mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-11-01 08:05:23 +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:
232 files changed
+50585
-32016
No files matched your search
@@ -389,6 +389,45 @@
|
||||
"noSavedServers": "Tidak ada server yang tersimpan.",
|
||||
"removeServer": "Menghapus"
|
||||
},
|
||||
"migrationNotice": {
|
||||
"title": "Termix Desktop sekarang berjalan secara mandiri.",
|
||||
"body1": "Aplikasi ini sebelumnya terhubung langsung ke server Termix Anda. Aplikasi ini telah dirancang ulang agar dapat berjalan sepenuhnya secara mandiri, menyimpan host dan kredensial secara lokal sehingga tetap berfungsi saat offline. Sinkronisasi dua arah dengan server Termix yang dihosting sendiri sekarang bersifat opsional.",
|
||||
"body2": "Host dan kredensial Anda yang ada masih berada di {{url}}. Aktifkan Sinkronisasi Jarak Jauh dan sambungkan kembali ke server tersebut untuk mengembalikannya dan menjaga agar keduanya tetap sinkron ke depannya.",
|
||||
"dismiss": "Tidak sekarang",
|
||||
"setUpSync": "Siapkan Sinkronisasi Jarak Jauh"
|
||||
},
|
||||
"remoteSync": {
|
||||
"title": "Sinkronisasi Jarak Jauh",
|
||||
"description": "Secara opsional, hubungkan aplikasi desktop ini ke server Termix yang dihosting sendiri untuk menyinkronkan host, kredensial, dan cuplikan Anda di berbagai perangkat. Aplikasi ini selalu berfungsi sepenuhnya secara offline, baik Anda terhubung atau tidak.",
|
||||
"notConnected": "Tidak terhubung",
|
||||
"connected": "Terhubung",
|
||||
"connectedTo": "Terhubung ke {{url}}",
|
||||
"lastSynced": "Sinkronisasi terakhir {{time}}",
|
||||
"neverSynced": "Tidak pernah disinkronkan",
|
||||
"syncError": "Kesalahan sinkronisasi: {{message}}",
|
||||
"needsReauth": "Login telah kedaluwarsa.",
|
||||
"connectButton": "Terhubung ke Server",
|
||||
"disconnectButton": "Memutuskan",
|
||||
"syncNowButton": "Sinkronkan Sekarang",
|
||||
"syncing": "Sinkronisasi...",
|
||||
"serverUrl": "URL Server",
|
||||
"enterServerUrl": "Silakan masukkan URL server",
|
||||
"mustIncludeProtocol": "URL server harus diawali dengan http:// atau https://",
|
||||
"connectionTestFailed": "Tidak dapat terhubung ke server Termix di URL tersebut.",
|
||||
"allowInvalidCertificate": "Izinkan sertifikat tidak valid",
|
||||
"allowInvalidCertificateDesc": "Gunakan hanya untuk server mandiri tepercaya dengan sertifikat yang ditandatangani sendiri atau sertifikat alamat IP.",
|
||||
"savedServers": "Server Tersimpan",
|
||||
"removeServer": "Menghapus",
|
||||
"continueButton": "Melanjutkan",
|
||||
"cancelButton": "Membatalkan",
|
||||
"signInTitle": "Masuk ke {{url}}",
|
||||
"originTitle": "Asal Koneksi",
|
||||
"originDescription": "Pilih dari mana koneksi SSH berasal secara default. Pengaturan ini dapat diubah per host.",
|
||||
"originLocal": "Perangkat ini (jaringan lokal)",
|
||||
"originRemote": "Server jarak jauh",
|
||||
"bannerReconnect": "Terhubung kembali",
|
||||
"bannerMessage": "Sinkronisasi jarak jauh memerlukan autentikasi ulang."
|
||||
},
|
||||
"versionCheck": {
|
||||
"error": "Kesalahan Pemeriksaan Versi",
|
||||
"checkFailed": "Gagal memeriksa pembaruan.",
|
||||
@@ -602,6 +641,7 @@
|
||||
"overrideCredentialUsername": "Ganti Nama Pengguna Kredensial",
|
||||
"overrideCredentialUsernameDesc": "Gunakan nama pengguna yang telah ditentukan di atas, bukan nama pengguna kredensial.",
|
||||
"oidcUsernameHint": "Gunakan $oidc.preferred_username untuk mengganti nama login OIDC Anda.",
|
||||
"tailscaleUsernameHint": "Ini harus berupa pengguna Unix yang identitas Tailscale Anda diberikan dalam ACL SSH tailnet, tidak harus root.",
|
||||
"jumpHostChain": "Rantai Host Lompatan",
|
||||
"portKnocking": "Ketukan Pelabuhan",
|
||||
"addKnock": "Tambahkan Port",
|
||||
@@ -650,6 +690,11 @@
|
||||
"delayAfterMs": "Penundaan Setelah (ms)",
|
||||
"useSocks5Proxy": "Gunakan Proxy SOCKS5",
|
||||
"useSocks5ProxyDesc": "Rute koneksi melalui server proxy.",
|
||||
"connectionOrigin": "Asal Koneksi",
|
||||
"connectionOriginDesc": "Lokasi asal koneksi SSH host ini. Menggantikan pengaturan default global aplikasi desktop.",
|
||||
"connectionOriginDefault": "Gunakan pengaturan default",
|
||||
"connectionOriginLocal": "Perangkat ini (jaringan lokal)",
|
||||
"connectionOriginRemote": "Server jarak jauh",
|
||||
"proxyHost": "Host Proksi",
|
||||
"proxyPort": "Port Proksi",
|
||||
"proxyUsername": "Nama Pengguna Proksi",
|
||||
@@ -762,6 +807,14 @@
|
||||
"customThemeBrightCyan": "Biru Muda Terang",
|
||||
"customThemeBrightWhite": "Putih Terang",
|
||||
"customThemeResetTooltip": "Kembalikan ke pengaturan default",
|
||||
"savedThemesLabel": "Tema Tersimpan",
|
||||
"saveAsGlobalTheme": "Simpan sebagai Tema Global",
|
||||
"saveGlobalThemeNamePrompt": "Masukkan nama untuk tema ini",
|
||||
"saveGlobalThemeSuccess": "Tema tersimpan",
|
||||
"saveGlobalThemeError": "Gagal menyimpan tema",
|
||||
"applyGlobalThemeTooltip": "Terapkan tema ini",
|
||||
"deleteGlobalThemeTooltip": "Hapus tema ini",
|
||||
"noSavedThemes": "Belum ada tema yang tersimpan.",
|
||||
"syntaxHighlightingLabel": "Penyorotan Sintaksis",
|
||||
"syntaxHighlightingDesc": "Berikan warna pada output terminal (kesalahan, jalur, IP, stempel waktu)",
|
||||
"syntaxHighlightingCategories": "Kategori Unggulan",
|
||||
@@ -791,6 +844,8 @@
|
||||
"enableAutoTmuxDesc": "Secara otomatis meluncurkan atau terhubung ke sesi tmux.",
|
||||
"enableSessionLogging": "Pencatatan Sesi",
|
||||
"enableSessionLoggingDesc": "Rekam output sesi terminal untuk ditinjau nanti.",
|
||||
"allowSessionSharing": "Izinkan Berbagi Sesi",
|
||||
"allowSessionSharingDesc": "Izinkan sesi langsung di host ini dibagikan melalui tautan atau dengan pengguna lain.",
|
||||
"enableCommandHistory": "Riwayat Perintah",
|
||||
"enableCommandHistoryDesc": "Rekam perintah yang dijalankan di terminal ini untuk riwayat dan pelengkapan otomatis.",
|
||||
"linkClickBehaviorLabel": "Perilaku Klik Tautan",
|
||||
@@ -895,6 +950,7 @@
|
||||
"proxmoxResultImported": "{{count}} diimpor",
|
||||
"proxmoxResultUpdated": "{{count}} diperbarui",
|
||||
"proxmoxResultFailed": "{{count}} gagal",
|
||||
"proxmoxResultSkippedNoIp": "{{count}} dilewati (tidak ditemukan IP)",
|
||||
"proxmoxImportComplete": "Impor Proxmox selesai: {{summary}}",
|
||||
"proxmoxDiscoveryFailed": "Penemuan gagal",
|
||||
"proxmoxImportFailed": "Impor gagal",
|
||||
@@ -961,6 +1017,9 @@
|
||||
"failedToSaveCredential": "Gagal menyimpan kredensial",
|
||||
"credentialNameRequired": "Silakan masukkan nama untuk kredensial tersebut.",
|
||||
"credentialAuthRequired": "Tambahkan kata sandi, kunci SSH, atau keduanya.",
|
||||
"createCredentialFromHostBtn": "Buat Kredensial",
|
||||
"createCredentialFromHostTitle": "Buat Kredensial dari Host",
|
||||
"createCredentialFromHostDesc": "Buat entri kredensial yang dapat digunakan kembali dan dibagikan, yang telah diisi sebelumnya dengan nama pengguna, kata sandi, dan/atau kunci SSH host ini saat ini.",
|
||||
"backToHosts": "Kembali ke Host",
|
||||
"backToCredentials": "Kembali ke Kredensial",
|
||||
"pinned": "Disematkan",
|
||||
@@ -1000,6 +1059,9 @@
|
||||
"folderNestingHint": "Gunakan / untuk memisahkan level dan membuat folder bertingkat.",
|
||||
"folderColor": "Warna",
|
||||
"folderIcon": "Ikon",
|
||||
"folderCredential": "Mandat",
|
||||
"folderCredentialNone": "Tidak ada kredensial yang diberikan.",
|
||||
"folderCredentialHint": "Host dalam folder ini yang menggunakan otentikasi \"Kredensial tersimpan\" tanpa kredensial mereka sendiri yang dipilih akan mewarisi kredensial ini.",
|
||||
"folderPreview": "Pratinjau",
|
||||
"folderNameFallback": "Folder tanpa judul",
|
||||
"createFolderButton": "Buat folder",
|
||||
@@ -1181,6 +1243,10 @@
|
||||
"filterTagsGroup": "Tag",
|
||||
"shareHost": "Bagikan Host",
|
||||
"shareHostTitle": "Bagikan: {{name}}",
|
||||
"shareFolder": "Folder Bersama",
|
||||
"shareFolderTitle": "Folder berbagi: {{name}}",
|
||||
"folderSharedSuccessfully": "Host bersama {{count}} di dalam folder",
|
||||
"failedToShareFolder": "Gagal berbagi folder",
|
||||
"sharing": {
|
||||
"loadError": "Gagal memuat data berbagi. Silakan coba lagi.",
|
||||
"shareWithSection": "Bagikan dengan",
|
||||
@@ -1221,6 +1287,7 @@
|
||||
"shareWithCount": "Bagikan ({{count}})",
|
||||
"currentAccess": "Akses saat ini",
|
||||
"noAccessEntries": "Host ini belum dibagikan",
|
||||
"folderShareSummary": "Berbagi {{shared}} dari {{total}} host di folder ini",
|
||||
"grantedBy": "Diberikan oleh",
|
||||
"expires": "Berakhir",
|
||||
"expired": "Kedaluwarsa",
|
||||
@@ -1242,6 +1309,8 @@
|
||||
"authMethod": "Metode Otentikasi",
|
||||
"authTypeDirect": "Langsung",
|
||||
"authTypeCredential": "Mandat",
|
||||
"authTypeNone": "Tidak ada",
|
||||
"authTypeNoneDesc": "Tidak ada kredensial yang disimpan. Anda akan diminta memasukkan nama pengguna dan kata sandi setiap kali Anda terhubung; informasi tersebut tidak disimpan.",
|
||||
"selectCredential": "Pilih kredensial...",
|
||||
"connectionSettings": "Pengaturan Koneksi",
|
||||
"displaySettings": "Pengaturan Tampilan",
|
||||
@@ -1259,6 +1328,7 @@
|
||||
"rdpPort": "Port RDP",
|
||||
"username": "Nama belakang",
|
||||
"password": "Kata sandi",
|
||||
"passwordSaved": "Kata sandi tersimpan, ketik untuk mengubahnya",
|
||||
"domain": "Domain",
|
||||
"securityMode": "Mode Keamanan",
|
||||
"colorDepth": "Kedalaman Warna",
|
||||
@@ -1424,7 +1494,60 @@
|
||||
"expiresIn": "Berakhir dalam {{duration}}",
|
||||
"search": "Cari koneksi...",
|
||||
"noSearchResults": "Tidak ada koneksi yang sesuai dengan pencarian Anda.",
|
||||
"rename": "Ganti nama sesi"
|
||||
"rename": "Ganti nama sesi",
|
||||
"sectionSharedWithMe": "Dibagikan kepada saya",
|
||||
"sharedBy": "Dibagikan oleh {{username}}",
|
||||
"join": "Bergabung",
|
||||
"sharedSessionLabel": "{{hostName}} (dibagikan)"
|
||||
},
|
||||
"sessionSharing": {
|
||||
"guestView": {
|
||||
"loading": "Menghubungkan ke sesi bersama...",
|
||||
"linkInvalid": "Tautan berbagi ini tidak valid, telah kedaluwarsa, atau telah dicabut.",
|
||||
"rateLimited": "Terlalu banyak percobaan, silakan coba lagi sebentar lagi.",
|
||||
"sessionEnded": "Sesi ini telah berakhir.",
|
||||
"readOnlyBadge": "Hanya tampilan"
|
||||
},
|
||||
"modalTitle": "Sesi berbagi",
|
||||
"shareButton": "Membagikan",
|
||||
"notReadyToShare": "Sesi belum siap untuk dibagikan.",
|
||||
"modeTab": {
|
||||
"link": "Link",
|
||||
"user": "Pengguna"
|
||||
},
|
||||
"linkModeDescription": "Siapa pun yang memiliki tautan ini dapat bergabung, tidak perlu membuat akun.",
|
||||
"userModeDescription": "Bagikan dengan pengguna tertentu yang sudah memiliki akses ke host ini. Jika mereka belum memiliki akses, bagikan host tersebut kepada mereka terlebih dahulu atau gunakan tautan. Setelah dibagikan, sesi akan muncul di tab Koneksi mereka.",
|
||||
"permissionLevel": {
|
||||
"label": "Tingkat izin",
|
||||
"readOnly": "Hanya baca",
|
||||
"readOnlyDescription": "Bisa menonton sesi secara langsung tetapi tidak bisa mengetik atau berinteraksi.",
|
||||
"readWrite": "Baca-tulis",
|
||||
"readWriteDescription": "Dapat mengetik dan berinteraksi dengan sesi seperti halnya pemilik."
|
||||
},
|
||||
"expiryLabel": "Kedaluwarsa tautan",
|
||||
"createLinkButton": "Buat tautan",
|
||||
"createShareButton": "Bagikan dengan pengguna",
|
||||
"searchUsersPlaceholder": "Cari pengguna...",
|
||||
"noUsersFound": "Tidak ada pengguna yang ditemukan",
|
||||
"linkCreated": "Tautan berbagi telah dibuat",
|
||||
"linkCopied": "Tautan disalin ke papan klip",
|
||||
"copyLink": "Salin tautan",
|
||||
"shareCreated": "Sesi dibagikan. Sesi tersebut akan muncul di tab Koneksi mereka.",
|
||||
"shareFailed": "Gagal membuat saham",
|
||||
"userLacksHostAccess": "Pengguna tersebut belum memiliki akses ke host ini. Bagikan host tersebut kepada mereka terlebih dahulu, atau gunakan tautan sebagai gantinya.",
|
||||
"activeShares": "Saham aktif",
|
||||
"noActiveShares": "Tidak ada saham aktif untuk sesi ini.",
|
||||
"revoke": "Menarik kembali",
|
||||
"revokeConfirmTitle": "Batalkan pembagian ini?",
|
||||
"revokeConfirmDescription": "Siapa pun yang menggunakan share ini akan langsung kehilangan akses.",
|
||||
"revoked": "Saham dicabut",
|
||||
"revokeFailed": "Gagal mencabut saham",
|
||||
"joinCount": "{{count}} bergabung",
|
||||
"joinCount_other": "{{count}} bergabung",
|
||||
"expiresAt": "Berakhir {{date}}",
|
||||
"linkShareBadge": "Link",
|
||||
"userShareBadge": "Pengguna: {{username}}",
|
||||
"loadSharesFailed": "Gagal memuat saham aktif."
|
||||
},
|
||||
"guacamole": {
|
||||
"connecting": "Menghubungkan ke sesi {{type}}...",
|
||||
@@ -1436,6 +1559,9 @@
|
||||
"reconnect": "Terhubung kembali",
|
||||
"retry": "Mencoba kembali",
|
||||
"guacdUnavailable": "Layanan desktop jarak jauh (guacd) tidak tersedia. Pastikan guacd berjalan, dapat diakses, dan dikonfigurasi dengan benar di pengaturan admin.",
|
||||
"credentialPromptTitle": "Masukkan Kredensial RDP",
|
||||
"credentialPromptDescription": "Host ini diatur untuk meminta kredensial saat terhubung. Kredensial tersebut hanya digunakan untuk sesi ini dan tidak disimpan.",
|
||||
"connect": "Menghubungkan",
|
||||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||||
"toolbar": {
|
||||
"ctrlAltDel": "Ctrl+Alt+Del",
|
||||
@@ -1461,7 +1587,9 @@
|
||||
"reconnect": "Sesi Terhubung Kembali",
|
||||
"collapse": "Ciutkan bilah alat",
|
||||
"expand": "Perluas bilah alat",
|
||||
"dragHandle": "Seret untuk mengubah posisi"
|
||||
"dragHandle": "Seret untuk mengubah posisi",
|
||||
"switchToTrackpad": "Beralih ke mode trackpad (seret untuk memindahkan kursor, ketuk untuk mengklik)",
|
||||
"switchToTouch": "Beralih ke mode sentuh (ketuk langsung di tempat yang ingin Anda klik)"
|
||||
}
|
||||
},
|
||||
"terminal": {
|
||||
@@ -1508,6 +1636,11 @@
|
||||
"totpRequired": "Diperlukan Otentikasi Dua Faktor",
|
||||
"totpCodeLabel": "Kode Verifikasi",
|
||||
"totpVerify": "Memeriksa",
|
||||
"mfaPromptRequired": "Autentikasi Diperlukan",
|
||||
"mfaPushRequired": "Otentikasi Push Diperlukan",
|
||||
"mfaMenuPlaceholder": "Masukkan jawaban Anda",
|
||||
"mfaWaitingApproval": "Menunggu persetujuan di perangkat Anda...",
|
||||
"mfaSendRequest": "Kirim Permintaan",
|
||||
"warpgateAuthRequired": "Autentikasi Warpgate Diperlukan",
|
||||
"warpgateSecurityKey": "Kunci Keamanan",
|
||||
"warpgateAuthUrl": "URL Otentikasi",
|
||||
@@ -2277,7 +2410,8 @@
|
||||
"resetCodeRateLimited": "Pembatasan laju: Terlalu banyak upaya verifikasi. Silakan coba lagi nanti.",
|
||||
"resetCodeRateLimitedWithTime": "Pembatasan laju: Terlalu banyak upaya verifikasi. Harap tunggu {{time}} detik sebelum mencoba lagi.",
|
||||
"authTokenSaveFailed": "Gagal menyimpan token otentikasi.",
|
||||
"failedToLoadServer": "Server gagal dimuat."
|
||||
"failedToLoadServer": "Server gagal dimuat.",
|
||||
"remoteServerRequired": "Diperlukan server jarak jauh. Hubungkan server jarak jauh di Pengaturan untuk menggunakan jenis koneksi ini."
|
||||
},
|
||||
"messages": {
|
||||
"registrationDisabled": "Pendaftaran akun baru saat ini dinonaktifkan oleh administrator. Silakan masuk atau hubungi administrator.",
|
||||
@@ -2644,6 +2778,17 @@
|
||||
"sslSaveFailed": "Gagal menyimpan pengaturan SSL",
|
||||
"sslRequiresDomain": "Nama domain dan email wajib diisi.",
|
||||
"sslInfoNote": "Setelah menerbitkan sertifikat, aktifkan SSL di variabel lingkungan Anda (ENABLE_SSL=true) dan mulai ulang Termix.",
|
||||
"sslManualOption": "Manual (unggah sertifikat)",
|
||||
"sslManualCert": "Sertifikat (PEM)",
|
||||
"sslManualCertPlaceholder": "-----MULAI SERTIFIKAT-----",
|
||||
"sslManualKey": "Kunci Pribadi (PEM)",
|
||||
"sslManualKeyPlaceholder": "-----MULAI KUNCI PRIVAT-----",
|
||||
"sslManualDesc": "Tempelkan sertifikat dan kunci pribadi Anda yang sudah ada, termasuk rantai lengkap jika dipersyaratkan oleh CA Anda.",
|
||||
"sslManualUpload": "Unggah & Instal Sertifikat",
|
||||
"sslManualUploadLoading": "Mengunggah sertifikat...",
|
||||
"sslManualUploadSuccess": "Sertifikat berhasil diunggah dan diinstal.",
|
||||
"sslManualUploadFailed": "Unggahan sertifikat gagal.",
|
||||
"sslManualRequiresFields": "Sertifikat dan kunci pribadi diperlukan.",
|
||||
"auditLogTotal": "{{total}} total entri",
|
||||
"auditLogEmpty": "Tidak ditemukan entri log audit.",
|
||||
"auditLogSuccess": "Kesuksesan",
|
||||
@@ -2672,6 +2817,12 @@
|
||||
"commandHistoryEnabled": "Riwayat Perintah",
|
||||
"commandHistoryEnabledDesc": "Izinkan perekaman riwayat perintah. Jika dinonaktifkan, riwayat tidak akan disimpan terlepas dari pengaturan per host.",
|
||||
"updateCommandHistoryFailed": "Gagal memperbarui pengaturan riwayat perintah.",
|
||||
"analyticsEnabled": "Bagikan Statistik Penggunaan Anonim",
|
||||
"analyticsEnabledDesc": "Mengirimkan data harian anonim mengenai jumlah pengguna, host, dan penggunaan fitur untuk membantu meningkatkan Termix. Tidak ada data pribadi atau detail koneksi yang disertakan.",
|
||||
"updateAnalyticsFailed": "Gagal memperbarui pengaturan analitik.",
|
||||
"sessionSharingGloballyEnabled": "Izinkan Berbagi Sesi",
|
||||
"sessionSharingGloballyEnabledDesc": "Izinkan sesi terminal langsung, RDP, VNC, dan Telnet untuk dibagikan di seluruh instance. Menggantikan setiap pengaturan berbagi per host saat dinonaktifkan.",
|
||||
"updateSessionSharingFailed": "Gagal memperbarui pengaturan berbagi sesi.",
|
||||
"sessionTimeout": "Waktu sesi habis",
|
||||
"hours": "jam",
|
||||
"sessionTimeoutRange": "Minimal 1 jam · Maksimal 720 jam",
|
||||
@@ -3119,6 +3270,47 @@
|
||||
"executionSuccess": "Kesuksesan",
|
||||
"executionFailed": "Gagal"
|
||||
},
|
||||
"keybindings": {
|
||||
"title": "Pintasan Keyboard",
|
||||
"description": "Sesuaikan pintasan salin, tempel, dan kontrol terminal, atau tetapkan tombol untuk mengirim teks atau menjalankan cuplikan kode.",
|
||||
"defaultsHeading": "Pintasan bawaan",
|
||||
"customHeading": "Pintasan Kustom",
|
||||
"addBinding": "Tambahkan Pintasan",
|
||||
"addBindingTitle": "Tambahkan Pintasan",
|
||||
"editBindingTitle": "Edit Pintasan",
|
||||
"loading": "Memuat...",
|
||||
"noCustomBindings": "Belum ada pintasan khusus.",
|
||||
"defaultBadge": "Bawaan",
|
||||
"customizedBadge": "Disesuaikan",
|
||||
"customize": "Sesuaikan",
|
||||
"resetToDefault": "Atur ulang ke pengaturan default",
|
||||
"resetAllToDefaults": "Atur ulang semuanya ke pengaturan default.",
|
||||
"close": "Menutup",
|
||||
"cancel": "Membatalkan",
|
||||
"saveBinding": "Simpan Pintasan",
|
||||
"saveError": "Gagal menyimpan pintasan keyboard",
|
||||
"pressKeysToRecord": "Kombinasi tombol",
|
||||
"pressKeysPlaceholder": "Klik dan tekan tombol",
|
||||
"recording": "Tekan tombol...",
|
||||
"comboRequiredError": "Tekan kombinasi tombol terlebih dahulu.",
|
||||
"textRequiredError": "Masukkan teks yang ingin dikirim",
|
||||
"controlCodeRequiredError": "Masukkan satu huruf untuk kode kontrol.",
|
||||
"snippetRequiredError": "Pilih cuplikan",
|
||||
"conflictWarning": "Kombinasi ini sudah terikat ke {{combo}}. Menyimpan akan membuat keduanya menyala.",
|
||||
"actionLabel": "Tindakan",
|
||||
"actionCopy": "Salin pilihan",
|
||||
"actionPaste": "Pasta",
|
||||
"actionSendControlCode": "Kirim sinyal Ctrl+huruf",
|
||||
"actionSendText": "Kirim pesan teks",
|
||||
"actionRunSnippet": "Jalankan cuplikan kode yang sudah ada.",
|
||||
"controlCodeLabel": "Surat",
|
||||
"textLabel": "Teks untuk dikirim",
|
||||
"appendEnterLabel": "Tekan Enter setelah mengirim",
|
||||
"snippetLabel": "Potongan",
|
||||
"selectSnippetPlaceholder": "Pilih cuplikan",
|
||||
"orphanedSnippetWarning": "cuplikan tidak ditemukan",
|
||||
"clipboardPermissionNote": "Pada beberapa browser, mungkin akan meminta izin akses clipboard saat pertama kali digunakan."
|
||||
},
|
||||
"userProfile": {
|
||||
"donateTitle": "Jaga agar Termix tetap hidup.",
|
||||
"donateDescription": "Termix gratis, dihosting sendiri, dan dibangun hanya oleh beberapa orang di waktu luang mereka. Jika Termix telah menghemat waktu atau uang Anda, donasi kripto akan membantu kelangsungannya.",
|
||||
@@ -3134,6 +3326,7 @@
|
||||
"sectionAppearance": "Penampilan",
|
||||
"sectionSecurity": "Keamanan",
|
||||
"sectionApiKeys": "Kunci API",
|
||||
"sectionData": "Data",
|
||||
"sectionC2sTunnels": "Terowongan C2S",
|
||||
"usernameLabel": "Nama belakang",
|
||||
"roleLabel": "Peran",
|
||||
@@ -3162,6 +3355,9 @@
|
||||
"settingsTerminal": "Terminal",
|
||||
"commandAutocomplete": "Pelengkapan Otomatis Perintah",
|
||||
"commandAutocompleteDesc": "Tampilkan fitur pelengkapan otomatis saat mengetik.",
|
||||
"keyboardShortcuts": "Pintasan Keyboard",
|
||||
"keyboardShortcutsDescription": "Sesuaikan pintasan salin, tempel, dan perintah terminal.",
|
||||
"manageShortcuts": "Mengelola",
|
||||
"terminalLinkBehavior": "Klik Tautan Terminal",
|
||||
"terminalLinkBehaviorDesc": "Perilaku default saat mengklik tautan di terminal.",
|
||||
"historyTracking": "Pelacakan Riwayat",
|
||||
@@ -3228,6 +3424,22 @@
|
||||
"apiKeyUsageHint": "Sertakan kunci Anda di dalam",
|
||||
"apiKeyUsageHintHeader": "Judul.",
|
||||
"apiKeyPermissionsHint": "Kunci mewarisi izin dari pengguna yang membuatnya.",
|
||||
"exportData": "Ekspor Data Saya",
|
||||
"exportDataDesc": "Unduh cadangan data host, kredensial, dan pengaturan Anda untuk dipindahkan ke perangkat lain.",
|
||||
"export": "Ekspor",
|
||||
"exporting": "Mengekspor...",
|
||||
"importData": "Impor Data Saya",
|
||||
"importDataDesc": "Pulihkan host, kredensial, dan pengaturan Anda dari file cadangan .sqlite.",
|
||||
"importDataSelected": "Dipilih: {{name}}",
|
||||
"selectFile": "Pilih File",
|
||||
"changeFile": "Mengubah",
|
||||
"import": "Impor",
|
||||
"importing": "Pengimporan...",
|
||||
"exportSuccess": "Data berhasil diekspor.",
|
||||
"exportFailed": "Ekspor data gagal",
|
||||
"importSelectFile": "Silakan pilih file terlebih dahulu.",
|
||||
"importCompleted": "Impor selesai: {{total}} item diimpor, {{skipped}} dilewati",
|
||||
"importFailed": "Impor gagal: {{error}}",
|
||||
"roleUser": "Pengguna",
|
||||
"authMethodDual": "Otorisasi Ganda",
|
||||
"authMethodOidc": "OIDC",
|
||||
@@ -3379,6 +3591,7 @@
|
||||
"pageUp": "PgUp",
|
||||
"pageDown": "PgDn",
|
||||
"delete": "Del",
|
||||
"paste": "Pasta",
|
||||
"editQuickKeys": "Edit tombol pintasan",
|
||||
"quickKeysTitle": "Tombol Pintas",
|
||||
"quickKeysDesc": "Ketuk × untuk menghapus. Mendukung hingga 8 karakter.",
|
||||
|
||||
Reference in new issue
Block a user