Files
Termix/src/ui/locales/translated/pt_PT.json
T
+4 7ae1648c25 release-2.7.0 (#1264)
* feat: redesign host/credential sidebars with synced preferences and manual drag-to-reorder

* chore: run format

* chore(deps-dev): bump @types/pg in the dev-patch-updates group (#1162)

Bumps the dev-patch-updates group with 1 update: [@types/pg](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/pg).


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

---
updated-dependencies:
- dependency-name: "@types/pg"
  dependency-version: 8.20.3
  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-dev): bump the dev-minor-updates group with 4 updates (#1163)

Bumps the dev-minor-updates group with 4 updates: [react-hook-form](https://github.com/react-hook-form/react-hook-form), [react-icons](https://github.com/react-icons/react-icons), [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


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

Updates `react-icons` from 5.6.0 to 5.7.0
- [Release notes](https://github.com/react-icons/react-icons/releases)
- [Commits](https://github.com/react-icons/react-icons/compare/v5.6.0...v5.7.0)

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

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

---
updated-dependencies:
- dependency-name: react-hook-form
  dependency-version: 7.84.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: react-icons
  dependency-version: 5.7.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: typescript-eslint
  dependency-version: 8.66.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
- dependency-name: vite
  dependency-version: 8.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dev-minor-updates
...

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

* chore(deps): bump the prod-patch-updates group with 3 updates (#1164)

Bumps the prod-patch-updates group with 3 updates: [jose](https://github.com/panva/jose), [js-yaml](https://github.com/nodeca/js-yaml) and [nanoid](https://github.com/ai/nanoid).


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

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

Updates `nanoid` from 6.0.0 to 6.0.1
- [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/6.0.0...6.0.1)

---
updated-dependencies:
- dependency-name: jose
  dependency-version: 6.2.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: js-yaml
  dependency-version: 5.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: prod-patch-updates
- dependency-name: nanoid
  dependency-version: 6.0.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 undici in the prod-minor-updates group (#1165)

Bumps the prod-minor-updates group with 1 update: [undici](https://github.com/nodejs/undici).


Updates `undici` from 8.9.0 to 8.10.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v8.9.0...v8.10.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

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

* chore(deps-dev): bump the major-updates group with 2 updates (#1166)

Bumps the major-updates group with 2 updates: [@types/better-sqlite3](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/better-sqlite3) and [jsdom](https://github.com/jsdom/jsdom).


Updates `@types/better-sqlite3` from 7.6.13 to 9.6.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/better-sqlite3)

Updates `jsdom` from 29.1.1 to 30.0.1
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Commits](https://github.com/jsdom/jsdom/compare/v29.1.1...v30.0.1)

---
updated-dependencies:
- dependency-name: "@types/better-sqlite3"
  dependency-version: 9.6.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: major-updates
- dependency-name: jsdom
  dependency-version: 30.0.1
  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: stop resyncAutoIncrement failing on tables without an id column (#1173)

The Postgres branch asked pg_get_serial_sequence(table, 'id') about every
table a fixture had inserted into. That function raises 42703 when the
column does not exist, rather than returning null, so any seed touching a
table keyed on something else took down the fixture.

host_sidebar_preferences is keyed on user_id and has no id at all, which
is why the Postgres job on dev-2.7.0 fails for every pull request.

Drive the lookup from information_schema so a missing id column yields no
row instead of an error. A text primary key still returns a null sequence
and is still skipped, as before.

* chore: install the git hooks that were already configured (#1174)

husky, lint-staged, commitlint and their config have been in the repo
since v1.8.0 (#429): .husky/pre-commit runs lint-staged, .husky/commit-msg
runs commitlint, the lint-staged globs are in package.json and the
commitlint rules in .commitlintrc.json.

None of it has ever run. husky only takes effect once it sets
core.hooksPath, and that happens in the prepare lifecycle script, which
the package did not define -- so every clone installed the tooling and
left the hooks unwired.

That is why formatting keeps failing in CI rather than locally: three of
the four open pull requests fail lint-and-build on prettier alone,
touching between one and five files each, and the check is the first place
anyone finds out.

prepare falls back to true so a checkout without a .git directory cannot
break installation. The Docker build passes --ignore-scripts, so it never
runs this at all.

Also pin the Prettier extension to the repo's own copy via
prettier.prettierPath, and let .vscode/settings.json out of .gitignore so
it applies to everyone. The extension bundles its own prettier otherwise,
which formats to a different version's rules than the one CI enforces.

* fix: derive the ssh_credentials rebuild from the live schema (#1172)

The startup rebuild that drops the old username NOT NULL constraint
restated the table's columns as a literal and then copied rows with
INSERT INTO temp SELECT <every live column>. The table has gained columns
since that literal was written — cert_public_key, pin, sort_order and
sync_id are all added by addColumnIfNotExists before the rebuild runs —
so the destination was narrower than the source. SQLite rejected the
INSERT on a column count mismatch, the error was swallowed as a warning,
and the constraint survived every restart.

Read the CREATE TABLE statement back from sqlite_master and rewrite just
the table name and the username constraint, so the replacement table
cannot fall behind the real one. Copy rows by explicit column name rather
than positionally, and replay the table's indexes, which DROP TABLE would
otherwise take with it along with the sync_id uniqueness.

* fix: make audit_logs.user_id nullable on fresh SQLite installs (#1171)

The audit trail is meant to outlive the account it belongs to: deleting a
user nulls user_id and keeps username for attribution. schema.ts, the
Drizzle migrations and AuditLogRepository.anonymizeByUserId were all
written against that, but the runtime bootstrap still created
user_id TEXT NOT NULL.

A second CREATE TABLE IF NOT EXISTS further down migrateSchema() had the
correct nullable column, but it can never run — the primary bootstrap has
already created the table, so IF NOT EXISTS is a no-op. Every fresh
install therefore got the old constraint, and user deletion failed with
"NOT NULL constraint failed: audit_logs.user_id" for any account that had
logged in at least once, via both the admin delete path and the OIDC
account-link cleanup.

Fix the primary bootstrap, and rebuild the table on existing databases
using the same pattern already used for ssh_credentials.username, since
SQLite cannot ALTER a column.

* fix: key the sync upsert on the row it just looked up (#1175)

A sync push locates the stored row twice -- once to decide insert vs
update, once to write it -- and the two lookups were spelled out
separately. Only the read knew about singleton entities; the write always
keyed on table.id.

userPreferences is the only singleton, and user_preferences is the one
synced table with no id column: its primary key is user_id. table.id was
therefore undefined, and drizzle emitted a comparison with nothing on its
left:

  ( = ? and "user_preferences"."user_id" = ?)

The insert branch was unaffected, so the first push of preferences
succeeded and every push after it -- the steady state -- failed with
SqliteError: near "=": syntax error. Preference sync never converged, and
both sides ship the same handler, so the desktop's embedded backend failed
identically.

Extract the lookup into locateSyncRow() and use it for the read, the
update and the tombstone delete, so the three cannot drift apart again.
The tombstone path already handled singletons correctly; it now shares the
one expression rather than keeping a third copy of it.

* fix: refuse an SSH connection whose host id resolves elsewhere (#1176)

A client identifies a host by the numeric row id of the database it is
displaying. With the desktop connection origin set to "Remote server",
that id is resolved against the sync server's ssh_data instead, and the
two autoincrement sequences need not line up -- they diverge as soon as
each side accumulates inserts and deletes in a different order.

resolveHostById() then returns whichever row owns that id here, and the
handler takes the address, the credentials, the jump hosts and the stored
host key from it. The session opens on a machine the user did not pick,
while the host list, host details and export all keep showing the right
one. Commands run on the wrong server, a host key mismatch is reported
for the wrong reason, and anything typed at the prompt goes to the wrong
place.

Compare the resolved address against the one the client sent, and refuse
when they disagree. Checking at the point the row is loaded covers every
use of it rather than each site separately. Addresses are compared with
brackets stripped and casing folded, so an IPv6 literal or a hostname
written differently is not treated as a different machine; when the
server has no address stored, the client's own details are used as
before.

This stops the wrong-machine session. It does not make delegated
connections work when the ids have drifted -- that needs the host to be
addressed by syncId across the boundary, which the connection protocol
does not currently carry.

* fix: refuse SFTP and Docker console on a mismatched host id too (#1177)

The wrong-machine guard added for SSH covered one of the paths that
resolve a client-supplied host id against this server's ssh_data. The
file manager and the Docker console take the same id from the same client
and dial whatever row owns it here.

The file manager then browses, edits and deletes files on that machine,
and the Docker console attaches to its daemon -- both while the UI shows
the host the user actually picked.

Reuse hostAddressMismatch at each point the row is loaded. The two file
manager sites sit inside "failed to resolve credentials, carry on"
handlers, so the refusal is a distinct error type those catches rethrow;
swallowing it would resume the connection this is meant to stop. The
Docker console reports over its socket, as it does for every other
refusal.

The user-facing wording now lives next to the check instead of being
written out at each site.

Still uncovered, and not fixable this way: file-manager's transfer
session, jump-host-chain and the proxmox routes resolve an id with no
client-supplied address to compare it against. Those need the host to be
addressed by syncId across the boundary.

* feat: address hosts by syncId when a connection is delegated (#1178)

A numeric host id belongs to the database that produced it. The desktop
app lists hosts from its embedded database and names them by row id, so
when a connection is delegated to a sync server that id is resolved
against a different table, whose autoincrement sequence has no reason to
agree. The row it lands on is a different machine, and it supplies the
address, the credentials, the jump hosts and the stored host key.

#1176 and #1177 made that refuse rather than connect. Refusing is right,
but it leaves "Remote server" unusable once the ids have drifted, which
is the state the reporter was in.

syncId already names a host identically on both sides -- remote sync
relies on it, ssh_data.sync_id is unique, and the API already returns it.
It just never reached the backend: hostToSSHHost() builds its result field
by field and dropped it.

Carry it through, and resolve with it when it is present:

  resolveHostBySyncId(syncId, userId)   // translate, then reuse
    -> findHostIdBySyncId(syncId)       // this database's own row id
    -> resolveHostById(hostId, userId)  // permissions, decryption, audit

The translation is deliberately not scoped to a user -- sync_id is unique
across the table and a shared host belongs to someone else -- so access
stays with the permission check in the id-based path, which the new tests
cover.

An unknown syncId resolves to nothing rather than falling back to the
numeric id: an unknown host is precisely where guessing picks the wrong
machine. Clients that send no syncId are unchanged, address comparison
included, so an older desktop keeps its safety net instead of breaking.

* fix(homepage): make the System Overview update indicator able to fire (#1168)

The widget's "Update available" row and orange version text were unreachable,
for two independent reasons that each alone would have been enough.

It called `getVersionInfo(false)`, and `checkRemote=false` makes /version return
early with `{localVersion, status: "update_check_disabled"}` -- no GitHub fetch,
no remote version, nothing to compare. It then read `info.updateAvailable`, a
field the route does not return in either mode; the success response carries
status, localVersion, version, remoteVersion, latest_release, cached and
cache_age. `Boolean(undefined)` is false, always. The read type-checked only
because `getVersionInfo()` is declared as `Record<string, unknown>`, so a
property name that does not exist is indistinguishable from one that does.

Let the endpoint do the comparison and read `status === "requires_update"`,
which is what the dashboard stats bar and the profile panel badge already do.

The row's label was `homepage.overviewUpdate`, whose English string is "Up to
date" -- as the label of an update-available row it read "Up to date / Update
available". Nobody has seen that, because the row has never rendered; fixing
the indicator without the label would have shipped it. Give it its own key.
That leaves `homepage.overviewUpdate` unused; it is left in place rather than
removed, since it would be the natural value for an always-visible row and that
is a product decision, not part of this fix.

* fix: capture real client IP for SSH login alerts behind reverse proxy (#1169)

* fix: capture real client IP for SSH login alerts behind reverse proxy

The WebSocket terminal handler used req.socket.remoteAddress for the
"user logged in" alert message, which is the immediate TCP peer (the
reverse proxy) rather than the actual client IP forwarded via
X-Forwarded-For. This made trust-proxy config on Traefik irrelevant
since Termix never read the header for this code path.

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

* test: cover getClientIp forwarded-header and socket fallback paths

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

---------

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

* fix: keep already-shared hosts sharing their SSH authentication (#1179)

Sharing a host used to hand the owner's SSH authentication to the
recipient unconditionally. 2.6.1 put that behind ssh_data.share_ssh_auth,
added as NOT NULL DEFAULT 0.

Existing rows took the default, so every host shared before the upgrade
stopped supplying credentials the moment the column appeared. The snapshot
in collectProtocolSnapshots() is guarded by host.shareSshAuth, so nothing
was captured; resolveRecipientSharedHostAuthentication() then fell through
to "required" and the recipient got "No valid authentication method
provided" on a host that had worked the day before. Downgrading to 2.6.0
restored it, since that code has no such column to consult.

Backfill the flag for hosts that already appear in host_access. That is
where the previous behaviour was in effect and where the owner had already
agreed to share; hosts nobody has shared keep the new default and stay off
until their owner shares them.

Guarded by a settings key so it runs once. Without that, an owner who
turns sharing back off would have it turned on again by the next restart.

* fix: let a single credential disable 2FA again (#1180)

The disable dialog has one field, labelled "Enter TOTP code or password",
and its caller passes that value as disableTOTP(input) -- so it arrives as
`password` with `totp_code` undefined. That call has been unchanged since
v2.3.0.

2.5.1 changed the route to require both:

  if (!totp_code || (!userRecord.isOidc && !password)) -> 400

replacing `const credential = password || totp_code`. The first check has
rejected every attempt since, whatever the user typed, so nobody has been
able to turn 2FA off -- the client reports the generic "Failed to disable
2FA", which hides which check failed.

Take one credential again and try it as a TOTP code, a backup code, then
the account password. verifyTotpReauth still refuses the password itself,
so that comparison stays in the route; an OIDC user has no password hash
and reaches neither.

The backup-codes route has the same shape but no caller in the UI -- its
codes are returned when TOTP is enabled -- so it is left alone rather than
changed blind.

* fix: attach user-managed CA certificates over SFTP too (#1181)

opkssh-cert-auth.ts exports two helpers that end in the same
_applyCertToConnection: setupOPKSSHCertAuth, and setupCACertAuth for
user-managed CA-signed -cert.pub files. The file manager called the first
one twice and the second one never.

So a host whose key is paired with a CA-signed certificate authenticated
in a terminal and failed over SFTP, while OPKSSH certificates -- going
through the other helper -- worked in both. The file manager was not
missing certificate support in general; it was missing one of the two
paths into it.

The connection also never carried the certificate to begin with:
cert_public_key was not among the fields copied into resolvedCredentials,
so both places that build an SFTP connection now read it and attach it
where the private key is prepared -- the dedicated transfer session and
the main connect route.

An unusable certificate is logged and skipped rather than failing the
connection. The key alone may still be accepted, which is what happened
while this was not wired up at all, and turning that into a hard failure
would break setups that currently work.

Reported in #1160 with the call-site asymmetry already traced; the
reporter noted they could not confirm the link to their failure, having
moved off SSH CAs. The asymmetry is real either way and reproduces the
symptom exactly.

* fix: authenticate the desktop Docker console WebSocket (#1182)

The console WS opted out of the query token:

  buildOriginWsUrl({ ..., includeLocalJwt: false })

leaving it with no credential at all on the desktop. The browser
WebSocket API cannot set an Authorization header, and while Electron's
main process injects a remembered JWT cookie, it requires an exact origin
match -- the cookie belongs to the API origin (localhost:30001) while the
console connects to 127.0.0.1:30009, so nothing is attached.

The backend then closes the handshake with 1008 before it logs anything,
which is why the log has no docker-console entries while stats and logs
polling keep succeeding on the same host. The web build is unaffected: it
connects same-origin and its cookie is sent normally.

Drop the opt-out so the console carries the local JWT like the SSH
terminal does -- the same token, the same query parameter, and the
backend already reads it there.

Guacamole passes includeLocalJwt: false too, but rdp/vnc/telnet always
resolve to "remote", so that call never reaches the local branch.

* fix: use getClientIp in getRequestMeta for correct audit-log IPs (#1183)

* fix: capture real client IP for SSH login alerts behind reverse proxy

The WebSocket terminal handler used req.socket.remoteAddress for the
"user logged in" alert message, which is the immediate TCP peer (the
reverse proxy) rather than the actual client IP forwarded via
X-Forwarded-For. This made trust-proxy config on Traefik irrelevant
since Termix never read the header for this code path.

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

* test: cover getClientIp forwarded-header and socket fallback paths

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

* fix: use getClientIp in getRequestMeta for correct audit-log IPs

getRequestMeta had near-duplicate, strictly worse forwarded-header
logic: the array branch didn't split/trim, there was no socket-peer
fallback, and it returned "" instead of "unknown". Delegate to
getClientIp so the audit trail gets the same correctness as the
terminal login-alert path.

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

---------

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

* feat: add terminal image handoff (#1170)

* chore: sync Crowdin translations

* fix(homepage): make the System Overview update indicator able to fire (#1168)

The widget's "Update available" row and orange version text were unreachable,
for two independent reasons that each alone would have been enough.

It called `getVersionInfo(false)`, and `checkRemote=false` makes /version return
early with `{localVersion, status: "update_check_disabled"}` -- no GitHub fetch,
no remote version, nothing to compare. It then read `info.updateAvailable`, a
field the route does not return in either mode; the success response carries
status, localVersion, version, remoteVersion, latest_release, cached and
cache_age. `Boolean(undefined)` is false, always. The read type-checked only
because `getVersionInfo()` is declared as `Record<string, unknown>`, so a
property name that does not exist is indistinguishable from one that does.

Let the endpoint do the comparison and read `status === "requires_update"`,
which is what the dashboard stats bar and the profile panel badge already do.

The row's label was `homepage.overviewUpdate`, whose English string is "Up to
date" -- as the label of an update-available row it read "Up to date / Update
available". Nobody has seen that, because the row has never rendered; fixing
the indicator without the label would have shipped it. Give it its own key.
That leaves `homepage.overviewUpdate` unused; it is left in place rather than
removed, since it would be the natural value for an always-visible row and that
is a product decision, not part of this fix.

* fix: capture real client IP for SSH login alerts behind reverse proxy (#1169)

* fix: capture real client IP for SSH login alerts behind reverse proxy

The WebSocket terminal handler used req.socket.remoteAddress for the
"user logged in" alert message, which is the immediate TCP peer (the
reverse proxy) rather than the actual client IP forwarded via
X-Forwarded-For. This made trust-proxy config on Traefik irrelevant
since Termix never read the header for this code path.

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

* test: cover getClientIp forwarded-header and socket fallback paths

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

---------

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

* feat: add terminal image handoff

Add authenticated browser upload and clipboard image handoff for terminal agents. Normalize images through Sharp, enforce storage and request limits, preserve host-visible paths, and provide a stable three-button terminal toolbar.

* docs: document terminal image handoff deployment

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: kacperpietrzyk <105545577+kacperpietrzyk@users.noreply.github.com>
Co-authored-by: Brennan Neoh <497569+brennanneoh@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix(desktop): stop suppressing the update prompt, and make the version badge reachable (#1167)

* fix(desktop): stop suppressing the update prompt for users who need it

The startup update modal stored its dismissal under the local app version
rather than the remote version being offered, and the up-to-date branch
wrote that key with no user interaction at all. A user who launched while
current had their own version recorded; once the next release shipped,
`dismissedVersion === currentVersion` still held and the modal was skipped
on every launch. It reappeared only after the user had already updated --
the inverse of what it is for. Present since v2.3.0.

Key the dismissal on the offered remote version instead. The change is
backward compatible: an existing key holding 2.6.0 compares unequal against
a remote 2.6.1, so affected installs are prompted on their next launch. When
the check itself fails there is no remote version, so nothing is recorded and
no future prompt is suppressed.

That left the version badge as the only remaining signal, and it was an inert
span on both surfaces that render it -- the profile panel and the dashboard
stats bar -- even though the `getVersionInfo()` response it is built from
already carries `latest_release.html_url`. Extract the duplicated badge into
`components/version-badge.tsx` and make the update case a link to the release,
with an accessible name that says where it goes. The beta and stable cases
stay inert.

`getVersionInfo()` returned `Record<string, unknown>`, so the release URL was
unreachable without a cast; give it a `VersionInfo` type that keeps an index
signature, since `SystemOverviewWidget` reads `updateAvailable` off the same
response.

* test: cover the read that actually reaches the badge

The extracted VersionBadge is unit-tested, but the line that decides whether
it ever receives a URL -- pulling `latest_release.html_url` out of the version
response -- was duplicated at both call sites and asserted nowhere. A wrong
property there compiles (the response type keeps an index signature) and every
existing test still passes.

Give it a name, `releaseUrlFrom`, use it from both surfaces, and test it: the
happy path, a response with no release, a release with no URL, and a missing
response, since the caller's fetch can reject. Empty string is the contract the
badge reads as "nothing to link to", so it stays an inert span rather than
rendering a dead anchor.

* docs: state the index signature's real reason

The comment claimed the version endpoint carries fields beyond the typed ones,
citing `updateAvailable`. It does not -- `GET /version` returns status,
localVersion, version, remoteVersion, latest_release, cached and cache_age, and
nothing else. SystemOverviewWidget reads `updateAvailable` off it regardless,
which is why the permissive index signature has to stay, but that is a stale
read rather than an undocumented field. Say so accurately.

* Send alerts in Discord channels with Webhooks (#1158)

* feat(utils): add discord webhook sender

Add a utility to send alert embeds to Discord webhooks.

* fix(utils): validate DNS and use global fetch for outbound requests

Prevent private destination access and rely on global fetch after DNS validation.

* chore(logger): include extra context in logs

Show additional sanitized context entries for clearer diagnostics.

* feat(alerts): support discord channel type in routes and engine

Accept discord channels and route alerts to the Discord sender.

* feat(ui): add Discord option to notification channel dialog

Allow creating/editing Discord webhook channels with username/avatar.

* fix(ui/api): accept structured config payload for notification channels

Allow the client to pass structured config objects (or strings) when creating/updating channels.

* chore: sync Crowdin translations

* fix(homepage): make the System Overview update indicator able to fire (#1168)

The widget's "Update available" row and orange version text were unreachable,
for two independent reasons that each alone would have been enough.

It called `getVersionInfo(false)`, and `checkRemote=false` makes /version return
early with `{localVersion, status: "update_check_disabled"}` -- no GitHub fetch,
no remote version, nothing to compare. It then read `info.updateAvailable`, a
field the route does not return in either mode; the success response carries
status, localVersion, version, remoteVersion, latest_release, cached and
cache_age. `Boolean(undefined)` is false, always. The read type-checked only
because `getVersionInfo()` is declared as `Record<string, unknown>`, so a
property name that does not exist is indistinguishable from one that does.

Let the endpoint do the comparison and read `status === "requires_update"`,
which is what the dashboard stats bar and the profile panel badge already do.

The row's label was `homepage.overviewUpdate`, whose English string is "Up to
date" -- as the label of an update-available row it read "Up to date / Update
available". Nobody has seen that, because the row has never rendered; fixing
the indicator without the label would have shipped it. Give it its own key.
That leaves `homepage.overviewUpdate` unused; it is left in place rather than
removed, since it would be the natural value for an always-visible row and that
is a product decision, not part of this fix.

* fix: capture real client IP for SSH login alerts behind reverse proxy (#1169)

* fix: capture real client IP for SSH login alerts behind reverse proxy

The WebSocket terminal handler used req.socket.remoteAddress for the
"user logged in" alert message, which is the immediate TCP peer (the
reverse proxy) rather than the actual client IP forwarded via
X-Forwarded-For. This made trust-proxy config on Traefik irrelevant
since Termix never read the header for this code path.

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

* test: cover getClientIp forwarded-header and socket fallback paths

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

---------

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

* chore: add url to SENSITIVE_FIELDS for discord url

* fix: enforce SSRF protection on outbound fetches

Use `undici.fetch` with the custom DNS lookup hook to ensure the validated
DNS resolution is the one used for the connection. Fix DNS lookup/address
validation bugs and add coverage for private, public and invalid addresses,
including the resolution issue affecting Discord endpoints.

* chore: prettier format

* fix: validate all DNS addresses and close dispatcher

* fix DNS lookup validation and callback handling
* update safe outbound fetch tests
* ensure created dispatcher is properly closed

* chore: remode url from SENSITIVE_FIELDS for other logs

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>
Co-authored-by: kacperpietrzyk <105545577+kacperpietrzyk@users.noreply.github.com>
Co-authored-by: Brennan Neoh <497569+brennanneoh@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>

* fix tmux UTF-8 path handling (#1157)

Co-authored-by: Carl <scarlettme@qq.com>

* chore: update package lock

* chore: update gitnore

* fix: [BUG] (#1049)

https://github.com/Termix-SSH/Support/issues/1049

* fix: test commitlint path fix (#1021)

* fix: SGR mouse-tracking escape codes printed as text (#1023)

* fix: quote $1 in commit-msg hook so it works from git worktrees

* fix: [BUG] could not connect to the database (#1057)

https://github.com/Termix-SSH/Support/issues/1057

* fix: [BUG] VNC connect macOS screen sharing failed (#1063)

https://github.com/Termix-SSH/Support/issues/1063

* fix: [BUG] Meta key (#1075)

https://github.com/Termix-SSH/Support/issues/1075

* fix: [BUG] Remote sync doesn't work with Termix behind nginx proxy (#1085)

https://github.com/Termix-SSH/Support/issues/1085

* fix: [BUG] webhook not working (#1080)

https://github.com/Termix-SSH/Support/issues/1080

* fix: [BUG] First server sync doesn't refresh UI (#1084)

https://github.com/Termix-SSH/Support/issues/1084

* fix: [BUG] How to enable SSL using custom certificate (#1083)

https://github.com/Termix-SSH/Support/issues/1083

* fix: [BUG] Sudo Password Auto-fill Persistance (#1098)

https://github.com/Termix-SSH/Support/issues/1098

* feat: [FEATURE] Expand Snippets Function (#1031)

https://github.com/Termix-SSH/Support/issues/1031

* feat: [FEATURE] (#1055)

https://github.com/Termix-SSH/Support/issues/1055

* feat: [FEATURE] Support for Headscale API Keys (hskey prefix) and Custom API Endpoints (#1013)

https://github.com/Termix-SSH/Support/issues/1013

* feat: [FEATURE] Allow paste on non https (#1026)

https://github.com/Termix-SSH/Support/issues/1026

* feat: be-azerty layout (#1073)

https://github.com/Termix-SSH/Support/issues/1073

* feat: Keyboard shortcuts to move between open tabs (#1069)

https://github.com/Termix-SSH/Support/issues/1069

* feat: Session Logs as a downloadable text file (#1058)

https://github.com/Termix-SSH/Support/issues/1058

* fix: persist and auto-fill saved SSH and sudo passwords

* fix: persist docker runtime selection and docker manager UI issues

* feat: Allow excluding specific mounts from disk usage metrics (#1046)

https://github.com/Termix-SSH/Support/issues/1046

* feat: Expand Snippets Function (#1031)

https://github.com/Termix-SSH/Support/issues/1031

* chore: restore the prettier baseline on dev-2.7.0 (#1185)

Five files on dev-2.7.0 do not match prettier, so `npx prettier --check .`
fails and takes lint-and-build with it — on every pull request, whatever
it changes.

Formatting only, produced by `npx prettier --write` on exactly the files
the check names. No logic touched: tsc passes for both configs, backend
148 files / 1106 tests and UI 71 files / 479 tests all pass.

* test: keep the tmux escaping test runnable on Windows (#1184)

The escaping check ran its command through /bin/sh. That binary does not
exist on Windows, and Windows is a supported platform for the desktop
app, so `npm test` fails there on a test about string quoting. CI is
ubuntu-only and would never see it.

Assert the escaped string directly, which covers the rule on every
platform, and keep the round trip through a real shell as a separate case
guarded by platform -- it is the stronger evidence where a shell exists.

* chore: drop the unreachable table probes from migrateSchema (#1186)

Eleven blocks in migrateSchema() guarded a CREATE TABLE IF NOT EXISTS
behind SELECT id FROM <table> LIMIT 1, for tables the primary bootstrap
had already created earlier in the same startup. The probe could not
throw, so the catch never ran.

Two of those unreachable copies had drifted from the definition actually
in use. sessions had lost ON DELETE CASCADE, and session_recordings still
carried user_id TEXT NOT NULL with ON DELETE CASCADE and no username --
the shape from before audit trails were made to outlive the account. They
would have taken effect had anything ever reordered startup.

Kept, because they are not the same thing:

  - blocks whose catch runs ALTER TABLE ADD COLUMN. CREATE TABLE IF NOT
    EXISTS is a no-op on a table that exists, so a database created before
    a column was added still needs the ALTER. Those probe a column, not a
    table.
  - blocks that are a table's only creation point.
  - the user_open_tabs block, which is a data migration; its SELECT is a
    precondition, not a probe.

Deletion only, no behaviour change.

* fix: repair the frontend type-check and clear the 299 errors behind it (#1189)

* fix: repair frontend type-check configuration and the errors it exposed

The root tsconfig.json is solution-style with "files": [], so the
`npx tsc --noEmit` that CI runs compiles nothing at all. Frontend types
have therefore never been checked, and 299 errors had accumulated behind
that no-op. This clears just over half of them; nothing here changes
runtime behaviour.

Configuration:
- "@/types" resolved through the "@/*" fallback to src/ui/types, which
  does not exist. Added an explicit mapping to src/types/index.ts.
- src/vite-env.d.ts sits outside the include list, so import.meta.env and
  the ?url import suffix were unknown. Added.
- src/ui/types/ held a single file, keybindings.ts, while every other
  shared type lives in src/types/. Six modules imported it as
  "@/types/keybindings" and silently resolved to nothing. Moved.

Type definitions that had fallen behind the code:
- guacamoleConfig and terminalConfig were Record<string, unknown> in
  ui-types while the editor read concrete fields off them. Both now use
  the real interfaces; GuacamoleConfig is extracted from its inline
  definition in guacamole-api.ts so the two cannot drift again.
- customThemeColors and TerminalTheme["colors"] described the same object
  with different optionality. Aligned.
- FileWindow declared its own SSHHost whose authType was "password" | "key",
  which no longer matches the eight the app supports.
- connectSSH and listSSHFiles returned Record<string, unknown>, so every
  field the callers destructured arrived as unknown.
- AxiosRequestConfig and AxiosResponse were used without being imported.

Also adds asHttpError() for the handful of catch blocks that reached into
an unknown binding, and narrows the Host | HostFolder comparator and the
RailItem union at the points where the discriminant was not carrying.

Note: dbHealthMonitor.reportDatabaseError was being called with a second
argument it does not accept, so the authenticated-or-not flag was already
being discarded at runtime. Dropped the argument to match the signature;
whether that flag was meant to gate the report is worth a separate look.

* fix: clear more of the frontend type-check baseline

Continues the previous commit; 140 errors down to 70. Three of these were
real defects rather than missing annotations.

Defects:
- DashboardTab counted active tunnels by comparing status to "CONNECTED",
  but CONNECTION_STATES.CONNECTED is "connected" and that is what the
  tunnel manager emits, so the count was always zero. Now compares against
  the constant.
- QuickActionsCard requires isAdmin and gates a block of admin-only actions
  on it, but neither call site passed it — those actions never rendered.
  Both call sites also passed isAdmin to HostStatusCard, which does not
  accept it; the prop had evidently been moved and the call sites missed.
- The host editor stores jump host ids as strings and sent them straight to
  an API typed for numbers. Backend host lookups compare against an integer
  column, which a string does not match on Postgres or MySQL. Converted.

Types brought in line with the data:
- Host and HostData were missing hasPassword, hasSudoPassword, sortOrder,
  instanceId, connectionOrigin, vaultProfileId, syncId, and the "vault"
  authType; TabContextTab was missing the "tunnel" tab, which TabContext
  already branched on.
- statsConfig and terminalConfig used inline shapes that had drifted from
  StatsConfig and TerminalConfig. Both now reference the real interfaces;
  excludedMounts, which the editor reads, was added to StatsConfig.
- downloadSSHFile, generateKeyPair and generatePublicKeyFromPrivate all
  returned Record<string, unknown> while callers read named fields.
- The Guacamole declarations were missing Keyboard.reset, Client.onfile,
  InputStream.sendAck, Status.Code and BlobReader, all already in use.
- NetworkTopologyNode/Edge could not be discriminated, though the graph
  code tells them apart by testing for source/target.

ProxyNode.type is now 4 | 5 | "http" | "socks4" | "socks5". The editor
writes the string spellings while proxy-helper.ts tests for "http" and
casts everything else to 4|5 before handing it to the socks client, so a
chained proxy reaches it as "socks5" rather than 5. Typed as what is
actually stored; reconciling the two spellings needs a migration decision
and is left alone here.

* fix: continue clearing the frontend type-check baseline

70 errors down to 44.

Dead configuration removed:
- Terminal set terminal.options.bellStyle on xterm, which dropped the
  option in v5. The host editor still exposes the setting and stores it;
  it has simply had no effect on the terminal since that upgrade. Making
  the bell work again means handling the onBell event and is left alone.
- CodeEditor passed scrollPastEnd to basicSetup, which has no such option.
- FileManager passed an id to openWindow, which assigns its own and
  discards what it is given — the component was already being rendered
  under a different id than the one the caller held.

Widgets that were registered but unreachable:
- DockerActivityWidget and SshQuickConnectWidget register under
  "docker_activity" and "ssh_quick_connect", neither of which was in
  WidgetTypeId, and both referenced config interfaces that did not exist.
  Added the ids and the two interfaces, inferred from their edit forms and
  defaultConfig.

More endpoints given their real return types: getRecentFiles,
getPinnedFiles, getFolderShortcuts (arrays, not records), downloadSSHFile,
copySSHItem, generateKeyPair, generatePublicKeyFromPrivate and getSnippets.

parseGuacamoleConfig() handles the host row carrying guacamoleConfig either
parsed or as raw JSON, which GuacamoleApp was reading fields off directly.
TerminalHostConfig was missing name, which it reads for the activity log.

* fix: continue clearing the frontend type-check baseline

44 errors down to 17.

Host and AuditLog are now type aliases rather than interfaces. An
interface has no implicit index signature, so neither could be assigned
to the `[key: string]: unknown` shapes that TerminalHostConfig,
HostMetricsTab's HostConfig and several helpers declare — eight errors
came from that alone.

More dead configuration:
- i18n passed checkWhitelist to the language detector, which no longer
  has that option; supportedLngs already covers it.
- SSHAuthDialog passed scrollPastEnd to basicSetup, same as CodeEditor.
- AudioPreview's onLoadedMetadata never fired: react-h5-audio-player
  spells the prop onLoadedMetaData.
- MarkdownRenderer destructured `inline` from code(), which react-markdown
  removed in v9, so the flag was always undefined and every inline span
  took the block branch when it happened to carry a language class. Now
  derived from whether a className is present at all.
- SnippetsPanel put a title prop on a lucide icon, which does not forward
  it; changed to aria-label so the hint is actually reachable.

updateHostConfig in TabContext replaced tab.hostConfig wholesale with the
six-field literal it receives, dropping everything else the tab held about
the host. It now merges onto the existing config.

Also: getReleasesRSS, getUserAlerts and getVersionInfo have real return
types (UpdateLog kept private copies of two of them, and VersionInfo was
missing `version`, which the endpoint sends and the panel renders);
wakeOnLan and vncCredentialId get the numeric ids they are typed for; and
the tmux formatter takes i18next's TFunction instead of a hand-written
signature it does not satisfy.

* fix: clear the last frontend type errors and make CI actually run the check

Baseline is now zero, so the check can be turned on.

`npx tsc --noEmit` — what CI ran and what `npm run type-check` was — compiles
nothing: the root tsconfig.json is solution-style with "files": [], and
plain tsc does not follow project references. Both are now `tsc -b`, which
builds tsconfig.app.json and tsconfig.node.json. Verified by planting a type
error and watching the command fail.

Last defects in this batch:
- patchOpenTab could not carry hostId, so quick-connect's "save this host
  and attach the tab to it" call was passing a field excluded from the
  type all the way down. The column exists and updateForUser spreads
  whatever it receives, so the write worked; only the types disagreed.
  Widened front to back.
- The file-comparison window opened without x, y, width or height — every
  other openWindow call passes them — and sent a `type` field WindowInstance
  does not have.
- HostEditor gated a block on authType === "warpgate", which is not one of
  the eight authType values. Unreachable, and it held only a label and a
  description. Removed.
- FileManager passed onLoadDirectory to a sidebar that neither declares nor
  reads it, and FileManagerApp passed embedded to a FileManager that has no
  such prop.
- TunnelApp's minimal Host was missing three required flags.

The remainder were assertions at boundaries that are genuinely loose: bulk
host import takes rows assembled from untyped input and validates them
server-side, and a vi.fn() whose body only throws infers never.

* feat: add drive file browser and drag-and-drop upload for RDP (#1187)

Drive redirection could already be enabled per host, but the redirected
drive lived inside guacd with no way to reach it from the browser: the
client never handled onfilesystem, so the mounted volume was writable
from Windows and invisible from Termix.

Add a file browser panel that lists the drive, downloads files, and
uploads them, plus drag-and-drop onto the display which opens the panel
and uploads into the directory currently shown. The disable-upload and
disable-download connection settings are honoured by the UI, not just
passed to guacd.

A rejected upload stops the BlobWriter without firing onerror or
oncomplete, so the error ack is watched explicitly; otherwise the
transfer would hang forever. Directory reads carry a deadline for the
same reason.

Also declares Guacamole.Object, Client.onfilesystem, BlobReader and
BlobWriter in the local type definitions, which previously omitted them.

* fix: keep the mouse working on touch-capable devices in RDP/VNC (#1190)

Reported as "mouse input broken, keyboard fine" after 2.5.1 (#1102).

2.5.1 bound Guacamole.Mouse unconditionally. 2.6.0 replaced that with a
three-way branch on touchMode, and the touch branches replace the mouse
binding instead of adding to it:

    if (touchMode === "touchscreen")      new Guacamole.Mouse.Touchscreen(el)
    else if (touchMode === "touchpad")    new Guacamole.Mouse.Touchpad(el)
    else                                  new Guacamole.Mouse(el)

The two do not overlap. Guacamole.Mouse listens for mousedown/mousemove/
mouseup; Touchscreen and Touchpad listen only for touchstart/touchmove/
touchend. So in a touch mode nothing is listening for the mouse at all.

touchMode defaults to "touchscreen" whenever navigator.maxTouchPoints > 0,
which is true of every laptop with a touchscreen — machines that are still
driven by a mouse. Those users lost the pointer entirely while the keyboard
kept working, because Guacamole.Keyboard is bound independently.

The physical pointer is now always bound and a touch emulator is layered on
top when one is selected. Extracted to bindPointerInput() so the binding is
testable; the test fails against the old branch.

Note the issue also carries a second, unrelated report where well-formed
mouse frames do reach guacd and the VNC leg ignores them. That one is not
this, and the guacd image is pinned to 1.6.0 in both 2.5.1 and 2.6.1, so it
is not an upgrade either.

* fix: deduplicate /api/folders requests to prevent intermittent folder disappearance (#1191)

* chore: sync Crowdin translations

* fix: deduplicate /api/folders requests to prevent intermittent folder disappearance

getSSHFolders() had no request deduplication while getSSHHosts() used a TTL
cache with in-flight dedupe. When loadHosts() fired multiple times during
rapid navigation between Credentials and Hosts panels, the folder response
could arrive after the hosts response, causing the sidebar tree to render
without folder metadata.

- Add foldersCache (10s TTL) in hosts-request-cache.ts
- Wrap getSSHFolders() API call in getCachedSSHFolders()
- Invalidate folders cache on renameFolder, updateFolderMetadata,
  deleteAllHostsInFolder, and renameCredentialFolder
- Include foldersCache in invalidateHostsAndStatusCaches()

Closes Termix-SSH/Support#1103

Signed-off-by: RawNuke <67506722+RawNuke@users.noreply.github.com>

---------

Signed-off-by: RawNuke <67506722+RawNuke@users.noreply.github.com>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* chore(deps): bump undici from 8.9.0 to 8.10.0 in the prod-minor-updates group (#1195)

* chore: sync Crowdin translations

* chore(deps): bump undici in the prod-minor-updates group

Bumps the prod-minor-updates group with 1 update: [undici](https://github.com/nodejs/undici).


Updates `undici` from 8.9.0 to 8.10.0
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v8.9.0...v8.10.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 8.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: prod-minor-updates
...

Signed-off-by: dependabot[bot] <support@github.com>

---------

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

* feat: proxmox metrics integration

* feat: add folder select to the host multi select feature

* feat: implement context aware terminal toolbar with quick links, host info, image pasting, etc

* feat: made toolbar open file manager at path

* fix: delete folder route not invalidating host list cache

* fix: match host list icons with tab bar iconfix

* fix: change sidebar reset button icon to seperate against fullscreen button

* feat: unify connection system and add connection logs to guacd hosts

* fix: make mobile terminal scrollback match xterm wheel behavior (#1198)

* fix: route mobile terminal scrolling through xterm viewport

* docs: document mobile terminal touch scrolling

* chore: add a note to not place files in docs

* chore: remove touch imput from docs

* feat: improve snippet system with variable snippets and collapse settings

* feat: new fleet system with snippet, packages, files, and inventory features

* fix: command pallete not loading new activity and made enter load first item

* feat: add subhost from parent host organization feature

* feat: add workspaces feature to save tab layout

* perf: greatly improved performance across metrics polling and host management for enterprise users

* feat: add a onboarding system with a new interface simplicity system

* feat: finalize the multi dialect database system

* fix: bind trusted MFA devices to client installs (#1202)

* fix: merge OIDC group claims across sources (#1203)

* fix: allow disabling SSH keepalives (#1204)

* fix: distinguish reachable and available hosts (#1206)

* fix: throttle session activity persistence (#1207)

* fix: preserve saved RDP connection settings (#1208)

* fix: authenticate tunnel status stream (#1209)

* fix: select quick-created credentials (#1210)

* fix: stagger initial metrics collection (#1211)

* fix: stagger initial metrics collection

* fix: admit reachable hosts to initial metrics

* fix: prevent long host names shifting dashboard metrics (#1205)

* feat: add global touch input settings (#1201)

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

* fix: keep host list row sizing stable (#1213)

* fix(guacamole): correct Windows key mapping (#1216)

* fix: normalize OIDC discovery issuer URLs (#1218)

* fix: prompt for RDP domain credentials (#1212)

* fix: route status checks by connection origin (#1214)

* fix: restore desktop Tailscale configuration (#1215)

* fix(docker): restore Node 24 for ssh2 native crypto (#1217)

* feat: added new automations feature with events, channels, and steps

* feat: allowed some tabs in the app rail to be opened as its own tab or in a new right sidebar

* feat: expand onboarding process with more customization/features

* feat: initial implementation of the termix ai feature

* chore: run linter

* fix: issue #424 (#424)

https://github.com/Termix-SSH/Support/issues/424

* fix: Not working without internet connection. Missing OPKSSH binary in pre-built image. (#1133)

https://github.com/Termix-SSH/Support/issues/1133

* fix: SQLite forceSave on telemetry writes causes periodic SSH terminal stalls in 2.6.x (#1109)

https://github.com/Termix-SSH/Support/issues/1109

* feat: How to enable SSL using custom certificate (#1083)

https://github.com/Termix-SSH/Support/issues/1083

* fix: show profile API key after creation (#1221)

* feat: add trusted proxy authentication (#1222)

* fix: clarify SSH agent authentication (#1224)

* feat: add first-class split screen tabs (#1226)

* feat: add split tab data model

* feat: make split screens top-level tabs

* feat: persist and manage split layouts

* feat: launch native RDP on Windows desktop (#1223)

* feat: launch native RDP on Windows

* style: format native RDP launcher

* feat: enhance custom disk and network metrics (#1220)

* feat: enhance host disk and network metrics

* fix: align enhanced metrics types

* fix: preserve Proxmox guest identity on edit (#1219)

* fix: preserve Proxmox guest identity on edit

* fix: type Proxmox guest source metadata

* chore: dead-code cleanup and small refactors (#1225)

* chore: remove dead code and unused exports

* chore: remove unused api client functions

* chore: remove unused backend helpers

* refactor: extract getErrorMessage helper for repeated error extraction

* refactor: unify error message extraction across backend with getErrorMessage

* refactor: unify error message extraction in frontend with getErrorMessage

* refactor: merge duplicate imports from the same module

* refactor: use Array.includes in TabBar

* chore: drop biome, keep prettier as the single formatter

* style: apply prettier formatting to refactored files

* fix: close active tab with Ctrl+W on Windows

* fix: make tray Quit terminate the desktop app

* feat: verify host transfer integrity

* fix: reuse transfer sessions during verification

* feat: select the fastest host transfer route

* feat: tune host transfers adaptively

* feat: adapt background polling to activity (#1233)

* feat: adapt background polling to activity

* feat: extend adaptive polling coverage

* feat: make polling cost and network aware (#1234)

* feat: make repeat navigation feel instant (#1235)

* feat: make file operations feel immediate (#1236)

* feat: preload likely user actions (#1237)

* feat: preload likely file previews

* feat: preload likely host tools

* feat: preload likely file viewers

* fix: replace stale terminal input listeners

* feat: add links to docs for all new features

* chore: update readme

* fix: warn before discarding host changes (#1229)

* feat: learn local host action preferences (#1238)

* feat(terminal-toolbar): add bounded movable desktop toolbar (#1239)

* feat: add local adaptive decision engine (#1240)

* feat: adapt speculative resource usage (#1241)

* feat: persist adaptive transfer profiles (#1242)

* Fix .preferred_username when using LDAP login. (#1243)

* chore: sync Crowdin translations

* Fix .preferred_username when using LDAP login. Strips internal LDAP prefix from username.

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* feat: learn direct transfer routes (#1244)

* feat: learn speculative preload usefulness (#1245)

* fix: - Adjusting the SSH Authentication from Vault to something else fails (#1152)

https://github.com/Termix-SSH/Support/issues/1152

* fix: terminal graphical display, special characters inserted, distorted - `midnight comma... (#1145)

https://github.com/Termix-SSH/Support/issues/1145

* feat: single click on host in list opens session - should be only on double click (#1146)

https://github.com/Termix-SSH/Support/issues/1146

* feat: Terminal: custom font/ font selection/ how-to for adding a font - `MesloLGS NF` (#1140)

https://github.com/Termix-SSH/Support/issues/1140

* fix: revert host single click to open session, make double click an option (#1146)

Single click opens a session again by default. The old double click
behavior can be turned on in Customize Sidebar.

* chore: drop prettier check from beta release workflow, run formatter

* chore: patch dependabot vulnerabilities via npm overrides

* fix: reset adaptive resource state between tests to stop cross-test leaks

* feat: replace terminal toolbar density popover with a native select

* fix: pin hardwareConcurrency in adaptive budget tests so CI cores don't change the tier

* fix: allow dylib files in mac universal arch rules so mas build packages sharp

* feat: add file manager trash (#1250)

* feat: add inheritable connection defaults (#1246)

* feat: add desktop local terminal (#1247)

* feat: add interactive terminal macros (#1248)

* feat: add adaptive SSH local echo (#1249)

* fix: sync desktop host changes immediately (#1252)

* fix: route desktop sharing through synced server (#1253)

* Fix terminal image uploads and add safe diagnostics (#1254)

* feat: add configurable terminal image storage backends

* feat: add admin image storage settings

* fix: preserve native clipboard PNG uploads

* fix: quote terminal image paths safely

* docs: record image storage security remediation plan

* fix: close remote image SFTP channels

* fix: restrict remote image SFTP permissions

* fix: bound remote image SFTP writes

* fix: add best effort remote image retention

* fix: cap normalized image output size

* fix: bound concurrent image processing

* fix: fail closed on local image inspection errors

* test: cover fail closed image storage and atomic settings

* fix: enforce remote image quota and upload admission

* fix: serialize remote quota and verify existing paths

* fix: use synchronous sqlite settings transaction

* fix: keep settings transactions portable across dialects

* fix: bound image processing admission queue

* fix: serialize remote image quota across processes

* fix: recover stale remote image locks safely

* fix: preserve remote storage errors during unlock

* fix: fail closed when stale lock removal fails

* fix: harden image upload resource and storage cleanup

* fix: bound SFTP operations and lock lifetime

* fix: bound SFTP acquisition and cleanup callbacks

* fix: close late SFTP channels and test cleanup stalls

* fix: preserve SFTP inspection client context

* feat: add image upload source metadata

* fix: expose image upload metadata in logs

* chore: exclude internal plan from pull request

* style: apply prettier formatting

---------

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

* fix: batch of security hardening fixes (#1255)

* fix: bind desktop auto-session loopback check to the TCP peer address

* fix: escape HTML entities in Vault OIDC callback responses

* fix: route homepage ping and rss through the SSRF-safe outbound fetch

* fix: scope tunnel status endpoints to hosts the caller can access

* chore: update release notes

* chore: update release notes to write more about the ai integration

* fix: unbreak windows and macos electron builds after node-pty

Install Spectre-mitigated MSVC libs on the Windows runner and cover
node-pty's spawn-helper in the macOS universal arch rules.

* fix: rework connection defaults ui into a dialog and add missing i18n keys

* fix: rework macros panel with i18n, plain text matching, and list layout

* feat: add docs links for trash, connection defaults, and local echo

* fix: make image storage and trash tests pass on windows

* fix: stop docs links squeezing sidebar panel headers

* fix: put automations docs link back on the tabs row

* fix(desktop): keep Linux credential storage working on unrecognised desktops (#1261)

Chromium resolves safeStorage's backend from XDG_CURRENT_DESKTOP and falls
back to the basic_text store for any desktop it has no mapping for, which
covers every wlroots-style compositor (Hyprland, sway, niri, river).
isEncryptionAvailable() reports false for that store, so saveRemoteSyncJwt
refused every write and the OIDC sign-in it was storing appeared to succeed.
The sync engine then found no JWT and reported the session as expired, which
sent users looking at their OIDC provider for a fault that was never there.

Name the libsecret backend explicitly on those desktops. They run an ordinary
Secret Service, so that is enough to make encryption available again. KWallet
desktops keep their auto-detected backend, an explicit --password-store still
wins, and no stored secret can be orphaned by the switch because
isEncryptionAvailable() gated every write that would have created one.

Also stop discarding the {success: false} the main process returns when it
cannot store a credential: on a machine with no Secret Service at all, the
sign-in now says so instead of silently completing.

Co-authored-by: alexandre-vl <rafaelsenchais@gmail.com>

* chore: update release notes

* chore: update release notes

* fix(file-manager): widen trash dialog so names and paths are not cut off

* fix(sidebar): stop hover action tray overlapping the row below it

* fix(hosts): make real status colors toggle actually apply

* feat(local-terminal): add rail button and fix hardcoded tab label

* chore: update release notes

* fix(ai): hide assistant everywhere when admin disables it globally

* fix(automations): fix concurrency race, wire docker and internal event triggers

Claim the in-flight slot in the same tick it is checked, poll container
state for docker_event triggers, emit the internal events, apply the
schedule time zone, and expose the concurrency policy in the editor.

* fix(sidebar): rework host and credential drag-to-reorder

Adds a lock toggle in the sort menu and fixes reorder positioning,
cross-folder drops, and the duplicate drop indicator.

* chore(sidebar): drop unused sortKey prop from host and credential trees

* fix(sidebar): fix row height in click tray mode so status stripes stop overlapping

* fix(onboarding): remove add-first-host step that closed onboarding mid-flow

* fix(release): upload release notes so Mac App Store review submission stops failing

* chore: sync Crowdin translations for 2.7.0

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: RawNuke <67506722+RawNuke@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: kacperpietrzyk <105545577+kacperpietrzyk@users.noreply.github.com>
Co-authored-by: Brennan Neoh <497569+brennanneoh@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: T3rM1nAt0-R <niraj.sangani91@gmail.com>
Co-authored-by: Horziox <horziox.dev@gmail.com>
Co-authored-by: William Shi <184219650@qq.com>
Co-authored-by: Carl <scarlettme@qq.com>
Co-authored-by: Raw_Nuke <67506722+RawNuke@users.noreply.github.com>
Co-authored-by: njz-cvm <njz@cvm.com>
Co-authored-by: Alexandre VARGAS <alexandre.vargas.lopez@gmail.com>
Co-authored-by: alexandre-vl <rafaelsenchais@gmail.com>
2026-08-19 14:12:06 -05:00

4650 lines
248 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"connection": {
"retryingIn": "Tentando novamente em {{seconds}}s ({{attempt}}/{{max}})",
"retryingNow": "A tentar novamente... ({{attempt}}/{{max}})",
"disconnected": "Não foi possível ligar",
"reconnect": "Reconectar"
},
"termixId": {
"title": "Termix ID",
"loadFailed": "Falha ao carregar o Termix ID",
"claimTitle": "Reivindicar o seu Termix ID",
"claimIntro": "Escolha um identificador único. As suas chaves públicas SSH serão publicadas num URL público que pode adicionar ao ficheiro authorized_keys de qualquer servidor.",
"handleLabel": "Identificador",
"handlePlaceholder": "alice",
"checking": "A verificar…",
"available": "Disponível",
"taken": "Já utilizado",
"invalidHandle": "Apenas letras minúsculas, números, - e _",
"descriptionLabel": "Descrição (opcional)",
"descriptionPlaceholder": "Chaves do portátil de trabalho e do telemóvel",
"create": "Criar Termix ID",
"created": "Termix ID criado",
"createFailed": "Falha ao criar o Termix ID",
"deleteConfirm": "Eliminar o seu Termix ID e todas as chaves publicadas? Os servidores que provisionou manterão as chaves até as remover manualmente.",
"deleted": "Termix ID eliminado",
"deleteFailed": "Falha ao eliminar o Termix ID",
"copyFailed": "Falha ao copiar",
"resolverUrlLabel": "URL público de resolução",
"provisionLabel": "Provisionar um servidor",
"publishTitle": "Publicar uma chave pública",
"generate": "Gerar",
"generateTooltip": "Gerar um par de chaves Ed25519 — publica a chave pública e descarrega a chave privada para o seu dispositivo",
"saveToVault": "Guardar nas credenciais",
"keyPlaceholder": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5... user@host",
"labelPlaceholder": "Etiqueta (opcional)",
"add": "Adicionar",
"importFromCredential": "Ou importar de uma credencial guardada",
"keyPublished": "Chave publicada",
"addKeyFailed": "Falha ao adicionar chave",
"generatedSaved": "Par de chaves gerado e guardado no cofre de credenciais. A chave privada também foi descarregada.",
"generatedOnly": "Par de chaves gerado — chave privada descarregada (exibida apenas uma vez).",
"generateFailed": "Falha ao gerar chave",
"imported": "Chave importada da credencial",
"importFailed": "Falha ao importar chave",
"noKeys": "Nenhuma chave pública publicada ainda.",
"keysTitle": "Chaves publicadas",
"published": "Publicada",
"hidden": "Oculta",
"keyRemoved": "Chave removida",
"removeKeyFailed": "Falha ao remover chave",
"updateKeyFailed": "Falha ao atualizar chave",
"fromVault": "Do cofre de credenciais",
"linkedToTermixId": "Publicada via Termix ID",
"selectCredential": "Selecionar uma credencial...",
"import": "Importar",
"caTitle": "Autoridade de certificação",
"caIntro": "Confie nesta CA num servidor e ele aceitará qualquer certificado que assinar. Rode para revogar tudo de uma só vez; os certificados também expiram automaticamente.",
"caEnable": "Ativar CA",
"caEnabled": "CA ativada",
"caCreateFailed": "Falha ao ativar CA",
"caPublicKeyLabel": "Chave pública da CA",
"caTrustLabel": "Confiar num servidor (executar como root)",
"caRotate": "Rodar",
"caRotateConfirm": "Rodar a CA? Todos os certificados que assinou deixarão de ser aceites e terão de ser reemitidos.",
"caRotated": "CA rodada — certificados anteriores revogados",
"caRotateFailed": "Falha ao rodar CA",
"caDelete": "Remover CA",
"caDeleteConfirm": "Remover a CA?",
"caDeleted": "CA removida",
"caDeleteFailed": "Falha ao remover CA",
"caValidityLabel": "Validade do certificado (dias)",
"issueCert": "Certificado",
"issueCertTooltip": "Emitir um certificado SSH para esta chave, assinado pela sua CA",
"certIssued": "Certificado emitido e transferido",
"certIssueFailed": "Falha ao emitir certificado"
},
"credentials": {
"folders": "Pastas",
"folder": "Pasta",
"password": "Palavra-passe",
"key": "Chave",
"sshPrivateKey": "Chave Privada SSH",
"upload": "Carregar",
"keyPassword": "Palavra-passe da Chave",
"sshKey": "Chave SSH",
"uploadPrivateKeyFile": "Carregar Ficheiro de Chave Privada",
"searchCredentials": "Pesquisar credenciais...",
"addCredential": "Adicionar Credencial",
"caCertificate": "Certificado CA (-cert.pub)",
"caCertificateDescription": "Opcional: Carregar ou colar o ficheiro de certificado assinado pela CA (ex.: id_ed25519-cert.pub). Necessário quando o seu servidor SSH utiliza autorização baseada em certificados.",
"uploadCertFile": "Carregar ficheiro -cert.pub",
"clearCert": "Limpar",
"certLoaded": "Certificado carregado",
"certPublicKeyLabel": "Certificado CA",
"certTypeLabel": "Tipo de certificado",
"pasteOrUploadCert": "Colar ou carregar um certificado -cert.pub...",
"hasCaCert": "Tem Certificado CA",
"noCaCert": "Sem Certificado CA",
"noPublicKeyAvailable": "Nenhuma chave pública disponível. Abra o editor de credenciais primeiro.",
"deployCommandCopied": "Comando de implementação copiado",
"sortCredentials": "Ordenar Credenciais",
"sortDefault": "Ordem predefinida",
"sortNameAsc": "Nome (A → Z)",
"sortNameDesc": "Nome (Z → A)",
"sortUsernameAsc": "Nome de utilizador (A → Z)",
"sortUsernameDesc": "Nome de utilizador (Z → A)",
"filterCredentials": "Filtrar Credenciais",
"filterClearAll": "Limpar Filtros",
"filterTypeGroup": "Tipo",
"filterTypePassword": "Palavra-passe",
"filterTypeKey": "Chave SSH",
"filterTagsGroup": "Etiquetas",
"copyDeployCommand": "Copiar comando de implantação",
"deleteCredentialAction": "Apagar credencial",
"editCredentialAction": "Editar credencial",
"failedToDeleteCredential": "Falha ao eliminar credencial",
"idBadge": "EU IA",
"keyBadge": "CHAVE",
"passwordBadge": "PWD",
"renameFolder": "Renomear pasta",
"deleteFolder": "Apagar pasta",
"deleteCredentialConfirm": "Apagar credencial \"{{name}}\"?",
"deletedCredential": "Eliminado {{name}}",
"deploySSHKeyTitle": "Implantar chave no host",
"loadingCredentials": "A carregar credenciais...",
"noCredentialsFound": "Nenhuma credencial encontrada",
"noCredentialsMatchSearch": "Nenhuma credencial corresponde à sua pesquisa.",
"addCredentialBtn": "Adicionar credencial",
"failedToReorder": "Falha ao reordenar as credenciais",
"failedToMoveCredential": "Falha ao mover as credenciais",
"sortManual": "Manual (arrastar para reordenar)",
"customizeSidebar": "Personalizar a barra lateral",
"customizeSidebarDescription": "Escolha o aspeto e o comportamento da lista de credenciais.",
"customizeDensityTitle": "Densidade",
"densityComfortableDesc": "Uma credencial por linha, com detalhes adicionais.",
"densityCompactDesc": "Uma linha por credencial, para listas mais longas.",
"displayDensityComfortable": "Confortável",
"displayDensityCompact": "Compactar",
"customizeBehaviorTitle": "Comportamento",
"showCredentialTags": "Mostrar etiquetas",
"showCredentialTagsDesc": "Exibir etiquetas na lista de credenciais",
"actionsVisibility": "Ações de credenciais",
"actionsVisibilityDesc": "Quando os botões de ligação e gestão em cada credencial aparecerem",
"actionsAlways": "Sempre visível",
"actionsOnly": "Ligue apenas, descanse com um clique.",
"actionsHover": "Mostrar ao passar o cursor",
"actionsClick": "Mostrar ao clicar",
"customizeSortHint": "A ordem de classificação encontra-se no menu de classificação da barra de ferramentas.",
"expandActions": "Expandir ações",
"collapseActions": "Ações de cobrança",
"backToHosts": "Voltar para Anfitriões",
"backToCredentials": "Voltar às credenciais",
"searchCredentialsPlaceholder": "Credenciais de pesquisa…",
"deployDialogTitle": "Implantar chave SSH",
"deployDialogDesc": "Implemente {{name}} nas chaves autorizadas de um host.",
"targetHostLabel": "Anfitrião alvo",
"selectHostOption": "Selecione um host...",
"deployingBtn": "Implantação...",
"deployBtn": "Colocar",
"keyDeployedSuccess": "Chave implantada com sucesso",
"failedToDeployKey": "Falha ao implantar a chave",
"folderRenamedTo": "Pasta renomeada para \"{{name}}\"",
"failedToRenameFolder": "Falha ao renomear a pasta",
"arrangeUnlockedSwitchedToManual": "A ordenação foi alterada para manual, pelo que a sua ordem será mantida.",
"arrangeUnlocked": "Desbloqueie e arraste para reorganizar."
},
"homepage": {
"title": "Página Inicial",
"addWidget": "Adicionar widget",
"editWidget": "Editar widget",
"deleteWidget": "Apagar",
"widgetTypes": "Tipos de Widgets",
"serviceLink": "Link de Serviço",
"folder": "Pasta",
"clock": "Relógio",
"notes": "Notas",
"hostStatus": "Estado do Host",
"bookmarkList": "Marcadores",
"zoomIn": "Ampliar",
"zoomOut": "Reduzir",
"resetView": "Repor Vista",
"lockLayout": "Bloquear Disposição",
"unlockLayout": "Desbloquear Disposição",
"noWidgets": "Clique com o botão direito ou em + para adicionar o seu primeiro widget",
"openFullView": "Abrir Vista Completa",
"previewTitle": "Pré-visualização da Página Inicial",
"cancel": "Cancelar",
"save": "Guardar",
"title_label": "Título",
"widgetTitlePlaceholder": "Título do widget (opcional)",
"url": "URL",
"imageUrl": "URL de Imagem Personalizada",
"imageUrlHint": "Deixe em branco para usar automaticamente o favicon do site",
"showImage": "Mostrar Imagem",
"description": "Descrição",
"color": "Cor",
"icon": "Ícone",
"expanded": "Expandido por predefinição",
"timezone": "Fuso Horário",
"showSeconds": "Mostrar segundos",
"format12h": "12 horas",
"format24h": "24 horas",
"content": "Conteúdo",
"backgroundColor": "Cor de Fundo",
"host": "Host",
"showMetrics": "Mostrar métricas",
"links": "Hiperligações",
"addLink": "Adicionar ligação",
"linkLabel": "Etiqueta",
"linkUrl": "URL",
"removeLink": "Remover",
"categoryLinks": "Hiperligações",
"categoryInfo": "Info",
"categorySystem": "Sistema",
"widgetServiceLinkDesc": "Um mosaico clicável que liga a um URL de serviço",
"widgetFolderDesc": "Um contentor para agrupar widgets relacionados",
"widgetClockDesc": "Um relógio em tempo real com fuso horário configurável",
"widgetNotesDesc": "Um widget de notas em markdown",
"widgetHostStatusDesc": "Mostra CPU, memória e disco em tempo real para um anfitrião SSH",
"widgetBookmarkListDesc": "Uma lista de hiperligações rápidas",
"copyLink": "Copiar ligação",
"linkCopied": "Ligação copiada!",
"location": "Localização",
"temperatureUnit": "Unidade de temperatura",
"showForecast": "Mostrar previsão de 3 dias",
"scrolling": "Permitir deslocamento",
"feedUrl": "URL do feed",
"maxItems": "Itens máx.",
"showDescription": "Mostrar descrição",
"widgetWeatherName": "Tempo",
"widgetWeatherDesc": "Tempo em direto para qualquer localização",
"widgetIframeName": "Incorporação iFrame",
"widgetIframeDesc": "Incorpora qualquer URL num iframe",
"widgetRssName": "Feed RSS",
"widgetRssDesc": "Mostra itens de um feed RSS ou Atom",
"dragToFolder": "Arraste widgets aqui ou use + para adicionar",
"showDisk": "Mostrar utilização do disco",
"addToFolder": "Adicionar widget à pasta",
"noHostSelected": "Nenhum anfitrião selecionado",
"metricsNotAvailable": "Métricas não disponíveis",
"selectHost": "Selecionar um host...",
"displayedMetrics": "Métricas Exibidas",
"metricCpu": "CPU",
"metricMemory": "Memória",
"metricDisk": "Disco",
"metricUptime": "Tempo de atividade",
"metricSystem": "Sistema",
"metricOs": "SO",
"metricKernel": "Kernel",
"metricHostname": "Nome do host",
"metricNetwork": "Rede",
"metricProcesses": "Processos",
"metricProcessesTotal": "total",
"metricProcessesRunning": "em execução",
"categoryMonitoring": "Monitorização",
"loading": "A carregar...",
"noData": "Sem dados disponíveis",
"allClear": "Tudo em ordem",
"acknowledgeAlert": "Reconhecer",
"noPingUrls": "Nenhum URL configurado",
"pingLabel": "Etiqueta",
"addPingUrl": "Adicionar URL",
"showLatency": "Mostrar latência",
"refreshInterval": "Intervalo de atualização",
"seconds": "segundos",
"filterActivityTypes": "Filtrar tipos",
"filterTypesHint": "Deixar vazio para mostrar todos",
"showTimestamp": "Mostrar timestamp",
"uptimeUnavailable": "Tempo de atividade indisponível",
"uptimeLabel": "Tempo de atividade",
"overviewVersion": "Versão",
"overviewUpdate": "Atualizado",
"overviewUpdateLabel": "Atualização",
"overviewUpdateAvailable": "Atualização disponível",
"overviewDatabase": "Base de dados",
"overviewUptime": "Tempo de atividade",
"noHosts": "Sem hosts configurados",
"hostGridHosts": "Hosts",
"hostGridAllHint": "Deixar em branco para mostrar todos os hosts",
"columns": "Colunas",
"showIp": "Mostrar endereço IP",
"connectionType": "Tipo de ligação",
"layout": "Layout",
"showStatus": "Mostrar estado",
"showHostName": "Mostrar nome do host",
"noDockerActivity": "Sem atividade do Docker",
"noActivity": "Sem atividade",
"showAcknowledged": "Mostrar reconhecidos",
"showCurrentValue": "Mostrar valor atual",
"chartMetric": "Métrica",
"metricRange": "Intervalo",
"widgetMetricsChartName": "Gráfico de métricas",
"widgetMetricsChartDesc": "Gráfico histórico de CPU, memória, disco ou rede para um host",
"widgetHostGridName": "Grelha de hosts",
"widgetHostGridDesc": "Vista em grelha dos estados dos hosts SSH",
"widgetAlertFeedName": "Feed de alertas",
"widgetAlertFeedDesc": "Disparos de alertas em tempo real com suporte a reconhecimento",
"widgetPingStatusName": "Estado do ping",
"widgetPingStatusDesc": "Estado do ping HTTP para um ou mais URLs",
"widgetRecentActivityName": "Atividade recente",
"widgetRecentActivityDesc": "Feed deslocável da atividade recente do Termix",
"widgetTermixUptimeName": "Tempo de atividade do Termix",
"widgetTermixUptimeDesc": "Contador em tempo real do tempo de atividade do servidor Termix",
"widgetSystemOverviewName": "Visão geral do sistema",
"widgetSystemOverviewDesc": "Versão do Termix, saúde da base de dados e tempo de atividade de relance",
"widgetSshQuickConnectName": "Ligação rápida SSH",
"widgetSshQuickConnectDesc": "Botões de um clique para abrir sessões SSH",
"widgetDockerActivityName": "Atividade do Docker",
"widgetDockerActivityDesc": "Eventos recentes de contentores Docker em todos os hosts",
"widgetCalendarName": "Calendário",
"widgetCalendarDesc": "Um calendário mensal com o dia de hoje em destaque",
"widgetCountdownName": "Contagem Decrescente",
"widgetCountdownDesc": "Temporizador de contagem decrescente até uma data alvo",
"widgetSearchBarName": "Barra de Pesquisa",
"widgetSearchBarDesc": "Widget de pesquisa rápida na web",
"widgetTextBannerName": "Banner de Texto",
"widgetTextBannerDesc": "Um rótulo ou cabeçalho de secção em destaque para a tela",
"widgetImageWidgetName": "Imagem",
"widgetImageWidgetDesc": "Exibir uma imagem a partir de um URL",
"widgetMarkdownNotesName": "Notas Markdown",
"widgetMarkdownNotesDesc": "Notas enriquecidas com renderização inline de Markdown",
"widgetCustomApiName": "API Personalizada",
"widgetCustomApiDesc": "Obter e exibir dados de qualquer API JSON",
"widgetServiceGridName": "Grelha de Serviços",
"widgetServiceGridDesc": "Uma grelha configurável de links de serviços em mosaico",
"widgetDashboardLinksName": "Links do Painel",
"widgetDashboardLinksDesc": "Exibir os seus links de serviço configurados a partir do painel",
"widgetSearchLinksName": "Atalhos de Pesquisa",
"widgetSearchLinksDesc": "Botões de atalho para pesquisa rápida com entrada inline",
"widgetLinkTreeName": "Árvore de Links",
"widgetLinkTreeDesc": "Secções agrupadas de links com cabeçalhos",
"calMon": "Seg",
"calTue": "Ter",
"calWed": "Qua",
"calThu": "Qui",
"calFri": "Sex",
"calSat": "Sáb",
"calSun": "Dom",
"startOnMonday": "Começar a semana na segunda-feira",
"countdownNoDate": "Nenhuma data alvo definida",
"countdownPast": "O evento já passou",
"countdownDays": "dias",
"countdownHours": "horas",
"countdownMinutes": "min",
"countdownSeconds": "seg",
"countdownLabel": "Rótulo",
"countdownLabelPlaceholder": "p. ex. Dia de Lançamento",
"countdownShowDays": "Mostrar Dias",
"countdownShowHours": "Mostrar Horas",
"targetDate": "Data Alvo",
"searchEngine": "Motor de Pesquisa",
"customSearchUrl": "URL de Pesquisa Personalizada",
"searchPlaceholder": "Pesquisar...",
"searchGo": "Ir",
"searchPlaceholderLabel": "Texto do Placeholder",
"searchPlaceholderHint": "Texto apresentado no campo de pesquisa",
"openInNewTab": "Abrir num Novo Separador",
"searchQueryPlaceholder": "Introduzir consulta...",
"noSearchShortcuts": "Nenhum atalho configurado",
"addSearchShortcut": "Adicionar Atalho",
"fontSize": "Tamanho da Letra",
"textAlign": "Alinhamento do Texto",
"fontWeight": "Peso da Fonte",
"clearColor": "Limpar Cor",
"imageFit": "Ajuste da Imagem",
"imageLinkUrl": "URL do Link",
"noImage": "Nenhum URL de imagem definido",
"altText": "Texto Alternativo",
"altTextPlaceholder": "Descreva a imagem",
"renderMarkdown": "Renderizar Markdown",
"displayMode": "Modo de Exibição",
"displayField": "Campo de Exibição",
"jsonPath": "Caminho JSON",
"customApiLabel": "Etiqueta",
"customApiLabelPlaceholder": "p. ex. Temperatura",
"customApiUnit": "Unidade",
"customApiNoUrl": "Nenhum URL de API configurado",
"customApiError": "Falha ao obter",
"customApiNotArray": "A resposta não é um array",
"addService": "Adicionar Serviço",
"showLabels": "Mostrar Etiquetas",
"iconSize": "Tamanho do Ícone",
"noDashboardLinks": "Nenhuma ligação do painel configurada",
"noLimit": "Sem limite",
"sectionHeading": "Cabeçalho da Secção",
"addSection": "Adicionar Secção",
"compactMode": "Modo Compacto",
"showDetailed": "Mostrar Detalhes",
"selectHosts": "Selecionar Hosts",
"allHosts": "Todos os hosts",
"listLayout": "Lista",
"gridLayout": "Grelha",
"terminal": "Terminal",
"files": "Ficheiros",
"docker": "Docker",
"range15m": "15 minutos",
"range1h": "1 hora",
"range6h": "6 horas",
"range24h": "24 horas",
"metricNetRx": "Download de Rede",
"metricNetTx": "Upload de Rede",
"severityFilter": "Filtro de Gravidade",
"filterAll": "Tudo",
"accentColor": "Cor de Destaque",
"widgetSshTerminalName": "Terminal SSH",
"widgetSshTerminalDesc": "Um terminal SSH integrado ligado a um host configurado",
"sshTerminalNoHost": "Nenhum host configurado",
"sshTerminalConnect": "Ligar",
"sshTerminalAutoConnect": "Ligação automática ao carregar",
"widgetQuickConnectName": "Ligação Rápida",
"widgetQuickConnectDesc": "Botões de lançamento num clique para qualquer tipo de ligação em todos os seus hosts",
"connectionTypes": "Tipos de Ligação",
"connType_terminal": "Terminal",
"connType_files": "Gestor de Ficheiros",
"connType_docker": "Docker",
"connType_tunnel": "Túnel",
"connType_host-metrics": "Métricas do Host",
"connType_rdp": "RDP",
"connType_vnc": "VNC",
"connType_telnet": "Telnet",
"widgetFileManagerName": "Gestor de Ficheiros",
"widgetFileManagerDesc": "Gestor de ficheiros SFTP integrado para um host configurado",
"widgetDockerName": "Gestor Docker",
"widgetDockerDesc": "Gestor de contentores Docker integrado para um host configurado",
"widgetTunnelName": "Gestor de Túneis",
"widgetTunnelDesc": "Gestor de túneis SSH integrado para um host configurado",
"widgetNoHostSelected": "Nenhum host configurado"
},
"serverConfig": {
"title": "Configuração do Servidor",
"description": "Configure o URL do servidor Termix para se ligar aos seus serviços de backend",
"serverUrl": "URL do Servidor",
"enterServerUrl": "Por favor, insira um URL do servidor",
"saveFailed": "Falha ao guardar a configuração",
"saveError": "Erro ao guardar a configuração",
"saving": "A guardar...",
"saveConfig": "Guardar Configuração",
"helpText": "Insira o URL onde o seu servidor Termix está a ser executado (ex: http://localhost:30001 ou https://your-server.com)",
"changeServer": "Alterar Servidor",
"mustIncludeProtocol": "O URL do servidor deve começar com http:// ou https://",
"allowInvalidCertificate": "Permitir certificado inválido",
"allowInvalidCertificateDesc": "Usar apenas para servidores auto-hospedados de confiança com certificados auto-assinados ou de endereço IP.",
"useEmbedded": "Usar Servidor Local",
"embeddedDesc": "Executar o Termix com o servidor local incorporado (não é necessário servidor remoto)",
"embeddedConnecting": "A ligar ao servidor local...",
"embeddedNotReady": "O servidor local ainda não está pronto. Aguarde um momento e tente novamente.",
"localServer": "Servidor Local",
"savedServers": "Servidores Guardados",
"noSavedServers": "Nenhum servidor guardado",
"removeServer": "Remover"
},
"migrationNotice": {
"title": "O Termix Desktop funciona agora de forma independente.",
"body1": "Esta aplicação costumava ligar-se diretamente ao seu servidor Termix. Foi reformulado para funcionar de forma totalmente independente, armazenando hosts e credenciais localmente para que continue a funcionar offline. A sincronização bidirecional com um servidor Termix auto-hospedado é agora opcional.",
"body2": "Os seus hosts e credenciais atuais ainda estão em {{url}}. Ative a Sincronização Remota e volte a ligar-se a esse servidor para os recuperar e mantê-los sincronizados daqui para a frente.",
"dismiss": "Agora não",
"setUpSync": "Configurar sincronização remota"
},
"remoteSync": {
"title": "Sincronização remota",
"description": "Opcionalmente, ligue esta aplicação de desktop a um servidor Termix auto-hospedado para sincronizar os seus hosts, credenciais e pedaços de código entre dispositivos. A aplicação funciona sempre totalmente offline, independentemente de estar ligado ou não.",
"notConnected": "Não conectado",
"connected": "Conectado",
"connectedTo": "Ligado a {{url}}",
"lastSynced": "Última sincronização {{time}}",
"neverSynced": "Nunca sincronizado",
"syncError": "Erro de sincronização: {{message}}",
"needsReauth": "Login expirou",
"connectButton": "Ligar ao servidor",
"disconnectButton": "Desconectar",
"syncNowButton": "Sincronizar agora",
"syncing": "Sincronizando...",
"serverUrl": "URL do servidor",
"enterServerUrl": "Por favor, introduza um URL de servidor.",
"mustIncludeProtocol": "O URL do servidor deve começar por http:// ou https://",
"connectionTestFailed": "Não foi possível aceder a um servidor Termix nesse URL.",
"allowInvalidCertificate": "Permitir certificado inválido",
"allowInvalidCertificateDesc": "Utilize apenas em servidores auto-hospedados fidedignos com certificados autoassinados ou de endereço IP.",
"savedServers": "Servidores salvos",
"removeServer": "Remover",
"continueButton": "Continuar",
"cancelButton": "Cancelar",
"signInTitle": "Faça login em {{url}}",
"originTitle": "Origem da ligação",
"originDescription": "Por predefinição, escolha de onde se originam as ligações SSH. Esta configuração pode ser alterada para cada host individualmente.",
"originLocal": "Este dispositivo (rede local)",
"originRemote": "Servidor remoto",
"bannerReconnect": "Reconectar",
"bannerMessage": "A sincronização remota requer nova autenticação."
},
"versionCheck": {
"error": "Erro na Verificação de Versão",
"checkFailed": "Falha ao verificar atualizações",
"upToDate": "A aplicação está atualizada",
"currentVersion": "Está a executar a versão {{version}}",
"updateAvailable": "Atualização disponível",
"updateLinkLabel": "Atualização disponível — abra as notas de lançamento no GitHub.",
"newVersionAvailable": "Está disponível uma nova versão! Está a executar {{current}}, mas a {{latest}} está disponível.",
"betaVersion": "Versão Beta",
"betaVersionDesc": "Está a executar a {{current}}, que é mais recente do que a última versão estável {{latest}}.",
"releasedOn": "Lançado a {{date}}",
"downloadUpdate": "Descarregar Atualização",
"checking": "A verificar atualizações...",
"checkUpdates": "Verificar Atualizações",
"checkingUpdates": "A verificar atualizações...",
"updateRequired": "Atualização necessária"
},
"common": {
"close": "Fechar",
"minimize": "Minimizar",
"online": "Online",
"offline": "Offline",
"unknown": "Desconhecido",
"continue": "Continuar",
"maintenance": "Manutenção",
"degraded": "Degradado",
"error": "Erro",
"warning": "Aviso",
"unsavedChanges": "Alterações não guardadas",
"dismiss": "Ignorar",
"more": "Mais",
"loading": "A carregar...",
"optional": "Opcional",
"connect": "Ligar",
"copied": "Copiado",
"connecting": "A ligar...",
"updateAvailable": "Atualização disponível",
"appName": "Termix",
"openInNewTab": "Abrir num novo separador",
"noReleases": "Sem lançamentos",
"updatesAndReleases": "Atualizações e Lançamentos",
"newVersionAvailable": "Está disponível uma nova versão ({{version}}).",
"failedToFetchUpdateInfo": "Falha ao obter informações de atualização",
"preRelease": "Pré-lançamento",
"noReleasesFound": "Nenhum lançamento encontrado.",
"cancel": "Cancelar",
"username": "Nome de utilizador",
"login": "Iniciar sessão",
"logout": "Terminar sessão",
"register": "Registar",
"password": "Palavra-passe",
"confirmPassword": "Confirmar palavra-passe",
"back": "Voltar",
"save": "Guardar",
"saving": "A guardar...",
"delete": "Eliminar",
"rename": "Renomear",
"edit": "Editar",
"add": "Adicionar",
"confirm": "Confirmar",
"no": "Não",
"or": "OU",
"next": "Seguinte",
"previous": "Anterior",
"refresh": "Atualizar",
"language": "Idioma",
"checking": "A verificar...",
"checkingDatabase": "A verificar a ligação à base de dados...",
"checkingAuthentication": "A verificar a autenticação...",
"backendReconnected": "Ligação ao servidor restabelecida",
"connectionDegraded": "Ligação ao servidor perdida, a recuperar…",
"reload": "Recarregar",
"remove": "Remover",
"create": "Criar",
"update": "Atualizar",
"copy": "Copiar",
"copyFailed": "Falha ao copiar para a área de transferência",
"maximize": "Maximizar",
"restore": "Restaurar",
"of": "de",
"saved": "Guardado",
"deleted": "Eliminado",
"deleteFailed": "Falha ao eliminar",
"saveFailed": "Falha ao guardar",
"required": "Obrigatório"
},
"onboarding": {
"stepCounter": "Passo {{current}} de {{total}}",
"skip": "Ignorar configuração",
"next": "Seguinte",
"finish": "Comece agora",
"welcomeTitle": "Bem-vindo ao Termix",
"welcomeIntro": "O Termix gere os seus servidores a partir de um único local. Esta configuração demora cerca de um minuto e nada aqui é permanente.",
"welcome_hosts": "Salve os seus servidores",
"welcome_hosts_desc": "Mantenha todas as máquinas que gere numa única lista.",
"welcome_terminal": "Ligue-se instantaneamente",
"welcome_terminal_desc": "Abra um terminal num separador, sem um cliente SSH separado.",
"welcome_files": "Navegue e edite ficheiros",
"welcome_files_desc": "Carregar, descarregar e editar ficheiros remotos.",
"presetTitle": "Quanto quer que apareça no ecrã?",
"presetIntro": "O Termix pode ser tão simples ou detalhado quanto desejar. Escolha um ponto de partida.",
"presetChangeLater": "Pode alternar entre predefinições ou alterar qualquer configuração individual posteriormente em Definições, na secção Interface.",
"appearanceTitle": "Faça dele o seu.",
"appearanceIntro": "Escolha um tema, uma cor de destaque e o seu idioma. Todos os três podem ser alterados posteriormente nas Definições.",
"featuresTitle": "O que mais faz a Termix?",
"featuresIntro": "Cada servidor que guarda pode ser aberto em mais do que um terminal. Veja o que o espera por trás dos ícones à esquerda.",
"feature_files": "Gestor de arquivos",
"feature_files_desc": "Navegue, carregue, descarregue e edite ficheiros via SFTP sem sair da aplicação.",
"feature_desktop": "Área de trabalho remota",
"feature_desktop_desc": "Abra as sessões RDP, VNC e Telnet num separador, da mesma forma que o SSH.",
"feature_tunnels": "Túneis",
"feature_tunnels_desc": "Encaminhar portas através de um servidor para chegar a serviços que não estão expostos.",
"feature_docker": "Docker",
"feature_docker_desc": "Visualize contentores, leia registos e acompanhe as estatísticas em qualquer host que execute o Docker.",
"feature_snippets": "Trechos",
"feature_snippets_desc": "Guarde os comandos que executa com frequência e envie-os para um terminal com um único clique.",
"feature_automations": "Automações",
"feature_automations_desc": "Execute automaticamente os passos quando algo acontece e receba notificações.",
"feature_metrics": "Métricas e alertas",
"feature_metrics_desc": "Monitorize a utilização de CPU, memória e disco ao longo do tempo e receba alertas quando apresentam problemas.",
"featuresRailHint": "Não precisa de nenhum destes ícones? Oculte qualquer ícone da barra lateral em Definições, na secção Navegação.",
"workflowTitle": "Movimente-se mais rapidamente",
"workflowIntro": "Algumas práticas que poupam bastante tempo quando já tem alguns servidores.",
"workflow_palette": "Paleta de comandos",
"workflow_palette_desc": "Aceda a qualquer servidor ou ação digitando. Prima Shift duas vezes para abrir.",
"workflow_split": "Tela dividida",
"workflow_split_desc": "Apresente até quatro separadores lado a lado para visualizar registos enquanto trabalha.",
"workflow_dock": "Painel lateral",
"workflow_dock_desc": "Clique com o botão do meio do rato ou com o botão direito do rato num ícone da barra lateral para o abrir como separador ou fixá-lo à direita.",
"workflow_workspaces": "Espaços de trabalho",
"workflow_workspaces_desc": "Guarde um conjunto de separadores abertos e reabra todo o layout mais tarde.",
"securityTitle": "Protegendo os seus logins",
"securityIntro": "O Termix armazena as suas credenciais, por isso vale a pena dedicar um minuto para ver como funciona.",
"security_credentials": "Credenciais reutilizáveis",
"security_credentials_desc": "Guarde uma chave ou palavra-passe uma única vez e associe-a a quantos servidores desejar.",
"security_twofa": "Autenticação de dois fatores e chaves de acesso",
"security_twofa_desc": "Adicione um código TOTP ou uma chave de acesso à sua conta em Definições, na secção Segurança.",
"security_identity": "Termix ID",
"security_identity_desc": "Emita certificados SSH de curta duração em vez de copiar as chaves para todos os servidores.",
"security_sharing": "Compartilhamento",
"security_sharing_desc": "Conceder acesso a um servidor a outros utilizadores sem fornecer a palavra-passe.",
"securityEncryptionNote": "As credenciais são encriptadas antes de serem armazenadas e só são desencriptadas quando uma ligação precisa delas.",
"doneTitle": "Está tudo pronto!",
"doneHeading": "Configuração concluída",
"doneDesc": "Selecione um servidor na barra lateral para abrir um terminal, navegar pelos seus ficheiros ou visualizar as suas métricas.",
"done_settings": "Alterar qualquer coisa mais tarde",
"done_settings_desc": "Os temas, a densidade do layout e quais os ícones que aparecem podem ser definidos nas Definições.",
"done_rerun": "Quer repetir?",
"done_rerun_desc": "Abra as Definições, aceda a Interface e escolha Executar configuração para repetir estes passos.",
"done_desktop": "Aplicação para computador",
"done_desktop_desc": "O Termix funciona como uma aplicação para desktop em Windows, macOS e Linux.",
"done_desktop_link": "Obtenha a aplicação para desktop",
"done_mobile": "Aplicativo móvel",
"done_mobile_desc": "Leve os seus servidores consigo no iOS e no Android.",
"done_mobile_link": "Descarregue o aplicativo para celular",
"done_docs": "Documentação completa",
"done_docs_desc": "Guias para todas as funcionalidades, incluindo as não abordadas aqui.",
"done_docs_link": "Abra os documentos",
"done_cli": "Ferramenta de linha de comandos",
"done_cli_desc": "Faça a gestão dos seus servidores a partir de um terminal e utilize o Termix nos seus próprios scripts.",
"done_cli_link": "Abra a documentação da CLI.",
"aiTitle": "assistente de IA",
"aiIntro": "O Termix pode incluir um assistente de IA opcional. Pode alterar isso posteriormente nas suas definições.",
"aiEnableTitle": "Ligue-o",
"aiEnableDesc": "Adiciona um assistente que lê a sua configuração e sugere alterações que aprova. Requer um fornecedor fornecido por si, como um Ollama local.",
"aiSkipTitle": "Deixe desligado",
"aiSkipDesc": "O Termix funciona como está agora. O assistente permanece oculto.",
"aiNote": "Nada será enviado até que adicione um fornecedor e envie uma mensagem."
},
"nav": {
"home": "Início",
"terminal": "Terminal",
"localTerminal": "Terminal local",
"docker": "Docker",
"tunnels": "Túneis",
"fileManager": "Gestor de ficheiros",
"serverStats": "Métricas do Servidor",
"hostMetrics": "Métricas do Servidor",
"admin": "Administração",
"termixId": "ID",
"userProfile": "Perfil do Utilizador",
"splitScreen": "Ecrã Dividido",
"confirmClose": "Fechar esta sessão ativa?",
"close": "Fechar",
"cancel": "Cancelar",
"sshManager": "Gestor SSH",
"cannotSplitTab": "Não é possível dividir este separador",
"hostTabTitle": "{{username}}@{{ip}}:{{port}}",
"copyPassword": "Copiar Palavra-passe",
"copySudoPassword": "Copiar Palavra-passe do Sudo",
"passwordCopied": "Palavra-passe copiada para a área de transferência",
"noPasswordAvailable": "Nenhuma palavra-passe disponível",
"failedToCopyPassword": "Falha ao copiar a palavra-passe",
"refreshTab": "Atualizar ligação",
"renameTab": "Renomear separador",
"openFileManager": "Abrir Gestor de Ficheiros",
"dashboard": "Painel de controlo",
"networkGraph": "Gráfico de rede",
"tmuxMonitor": "Monitor Tmux",
"homepage": "Página inicial",
"quickConnect": "Ligação Rápida",
"sshTools": "Ferramentas SSH",
"history": "Histórico",
"sessionLogs": "Registos de Sessão",
"openAsTabHint": "Ctrl+clique ou clique com o botão do meio para abrir como separador",
"openAsTab": "Abrir como separador",
"openInRightDock": "Abrir no painel direito",
"closeRightDock": "Feche o cais direito",
"toggleRightDock": "Alternar dock direito",
"multiPanelHintTitle": "Trabalhe com mais do que um painel.",
"multiPanelHintBody": "Mantenha este painel aberto enquanto a barra lateral estiver a ser utilizada para outra coisa. Duas formas de movê-lo:",
"multiPanelHintTabHow": "Ctrl+clique no ícone do carril ou utilize o botão neste cabeçalho.",
"multiPanelHintDockHow": "Clique com o botão direito do rato no ícone do carril ou utilize o ícone do painel na barra de separadores.",
"sidebarSettings": "Definições da barra lateral...",
"hosts": "Máquinas",
"snippets": "Fragmentos",
"macros": "Macros",
"fleets": "Frotas",
"automations": "Automações",
"workspaces": "Espaços de trabalho",
"hostManager": "Gestor de Máquinas",
"credentials": "Credenciais",
"connections": "Ligações",
"alerts": "Alertas",
"serial": "Serial",
"roleAdministrator": "Administrador",
"roleUser": "Utilizador",
"ai": "IA"
},
"hosts": {
"hosts": "Máquinas",
"noHosts": "Sem máquinas SSH",
"retry": "Tentar novamente",
"refresh": "Atualizar",
"optional": "Opcional",
"downloadSample": "Transferir exemplo",
"failedToDeleteHost": "Falha ao eliminar {{name}}",
"importSkipExisting": "Importar (ignorar existentes)",
"importSSHConfig": "Importar da configuração SSH",
"connectionDetails": "Detalhes da ligação",
"ssh": "SSH",
"telnet": "Telnet",
"remoteDesktop": "Ambiente de trabalho remoto",
"port": "Porta",
"username": "Nome de utilizador",
"folder": "Pasta",
"tags": "Etiquetas",
"pin": "Fixar",
"addHost": "Adicionar máquina",
"editHost": "Editar máquina",
"cloneHost": "Clonar máquina",
"enableTerminal": "Ativar Terminal",
"enableTunnel": "Ativar Túnel",
"enableFileManager": "Ativar Gestor de Ficheiros",
"enableDocker": "Ativar Docker",
"defaultPath": "Caminho Predefinido",
"connection": "Ligação",
"upload": "Carregar",
"authentication": "Autenticação",
"password": "Palavra-passe",
"passwordSaved": "Palavra-passe guardada, digite para alterar",
"key": "Chave",
"credential": "Credencial",
"none": "Nenhum",
"sshPrivateKey": "Chave Privada SSH",
"keyType": "Tipo de Chave",
"uploadFile": "Carregar Ficheiro",
"tabGeneral": "Geral",
"tabSsh": "SSH",
"tabTerminal": "Terminal",
"tabRdp": "RDP",
"tabVnc": "VNC",
"tabTunnels": "Túneis",
"tabDocker": "Docker",
"tabFiles": "Ficheiros",
"tabStats": "Métricas do Host",
"tabHostMetrics": "Métricas do Host",
"tabTelnet": "Telnet",
"tabSharing": "Partilha",
"tabAuthentication": "Autenticação",
"terminal": "Terminal",
"tunnel": "Túnel",
"fileManager": "Gestor de Ficheiros",
"serverStats": "Métricas do Host",
"status": "Estado",
"folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso",
"failedToRenameFolder": "Falha ao renomear a pasta",
"unsavedChangesDescription": "As alterações efetuadas no seu host não foram guardadas. Deseja descartá-las?",
"keepEditing": "Continue a editar",
"discardChanges": "Descartar alterações",
"movedToFolder": "Movido(s) {{count}} host(s) para \"{{folder}}\"",
"editHostTooltip": "Editar host",
"statusChecks": "Verificações de estado",
"metricsCollection": "Recolha de métricas",
"metricsInterval": "Intervalo de recolha de métricas",
"metricsIntervalDesc": "Com que frequência recolher estatísticas do servidor (5s - 1h)",
"behavior": "Comportamento",
"themePreview": "Pré-visualização do tema",
"theme": "Tema",
"fontFamily": "Família da fonte",
"fontSize": "Tamanho da fonte",
"letterSpacing": "Espaçamento de letras",
"lineHeight": "Altura da linha",
"cursorStyle": "Estilo do cursor",
"cursorBlink": "Piscar do cursor",
"scrollbackBuffer": "Buffer de rolagem",
"bellStyle": "Estilo da campainha",
"rightClickSelectsWord": "Clique direito seleciona palavra",
"fastScrollModifier": "Modificador de deslocamento rápido",
"fastScrollSensitivity": "Sensibilidade do deslocamento rápido",
"sshAgentForwarding": "Reencaminhamento do agente SSH",
"backspaceMode": "Modo de retrocesso",
"startupSnippet": "Snippet de arranque",
"selectSnippet": "Selecionar snippet",
"forceKeyboardInteractive": "Forçar autenticação Keyboard-Interactive",
"overrideCredentialUsername": "Substituir nome de utilizador da credencial",
"overrideCredentialUsernameDesc": "Utilizar o nome de utilizador especificado acima em vez do nome de utilizador da credencial",
"oidcUsernameHint": "Utilize $oidc.preferred_username para substituir o seu nome de início de sessão OIDC.",
"tailscaleUsernameHint": "Este deve ser um utilizador Unix cuja identidade Tailscale é concedida na ACL SSH da tailnet, não necessariamente o utilizador root.",
"jumpHostChain": "Cadeia de hosts de salto",
"portKnocking": "Port Knocking",
"addKnock": "Adicionar porta",
"addProxyNode": "Adicionar nó",
"proxyNode": "Nó de proxy",
"proxyType": "Tipo de proxy",
"quickActions": "Ações rápidas",
"sudoPasswordAutoFill": "Preenchimento Automático da Palavra-passe Sudo",
"sudoPassword": "Palavra-passe Sudo",
"keepaliveInterval": "Intervalo de keepalive (ms)",
"moshCommand": "Comando MOSH",
"environmentVariables": "Variáveis de Ambiente",
"addVariable": "Adicionar Variável",
"docker": "Docker",
"copyTerminalUrl": "Copiar URL do Terminal",
"copyFileManagerUrl": "Copiar URL do Gestor de Ficheiros",
"copyRemoteDesktopUrl": "Copiar URL do Ambiente de Trabalho Remoto",
"failedToConnect": "Falha ao ligar à consola",
"connect": "Ligar",
"disconnect": "Desligar",
"start": "Iniciar",
"enableStatusCheck": "Ativar Verificação de Estado",
"enableMetrics": "Ativar Métricas",
"bulkUpdateFailed": "Falha na atualização em massa",
"selectAll": "Selecionar Todos",
"deselectAll": "Desmarcar Todos",
"protocols": "Protocolos",
"secureShell": "Shell Seguro",
"virtualNetwork": "Rede Virtual",
"unencryptedShell": "Shell não encriptado",
"addressIp": "Endereço / IP",
"friendlyName": "Nome Amigável",
"macAddress": "Endereço MAC",
"wolBroadcastAddress": "Endereço de broadcast WoL",
"wolBroadcastAddressDesc": "Broadcast direcionado opcional para Docker/redes encaminhadas (p. ex., 192.168.1.255). Deixar vazio para usar 255.255.255.255.",
"folderAndAdvanced": "Pasta e Avançado",
"showAdvancedSettings": "Mostrar definições avançadas",
"hideAdvancedSettings": "Ocultar definições avançadas",
"privateNotes": "Notas Privadas",
"privateNotesPlaceholder": "Detalhes sobre este servidor...",
"pinToTop": "Fixar no Topo",
"pinToTopDesc": "Mostrar sempre este host no topo da lista",
"portKnockingSequence": "Sequência de Port Knocking",
"addKnockBtn": "Adicionar Knock",
"noPortKnocking": "Nenhum port knocking configurado.",
"knockPort": "Porta Knock",
"protocol": "Protocolo",
"delayAfterMs": "Atraso após (ms)",
"useSocks5Proxy": "Usar proxy SOCKS5",
"useSocks5ProxyDesc": "Encaminhar ligação através de um servidor proxy",
"connectionOrigin": "Origem da ligação",
"connectionOriginDesc": "De onde se origina a ligação SSH deste host. Substitui o padrão global da aplicação de desktop.",
"connectionOriginDefault": "Usar padrão",
"connectionOriginLocal": "Este dispositivo (rede local)",
"connectionOriginRemote": "Servidor remoto",
"proxyHost": "Host do proxy",
"proxyPort": "Porta do proxy",
"proxyUsername": "Nome de utilizador do proxy",
"proxyPassword": "Palavra-passe do proxy",
"proxySingleMode": "Proxy único",
"proxyChainMode": "Cadeia de proxy",
"you": "Tu",
"jumpHostChainLabel": "Cadeia de jump hosts",
"addJumpBtn": "Adicionar jump",
"noJumpHosts": "Nenhum jump host configurado.",
"selectAServer": "Selecionar um servidor...",
"sshPort": "Porta SSH",
"authMethod": "Método de autenticação",
"authenticationMethod": "Método de autenticação",
"authenticationMethodDesc": "Selecione o método que o Termix irá utilizar para autenticar esta ligação SSH. Outros métodos não serão tentados automaticamente.",
"storedCredential": "Credencial guardada",
"selectACredential": "Selecionar uma credencial...",
"vaultProfile": "Perfil de assinatura Vault",
"selectAVaultProfile": "Selecionar um perfil Vault...",
"vaultProfileHint": "As definições provêm do perfil partilhado; ao ligar, iniciará sessão no Vault via OIDC. Nenhum segredo é armazenado.",
"vaultNewProfile": "Novo perfil",
"vaultManageProfiles": "Gerir perfis Vault",
"vaultAddrLabel": "Endereço Vault",
"vaultNamespaceLabel": "Namespace",
"vaultOidcMountLabel": "Mount de autenticação OIDC",
"vaultOidcRoleLabel": "Função OIDC",
"vaultSshMountLabel": "Mount de segredos SSH",
"vaultSshRoleLabel": "Função de assinatura SSH",
"vaultValidPrincipalsLabel": "Principais válidos",
"vaultKeyTypeLabel": "Tipo de chave efémera",
"vaultSharedLabel": "Partilhar com todos os utilizadores",
"vaultCreateProfile": "Criar perfil",
"vaultProfileCreated": "Perfil Vault criado",
"vaultProfileSaved": "Perfil Vault guardado",
"vaultProfileDeleted": "Perfil Vault eliminado",
"vaultProfileSaveFailed": "Falha ao guardar perfil Vault",
"vaultProfileDeleteFailed": "Falha ao eliminar perfil Vault",
"vaultSaveProfile": "Guardar perfil",
"vaultProfileValidationError": "Nome, endereço Vault e função de signatário SSH são obrigatórios",
"vaultNoProfiles": "Ainda sem perfis Vault.",
"vaultSharedBadge": "partilhado",
"keyTypeLabel": "Tipo de chave",
"keyTypeAuto": "Detetar automaticamente",
"keyPasteTab": "Colar",
"keyUploadTab": "Carregar",
"keyFileLoaded": "Ficheiro de chave carregado",
"keyUploadClick": "Clique para carregar .pem / .key / .ppk",
"clearKey": "Limpar chave",
"keySaved": "Chave SSH guardada",
"keyReplaceNotice": "cole uma nova chave abaixo para substituí-la",
"keyPassphraseSaved": "Frase-passe guardada, escreva para alterar",
"replaceKey": "Substituir chave",
"docsLink": "Ver documentação",
"opksshLabel": "OPKSSH",
"opksshDesc": "Inicie sessão neste anfitrião usando o seu fornecedor de identidade em vez de uma palavra-passe ou chave. Requer que o OPKSSH esteja configurado no servidor.",
"warpgateLabel": "Warpgate Gateway",
"warpgateDesc": "Este anfitrião liga-se através de um proxy SSH Warpgate. O Termix irá gerir automaticamente o fluxo de aprovação baseado no navegador após a autenticação.",
"agentLabel": "Agente SSH",
"agentDesc": "Autentique-se usando um agente SSH em execução no servidor Termix (Bitwarden, 1Password, gpg-agent, KeeAgent, ssh-agent). O agente deve estar em execução na máquina onde o Termix está alojado.",
"agentAuthenticationDesc": "Utilize as chaves de um agente SSH para autenticar esta ligação. Deixe o caminho do socket vazio para utilizar SSH_AUTH_SOCK.",
"agentSocketPathLabel": "Caminho do socket do agente",
"agentSocketPathPlaceholder": "Deixar vazio para usar SSH_AUTH_SOCK",
"agentSocketPathHint": "Deixar vazio para detetar automaticamente a partir da variável de ambiente SSH_AUTH_SOCK, ou introduza um caminho de socket personalizado (ex.: /run/user/1000/gnupg/S.gpg-agent.ssh).",
"shareSshAuthLabel": "Partilhar autenticação SSH",
"shareSshAuthDesc": "Forneça aos destinatários cópias encriptadas da autenticação SSH deste host. As credenciais pessoais do destinatário ainda têm precedência.",
"tailscaleDeviceSelect": "Selecionar dispositivo Tailscale",
"tailscaleDeviceSelectPlaceholder": "Selecionar um dispositivo...",
"tailscaleNoApiKey": "Nenhuma chave de API Tailscale configurada. Adicione uma nas Definições de Administrador para ativar a descoberta de dispositivos.",
"tailscaleDocsLink": "Ver documentação",
"tailscaleLoadingDevices": "A carregar dispositivos...",
"tailscaleDeviceLoadFailed": "Falha ao carregar os dispositivos Tailscale. Verifique o URL da API e a ligação de rede.",
"tailscaleNoDevices": "Nenhum dispositivo encontrado na sua tailnet.",
"tailscaleDeviceAutoFill": "Selecionar um dispositivo preencherá automaticamente o endereço IP do host.",
"forceKeyboardInteractiveLabel": "Forçar Keyboard Interactive",
"forceKeyboardInteractiveShortDesc": "Forçar a entrada manual da palavra-passe mesmo que existam chaves.",
"allowLegacyAlgorithmsLabel": "Permitir Algoritmos Legados",
"allowLegacyAlgorithmsDesc": "Ativar algoritmos SSH obsoletos (ssh-dss, ssh-rsa, diffie-hellman-group1-sha1, hmac-md5, 3des-cbc) para ligações a dispositivos antigos que não podem ser atualizados.",
"insecure": "Inseguro",
"terminalAppearance": "Aparência do Terminal",
"colorTheme": "Tema de Cores",
"fontFamilyLabel": "Família da Fonte",
"fontFamilyCustomOption": "Personalizado...",
"fontFamilyCustomPlaceholder": "Nome exato da fonte, por exemplo, MesloLGS NF",
"fontFamilyCustomHint": "Escolha uma fonte incluída ou selecione \"Personalizada\" e introduza o nome exato de uma fonte já instalada no seu sistema (por exemplo, MesloLGS NF, Noto Sans Mono). O Termix não instala fontes automaticamente; instale-as primeiro no seu sistema operativo.",
"fontSizeLabel": "Tamanho da Fonte",
"cursorStyleLabel": "Estilo do Cursor",
"letterSpacingPx": "Espaçamento entre Letras (px)",
"lineHeightLabel": "Altura da Linha",
"bellStyleLabel": "Estilo do Alerta Sonoro",
"backspaceModeLabel": "Modo da Tecla Retrocesso",
"cursorBlinking": "Piscar do Cursor",
"cursorBlinkingDesc": "Ativar a animação de piscar para o cursor do terminal",
"rightClickSelectsWordLabel": "Clique Direito Seleciona Palavra",
"rightClickSelectsWordShortDesc": "Selecionar a palavra sob o cursor ao clicar com o botão direito",
"macOptionIsMetaLabel": "A tecla Option envia meta",
"macOptionIsMetaShortDesc": "Desative a digitação de caracteres especiais (como @ ou |) com a tecla Option/Alt no macOS em vez de enviar Meta",
"backgroundImageLabel": "URL da Imagem de Fundo",
"backgroundImageDesc": "URL opcional para uma imagem de fundo do terminal",
"backgroundImageOpacityLabel": "Opacidade da Imagem de Fundo",
"customThemeColors": "Cores Personalizadas",
"customThemeBackground": "Fundo",
"customThemeForeground": "Primeiro Plano",
"customThemeCursor": "Cursor",
"customThemeCursorAccent": "Destaque do Cursor",
"customThemeSelection": "Seleção",
"customThemeAnsiColors": "Cores ANSI",
"customThemeBlack": "Preto",
"customThemeRed": "Vermelho",
"customThemeGreen": "Verde",
"customThemeYellow": "Amarelo",
"customThemeBlue": "Azul",
"customThemeMagenta": "Magenta",
"customThemeCyan": "Ciano",
"customThemeWhite": "Branco",
"customThemeBrightBlack": "Preto Brilhante",
"customThemeBrightRed": "Vermelho Brilhante",
"customThemeBrightGreen": "Verde Brilhante",
"customThemeBrightYellow": "Amarelo Brilhante",
"customThemeBrightBlue": "Azul Brilhante",
"customThemeBrightMagenta": "Magenta Brilhante",
"customThemeBrightCyan": "Ciano Brilhante",
"customThemeBrightWhite": "Branco Brilhante",
"customThemeResetTooltip": "Repor predefinições",
"savedThemesLabel": "Temas guardados",
"saveAsGlobalTheme": "Guardar como tema global",
"saveGlobalThemeNamePrompt": "Introduza um nome para este tema.",
"saveGlobalThemeSuccess": "Tema guardado",
"saveGlobalThemeError": "Falha ao guardar o tema",
"applyGlobalThemeTooltip": "Aplique este tema",
"deleteGlobalThemeTooltip": "Apagar este tema",
"noSavedThemes": "Ainda não há temas guardados.",
"syntaxHighlightingLabel": "Realce de Sintaxe",
"syntaxHighlightingDesc": "Colorir a saída do terminal (erros, caminhos, IPs, marcas temporais)",
"syntaxHighlightingCategories": "Categorias de Realce",
"syntaxHighlightingCategoriesDesc": "Escolher os tipos de conteúdo a colorir",
"syntaxCategoryLogLevels": "Níveis de Registo",
"syntaxCategoryLogLevelsDesc": "erro, aviso, info, depuração, fatal",
"syntaxCategoryPaths": "Caminhos de Ficheiros",
"syntaxCategoryPathsDesc": "/usr/share/doc, ~/file.txt",
"syntaxCategoryTimestamps": "Marcas Temporais",
"syntaxCategoryTimestampsDesc": "[12:34:56], 2024-01-15",
"syntaxCategoryIpAddresses": "Endereços IP",
"syntaxCategoryIpAddressesDesc": "192.168.1.1, 10.0.0.1:8080",
"syntaxCategoryUrls": "URLs",
"syntaxCategoryUrlsDesc": "https://example.com",
"syntaxCategoryNumbers": "Números com Rótulo",
"syntaxCategoryNumbersDesc": "port 8080, exit 1, status 404",
"behaviorAndAdvanced": "Comportamento e Avançado",
"scrollbackBufferLabel": "Buffer de Retrocesso",
"scrollbackMaxLines": "Número máximo de linhas guardadas no histórico",
"sshAgentForwardingLabel": "Reencaminhamento do Agente SSH",
"sshAgentForwardingShortDesc": "Permita que este host remoto utilize o seu agente SSH local para ligações subsequentes. Isto não é necessário para a autenticação do agente.",
"useSSHTitleLabel": "Usar o Título da Janela SSH",
"useSSHTitleDesc": "Atualizar o título do separador a partir do título da janela do shell em vez do nome do host",
"enableAutoMosh": "Ativar Auto-Mosh",
"enableAutoMoshDesc": "Preferir Mosh a SSH, se disponível",
"enableAutoTmux": "Ativar Auto-Tmux",
"enableAutoTmuxDesc": "Iniciar ou anexar automaticamente a uma sessão tmux",
"enableSessionLogging": "Registo de sessão",
"enableSessionLoggingDesc": "Gravar a saída da sessão de terminal para revisão posterior",
"allowSessionSharing": "Permitir partilha de sessão",
"allowSessionSharingDesc": "Permitir que as sessões em direto neste servidor sejam partilhadas através de link ou com outros utilizadores.",
"enableCommandHistory": "Histórico de comandos",
"enableCommandHistoryDesc": "Gravar comandos executados neste terminal para histórico e autocompletar",
"localEchoLabel": "Eco Local",
"localEchoDesc": "Preveja sequências de teclas seguras e imprimíveis localmente em ligações lentas. Os avisos de palavra-passe e as entradas de controlo nunca são repetidos.",
"localEchoDefault": "Usar configuração global",
"localEchoOff": "Desligado",
"localEchoAuto": "Automático",
"localEchoOn": "Sempre ligado",
"linkClickBehaviorLabel": "Comportamento ao clicar em ligações",
"linkClickBehaviorDesc": "Controla o que acontece ao clicar numa ligação no terminal. Use 'Predefinido' para seguir a definição da aplicação.",
"linkClickBehaviorDefault": "Predefinido (seguir a definição da aplicação)",
"linkClickBehaviorConfirm": "Mostrar pop-up para abrir ou copiar",
"linkClickBehaviorDirect": "Abrir diretamente",
"sudoPasswordAutoFillLabel": "Preenchimento automático da palavra-passe sudo",
"sudoPasswordAutoFillShortDesc": "Fornecer automaticamente a palavra-passe sudo quando solicitada",
"sudoPasswordAutoFillDesc": "Armazenar uma palavra-passe sudo para que as métricas do host, prompts do terminal e outros possam executar comandos com privilégios automaticamente.",
"sudoPasswordLabel": "Palavra-passe sudo",
"sudoPasswordSaved": "Palavra-passe guardada, digite para alterar",
"environmentVariablesLabel": "Variáveis de ambiente",
"addVariableBtn": "Adicionar variável",
"noEnvVars": "Nenhuma variável de ambiente configurada.",
"fastScrollModifierLabel": "Modificador de deslocamento rápido",
"fastScrollSensitivityLabel": "Sensibilidade do deslocamento rápido",
"moshCommandLabel": "Comando Mosh",
"startupSnippetLabel": "Fragmento de inicialização",
"keepaliveIntervalLabel": "Intervalo de Keepalive (segundos)",
"maxKeepaliveMisses": "Máximo de falhas de Keepalive",
"tunnelSettings": "Definições de túnel",
"enableTunneling": "Ativar tunelamento",
"enableTunnelingDesc": "Ativar a funcionalidade de túnel SSH para este host",
"serverTunnelsSection": "Túneis do servidor",
"addTunnelBtn": "Adicionar túnel",
"noTunnelsConfigured": "Nenhum túnel configurado.",
"tunnelLabel": "Túnel {{number}}",
"tunnelType": "Tipo de túnel",
"tunnelModeLocalDesc": "Reencaminhar uma porta local para uma porta no servidor remoto (ou um host acessível a partir dele).",
"tunnelModeRemoteDesc": "Reencaminhar uma porta no servidor remoto de volta para uma porta local na sua máquina.",
"tunnelModeDynamicDesc": "Criar um proxy SOCKS5 numa porta local para reencaminhamento dinâmico de portas.",
"sameHost": "Este host (túnel direto)",
"endpointHost": "Host de Destino",
"endpointHostPlaceholder": "Mesmo host, host SSH ou host/IP acessível",
"endpointPort": "Porta de Destino",
"bindHost": "Host de Ligação",
"sourcePort": "Porta de Origem",
"maxRetries": "Tentativas Máximas",
"retryIntervalS": "Intervalo de Repetição (s)",
"autoStartLabel": "Início Automático",
"autoStartDesc": "Conectar automaticamente este túnel quando o host for carregado",
"tunnelConnecting": "Túnel a conectar...",
"tunnelDisconnected": "Túnel desligado",
"failedToConnectTunnel": "Falha ao conectar",
"failedToDisconnectTunnel": "Falha ao desligar",
"dockerIntegration": "Integração com Docker",
"enableDockerMonitor": "Ativar Docker",
"enableDockerMonitorDesc": "Monitorizar e gerir contentores neste host via Docker",
"containerRuntime": "Runtime de Contentores",
"containerRuntimeDesc": "Escolha a CLI usada para a gestão de contentores neste host",
"containerRuntimeDocker": "Docker",
"containerRuntimePodman": "Podman",
"enableTmuxMonitor": "Ativar Monitor Tmux",
"enableTmuxMonitorDesc": "Mostrar este host no Monitor Tmux e adicionar as suas ações tmux à barra lateral",
"enableTerminalToolbar": "Ativar a barra de ferramentas do terminal",
"enableTerminalToolbarDesc": "Visualizar uma barra de ferramentas de acesso rápido acoplada ao terminal ativo com as ferramentas e estatísticas em tempo real deste host.",
"tabProxmox": "Proxmox",
"proxmoxIntegration": "Integração com Proxmox",
"enableProxmox": "Ativar Proxmox",
"enableProxmoxDesc": "Marcar este host como um nó Proxmox. Permite a descoberta e importação de convidados diretamente a partir deste host.",
"proxmoxDefaultAuthType": "Tipo de Autenticação Padrão",
"proxmoxDefaultAuthTypeDesc": "Método de autenticação aplicado aos hosts convidados importados. Escolha o tipo de autenticação que corresponde à forma como se liga aos seus convidados.",
"authTypePassword": "Palavra-passe",
"authTypeKey": "Chave SSH",
"authTypeCredential": "Credencial",
"authTypeOpkssh": "OPKSSH",
"authTypeNone": "Nenhum",
"proxmoxDefaultCredential": "Credencial padrão",
"proxmoxDefaultCredentialDesc": "Credencial usada para os convidados importados quando o tipo de autenticação é definido como Credencial.",
"proxmoxWindowsDetection": "Deteção de Windows / RDP",
"proxmoxWindowsDetectionDesc": "Padrões de nomes separados por vírgulas que acionam RDP em vez de SSH (sem distinção entre maiúsculas/minúsculas)",
"proxmoxDockerDetection": "Deteção de Docker",
"proxmoxDockerDetectionDesc": "Padrões de nomes separados por vírgulas que ativam o Docker nos convidados que correspondam.",
"proxmoxPreferredRanges": "Intervalos de IP preferenciais",
"proxmoxPreferredRangesDesc": "Prefixos separados por vírgulas em ordem de prioridade para seleção de IP quando um convidado tem várias interfaces.",
"proxmoxAutoSync": "Sincronização automática",
"proxmoxAutoSyncDesc": "Descobrir periodicamente este nó Proxmox e criar ou atualizar os convidados importados enquanto a sessão estiver desbloqueada.",
"proxmoxSyncInterval": "Intervalo de sincronização (minutos)",
"proxmoxSyncIntervalDesc": "Mínimo de 5 minutos. O agendador ignora sessões de utilizador bloqueadas.",
"proxmoxMarkMissing": "Marcar convidados em falta",
"proxmoxMarkMissingDesc": "Adicionar a etiqueta proxmox-missing quando um convidado previamente importado desaparecer, em vez de o eliminar.",
"proxmoxLastSync": "Última sincronização",
"proxmoxLastSyncNever": "Ainda não sincronizado",
"proxmoxLastSyncNoResult": "Sem detalhes do resultado",
"proxmoxLastSyncSummary": "{{created}} criados, {{updated}} atualizados, {{markedMissing}} em falta, {{skipped}} ignorados",
"proxmoxLastSyncStatus": {
"success": "Sucesso",
"error": "Falhou",
"pending": "Pendente"
},
"proxmoxDiscoverAction": "Descobrir e importar convidados",
"proxmoxImportTitle": "Importar do Proxmox",
"proxmoxSelectHost": "Selecionar um host Proxmox…",
"proxmoxDiscover": "Descobrir",
"proxmoxDiscovering": "A descobrir…",
"proxmoxDiscoverGuests": "Descobrir convidados",
"proxmoxGuestsSelected_one": "{{count}} convidado — {{selected}} selecionado",
"proxmoxGuestsSelected_other": "{{count}} convidados — {{selected}} selecionados",
"proxmoxSelectAll": "Selecionar todos",
"proxmoxDeselectAll": "Desmarcar todos",
"proxmoxNoGuests": "Nenhum convidado encontrado neste nó Proxmox.",
"proxmoxImportButton_one": "Importar {{count}} host",
"proxmoxImportButton_other": "Importar {{count}} hosts",
"proxmoxResultImported": "{{count}} importados",
"proxmoxResultUpdated": "{{count}} atualizados",
"proxmoxResultFailed": "{{count}} falhados",
"proxmoxResultSkippedNoIp": "{{count}} ignorado (nenhum IP encontrado)",
"proxmoxImportComplete": "Importação Proxmox concluída: {{summary}}",
"proxmoxDiscoveryFailed": "Descoberta falhou",
"proxmoxImportFailed": "Importação falhou",
"enableProxmoxStats": "Ativar estatísticas do Proxmox",
"enableProxmoxStatsDesc": "Apresenta o separador Estatísticas do Proxmox para este host com estatísticas em tempo real dos nós, máquinas virtuais, armazenamento e cluster, recolhidas via SSH.",
"proxmoxStatsPollInterval": "Intervalo de sondagem (segundos)",
"proxmoxStatsPollIntervalDesc": "Mínimo de 15 segundos. Com que frequência as estatísticas do nó Proxmox devem ser atualizadas.",
"proxmoxStatsNodeOverride": "Substituição do nome do nó",
"proxmoxStatsNodeOverrideDesc": "Substituir a deteção automática do nome do nó Proxmox (detetado por defeito através do nome do host).",
"proxmoxStatsNodeOverridePlaceholder": "Detetado automaticamente a partir do nome do host",
"proxmoxStatsUrlCopied": "URL das estatísticas do Proxmox copiado para a área de transferência",
"copyProxmoxStatsUrlAction": "Copiar URL das estatísticas do Proxmox",
"enableFileManagerMonitor": "Ativar Gestor de Ficheiros",
"enableFileManagerMonitorDesc": "Explorar e gerir ficheiros neste host via SFTP",
"scpLegacyLabel": "Modo SCP Legado",
"scpLegacyDesc": "Utilizar transferência de ficheiros legada para servidores que não suportam o subsistema SFTP (ex.: servidores SSH embebidos ou mínimos)",
"defaultPathLabel": "Caminho Predefinido",
"fileManagerPathHint": "O diretório a abrir quando o gestor de ficheiros for iniciado para este host",
"statusChecksLabel": "Verificações de Estado",
"enableStatusChecks": "Ativar Verificações de Estado",
"enableStatusChecksDesc": "Fazer ping periodicamente a este host para verificar a disponibilidade",
"useGlobalInterval": "Usar Intervalo Global",
"useGlobalIntervalDesc": "Substituir pelo intervalo de verificação de estado global do servidor",
"checkIntervalS": "Intervalo de Verificação (s)",
"checkIntervalDesc": "Segundos entre cada ping de conectividade",
"metricsCollectionLabel": "Recolha de Métricas",
"enableMetricsLabel": "Ativar Métricas",
"enableMetricsDesc": "Recolher métricas de CPU, RAM, disco e outras deste host",
"useGlobalMetrics": "Usar Intervalo Global",
"useGlobalMetricsDesc": "Substituir pelo intervalo de métricas global do servidor",
"metricsIntervalS": "Intervalo de Métricas (s)",
"metricsIntervalDesc2": "Segundos entre cada registo de métricas",
"excludedMountsLabel": "Suportes excluídos",
"monitoredMountsLabel": "Caminhos monitorizados personalizados",
"monitoredMountsDesc": "Adicione caminhos que não estejam expostos como montagens separadas, incluindo caminhos do Home Assistant montados através de bind, como /config.",
"monitoredMountPathPlaceholder": "Caminho (/config, /mnt/data)",
"monitoredMountLabelPlaceholder": "Rótulo (opcional)",
"addMonitoredMount": "Adicionar caminho",
"excludedMountsDesc": "Ocultar pontos de montagem ou tipos de sistema de ficheiros específicos (por exemplo, NFS, CIFS) da utilização do disco e dos alertas para este host.",
"excludedMountsPlaceholder": "Caminho de montagem (/mnt/nas) ou tipo de sistema de ficheiros (nfs, cifs)",
"excludedMountsEmpty": "Nenhuma montagem excluída. Todos os sistemas de ficheiros detetados são apresentados.",
"addExcludedMount": "Adicionar",
"visibleWidgets": "Widgets Visíveis",
"widgetsMovedToHostMetrics": "Os cartões são agora adicionados, organizados e redimensionados diretamente no separador Métricas do Host. Abra as Métricas do Host para este host e use Personalizar para escolher quais os cartões a mostrar.",
"cpuUsageLabel": "Utilização da CPU",
"cpuUsageDesc": "Percentagem da CPU, médias de carga, gráfico de linha",
"memoryLabel": "Utilização da Memória",
"memoryDesc": "Utilização da RAM, swap, em cache",
"storageLabel": "Utilização do Disco",
"storageDesc": "Utilização do disco por ponto de montagem",
"networkLabel": "Interfaces de Rede",
"networkDesc": "Lista de interfaces e largura de banda",
"uptimeLabel": "Tempo de Atividade",
"uptimeDesc": "Tempo de atividade do sistema e hora de arranque",
"systemInfoLabel": "Informação do Sistema",
"systemInfoDesc": "SO, kernel, nome de máquina, arquitetura",
"recentLoginsLabel": "Inícios de Sessão Recentes",
"recentLoginsDesc": "Eventos de início de sessão bem-sucedidos e falhados",
"topProcessesLabel": "Principais Processos",
"topProcessesDesc": "PID, CPU%, MEM%, comando",
"listeningPortsLabel": "Portas à Escuta",
"listeningPortsDesc": "Portas abertas com processo e estado",
"firewallLabel": "Firewall",
"firewallDesc": "Estado do Firewall, AppArmor, SELinux",
"quickActionsLabel": "Ações Rápidas",
"quickActionsToolbar": "As ações rápidas aparecem como botões na barra de ferramentas de Métricas do Host para execução de comandos com um clique.",
"noQuickActions": "Ainda não existem ações rápidas.",
"buttonLabel": "Texto do botão",
"selectSnippetPlaceholder": "Selecionar snippet...",
"addActionBtn": "Adicionar Ação",
"hostSharedSuccessfully": "Host partilhado com sucesso",
"failedToShareHost": "Falha ao partilhar o host",
"accessRevoked": "Acesso revogado",
"failedToRevokeAccess": "Falha ao revogar o acesso",
"cancelBtn": "Cancelar",
"savingBtn": "A guardar...",
"addHostBtn": "Adicionar Host",
"hostUpdated": "Host atualizado",
"hostCreated": "Host criado",
"failedToSave": "Falha ao guardar o host",
"credentialUpdated": "Credencial atualizada",
"credentialCreated": "Credencial criada",
"failedToSaveCredential": "Falha ao guardar a credencial",
"credentialNameRequired": "Introduza um nome para a credencial",
"credentialAuthRequired": "Adicione uma palavra-passe, uma chave SSH, ou ambas",
"createCredentialFromHostBtn": "Criar credencial",
"createCredentialFromHostTitle": "Criar credencial a partir do host",
"createCredentialFromHostDesc": "Crie uma entrada de credencial reutilizável e partilhável, previamente preenchida com o nome de utilizador, palavra-passe e/ou chave SSH atuais deste host.",
"backToHosts": "Voltar aos hosts",
"pinned": "Fixado",
"noHostsFound": "Nenhum host encontrado",
"tryDifferentTerm": "Experimente um termo diferente",
"addFirstHost": "Adicione o seu primeiro host para começar",
"noCredentialsFound": "Nenhuma credencial encontrada",
"addCredentialBtn": "Adicionar Credencial",
"updateCredentialBtn": "Atualizar Credencial",
"features": "Funcionalidades",
"noFolder": "(Nenhuma pasta)",
"deleteSelected": "Eliminar",
"exitSelection": "Sair da seleção",
"importSkip": "Importar (ignorar existentes)",
"importOverwrite": "Importar (substituir)",
"collapseBtn": "Recolher",
"importExportBtn": "Importar / Exportar",
"hostStatusesRefreshed": "Estados dos hosts atualizados",
"failedToRefreshHosts": "Falha ao atualizar hosts",
"movedHostTo": "Moveu {{host}} para \"{{folder}}\"",
"failedToMoveHost": "Falha ao mover host",
"deletedFolder": "Pasta \"{{name}}\" eliminada",
"failedToDeleteFolder": "Falha ao eliminar pasta",
"deleteAllInFolder": "Eliminar todos os hosts em \"{{name}}\"? Esta ação não pode ser desfeita.",
"folderPickerPlaceholder": "Nenhuma pasta",
"folderPickerSearch": "Pesquisar ou criar (use / para subpastas)...",
"folderPickerNone": "Nenhuma pasta",
"folderPickerCreate": "Criar \"{{path}}\"",
"folderPickerEmpty": "Nenhuma pasta correspondente",
"parentHost": "Anfitrião principal",
"useFolderInstead": "Utilize uma pasta em vez de uma pasta.",
"useParentHostInstead": "Utilize o host pai em vez disso.",
"parentHostPickerPlaceholder": "Sem host pai",
"parentHostPickerSearch": "Pesquisar hosts...",
"parentHostPickerNone": "Sem host pai",
"parentHostPickerEmpty": "Nenhum host correspondente",
"collapseSubHosts": "Colapsar sub-hosts",
"expandSubHosts": "Expandir sub-anfitriões",
"cannotNestUnderDescendant": "Não é possível aninhar um host dentro do seu próprio subhost.",
"movedToParent": "Movido {{count}} host(s) para \"{{parent}}\"",
"newFolder": "Nova pasta",
"createFolderTitle": "Criar pasta",
"editFolderTitle": "Editar pasta",
"folderDialogDescription": "Escolha um nome, cor e ícone. Use / para aninhar pastas.",
"folderNameLabel": "Nome da pasta",
"folderNamePlaceholder": "ex.: Produção/Web",
"folderNestingHint": "Utilize / para separar níveis e criar pastas aninhadas.",
"folderNameDuplicate": "Já existe uma pasta com esse nome aqui.",
"folderColor": "Cor",
"folderIcon": "Ícone",
"folderCredential": "Credencial",
"folderCredentialNone": "Nenhuma credencial atribuída",
"folderCredentialHint": "Os hosts nesta pasta que utilizem autenticação com \"Credenciais armazenadas\" sem que as suas próprias credenciais estejam seleccionadas herdarão esta.",
"folderPreview": "Pré-visualização",
"folderNameFallback": "Pasta sem título",
"createFolderButton": "Criar pasta",
"saveFolderButton": "Guardar pasta",
"cancel": "Cancelar",
"iconSearchPlaceholder": "Pesquisar ícones...",
"openAllSessions": "Abrir todas as sessões",
"editFolder": "Editar pasta",
"deleteFolder": "Eliminar pasta",
"selectFolder": "Selecione todos os hosts na pasta",
"deselectFolder": "Desmarque todos os hosts na pasta",
"folderSaved": "Pasta guardada",
"failedToSaveFolder": "Falha ao guardar pasta",
"folderDeleted": "Pasta \"{{name}}\" eliminada",
"deleteFolderConfirm": "Eliminar \"{{name}}\" e os seus {{count}} host(s)? Esta ação não pode ser anulada.",
"failedToMoveHosts": "Falha ao mover hosts",
"failedToReorder": "Falha ao refazer o pedido",
"expandAll": "Expandir todas as pastas",
"collapseAll": "Recolher todas as pastas",
"moreActions": "Mais",
"groupBy": "Agrupar por",
"GroupByFolder": "Pasta",
"GroupByTag": "Etiqueta",
"GroupByStatus": "Estado",
"GroupByProtocol": "Protocolo",
"GroupByAuth": "Tipo de autenticação",
"groupUngrouped": "Não agrupados",
"customizeSidebar": "Personalizar a barra lateral",
"customizeSidebarDescription": "Escolha o aspeto e o comportamento da lista de hosts.",
"customizeDensityTitle": "Densidade",
"customizeBehaviorTitle": "Comportamento",
"customizeSortHint": "A ordem de classificação e o agrupamento podem ser definidos nos menus de classificação e agrupamento da barra de ferramentas.",
"densityComfortableDesc": "Mais detalhes por host: endereço, tags e utilização de recursos.",
"densityCompactDesc": "Uma linha por host, para listas mais longas.",
"display": "Ecrã",
"displayDensity": "Densidade",
"displayDensityComfortable": "Confortável",
"displayDensityCompact": "Compactar",
"displayShowTags": "Mostrar etiquetas",
"displayTrayOnClick": "Abrir ações ao clicar (em vez de passar o cursor sobre as mesmas)",
"actionsVisibility": "Ações do anfitrião",
"actionsVisibilityDesc": "Quando os botões de ligação e gestão em cada host aparecerem",
"actionsAlways": "Sempre visível",
"actionsOnly": "Ligue apenas, descanse com um clique.",
"actionsHover": "Mostrar ao passar o cursor",
"actionsClick": "Mostrar ao clicar",
"openOnDoubleClick": "Abrir com um duplo clique",
"openOnDoubleClickDesc": "Exigir um duplo clique para abrir uma sessão de host em vez de um único clique.",
"deletedHost": "{{name}} eliminado",
"copiedToClipboard": "Copiado para a área de transferência",
"terminalUrlCopied": "URL do terminal copiada",
"fileManagerUrlCopied": "URL do gestor de ficheiros copiada",
"tunnelUrlCopied": "URL do túnel copiada",
"dockerUrlCopied": "URL do Docker copiada",
"hostMetricsUrlCopied": "URL das métricas do host copiada",
"tmuxMonitorUrlCopied": "URL do Monitor Tmux copiado",
"rdpUrlCopied": "URL RDP copiado",
"openNativeRdp": "Abrir no Windows Remote Desktop",
"nativeRdpOpened": "Aberto na Área de Trabalho Remota do Windows",
"nativeRdpFailed": "Falha ao abrir a Área de Trabalho Remota do Windows",
"vncUrlCopied": "URL VNC copiado",
"telnetUrlCopied": "URL Telnet copiado",
"remoteDesktopUrlCopied": "URL do Ambiente de Trabalho Remoto copiado",
"expandActions": "Expandir ações",
"collapseActions": "Recolher ações",
"wakeOnLanAction": "Wake on LAN",
"wakeOnLanSuccess": "Pacote mágico enviado para {{name}}",
"wakeOnLanError": "Falha ao enviar pacote mágico",
"cloneHostAction": "Clonar host",
"copyAddress": "Copiar endereço",
"copyLink": "Copiar link",
"copyTerminalUrlAction": "Copiar URL do Terminal",
"copyFileManagerUrlAction": "Copiar URL do Gestor de Ficheiros",
"copyTunnelUrlAction": "Copiar URL do Túnel",
"copyDockerUrlAction": "Copiar URL do Docker",
"copyHostMetricsUrlAction": "Copiar URL das Métricas do host",
"copyTmuxMonitorUrlAction": "Copiar URL do Monitor Tmux",
"copyRdpUrlAction": "Copiar URL RDP",
"copyVncUrlAction": "Copiar URL VNC",
"copyTelnetUrlAction": "Copiar URL Telnet",
"copyRemoteDesktopUrlAction": "Copiar URL do Ambiente de Trabalho Remoto",
"deleteCredentialConfirm": "Eliminar credencial \"{{name}}\"?",
"deletedCredential": "Eliminada {{name}}",
"deleteHostsConfirm": "Eliminar {{count}} host{{plural}}? Esta ação não pode ser desfeita.",
"movedToRoot": "Movido para a raiz",
"enableTerminalFeature": "Ativar Terminal",
"disableTerminalFeature": "Desativar Terminal",
"enableFilesFeature": "Ativar Ficheiros",
"disableFilesFeature": "Desativar Ficheiros",
"enableTunnelsFeature": "Ativar Tunnels",
"disableTunnelsFeature": "Desativar Tunnels",
"enableDockerFeature": "Ativar Docker",
"disableDockerFeature": "Desativar Docker",
"enableProxmoxFeature": "Ativar Proxmox",
"disableProxmoxFeature": "Desativar Proxmox",
"addTagsPlaceholder": "Adicionar tags...",
"authDetails": "Detalhes de autenticação",
"credType": "Tipo",
"generateKeyPairDesc": "Gerar um novo par de chaves; as chaves privada e pública serão preenchidas automaticamente.",
"generatingKey": "A gerar...",
"generateLabel": "Gerar {{label}}",
"uploadFileBtn": "Carregar ficheiro",
"keyPassphraseOptional": "Frase-senha da chave (Opcional)",
"sshPublicKeyOptional": "Chave pública SSH (Opcional)",
"publicKeyGenerated": "Chave pública gerada",
"failedToGeneratePublicKey": "Falha ao derivar a chave pública",
"publicKeyCopied": "Chave pública copiada",
"keyPairGenerated": "Par de chaves {{label}} gerado",
"failedToGenerateKeyPair": "Falha ao gerar par de chaves",
"searchHostsPlaceholder": "Pesquisar anfitriões, endereços, tags…",
"refreshBtn": "Atualizar",
"addTag": "Adicionar tags...",
"deleteConfirmBtn": "Eliminar",
"tunnelRequirementsText": "O servidor SSH deve ter GatewayPorts yes, AllowTcpForwarding yes e PermitRootLogin yes definidos em /etc/ssh/sshd_config.",
"deleteHostConfirm": "Eliminar \"{{name}}\"?",
"enableAtLeastOneProtocol": "Ative pelo menos um protocolo acima para configurar as definições de autenticação e ligação.",
"keyPassphrase": "Frase-senha da chave",
"connectBtn": "Ligar",
"disconnectBtn": "Desligar",
"basicInformation": "Informação básica",
"authDetailsSection": "Detalhes de autenticação",
"credTypeLabel": "Tipo",
"hostsTab": "Anfitriões",
"credentialsTab": "Credenciais",
"selectMultiple": "Selecionar vários",
"selectHosts": "Selecionar hosts",
"connectionLabel": "Ligação",
"authenticationLabel": "Autenticação",
"generateKeyPairTitle": "Gerar par de chaves",
"generateKeyPairDescription": "Gerar um novo par de chaves, as chaves privada e pública serão preenchidas automaticamente.",
"generateFromPrivateKey": "Gerar a partir da chave privada",
"refreshBtn2": "Atualizar",
"exitSelectionTitle": "Sair da seleção",
"addHostBtn2": "Adicionar host",
"addCredentialBtn2": "Adicionar credencial",
"checkingHostStatuses": "A verificar o estado dos hosts...",
"pinnedSection": "Fixados",
"hostsExported": "Hosts exportados com sucesso",
"export": {
"menuItem": "Exportar...",
"title": "Hosts de exportação",
"scope": "Âmbito",
"scopeAll": "Tudo",
"scopeSelected": "Selecionado",
"searchHosts": "Pesquisar hosts...",
"include": "Incluir",
"groupConnection": "Conexão",
"groupCredentials": "Credenciais",
"groupNotes": "Notas",
"groupTags": "Etiquetas e alfinete",
"groupTunnels": "Túneis",
"groupJumpHosts": "Apresentadores do Jump",
"groupQuickActions": "Ações rápidas",
"groupFeatureFlags": "Sinalizadores de recursos",
"groupAdvanced": "Configuração avançada",
"preview": "Pré-visualização",
"moreHosts": "... {{count}} mais hosts",
"summary": "{{selected}} de {{total}} anfitriões",
"credentialsIncluded": "credenciais incluídas",
"credentialsExcluded": "credenciais excluídas",
"noneSelected": "Nenhum host selecionado",
"cancel": "Cancelar",
"confirm": "Exportar",
"fetchFailed": "Falha ao carregar os hosts para exportação.",
"bulkButton": "Exportar"
},
"sampleDownloaded": "Ficheiro de exemplo descarregado",
"failedToDeleteCredential2": "Falha ao eliminar a credencial",
"noFolderOption": "(Sem pasta)",
"nSelected": "{{count}} selecionado(s)",
"featuresMenu": "Funcionalidades",
"moveMenu": "Mover",
"connectSelected": "Ligar",
"cancelSelection": "Cancelar",
"deletedCount": "Eliminados {{count}} hosts",
"failedToDeleteCount": "Falha ao eliminar {{count}} hosts",
"duplicatedHost": "Duplicado \"{{name}}\"",
"failedToDuplicateHost": "Falha ao duplicar o host",
"updatedCount": "Atualizados {{count}} hosts",
"friendlyNameLabel": "Nome Amigável",
"descriptionLabel": "Descrição",
"loadingHost": "A carregar o host...",
"loadingHosts": "A carregar hosts...",
"loadingCredentials": "A carregar credenciais...",
"noHostsYet": "Ainda sem hosts",
"noHostsYetHint": "Adicione um servidor para abrir terminais, navegar por ficheiros e visualizar métricas.",
"noHostsMatchSearch": "Nenhum host corresponde à sua pesquisa",
"hostNotFound": "Host não encontrado",
"searchHosts": "Pesquisar hosts...",
"sortHosts": "Ordenar Hosts",
"sortDefault": "Ordem Padrão",
"sortNameAsc": "Nome (A → Z)",
"sortNameDesc": "Nome (Z → A)",
"sortIpAsc": "Endereço IP (Asc)",
"sortIpDesc": "Endereço IP (Desc)",
"sortOnlineFirst": "Online primeiro",
"sortOfflineFirst": "Offline primeiro",
"sortManual": "Manual (arrastar para reordenar)",
"sortPinnedFirst": "Fixados primeiro",
"filterHosts": "Filtrar Hosts",
"filterClearAll": "Limpar Filtros",
"filterStatusGroup": "Estado",
"filterOnline": "Online",
"filterOffline": "Offline",
"filterPinned": "Fixados",
"filterAuthGroup": "Tipo de Autenticação",
"filterAuthPassword": "Palavra-passe",
"filterAuthKey": "Chave SSH",
"filterAuthCredential": "Credencial",
"filterAuthNone": "Nenhuma",
"filterAuthOpkssh": "OPKSSH",
"filterProtocolGroup": "Protocolo",
"filterProtocolSsh": "SSH",
"filterProtocolRdp": "RDP",
"filterProtocolVnc": "VNC",
"filterProtocolTelnet": "Telnet",
"filterFeaturesGroup": "Funcionalidades",
"filterFeatureTerminal": "Terminal",
"filterFeatureFileManager": "Gestor de Ficheiros",
"filterFeatureTunnel": "Túnel",
"filterFeatureDocker": "Docker",
"filterTagsGroup": "Etiquetas",
"connectRdp": "RDP",
"connectVnc": "VNC",
"connectTelnet": "Telnet",
"editHostAction": "Editar Anfitrião",
"moreOptions": "Mais opções",
"shareHost": "Partilhar Anfitrião",
"shareHostTitle": "Partilhar: {{name}}",
"shareFolder": "Pasta partilhada",
"shareFolderTitle": "Pasta partilhada: {{name}}",
"folderSharedSuccessfully": "Host(ns) partilhado(s) {{count}} na pasta",
"failedToShareFolder": "Falha ao partilhar a pasta",
"sharing": {
"loadError": "Erro ao carregar dados de partilha. Tente novamente.",
"shareWithSection": "Partilhar com",
"usersTab": "Utilizadores",
"rolesTab": "Funções",
"searchPlaceholder": "Procurar utilizadores ou funções...",
"noMatches": "Nenhuma correspondência encontrada",
"permissionLevelLabel": "Nível de permissão",
"levels": {
"connect": {
"label": "Ligar",
"description": "Abrir apenas sessões: terminal, ambiente de trabalho remoto, gestor de ficheiros, túneis e Docker. Sem acesso à configuração do anfitrião."
},
"view": {
"label": "Ver",
"description": "Ligar e ver a configuração do anfitrião. Os segredos nunca são mostrados."
},
"edit": {
"label": "Editar",
"description": "Visualize e modifique as definições do host que não requerem autenticação. A autenticação SSH do proprietário permanece privada e restrita ao proprietário."
},
"manage": {
"label": "Gerir",
"description": "Editar, além de partilhar o anfitrião com outras pessoas, alterar os níveis de permissão e revogar o acesso."
}
},
"expiryLabel": "Expiração do acesso",
"expiry": {
"never": "Nunca",
"oneHour": "1 hora",
"oneDay": "24 horas",
"sevenDays": "7 dias",
"thirtyDays": "30 dias",
"custom": "Personalizado"
},
"customHoursPlaceholder": "Horas até à expiração do acesso",
"shareButton": "Partilhar",
"shareWithCount": "Partilhar ({{count}})",
"currentAccess": "Acesso atual",
"noAccessEntries": "Este anfitrião ainda não foi partilhado",
"folderShareSummary": "Partilhado {{shared}} de {{total}} hosts nesta pasta",
"grantedBy": "Concedido por",
"expires": "Expira",
"expired": "Expirado",
"never": "Nunca",
"revoke": "Revogar",
"accessUpdated": "Acesso atualizado",
"accessUpdateFailed": "Falha ao atualizar o acesso",
"sharedBadge": "Partilhado",
"sharedBadgeTooltip": "Partilhado por {{owner}} (acesso de {{level}})",
"viewOnlyBanner": "Este anfitrião é partilhado consigo por {{owner}} com acesso de visualização. A configuração é só de leitura.",
"sharedEditBanner": "Este anfitrião é partilhado consigo por {{owner}} com acesso de edição. As alterações aplicam-se ao anfitrião real; as referências de autenticação só podem ser alteradas pelo proprietário.",
"ownerOnlyControl": "Apenas o proprietário do anfitrião pode alterar isto",
"ownerAuthPrivate": "A autenticação SSH do proprietário do host é privada. Utilize a opção “Definir autenticação SSH pessoal” no menu do host para escolher as suas próprias credenciais.",
"ownerAuthShared": "O proprietário do host partilhou a autenticação SSH para este host. Pode utilizá-la ou escolher as suas próprias credenciais em \"Definir autenticação SSH pessoal\".",
"authOverrideAction": "Configure a autenticação SSH pessoal.",
"authOverrideTitle": "Autenticação SSH pessoal",
"authOverrideDescriptionPrivate": "As credenciais SSH do proprietário do host permanecem privadas. Escolha uma das suas credenciais guardadas para ligações a {{host}}.",
"authOverrideDescriptionShared": "Utilize a autenticação partilhada pelo proprietário do host ou substitua-a por uma das suas credenciais guardadas para ligações a {{host}}.",
"authOverrideCredentialLabel": "Credencial de autenticação",
"useSharedAuthentication": "Utilizar autenticação de host partilhada",
"noPersonalCredential": "Sem credencial pessoal",
"authOverrideNoCredentials": "Ainda não guardou nenhuma credencial SSH. Crie uma em Credenciais para se ligar a hosts que exijam autenticação.",
"authOverrideRequired": "Este host requer uma das suas credenciais guardadas para que se possa ligar.",
"authOverridePrivateHint": "Esta credencial é privada e intransmissível. O proprietário do host e outros destinatários não a podem ver nem utilizar.",
"authOverrideSaved": "Autenticação SSH pessoal guardada",
"authOverrideCleared": "Autenticação SSH pessoal removida",
"authOverrideClearedToShared": "Utilizando autenticação de host partilhado",
"authOverrideLoadError": "Falha ao carregar a sua autenticação SSH. Tente novamente.",
"authOverrideSaveError": "Falha ao guardar a sua autenticação SSH."
},
"guac": {
"connection": "Ligação",
"authentication": "Autenticação",
"storedCredential": "Credencial Armazenada",
"noCredential": "Sem credencial (credenciais diretas abaixo)",
"authMethod": "Método de Autenticação",
"authTypeDirect": "Direta",
"authTypeCredential": "Credencial",
"authTypeNone": "Nenhum",
"authTypeNoneDesc": "Nenhuma credencial é armazenada. Ser-lhe-á pedido que insira um nome de utilizador e uma senha sempre que se conectar; não são salvos.",
"selectCredential": "Selecionar uma credencial...",
"connectionSettings": "Definições de Ligação",
"displaySettings": "Definições de Ecrã",
"audioSettings": "Definições de Áudio",
"rdpPerformance": "Desempenho do RDP",
"deviceRedirection": "Redirecionamento de Dispositivos",
"session": "Sessão",
"gateway": "Gateway",
"remoteApp": "RemoteApp",
"clipboard": "Área de Transferência",
"sessionRecording": "Gravação de Sessão",
"wakeOnLan": "Wake-on-LAN",
"vncSettings": "Definições VNC",
"terminalSettings": "Definições do Terminal",
"rdpPort": "Porta RDP",
"username": "Nome de utilizador",
"password": "Palavra-passe",
"passwordSaved": "Palavra-passe guardada, digite para alterar",
"domain": "Domínio",
"securityMode": "Modo de segurança",
"colorDepth": "Profundidade de cor",
"width": "Largura",
"height": "Altura",
"dpi": "DPI",
"resizeMethod": "Método de redimensionamento",
"clientName": "Nome do cliente",
"initialProgram": "Programa inicial",
"serverLayout": "Layout do servidor",
"timezone": "Fuso horário",
"loadBalanceInfo": "Informação de balanceamento de carga / Cookie",
"loadBalanceInfoDesc": "Cookie do RD Connection Broker para balanceamento de carga em farms RDS (ex: tsv://MS Terminal Services Plugin.1.CollectionName)",
"guacdProxy": "Proxy guacd",
"guacdHostname": "Host guacd",
"guacdHostnamePlaceholder": "Padrão global",
"guacdPort": "Porta guacd",
"guacdProxyDesc": "Substituir a instância guacd global para esta ligação. Deixe em branco para usar o guacd configurado globalmente.",
"gatewayHostname": "Nome de host do gateway",
"gatewayPort": "Porta do gateway",
"gatewayUsername": "Nome de utilizador do gateway",
"gatewayPassword": "Palavra-passe do gateway",
"gatewayDomain": "Domínio do gateway",
"remoteAppProgram": "Programa RemoteApp",
"workingDirectory": "Diretório de trabalho",
"arguments": "Argumentos",
"normalizeLineEndings": "Normalizar fins de linha",
"recordingPath": "Caminho da gravação",
"recordingName": "Nome da gravação",
"macAddress": "Endereço MAC",
"broadcastAddress": "Endereço de broadcast",
"udpPort": "Porta UDP",
"waitTimeS": "Tempo de Espera (s)",
"driveName": "Nome da Unidade",
"drivePath": "Caminho da Unidade",
"ignoreCertificate": "Ignorar Certificado",
"ignoreCertificateDesc": "Permitir ligações a hosts com certificados auto-assinados",
"forceLossless": "Forçar sem perdas",
"forceLosslessDesc": "Forçar codificação de imagem sem perdas (maior qualidade, mais largura de banda)",
"disableAudio": "Desativar Áudio",
"disableAudioDesc": "Silenciar todo o áudio da sessão remota",
"enableAudioInput": "Ativar Entrada de Áudio (Microfone)",
"enableAudioInputDesc": "Encaminhar microfone local para a sessão remota",
"wallpaper": "Fundo de ecrã",
"wallpaperDesc": "Mostrar fundo de ecrã (desativar melhora o desempenho)",
"theming": "Temas",
"themingDesc": "Ativar temas e estilos visuais",
"fontSmoothing": "Suavização de Fontes",
"fontSmoothingDesc": "Ativar renderização de fontes ClearType",
"fullWindowDrag": "Arrasto de Janela Completo",
"fullWindowDragDesc": "Mostrar conteúdo da janela ao arrastar",
"desktopComposition": "Composição do ambiente de trabalho",
"desktopCompositionDesc": "Ativar efeitos de transparência Aero",
"menuAnimations": "Animações de Menu",
"menuAnimationsDesc": "Ativar animações de desvanecimento e deslizamento de menus",
"disableBitmapCaching": "Desativar cache de bitmaps",
"disableBitmapCachingDesc": "Desativar a cache de bitmaps (pode ajudar com falhas)",
"disableOffscreenCaching": "Desativar cache fora do ecrã",
"disableOffscreenCachingDesc": "Desativar a cache fora do ecrã",
"disableGlyphCaching": "Desativar cache de glifos",
"disableGlyphCachingDesc": "Desativar a cache de glifos",
"enableGfx": "Ativar GFX",
"enableGfxDesc": "Usar pipeline gráfico RemoteFX",
"enablePrinting": "Ativar Impressão",
"enablePrintingDesc": "Redirecionar impressoras locais para a sessão remota",
"enableDriveRedirection": "Ativar Redirecionamento de Unidades",
"enableDriveRedirectionDesc": "Mapear uma pasta local como unidade na sessão remota",
"createDrivePath": "Criar Caminho de Unidade",
"createDrivePathDesc": "Criar automaticamente a pasta se não existir",
"disableDownload": "Desativar Download",
"disableDownloadDesc": "Impedir o download de ficheiros da sessão remota",
"disableUpload": "Desativar Upload",
"disableUploadDesc": "Impedir o envio de ficheiros para a sessão remota",
"enableTouch": "Ativar Toque",
"enableTouchDesc": "Ativar o reencaminhamento de entrada tátil",
"consoleSession": "Sessão de Consola",
"consoleSessionDesc": "Ligar à consola (sessão 0) em vez de uma nova sessão",
"sendWolPacket": "Enviar Pacote WOL",
"sendWolPacketDesc": "Enviar um pacote mágico para despertar este host antes de ligar",
"disableCopy": "Desativar Cópia",
"disableCopyDesc": "Impedir a cópia de texto da sessão remota",
"disablePaste": "Desativar Colagem",
"disablePasteDesc": "Impedir a colagem de texto na sessão remota",
"createPathIfMissing": "Criar caminho se não existir",
"createPathIfMissingDesc": "Criar automaticamente o diretório de gravação",
"excludeOutput": "Excluir Saída",
"excludeOutputDesc": "Não gravar a saída do ecrã (apenas metadados)",
"excludeMouse": "Excluir Rato",
"excludeMouseDesc": "Não gravar os movimentos do rato",
"includeKeystrokes": "Incluir Teclas",
"includeKeystrokesDesc": "Gravar as teclas premidas em bruto, além da saída do ecrã",
"vncPort": "Porta VNC",
"vncPassword": "Palavra-passe VNC",
"vncUsernameOptional": "Nome de utilizador (opcional)",
"vncLeaveBlank": "Deixar em branco se não for necessário",
"cursorMode": "Modo do Cursor",
"swapRedBlue": "Trocar Vermelho/Azul",
"swapRedBlueDesc": "Trocar os canais de cor vermelha e azul (corrige alguns problemas de cor)",
"readOnly": "Apenas leitura",
"readOnlyDesc": "Visualizar o ecrã remoto sem enviar qualquer entrada",
"telnetPort": "Porta Telnet",
"terminalType": "Tipo de Terminal",
"fontName": "Nome da Fonte",
"fontSize": "Tamanho da Fonte",
"colorScheme": "Esquema de Cores",
"backspaceKey": "Tecla Backspace",
"saveHostFirst": "Guarde o host primeiro.",
"sharingOptionsAfterSave": "As opções de partilha estão disponíveis após o host ter sido guardado.",
"permissionLevel": "Nível de Permissão",
"typeHeader": "Tipo",
"targetHeader": "Destino",
"permissionHeader": "Permissão",
"cancelBtn": "Cancelar",
"savingBtn": "A guardar...",
"updateHostBtn": "Atualizar Host",
"addHostBtn": "Adicionar Host"
},
"arrangeUnlockedSwitchedToManual": "A ordenação foi alterada para manual, pelo que a sua ordem será mantida.",
"dragToRearrange": "Arraste para reorganizar",
"arrangeUnlocked": "Desbloqueie e arraste para reorganizar."
},
"commandPalette": {
"searchPlaceholder": "Pesquisar hosts, comandos ou definições...",
"quickActions": "Ações Rápidas",
"navigation": "Navegação",
"orShortcut": "ou",
"hostManager": "Gestor de Hosts",
"hostManagerDesc": "Gerir, adicionar ou editar hosts",
"addNewHost": "Adicionar Novo Host",
"addNewHostDesc": "Registar um novo host",
"adminSettings": "Definições de Administrador",
"adminSettingsDesc": "Configurar preferências do sistema e utilizadores",
"userProfile": "Perfil do Utilizador",
"userProfileDesc": "Gerir a sua conta e preferências",
"addCredential": "Adicionar Credencial",
"addCredentialDesc": "Guardar chaves SSH ou palavras-passe",
"tmuxMonitor": "Monitor Tmux",
"tmuxMonitorDesc": "Monitorizar sessões tmux nos seus hosts",
"snippets": "Trechos",
"runSnippetDesc": "Execute no separador do terminal ativo",
"noSnippetsFound": "Não foram encontrados trechos que correspondam a \"{{search}}\"",
"recentActivity": "Atividade Recente",
"serversAndHosts": "Servidores e Hosts",
"noHostsFound": "Nenhum host encontrado que corresponda a \"{{search}}\"",
"links": "Ligações",
"navigate": "Navegar",
"select": "Selecionar",
"toggleWith": "Alternar com",
"localTerminal": "Terminal local",
"localTerminalDesc": "Abra um terminal neste computador."
},
"splitScreen": {
"paneEmpty": "Painel {{index}} - vazio",
"noTabAssigned": "Nenhum separador atribuído",
"focusedPane": "Painel ativo"
},
"connections": {
"noConnections": "Sem ligações",
"noConnectionsDesc": "Abra um terminal, gestor de ficheiros ou desktop remoto para ver as ligações aqui",
"connectedFor": "Ligado há {{duration}}",
"connected": "Ligado",
"disconnected": "Desligado",
"closeTab": "Fechar separador",
"closeConnection": "Fechar ligação",
"forgetTab": "Esquecer",
"removeBackground": "Remover",
"reconnect": "Religar",
"reopenTab": "Reabrir",
"sectionOpen": "Abertas",
"sectionBackground": "Em segundo plano",
"backgroundDesc": "As sessões persistem durante 30 minutos após a desligação e podem ser religadas.",
"persisted": "Persistida em segundo plano",
"expiresIn": "Expira em {{duration}}",
"search": "Pesquisar ligações...",
"noSearchResults": "Nenhuma ligação corresponde à sua pesquisa",
"rename": "Renomear sessão",
"sectionSharedWithMe": "Partilhou comigo",
"sharedBy": "Partilhado por {{username}}",
"join": "Juntar",
"sharedSessionLabel": "{{hostName}} (partilhado)"
},
"sessionSharing": {
"guestView": {
"loading": "Ligar à sessão partilhada...",
"linkInvalid": "Este link de partilha é inválido, expirou ou foi revogado.",
"rateLimited": "Muitas tentativas foram feitas, tente novamente em breve.",
"sessionEnded": "Esta sessão terminou.",
"readOnlyBadge": "Somente visualização"
},
"modalTitle": "Sessão de partilha",
"shareButton": "Partilhar",
"notReadyToShare": "A sessão ainda não está pronta para ser partilhada.",
"modeTab": {
"link": "Ligação",
"user": "Usuário"
},
"linkModeDescription": "Qualquer pessoa com este link pode participar, sem necessidade de criar conta.",
"userModeDescription": "Partilhe com um utilizador específico que já tenha acesso a este host. Caso ainda não tenha acesso, partilhe primeiro o host com ele ou utilize um link. Após a partilha, a sessão aparecerá no separador Conexões do utilizador.",
"permissionLevel": {
"label": "Nível de permissão",
"readOnly": "Somente leitura",
"readOnlyDescription": "É possível assistir à sessão em direto, mas não é possível digitar ou interagir.",
"readWrite": "Ler e escrever",
"readWriteDescription": "Pode digitar e interagir com a sessão da mesma forma que o proprietário."
},
"expiryLabel": "Expiração do link",
"createLinkButton": "Criar link",
"createShareButton": "Partilhar com o usuário",
"searchUsersPlaceholder": "Pesquisar utilizadores...",
"noUsersFound": "Nenhum utilizador encontrado",
"linkCreated": "Partilhar link criado",
"linkCopied": "Ligação copiada para a área de transferência",
"copyLink": "Copiar link",
"shareCreated": "Sessão partilhada. Ela aparecerá no separador Conexões deles.",
"shareFailed": "Falha ao criar partilha",
"userLacksHostAccess": "Esse utilizador ainda não tem acesso a este host. Partilhe o host com ele primeiro ou use um link.",
"activeShares": "Ações ativas",
"noActiveShares": "Sem ação ativa nesta sessão.",
"revoke": "Revogar",
"revokeConfirmTitle": "Revogar essa participação?",
"revokeConfirmDescription": "Qualquer pessoa que utilize esta partilha perderá o acesso imediatamente.",
"revoked": "Ações revogadas",
"revokeFailed": "Falha ao revogar a participação",
"joinCount": "{{count}} junte-se",
"joinCount_other": "{{count}} entra",
"expiresAt": "Expira em {{date}}",
"linkShareBadge": "Ligação",
"userShareBadge": "Utilizador: {{username}}",
"loadSharesFailed": "Falha ao carregar partilhas ativas"
},
"guacamole": {
"connecting": "A ligar à sessão {{type}}...",
"connectionError": "Erro de ligação",
"connectionFailed": "Falha na ligação",
"failedToConnect": "Falha ao obter o token de ligação",
"hostNotFound": "Servidor não encontrado",
"noHostSelected": "Nenhum servidor selecionado",
"reconnect": "Religar",
"retry": "Repetir",
"guacdUnavailable": "O serviço de ambiente de trabalho remoto (guacd) não está disponível. Certifique-se de que o guacd está em execução, acessível e devidamente configurado nas definições de administração.",
"credentialPromptTitle": "Introduza as credenciais RDP",
"credentialPromptDescription": "Este host está configurado para solicitar credenciais ao ligar. São utilizadas apenas para esta sessão e não são guardadas.",
"connect": "Ligar",
"ctrlAltDel": "Ctrl+Alt+Del",
"files": {
"title": "Arquivos do Drive",
"parent": "Diretório pai",
"refresh": "Atualizar",
"empty": "Esta pasta está vazia",
"listFailed": "Não foi possível ler esta pasta.",
"download": "Transferir",
"downloadFailed": "Falha ao descarregar {{name}}",
"upload": "Carregar ficheiros",
"uploading": "Carregando {{name}}...",
"uploaded": "Enviado {{name}}",
"uploadFailed": "Falha ao carregar {{name}}",
"uploadDisabled": "Os uploads estão desativados para esta ligação.",
"dropToUpload": "Arraste e largue os ficheiros para fazer o upload."
},
"toolbar": {
"ctrlAltDel": "Ctrl+Alt+Del",
"winL": "Win+L (Bloquear ecrã)",
"winKey": "Tecla Windows",
"ctrl": "Ctrl",
"alt": "Alt",
"shift": "Shift",
"win": "Win",
"stickyActive": "{{key}} (bloqueado - clique para libertar)",
"stickyInactive": "{{key}} (clique para bloquear)",
"esc": "Escape",
"tab": "Tab",
"home": "Home",
"end": "End",
"pageUp": "Page Up",
"pageDown": "Page Down",
"arrowUp": "Arrow Up",
"arrowDown": "Arrow Down",
"arrowLeft": "Arrow Left",
"arrowRight": "Arrow Right",
"fnToggle": "Teclas de Função",
"reconnect": "Reconectar Sessão",
"collapse": "Recolher barra",
"expand": "Expandir barra",
"dragHandle": "Arraste para reposicionar",
"switchToTrackpad": "Mudar para o modo trackpad (arraste para mover o cursor, toque para clicar)",
"switchToTouch": "Mude para o modo de toque (toque diretamente onde pretende clicar)."
}
},
"terminal": {
"connect": "Ligar ao Host",
"clear": "Limpar",
"paste": "Colar",
"reconnect": "Reconectar",
"connectionLost": "Ligação perdida",
"connected": "Ligado",
"clipboardWriteFailed": "Erro ao copiar para a área de transferência. Certifique-se de que a página é servida via HTTPS ou localhost.",
"clipboardReadFailed": "Erro ao ler da área de transferência. Certifique-se de que as permissões da área de transferência foram concedidas.",
"clipboardHttpWarning": "Não foi possível ler a área de transferência. Alguns browsers restringem o acesso à área de transferência fora de HTTPS - experimente Ctrl+V ou utilize HTTPS para aceder ao Termix.",
"passwordPromptFillTitle": "Preencher a palavra-passe guardada neste pedido?",
"unknownError": "Ocorreu um erro desconhecido.",
"websocketError": "Erro de ligação WebSocket",
"connecting": "A ligar...",
"noHostSelected": "Nenhum host selecionado",
"reconnecting": "A restabelecer ligação... ({{attempt}}/{{max}})",
"reconnected": "Ligação restabelecida com sucesso",
"tmuxSessionCreated": "Sessão tmux criada: {{name}}",
"tmuxSessionAttached": "Sessão tmux anexada: {{name}}",
"tmuxUnavailable": "O tmux não está instalado no host remoto, a reverter para shell padrão",
"tmuxSessionPickerTitle": "Sessões tmux",
"tmuxSessionPickerDesc": "Foram encontradas sessões tmux neste host. Selecione uma para retomar ou crie uma nova sessão.",
"tmuxWindows": "Janelas",
"tmuxWindowCount": "{{count}} janela",
"tmuxAttached": "Clientes anexados",
"tmuxAttachedCount": "{{count}} anexado",
"tmuxLastActivity": "Última atividade",
"tmuxTimeJustNow": "agora mesmo",
"tmuxTimeMinutes": "há {{count}} min",
"tmuxTimeHours": "há {{count}} h",
"tmuxTimeDays": "há {{count}} d",
"tmuxCreateNew": "Iniciar nova sessão",
"tmuxCopyHint": "Ajuste a seleção e prima Enter para copiar para a área de transferência",
"tmuxDetach": "Desanexar da sessão tmux",
"tmuxDetached": "Desanexado da sessão tmux",
"searchPlaceholder": "Encontrar",
"searchCaseSensitive": "Caixa de fósforos",
"searchWholeWord": "Combine a palavra inteira",
"searchRegex": "Utilizar expressão regular",
"searchNoResults": "Nenhum resultado",
"searchResultCount": "{{index}} de {{count}}",
"searchNext": "Próxima partida (Entrar)",
"searchPrevious": "Partida anterior (Shift+Enter)",
"searchClose": "Fechar (Esc)",
"maxReconnectAttemptsReached": "Número máximo de tentativas de restabelecimento de ligação atingido",
"closeTab": "Fechar",
"connectionTimeout": "Tempo limite da ligação",
"terminalTitle": "Terminal - {{host}}",
"terminalWithPath": "Terminal - {{host}}:{{path}}",
"runTitle": "A executar {{command}} - {{host}}",
"totpRequired": "Autenticação de dois fatores necessária",
"totpCodeLabel": "Código de verificação",
"totpVerify": "Verificar",
"mfaPromptRequired": "Autenticação necessária",
"mfaPushRequired": "Autenticação Push necessária",
"mfaMenuPlaceholder": "Insira a sua resposta",
"mfaWaitingApproval": "Aguarda aprovação no seu dispositivo...",
"mfaSendRequest": "Enviar solicitação",
"warpgateAuthRequired": "Autenticação Warpgate necessária",
"warpgateSecurityKey": "Chave de segurança",
"warpgateAuthUrl": "URL de autenticação",
"warpgateOpenBrowser": "Abrir no navegador",
"warpgateContinue": "Concluí a autenticação",
"opksshAuthRequired": "Autenticação OPKSSH necessária",
"opksshAuthDescription": "Conclua a autenticação no seu navegador para continuar. Esta sessão permanecerá válida por 24 horas.",
"opksshOpenBrowser": "Abrir navegador para autenticar",
"opksshWaitingForAuth": "A aguardar autenticação no navegador...",
"opksshAuthenticating": "A processar autenticação...",
"opksshTimeout": "A autenticação expirou. Tente novamente.",
"opksshAuthFailed": "A autenticação falhou. Verifique as suas credenciais e tente novamente.",
"opksshSignInWith": "Iniciar sessão com {{provider}}",
"tailscaleCheckRequired": "Autenticação Tailscale necessária",
"tailscaleCheckDescription": "O Tailscale SSH requer uma verificação adicional. Autentique-se no seu browser para continuar.",
"tailscaleCheckOpenBrowser": "Abra o browser para autenticar.",
"tailscaleCheckWaiting": "Aguarda-se autenticação do Tailscale...",
"tailscaleCheckTimeout": "A autenticação no Tailscale expirou. Tente novamente.",
"vaultAuthTitle": "Início de sessão no Vault necessário",
"vaultAuthDescription": "Foi aberta uma janela para iniciar sessão no HashiCorp Vault. Conclua o início de sessão aí; esta ligação continuará automaticamente.",
"vaultAuthFailed": "A autenticação no Vault falhou. Tente novamente.",
"vaultReopen": "Reabrir janela de início de sessão",
"sudoPasswordPopupTitle": "Inserir Password?",
"linkDialogTitle": "Abrir Ligação",
"linkDialogOpen": "Abrir",
"linkDialogCopy": "Copiar",
"websocketAbnormalClose": "A ligação foi fechada inesperadamente. Isto pode dever-se a um problema de configuração do proxy reverso ou SSL. Verifique os registos do servidor.",
"connectionLogTitle": "Registo da Ligação",
"connectionLogCopy": "Copiar registos para a área de transferência",
"connectionLogEmpty": "Ainda não há registos da ligação",
"connectionLogWaiting": "A aguardar registos da ligação...",
"connectionLogCopied": "Registos da ligação copiados para a área de transferência",
"connectionLogCopyFailed": "Falha ao copiar registos para a área de transferência",
"connectionRejected": "Ligação rejeitada pelo servidor. Verifique a sua autenticação e configuração de rede.",
"hostKeyRejected": "Verificação da chave de host SSH rejeitada. Ligação cancelada.",
"sessionTakenOver": "A sessão foi aberta noutro separador. A restabelecer ligação...",
"split": {
"splitTab": "Dividir Separador",
"addToSplit": "Adicionar à Divisão",
"removeFromSplit": "Remover da Divisão"
}
},
"fileManager": {
"noHostSelected": "Nenhum host selecionado",
"initializingEditor": "A inicializar editor...",
"file": "Ficheiro",
"folder": "Pasta",
"uploadFile": "Carregar Ficheiro",
"downloadFile": "Descarregar",
"extractArchive": "Extrair Arquivo",
"extractingArchive": "A extrair {{name}}...",
"archiveExtractedSuccessfully": "{{name}} extraído com sucesso",
"extractFailed": "Extração falhou",
"compressFile": "Comprimir Ficheiro",
"compressFiles": "Comprimir Ficheiros",
"compressFilesDesc": "Comprimir {{count}} itens num arquivo",
"archiveName": "Nome do arquivo",
"enterArchiveName": "Introduza o nome do arquivo...",
"compressionFormat": "Formato de compressão",
"selectedFiles": "Ficheiros selecionados",
"andMoreFiles": "e mais {{count}}...",
"compress": "Comprimir",
"compressingFiles": "A comprimir {{count}} itens em {{name}}...",
"filesCompressedSuccessfully": "{{name}} criado com sucesso",
"compressFailed": "Compressão falhou",
"edit": "Editar",
"preview": "Pré-visualizar",
"previous": "Anterior",
"next": "Seguinte",
"pageXOfY": "Página {{current}} de {{total}}",
"zoomOut": "Reduzir",
"zoomIn": "Ampliar",
"newFile": "Novo Ficheiro",
"newFolder": "Nova Pasta",
"rename": "Renomear",
"uploading": "A enviar...",
"uploadingFile": "A enviar {{name}}...",
"fileName": "Nome do ficheiro",
"folderName": "Nome da pasta",
"fileUploadedSuccessfully": "Ficheiro \"{{name}}\" enviado com sucesso",
"failedToUploadFile": "Falha ao enviar ficheiro",
"fileDownloadedSuccessfully": "Ficheiro \"{{name}}\" descarregado com sucesso",
"failedToDownloadFile": "Falha ao descarregar ficheiro",
"fileCreatedSuccessfully": "Ficheiro \"{{name}}\" criado com sucesso",
"folderCreatedSuccessfully": "Pasta \"{{name}}\" criada com sucesso",
"failedToCreateItem": "Falha ao criar item",
"operationFailed": "Operação {{operation}} falhou para {{name}}: {{error}}",
"failedToResolveSymlink": "Falha ao resolver ligação simbólica",
"itemsDeletedSuccessfully": "{{count}} itens eliminados com êxito",
"failedToDeleteItems": "Falha ao eliminar itens",
"sudoPasswordRequired": "Palavra-passe de administrador necessária",
"enterSudoPassword": "Introduza a palavra-passe sudo para continuar esta operação",
"sudoPassword": "Palavra-passe sudo",
"sudoOperationFailed": "Operação sudo falhou",
"sudoAuthFailed": "Autenticação sudo falhou",
"dragFilesToUpload": "Arraste ficheiros aqui para carregar",
"emptyFolder": "Esta pasta está vazia",
"searchFiles": "Procurar ficheiros...",
"upload": "Carregar",
"selectHostToStart": "Selecione uma máquina para iniciar a gestão de ficheiros",
"sshRequiredForFileManager": "O gestor de ficheiros requer SSH. Esta máquina não tem SSH ativado.",
"failedToConnect": "Falha ao ligar ao SSH",
"failedToLoadDirectory": "Falha ao carregar diretório",
"noSSHConnection": "Nenhuma ligação SSH disponível",
"copy": "Copiar",
"cut": "Cortar",
"paste": "Colar",
"copyPath": "Copiar caminho",
"copyPaths": "Copiar caminhos",
"delete": "Eliminar",
"properties": "Propriedades",
"refresh": "Atualizar",
"downloadFiles": "Descarregar {{count}} ficheiros para o navegador",
"copyFiles": "Copiar {{count}} itens",
"cutFiles": "Cortar {{count}} itens",
"deleteFiles": "Eliminar {{count}} itens",
"filesCopiedToClipboard": "{{count}} itens copiados para a área de transferência",
"filesCutToClipboard": "{{count}} itens cortados para a área de transferência",
"pathCopiedToClipboard": "Caminho copiado para a área de transferência",
"pathsCopiedToClipboard": "{{count}} caminhos copiados para a área de transferência",
"failedToCopyPath": "Falha ao copiar o caminho para a área de transferência",
"copyFolderLink": "Copiar ligação para a pasta",
"copyCurrentFolderLink": "Copiar ligação para a pasta atual",
"folderLinkCopied": "Ligação da pasta copiada para a área de transferência",
"failedToCopyFolderLink": "Falha ao copiar a ligação da pasta",
"movedItems": "{{count}} itens movidos",
"failedToDeleteItem": "Falha ao eliminar o item",
"itemRenamedSuccessfully": "Renomeação de {{type}} bem-sucedida.",
"failedToRenameItem": "Falha ao renomear o item",
"download": "Transferir",
"openExternalEditor": "Abrir externamente",
"chooseExternalEditor": "Escolher editor externo",
"externalEditorSelected": "Editor externo selecionado",
"externalEditorDesktopOnly": "O editor externo está disponível apenas na aplicação de ambiente de trabalho",
"externalEditorOpened": "Aberto no editor externo. Ao guardar, as alterações serão enviadas de volta para o servidor.",
"failedToOpenExternalEditor": "Falha ao abrir o editor externo",
"failedToSelectExternalEditor": "Falha ao selecionar o editor externo",
"permissions": "Permissões",
"size": "Tamanho",
"modified": "Modificado",
"path": "Caminho",
"confirmDelete": "Tem a certeza de que pretende eliminar {{name}}?",
"permissionDenied": "Permissão negada",
"serverError": "Erro do servidor",
"fileSavedSuccessfully": "Ficheiro guardado com sucesso",
"failedToSaveFile": "Falha ao guardar o ficheiro",
"confirmDeleteSingleItem": "Tem a certeza de que pretende eliminar permanentemente \"{{name}}\"?",
"confirmDeleteMultipleItems": "Tem a certeza de que pretende eliminar permanentemente {{count}} itens?",
"confirmDeleteMultipleItemsWithFolders": "Tem a certeza de que pretende eliminar permanentemente {{count}} itens? Isto inclui pastas e o seu conteúdo.",
"confirmDeleteFolder": "Tem a certeza de que pretende eliminar permanentemente a pasta \"{{name}}\" e todo o seu conteúdo?",
"permanentDeleteWarning": "Esta ação não pode ser anulada. Os itens serão permanentemente eliminados do servidor.",
"moveToTrashWarning": "O(s) artigo(s) será(ão) movido(s) para a Reciclagem Termix e poderá(ão) ser restaurado(s) antes do fim do período de retenção.",
"itemsMovedToTrash": "{{count}} artigo(s) movido(s) para a Reciclagem",
"trash": "Lixo",
"trashDescription": "Os itens eliminados são retidos durante {{days}} dia(s) neste host.",
"trashLoadFailed": "Falha ao carregar a Reciclagem",
"trashEmpty": "A papeleira está vazia.",
"trashRestore": "Restaurar",
"trashRestored": "Restaurado {{name}}",
"trashRestoreFailed": "Falha ao restaurar o item. O caminho original pode já existir.",
"trashDeletePermanently": "Apagar permanentemente",
"trashDeleteConfirm": "Apagar permanentemente {{name}}? Esta ação não pode ser anulada.",
"trashPermanentlyDeleted": "Eliminado permanentemente {{name}}",
"trashDeleteFailed": "Falha ao eliminar o item permanentemente",
"trashEmptyAction": "Esvaziar o lixo",
"trashEmptyConfirm": "Apagar permanentemente todos os itens da Reciclagem? Esta ação é irreversível.",
"trashEmptied": "Lixo esvaziado",
"trashRetention": "Limpeza automática após (dias)",
"trashRetentionSaved": "Retenção de lixo atualizada",
"trashRetentionFailed": "Falha na atualização da retenção de lixo",
"trashUnavailableConfirm": "Este item não pode ser movido para a Reciclagem, geralmente porque está noutro sistema de ficheiros ou requer permissões elevadas. Deseja eliminá-lo permanentemente?",
"recent": "Recentes",
"pinned": "Fixados",
"folderShortcuts": "Atalhos de pastas",
"failedToReconnectSSH": "Falha ao restabelecer a sessão SSH",
"openTerminalHere": "Abrir Terminal Aqui",
"run": "Executar",
"openTerminalInFolder": "Abrir Terminal Nesta Pasta",
"openTerminalInFileLocation": "Abrir Terminal na Localização do Ficheiro",
"runningFile": "Em execução - {{file}}",
"onlyRunExecutableFiles": "Só pode executar ficheiros executáveis",
"directories": "Pastas",
"removedFromRecentFiles": "Removido \"{{name}}\" dos ficheiros recentes",
"removeFailed": "Falha ao remover",
"unpinnedSuccessfully": "\"{{name}}\" desafixado com sucesso",
"unpinFailed": "Falha ao desafixar",
"removedShortcut": "Atalho \"{{name}}\" removido",
"removeShortcutFailed": "Falha ao remover atalho",
"clearedAllRecentFiles": "Limpos todos os ficheiros recentes",
"clearFailed": "Falha ao limpar",
"removeFromRecentFiles": "Remover dos ficheiros recentes",
"clearAllRecentFiles": "Limpar todos os ficheiros recentes",
"unpinFile": "Desafixar ficheiro",
"removeShortcut": "Remover atalho",
"pinFile": "Afixar ficheiro",
"addToShortcuts": "Adicionar aos atalhos",
"pasteFailed": "Falha ao colar",
"noUndoableActions": "Sem ações para desfazer",
"undoCopySuccess": "Desfeita a operação de cópia: Eliminados {{count}} ficheiros copiados",
"undoCopyFailedDelete": "Falha ao desfazer: Não foi possível eliminar os ficheiros copiados",
"undoCopyFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar a informação dos ficheiros copiados",
"undoMoveSuccess": "Desfeita a operação de mover: {{count}} ficheiros movidos de volta para o local original",
"undoMoveFailedMove": "Falha ao desfazer: Não foi possível mover nenhum ficheiro de volta",
"undoMoveFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar a informação dos ficheiros movidos",
"undoDeleteNotSupported": "A operação de eliminar não pode ser desfeita: Os ficheiros foram eliminados permanentemente do servidor",
"undoTypeNotSupported": "Tipo de operação de desfazer não suportado",
"undoOperationFailed": "Falha ao desfazer a operação",
"unknownError": "Erro desconhecido",
"confirm": "Confirmar",
"find": "Procurar...",
"replace": "Substituir",
"downloadInstead": "Transferir em alternativa",
"keyboardShortcuts": "Atalhos de teclado",
"searchAndReplace": "Pesquisar e substituir",
"editing": "Edição",
"search": "Pesquisar",
"findNext": "Localizar seguinte",
"findPrevious": "Localizar anterior",
"save": "Guardar",
"selectAll": "Selecionar tudo",
"undo": "Desfazer",
"redo": "Refazer",
"moveLineUp": "Mover linha para cima",
"moveLineDown": "Mover linha para baixo",
"toggleComment": "Alternar comentário",
"autoComplete": "Autocompletar",
"imageLoadError": "Erro ao carregar a imagem",
"startTyping": "Comece a escrever...",
"unknownSize": "Tamanho desconhecido",
"fileIsEmpty": "O ficheiro está vazio",
"largeFileWarning": "Aviso de ficheiro grande",
"largeFileWarningDesc": "Este ficheiro tem {{size}} de tamanho, o que poderá causar problemas de desempenho ao ser aberto como texto.",
"fileNotFoundAndRemoved": "O ficheiro \"{{name}}\" não foi encontrado e foi removido dos ficheiros recentes/fixados",
"failedToLoadFile": "Erro ao carregar o ficheiro: {{error}}",
"serverErrorOccurred": "Ocorreu um erro no servidor. Por favor, tente novamente mais tarde.",
"autoSaveFailed": "Falha na gravação automática",
"fileAutoSaved": "Ficheiro gravado automaticamente",
"moveFileFailed": "Falha ao mover {{name}}",
"moveOperationFailed": "Falha na operação de movimentação",
"canOnlyCompareFiles": "Só é possível comparar dois ficheiros",
"comparingFiles": "A comparar ficheiros: {{file1}} e {{file2}}",
"dragFailed": "Falha ao arrastar",
"filePinnedSuccessfully": "Ficheiro \"{{name}}\" fixado com sucesso",
"pinFileFailed": "Erro ao fixar o ficheiro",
"fileUnpinnedSuccessfully": "Ficheiro \"{{name}}\" desafixado com sucesso",
"unpinFileFailed": "Falha ao desafixar ficheiro",
"shortcutAddedSuccessfully": "Atalho para a pasta \"{{name}}\" adicionado com sucesso",
"addShortcutFailed": "Falha ao adicionar atalho",
"operationCompletedSuccessfully": "{{operation}} {{count}} itens com sucesso",
"operationCompleted": "{{operation}} {{count}} itens",
"downloadFileSuccess": "Ficheiro {{name}} descarregado com sucesso",
"downloadFileFailed": "Falha ao descarregar",
"moveTo": "Mover para {{name}}",
"diffCompareWith": "Comparar diferenças com {{name}}",
"dragOutsideToDownload": "Arraste para fora da janela para descarregar ({{count}} ficheiros)",
"newFolderDefault": "NovaPasta",
"newFileDefault": "NovoFicheiro.txt",
"successfullyMovedItems": "{{count}} itens movidos com sucesso para {{target}}",
"move": "Mover",
"searchInFile": "Procurar no ficheiro (Ctrl+F)",
"showKeyboardShortcuts": "Mostrar atalhos de teclado",
"decreaseFontSize": "Diminuir tamanho da letra",
"increaseFontSize": "Aumentar tamanho da letra",
"startWritingMarkdown": "Comece a escrever o seu conteúdo em markdown...",
"loadingFileComparison": "A carregar comparação de ficheiros...",
"reload": "Recarregar",
"compare": "Comparar",
"sideBySide": "Lado a lado",
"inline": "Em linha",
"fileComparison": "Comparação de ficheiros: {{file1}} vs {{file2}}",
"fileTooLarge": "Ficheiro demasiado grande: {{error}}",
"sshConnectionFailed": "Falha na ligação SSH. Verifique a sua ligação a {{name}} ({{ip}}:{{port}})",
"loadFileFailed": "Falha ao carregar ficheiro: {{error}}",
"connecting": "A ligar...",
"connectedSuccessfully": "Ligado com sucesso",
"totpVerificationFailed": "Falha na verificação TOTP",
"warpgateVerificationFailed": "Falha na autenticação Warpgate",
"authenticationFailed": "Falha na autenticação",
"incorrectPassphrase": "Frase-passe incorreta. Tente novamente.",
"verificationCodePrompt": "Código de verificação:",
"changePermissions": "Alterar Permissões",
"currentPermissions": "Permissões Atuais",
"owner": "Proprietário",
"group": "Grupo",
"others": "Outros",
"read": "Leitura",
"write": "Escrita",
"execute": "Execução",
"permissionsChangedSuccessfully": "Permissões alteradas com sucesso",
"failedToChangePermissions": "Falha ao alterar permissões",
"name": "Nome",
"sortByName": "Nome",
"sortByDate": "Data de modificação",
"sortBySize": "Tamanho",
"ascending": "Ascendente",
"descending": "Descendente",
"root": "Raiz",
"new": "Novo",
"sortBy": "Ordenar por",
"items": "Itens",
"selected": "Selecionados",
"editor": "Editor",
"octal": "Octal",
"storage": "Armazenamento",
"disk": "Disco",
"used": "Utilizado",
"of": "de",
"toggleSidebar": "Alternar Barra Lateral",
"cannotLoadPdf": "Não é possível carregar o PDF",
"pdfLoadError": "Ocorreu um erro ao carregar este ficheiro PDF.",
"loadingPdf": "A carregar PDF...",
"loadingPage": "A carregar página..."
},
"transfer": {
"copyToHost": "Copiar para o host…",
"moveToHost": "Mover para o host…",
"copyItemsToHost": "Copiar {{count}} itens para o host…",
"moveItemsToHost": "Mover {{count}} itens para o host…",
"noHostsConnected": "Não há outros hosts do gestor de ficheiros disponíveis.",
"noHostsConnectedHint": "Adicione outro host SSH com o Gestor de Ficheiros ativado no Gestor de Hosts.",
"selectDestinationHost": "Selecionar host de destino",
"destinationPath": "Caminho de destino",
"recentDestinations": "Destinos recentes",
"collapseRecentDestinations": "Recolher destinos recentes",
"expandRecentDestinations": "Expandir destinos recentes",
"browseFolders": "Navegar pelas pastas de destino",
"browseDestination": "Navegar ou introduzir o caminho",
"confirmCopy": "Copiar",
"confirmMove": "Mover",
"transferring": "A transferir…",
"progressVerifying": "Verificação da integridade do ficheiro…",
"progressBenchmarking": "Selecionando a rota de transferência mais rápida…",
"compressing": "A comprimir…",
"extracting": "A extrair…",
"transferringItems": "A transferir {{current}} de {{total}} itens…",
"transferSuccess": "Transferência concluída",
"transferError": "Transferência falhou",
"transferPartial": "Transferência concluída com {{count}} erros",
"transferPartialHint": "Não foi possível transferir: {{paths}}",
"itemsSummary": "{{count}} itens",
"destMustBeDirectory": "O destino deve ser uma pasta para transferências de vários itens.",
"selectThisFolder": "Selecionar esta pasta",
"browsePathWillBeCreated": "Esta pasta ainda não existe. Será criada quando a transferência for iniciada.",
"browsePathError": "Não foi possível abrir este caminho no host de destino.",
"goUp": "Subir",
"copyFolderToHost": "Copiar pasta para o host…",
"moveFolderToHost": "Mover pasta para o host…",
"hostReady": "Pronto",
"hostConnecting": "A ligar…",
"hostDisconnected": "Desligado",
"hostAuthRequired": "Autenticação necessária — abra o Gestor de Ficheiros neste host primeiro",
"hostConnectionFailed": "Falha na ligação",
"metricsTitle": "Tempos de transferência",
"metricsPrepare": "Preparar destino: {{duration}}",
"metricsCompress": "Compressão na origem: {{duration}}",
"metricsHopSourceRead": "Origem → servidor: {{throughput}}",
"metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}",
"metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}",
"metricsTransfer": "Ponta a ponta: {{throughput}} ({{duration}})",
"metricsExtract": "Extração no destino: {{duration}}",
"metricsVerify": "Verificado por SHA-256: {{duration}}",
"metricsRouteBenchmark": "Sondagem de percurso — direta: {{direct}}, retransmissão: {{relay}}",
"metricsSourceDelete": "Remoção da origem: {{duration}}",
"metricsTotal": "Total: {{duration}}",
"progressCompressing": "A comprimir no host de origem…",
"progressExtracting": "A extrair no destino…",
"progressTransferring": "A transferir dados…",
"progressReconnecting": "A reconectar…",
"parallelSegmentsLabel": "Vias de transferência paralelas",
"parallelSegmentsOption": "{{count}} vias",
"parallelSegmentsHint": "Os ficheiros grandes são divididos em partes de 256 MB. Múltiplas vias utilizam ligações separadas (como iniciar várias transferências) para um maior débito total.",
"progressTotalSpeed": "{{speed}} total ({{lanes}} vias)",
"progressTransferringItems": "A transferir ficheiros ({{current}} de {{total}})…",
"progressBytes": "{{transferred}} / {{total}}",
"progressItems": "{{current}} / {{total}} ficheiros",
"sourceNotDeletedPartial": "Ficheiros de origem mantidos (transferência parcial)",
"jumpHostLimitation": "Ambos os hosts têm de ser acessíveis a partir do servidor Termix. O encaminhamento direto entre hosts não é suportado.",
"cancel": "Cancelar",
"methodLabel": "Método de transferência",
"methodAuto": "Automático",
"methodTar": "Arquivo Tar",
"methodItemSftp": "SFTP por ficheiro",
"methodAutoHint": "Escolhe tar ou SFTP por ficheiro com base no número de ficheiros, tamanho e compressibilidade. Os ficheiros únicos usam sempre SFTP por streaming.",
"methodTarHint": "Comprime na origem, transfere um arquivo, extrai no destino. Requer tar em ambos os hosts Unix.",
"methodItemSftpHint": "Transfere cada ficheiro individualmente por SFTP. Funciona em todos os hosts, incluindo Windows.",
"methodPreviewLoading": "A calcular o método de transferência…",
"methodPreviewError": "Não foi possível pré-visualizar o método de transferência. O servidor ainda escolherá um método quando iniciar.",
"methodPreviewWillUseTar": "Utilizará: Arquivo Tar",
"methodPreviewWillUseItemSftp": "Utilizará: SFTP por ficheiro",
"methodPreviewScanSummary": "{{fileCount}} ficheiros, {{totalSize}} no total (analisados no host de origem).",
"methodItemSftpLimitation": "Cada ficheiro utiliza o mesmo stream SFTP como uma cópia de um único ficheiro, um após o outro. O progresso é combinado para todos os ficheiros, pelo que a barra se move lentamente durante ficheiros grandes.",
"methodReason": {
"user_item_sftp": "Optou por SFTP ficheiro a ficheiro.",
"user_tar": "Optou por ficheiro tar.",
"tar_unavailable": "O tar não está disponível num ou em ambos os anfitriões — será usado SFTP ficheiro a ficheiro.",
"windows_host": "Está envolvido um anfitrião Windows — o tar não é utilizado.",
"auto_multi_large": "Automático: vários ficheiros, incluindo um grande ({{largestSize}}) com dados compressíveis — o tar agrupa numa transferência única.",
"auto_single_large_in_archive": "Automático: um ficheiro grande ({{largestSize}}) neste conjunto — SFTP ficheiro a ficheiro.",
"auto_many_incompressible": "Automático: dados maioritariamente incompressíveis — SFTP ficheiro a ficheiro.",
"auto_many_files": "Automático: muitos ficheiros ({{fileCount}}) — o tar reduz a sobrecarga por ficheiro.",
"auto_default": "Automático: SFTP ficheiro a ficheiro para este conjunto."
},
"progressCancel": "Cancelar",
"progressCancelling": "A cancelar…",
"progressStalled": "Parado",
"resumedHint": "Reconectado a uma transferência ativa iniciada noutra janela.",
"transferCancelled": "Transferência cancelada",
"transferCancelledCopyHint": "Poderão permanecer ficheiros parciais no destino.",
"transferCancelledMoveHint": "Poderão permanecer ficheiros parciais no destino. Os ficheiros de origem não foram removidos.",
"cleanupDestFiles": "Limpar destino",
"cleanupDestFilesSuccess": "Ficheiros parciais removidos do destino.",
"cleanupDestFilesPartial": "Não foi possível remover alguns ficheiros parciais.",
"cleanupDestFilesNothing": "Nada a limpar no destino.",
"cleanupDestFilesError": "A limpeza falhou.",
"retryTransfer": "Repetir",
"retryTransferError": "A repetição falhou.",
"transferFailedRetryHint": "Foram mantidos dados parciais no destino. A repetição será retomada quando a ligação for restabelecida."
},
"tunnels": {
"noSshTunnels": "Sem túneis SSH",
"createFirstTunnelMessage": "Ainda não criou nenhum túnel SSH. Configure as ligações de túnel no Gestor de Anfitriões para começar.",
"connected": "Ligado",
"disconnected": "Desligado",
"connecting": "A ligar...",
"error": "Erro",
"canceling": "A cancelar...",
"connect": "Ligar",
"disconnect": "Desligar",
"cancel": "Cancelar",
"port": "Porta",
"localPort": "Porta local",
"remotePort": "Porta remota",
"currentHostPort": "Porta do host atual",
"endpointPort": "Porta do endpoint",
"bindIp": "IP local",
"endpointSshConfig": "Configuração SSH do endpoint",
"endpointSshHost": "Host SSH do endpoint",
"endpointSshHostPlaceholder": "Selecionar um host configurado",
"endpointSshHostRequired": "Selecione um host SSH do endpoint para cada túnel de cliente.",
"attempt": "Tentativa {{current}} de {{max}}",
"nextRetryIn": "Próxima tentativa em {{seconds}} segundos",
"clientTunnels": "Túneis de cliente",
"clientTunnel": "Túnel de cliente",
"addClientTunnel": "Adicionar túnel de cliente",
"noClientTunnels": "Nenhum túnel de cliente configurado neste desktop.",
"tunnelName": "Nome do túnel",
"remoteHost": "Host remoto",
"autoStart": "Arranque automático",
"clientAutoStartDesc": "Inicia quando este cliente de desktop abre e permanece ligado.",
"clientManualStartDesc": "Utilize Iniciar e Parar nesta linha. O Termix não o abrirá automaticamente.",
"clientRemoteServerNote": "O reencaminhamento remoto pode exigir AllowTcpForwarding e GatewayPorts no servidor SSH do endpoint. A porta remota fecha quando este desktop se desliga.",
"clientTunnelStarted": "Túnel de cliente iniciado",
"clientTunnelStopped": "Túnel de cliente parado",
"tunnelTestSucceeded": "Teste do túnel bem-sucedido",
"tunnelTestFailed": "Teste do túnel falhou",
"localSaved": "Túneis de cliente guardados",
"localSaveError": "Falha ao guardar os túneis de cliente locais",
"invalidBindIp": "O IP local deve ser um endereço IPv4 válido.",
"invalidLocalTargetIp": "O IP de destino local deve ser um endereço IPv4 válido.",
"invalidLocalPort": "A porta local deve estar entre 1 e 65535.",
"invalidRemotePort": "A porta remota deve estar entre 1 e 65535.",
"invalidLocalTargetPort": "A porta de destino local deve estar entre 1 e 65535.",
"invalidEndpointPort": "A porta do endpoint deve estar entre 1 e 65535.",
"duplicateAutoStartBind": "Apenas um túnel de cliente com arranque automático pode utilizar {{bind}}.",
"manualControlError": "Falha ao atualizar o estado do túnel.",
"active": "Ativo",
"start": "Iniciar",
"stop": "Parar",
"test": "Testar",
"type": "Tipo de Túnel",
"typeLocal": "Local (-L)",
"typeRemote": "Remoto (-R)",
"typeDynamic": "Dinâmico (-D)",
"typeServerLocalDesc": "Do host atual para o endpoint.",
"typeServerRemoteDesc": "Do endpoint de volta para o host atual.",
"typeClientLocalDesc": "Do computador local para o endpoint.",
"typeClientRemoteDesc": "Do endpoint de volta para o computador local.",
"typeClientDynamicDesc": "SOCKS no computador local.",
"typeDynamicDesc": "Encaminha tráfego SOCKS5 CONNECT via SSH",
"forwardDescriptionServerLocal": "Host atual {{sourcePort}} → endpoint {{endpointPort}}.",
"forwardDescriptionServerRemote": "Endpoint {{endpointPort}} → host atual {{sourcePort}}.",
"forwardDescriptionServerDynamic": "SOCKS no host atual {{sourcePort}}.",
"forwardDescriptionClientLocal": "Local {{sourcePort}} → remoto {{endpointPort}}.",
"forwardDescriptionClientRemote": "Remoto {{sourcePort}} → local {{endpointPort}}.",
"forwardDescriptionClientDynamic": "SOCKS na porta local {{sourcePort}}.",
"summaryClientLocal": "{{localHost}}:{{localPort}} → {{endpoint}}:{{remotePort}}",
"summaryClientRemote": "{{endpoint}}:{{remotePort}} → {{localHost}}:{{localPort}}",
"summaryClientDynamic": "{{localHost}}:{{localPort}} → SOCKS via {{endpoint}}",
"autoNameClientLocal": "Local {{localPort}} → {{endpoint}} {{remotePort}}",
"autoNameClientRemote": "{{endpoint}} {{remotePort}} → local {{localPort}}",
"autoNameClientDynamic": "SOCKS {{localPort}} via {{endpoint}}",
"route": "Rota:",
"lastStarted": "Último início",
"lastTested": "Último teste",
"lastError": "Último erro",
"maxRetries": "Máx. tentativas",
"maxRetriesDescription": "Número máximo de tentativas.",
"retryInterval": "Intervalo de repetição (segundos)",
"retryIntervalDescription": "Tempo de espera entre tentativas.",
"local": "Local",
"remote": "Remoto",
"destination": "Destino",
"host": "Servidor",
"mode": "Modo",
"noHostSelected": "Nenhum servidor selecionado",
"working": "A trabalhar..."
},
"cardGrid": {
"dragToMove": "Arraste para mover",
"dragToResize": "Arraste para redimensionar",
"changeWidth": "Alterar largura",
"removeCard": "Remover {{label}}",
"addCard": "Adicionar",
"columns": "Colunas",
"empty": "Nenhum cartão. Utilize Adicionar abaixo para colocar cartões."
},
"hostMetrics": {
"cpu": "CPU",
"memory": "Memória",
"disk": "Disco",
"network": "Rede",
"uptime": "Tempo de atividade",
"processes": "Processos",
"available": "Disponível",
"free": "Livre",
"connecting": "A ligar...",
"connectionFailed": "Falha ao ligar ao servidor",
"naCpus": "N/D CPU(s)",
"cpuCores_one": "{{count}} Núcleo",
"cpuCores_other": "{{count}} Núcleos",
"cpuUsage": "Utilização da CPU",
"memoryUsage": "Utilização da memória",
"diskUsage": "Utilização do disco",
"selectFilesystem": "Selecione o sistema de ficheiros",
"temperature": "Temperatura",
"highestTemperature": "Temperatura máxima",
"failedToFetchHostConfig": "Falha ao obter a configuração do servidor",
"serverOffline": "Servidor offline",
"cannotFetchMetrics": "Não é possível obter métricas do servidor offline",
"totpFailed": "Falha na verificação TOTP",
"noneAuthNotSupported": "Host Metrics não suporta o tipo de autenticação 'none'.",
"noHostSelected": "Nenhum host selecionado",
"load": "Carga",
"systemInfo": "Informação do Sistema",
"hostname": "Nome do host",
"operatingSystem": "Sistema Operativo",
"kernel": "Kernel",
"seconds": "segundos",
"networkInterfaces": "Interfaces de Rede",
"noInterfacesFound": "Nenhuma interface de rede encontrada",
"noProcessesFound": "Nenhum processo encontrado",
"processesTotal": "total",
"processesRunning": "em execução",
"loginStats": "Estatísticas de início de sessão SSH",
"noRecentLoginData": "Sem dados de início de sessão recentes",
"executingQuickAction": "A executar {{name}}...",
"quickActionSuccess": "{{name}} concluído com sucesso",
"quickActionFailed": "{{name}} falhou",
"quickActionError": "Falha ao executar {{name}}",
"ports": {
"title": "Portas em escuta",
"protocol": "Protocolo",
"port": "Porta",
"address": "Endereço",
"process": "Processo",
"search": "Pesquisar portas...",
"allProtocols": "Todos",
"noData": "Sem dados de portas em escuta"
},
"firewall": {
"title": "Firewall",
"inactive": "Inativo",
"policy": "Política",
"rules": "regras",
"noRules": "Sem regras nesta cadeia",
"noData": "Sem dados de firewall disponíveis",
"action": "Ação",
"protocol": "Proto",
"port": "Porta",
"source": "Origem",
"anywhere": "Qualquer lugar",
"chains": "cadeias"
},
"loadAvg": "Carga Média",
"swap": "Swap",
"architecture": "Arquitetura",
"refresh": "Atualizar",
"retry": "Tentar novamente",
"customize": "Personalizar layout",
"reset": "Redefinir",
"tabLive": "Ao Vivo",
"editModeInstructions": "Arraste os cartões para reorganizar, arraste a borda inferior para redimensionar e use o botão de largura para alterar a largura do cartão. Adicione ou remova cartões abaixo.",
"managers": {
"services": "Serviços",
"processInspector": "Inspetor de Processos",
"logViewer": "Visualizador de Registos",
"cron": "Tarefas Cron",
"packages": "Pacotes",
"ssl": "Certificados SSL",
"firewall": "Firewall",
"users": "Utilizadores e Permissões",
"healthCheck": "Verificações de Estado",
"diskBreakdown": "Análise de Disco",
"systemdTimers": "Temporizadores",
"topMemory": "Top por Memória",
"noData": "Sem dados",
"sudoHint": "Defina uma palavra-passe sudo para este host no editor de hosts para ativar ações privilegiadas.",
"filter": "Filtrar...",
"start": "Iniciar",
"stop": "Parar",
"restart": "Reiniciar",
"actionDone": "{{name}} atualizado",
"actionFailed": "A ação falhou",
"signalSent": "Sinal enviado para o PID {{pid}}",
"killHint": "Clique: terminar (SIGTERM). Clique direito: forçar encerramento (SIGKILL).",
"working": "A trabalhar...",
"update": "Atualizar",
"upgradeAll": "Atualizar tudo",
"allUpToDate": "Tudo está atualizado",
"save": "Guardar",
"command": "Comando",
"enabled": "Ativado",
"cronSaved": "Crontab atualizado",
"clients": "Clientes",
"dryRun": "Simulação",
"renew": "Renovar",
"noAcmeClient": "Nenhum cliente ACME (certbot ou acme.sh) encontrado neste servidor.",
"addInputRule": "Adicionar regra INPUT",
"firewallWarning": "As alterações são efetuadas apenas em execução até serem guardadas. Tenha cuidado para não ficar bloqueado.",
"ruleApplied": "Regra aplicada",
"invalidPort": "Introduza uma porta válida (1-65535)",
"newUsername": "Novo nome de utilizador",
"addUser": "Adicionar",
"deleteUser": "Eliminar utilizador",
"noHealthChecks": "Nenhuma verificação de estado configurada ainda.",
"follow": "Seguir",
"noLogData": "Sem saída de registo.",
"tree": "Árvore",
"enableDisable": "Ativar / desativar no arranque",
"grantSudo": "Conceder sudo",
"revokeSudo": "Revogar sudo",
"sslIssueCert": "Emitir certificado",
"sslExpired": "Expirado",
"sslInDays": "em {{days}}d",
"sslNeedDomain": "Introduza pelo menos um domínio",
"sslIssued": "Certificado emitido",
"sslDomainsPlaceholder": "example.com, www.example.com",
"sslHttpStandalone": "HTTP (autónomo)",
"sslHttpWebroot": "HTTP (webroot)",
"sslDns": "DNS",
"sslDnsProvider": "Fornecedor DNS (ex. cloudflare)",
"sslIssueHint": "As credenciais do fornecedor DNS já devem estar configuradas no host.",
"sslRevoke": "Revogar certificado",
"sslRevoked": "Certificado revogado",
"sslRevokeConfirm": "Revogar e remover o certificado \"{{name}}\"? Esta ação não pode ser anulada.",
"healthRun": "Executar",
"healthName": "Nome",
"healthTarget": "Host / endereço",
"healthAddCheck": "Adicionar verificação",
"healthSaved": "Verificações de saúde guardadas",
"healthMissingFields": "Cada verificação necessita de um nome e um destino",
"logFile": "Ficheiro",
"logUnit": "Unidade",
"logCustomPath": "Caminho personalizado em /var/log (opcional)",
"logGrep": "Filtrar linhas...",
"firewallPersist": "Persistir regras",
"firewallPersisted": "Regras de firewall persistidas",
"wireguard": "WireGuard",
"tailscale": "Tailscale",
"wgNotInstalled": "O WireGuard não está instalado neste host",
"wgNoInterfaces": "Nenhuma interface WireGuard configurada",
"wgInterfaceUp": "Ativar",
"wgInterfaceDown": "Desativar",
"wgBringingUp": "A ativar {{name}}...",
"wgBringingDown": "A desativar {{name}}...",
"wgInterfaceUpDone": "{{name}} está ativada",
"wgInterfaceDownDone": "{{name}} está desativada",
"wgListenPort": "Porta",
"wgPublicKey": "Chave pública",
"wgEndpoint": "Endpoint",
"wgAllowedIPs": "IPs permitidos",
"wgLastHandshake": "Último handshake",
"wgHandshakeNever": "Nunca",
"wgTransfer": "Transferência",
"tsNotInstalled": "O Tailscale não está instalado neste host",
"tsRunning": "A executar",
"tsStopped": "Parado",
"tsEnable": "Ligar",
"tsDisable": "Desligar",
"tsEnabling": "A ligar ao Tailscale...",
"tsDisabling": "A desligar do Tailscale...",
"tsEnabled": "Tailscale ligado",
"tsDisabled": "Tailscale desligado",
"tsIPs": "IPs do Tailscale",
"tsPeers": "Pares",
"tsOnline": "Online",
"tsOffline": "Offline",
"tsExitNode": "Nó de saída",
"tsExitNodeActive": "Nó de saída ativo",
"tsHostname": "Nome do host"
}
},
"proxmoxStats": {
"tabTitle": "Estatísticas do Proxmox",
"cpuUsage": "Utilização da CPU",
"memoryUsage": "Uso de memória",
"diskUsage": "Utilização do disco",
"networkInterfaces": "Interfaces de rede",
"uptime": "Tempo de atividade",
"systemInfo": "Informações do sistema",
"guestsSummary": "Convidados",
"storagePools": "Piscinas de armazenamento",
"clusterHealth": "Saúde em grupo",
"cpuCores_one": "{{count}} Núcleo",
"cpuCores_other": "{{count}} Núcleos",
"used": "Usado",
"total": "Total",
"hostname": "Nome do host",
"kernel": "Kernel",
"pveVersion": "Versão PvE",
"name": "Nome",
"status": "Estatuto",
"type": "Tipo",
"cpu": "CPU",
"mem": "Membro",
"disk": "Disco",
"running": "Corrida",
"stopped": "Parou",
"guestCounts": "{{running}}/{{total}} em execução",
"inactive": "Inativo",
"notClustered": "Nó independente (não faz parte de um cluster)",
"quorate": "Quorate",
"notQuorate": "Sem quórum",
"nodeOnline": "Online",
"nodeOffline": "Offline",
"noHostSelected": "Nenhum host selecionado",
"pveshNotFound": "pvesh não encontrado - este é um nó Proxmox?",
"nodeDetectionFailed": "Não foi possível determinar um nome de nó Proxmox válido.",
"connecting": "Ligando...",
"connectionFailed": "Falha ao ligar ao nó Proxmox",
"refresh": "Atualizar",
"searchGuests": "Pesquisar hóspedes...",
"filterAll": "Tudo",
"filterVm": "VM",
"filterLxc": "LXC",
"noGuests": "Nenhuma máquina virtual ou contentor LXC foi encontrado neste nó.",
"noGuestsMatch": "Nenhum hóspede corresponde aos filtros atuais."
},
"auth": {
"tagline": "Gestão auto-hospedada de SSH e ambiente de trabalho remoto",
"loginTitle": "Bem-vindo de volta",
"registerTitle": "Criar Conta",
"forgotPassword": "Esqueceu-se da palavra-passe?",
"rememberMe": "Lembrar dispositivo por 30 dias (inclui TOTP)",
"noAccount": "Não tem uma conta?",
"hasAccount": "Já tem uma conta?",
"twoFactorAuth": "Autenticação de dois fatores",
"enterCode": "Introduza o código de verificação",
"backupCode": "Ou utilize código de backup",
"verifyCode": "Verificar Código",
"redirectingToApp": "A redirecionar para a aplicação...",
"sshAuthenticationRequired": "Autenticação SSH necessária",
"sshNoKeyboardInteractive": "Autenticação por teclado interativo indisponível",
"sshAuthenticationFailed": "Falha na autenticação",
"sshAuthenticationTimeout": "Tempo limite de autenticação excedido",
"sshNoKeyboardInteractiveDescription": "O servidor não suporta autenticação por teclado interativo. Por favor, forneça a sua palavra-passe ou chave SSH.",
"sshAuthFailedDescription": "As credenciais fornecidas estavam incorretas. Por favor, tente novamente com credenciais válidas.",
"sshTimeoutDescription": "A tentativa de autenticação expirou. Por favor, tente novamente.",
"sshProvideCredentialsDescription": "Por favor, forneça as suas credenciais SSH para se ligar a este servidor.",
"sshPasswordDescription": "Introduza a palavra-passe para esta ligação SSH.",
"sshKeyPasswordDescription": "Se a sua chave SSH estiver encriptada, introduza a frase-senha aqui.",
"passphraseRequired": "Frase-senha obrigatória",
"passphraseRequiredDescription": "A chave SSH está encriptada. Introduza a frase-senha para a desbloquear.",
"back": "Voltar",
"firstUser": "Primeiro Utilizador",
"firstUserMessage": "É o primeiro utilizador e será configurado como administrador. Pode ver as definições de administrador no menu suspenso do utilizador na barra lateral. Se pensa que isto é um erro, verifique os logs do Docker, ou crie um issue no GitHub.",
"external": "Externo",
"loginWithExternal": "Iniciar sessão com fornecedor externo",
"loginWithExternalDesc": "Inicie sessão utilizando o seu fornecedor de identidade externo configurado",
"externalNotSupportedInElectron": "A autenticação externa ainda não é suportada na aplicação Electron. Utilize a versão web para iniciar sessão via OIDC.",
"loginWithProvider": "Iniciar sessão com {{name}}",
"orContinueWith": "ou continuar com",
"ldapUsername": "Nome de utilizador LDAP",
"ldapPassword": "Palavra-passe LDAP",
"ldapSignIn": "Iniciar sessão",
"ldapLoginFailed": "Falha no início de sessão LDAP",
"resetPasswordButton": "Redefinir palavra-passe",
"sendResetCode": "Enviar código de reposição",
"resetCodeDesc": "Introduza o seu nome de utilizador para receber um código de reposição de palavra-passe. O código será registado nos logs do contentor Docker.",
"resetCode": "Código de reposição",
"verifyCodeButton": "Verificar código",
"enterResetCode": "Introduza o código de 6 dígitos dos logs do contentor Docker para o utilizador:",
"newPassword": "Nova palavra-passe",
"confirmNewPassword": "Confirmar palavra-passe",
"enterNewPassword": "Introduza a nova palavra-passe para o utilizador:",
"signUp": "Registar",
"desktopApp": "Aplicação de ambiente de trabalho",
"loggingInToDesktopApp": "A iniciar sessão na aplicação de ambiente de trabalho",
"loadingServer": "A carregar servidor...",
"dataLossWarning": "Redefinir a sua palavra-passe desta forma irá eliminar todos os anfitriões SSH guardados, credenciais e outros dados encriptados. Esta ação não pode ser desfeita. Utilize apenas se se esqueceu da sua palavra-passe e não tem sessão iniciada.",
"authenticationDisabled": "Autenticação desativada",
"authenticationDisabledDesc": "Todos os métodos de autenticação estão atualmente desativados. Contacte o seu administrador.",
"passwordLoginDisabledDesc": "O início de sessão com palavra-passe está desativado. Utilize uma passkey ou um fornecedor de autenticação externo.",
"signInWithPasskey": "Iniciar sessão com passkey",
"passkeyLoginFailed": "Falha no início de sessão com passkey",
"attemptsRemaining": "{{count}} tentativas restantes",
"confirmResetDataWipe": "Esta conta não iniciou sessão desde a atualização da encriptação, pelo que os dados armazenados não podem ser recuperados sem a palavra-passe antiga. A reposição irá eliminar permanentemente os seus hosts, credenciais e snippets. Continuar?"
},
"hostKey": {
"verifyNewHost": "Verificar chave de host SSH",
"keyChangedWarning": "Chave de host SSH alterada",
"firstConnectionTitle": "Primeira ligação a este host",
"firstConnectionDescription": "Não é possível estabelecer a autenticidade deste host. Verifique se a impressão digital corresponde ao esperado.",
"keyChangedDescription": "A chave de host deste servidor foi alterada desde a sua última ligação. Isto pode indicar um problema de segurança.",
"previousKey": "Chave anterior",
"newFingerprint": "Nova impressão digital",
"fingerprint": "Impressão digital",
"verifyInstructions": "Se confia neste host, clique em Aceitar para continuar e guardar esta impressão digital para futuras ligações.",
"securityWarning": "Aviso de segurança",
"acceptAndContinue": "Aceitar e continuar",
"acceptNewKey": "Aceitar nova chave e continuar"
},
"errors": {
"databaseConnection": "Não foi possível ligar à base de dados",
"unknownError": "Erro desconhecido",
"loginFailed": "Falha no início de sessão",
"failedPasswordReset": "Falha ao iniciar a reposição da palavra-passe",
"failedVerifyCode": "Falha ao verificar o código de reposição",
"failedCompleteReset": "Falha ao concluir a reposição da palavra-passe",
"invalidTotpCode": "Código TOTP inválido",
"failedOidcLogin": "Falha ao iniciar sessão OIDC",
"silentSigninOidcUnavailable": "Foi solicitado um início de sessão silencioso, mas o início de sessão OIDC não está disponível.",
"failedUserInfo": "Falha ao obter informações do utilizador após o início de sessão",
"oidcAuthFailed": "Falha na autenticação OIDC",
"invalidAuthUrl": "URL de autorização inválida recebida do backend",
"requiredField": "Este campo é obrigatório",
"minLength": "O comprimento mínimo é {{min}}",
"passwordMismatch": "As palavras-passe não coincidem",
"passwordLoginDisabled": "O início de sessão com nome de utilizador/palavra-passe está atualmente desativado",
"sessionExpired": "Sessão expirada - inicie sessão novamente",
"totpRateLimited": "Limite de tentativas atingido: demasiadas tentativas de verificação TOTP. Tente novamente mais tarde.",
"totpRateLimitedWithTime": "Limite de tentativas atingido: demasiadas tentativas de verificação TOTP. Aguarde {{time}} segundos antes de tentar novamente.",
"resetCodeRateLimited": "Limite de tentativas atingido: demasiadas tentativas de verificação. Tente novamente mais tarde.",
"resetCodeRateLimitedWithTime": "Limite de tentativas: demasiadas tentativas de verificação. Por favor, aguarde {{time}} segundos antes de tentar novamente.",
"authTokenSaveFailed": "Falha ao guardar o token de autenticação",
"keyringUnavailable": "A sessão foi iniciada, mas não pôde ser guardada: este sistema não tem um porta-chaves disponível para a encriptar. Inicie um Serviço Secreto (como o gnome-keyring ou o KWallet) e inicie sessão novamente.",
"failedToLoadServer": "Falha ao carregar o servidor",
"remoteServerRequired": "É necessário um servidor remoto. Ligue um servidor remoto nas Definições para utilizar este tipo de ligação."
},
"messages": {
"registrationDisabled": "O registo de novas contas está atualmente desativado por um administrador. Por favor, inicie sessão ou contacte um administrador.",
"userNotAllowed": "A sua conta não está autorizada a registar-se. Por favor, contacte um administrador.",
"databaseConnectionFailed": "Falha ao ligar ao servidor de base de dados",
"resetCodeSent": "Código de reposição enviado para os registos do Docker",
"codeVerified": "Código verificado com sucesso",
"passwordResetSuccess": "Palavra-passe redefinida com sucesso",
"loginSuccess": "Início de sessão bem-sucedido",
"registrationSuccess": "Registo bem-sucedido"
},
"profile": {
"c2sTunnelConfigDesc": "Túneis locais do ambiente de trabalho direcionados para hosts SSH configurados.",
"c2sTunnelPresets": "Predefinições de túneis do cliente",
"c2sTunnelPresetsDesc": "Guarde a lista de túneis locais deste cliente de ambiente de trabalho como uma predefinição de servidor nomeada ou carregue uma predefinição de volta para este cliente.",
"c2sTunnelPresetsUnavailable": "As predefinições de túneis do cliente estão disponíveis apenas no cliente de ambiente de trabalho.",
"c2sPresetName": "Nome da predefinição",
"c2sPresetNamePlaceholder": "Nome da predefinição do cliente",
"c2sPresetToLoad": "Predefinição a carregar",
"c2sNoPresetSelected": "Nenhuma predefinição selecionada",
"c2sNoPresets": "Nenhuma predefinição guardada",
"c2sLoadPreset": "Carregar",
"c2sCurrentLocalConfig": "{{count}} túnel/túneis de cliente local configurado(s) neste ambiente de trabalho.",
"c2sPresetSyncNote": "As predefinições são instantâneos explícitos; carregar uma substitui a lista de túneis de cliente local deste cliente de ambiente de trabalho.",
"c2sPresetSaved": "Predefinição de túnel do cliente guardada",
"c2sPresetLoaded": "Predefinição de túnel do cliente carregada localmente",
"c2sPresetRenamed": "Predefinição de túnel do cliente renomeada",
"c2sPresetDeleted": "Predefinição de túnel do cliente eliminada",
"c2sPresetLoadError": "Falha ao carregar as predefinições de túneis do cliente"
},
"placeholders": {
"maxRetries": "3",
"retryInterval": "10",
"language": "Idioma",
"keyPassword": "palavra-passe da chave",
"pastePrivateKey": "Cole aqui a sua chave privada...",
"localListenerHost": "127.0.0.1 (escuta localmente)",
"localTargetHost": "127.0.0.1 (alvo neste computador)",
"socksListenerHost": "127.0.0.1 (escuta SOCKS)",
"enterPassword": "Introduza a sua palavra-passe",
"defaultPort": "22",
"defaultEndpointPort": "224"
},
"dashboard": {
"title": "Painel de Controlo",
"loading": "A carregar painel de controlo...",
"github": "GitHub",
"support": "Suporte",
"discord": "Discord",
"docs": "Documentação",
"donate": "Doar",
"serverOverview": "Visão Geral do Servidor",
"version": "Versão",
"upToDate": "Atualizado",
"updateAvailable": "Atualização Disponível",
"beta": "Beta",
"uptime": "Tempo de Atividade",
"database": "Base de Dados",
"healthy": "Operacional",
"error": "Erro",
"totalHosts": "Total de Hosts",
"totalTunnels": "Total de Túneis",
"totalCredentials": "Total de Credenciais",
"recentActivity": "Atividade Recente",
"reset": "Repor",
"loadingRecentActivity": "A carregar atividade recente...",
"noRecentActivity": "Sem atividade recente",
"quickActions": "Ações Rápidas",
"addHost": "Adicionar Host",
"addCredential": "Adicionar Credencial",
"adminSettings": "Definições de Administrador",
"userProfile": "Perfil do Utilizador",
"serverStats": "Estatísticas do Servidor",
"loadingServerStats": "A carregar estatísticas do servidor...",
"noServerData": "Nenhum dado do servidor disponível",
"cpu": "CPU",
"ram": "RAM",
"customizeLayout": "Personalizar Dashboard",
"dashboardSettings": "Definições do Dashboard",
"enableDisableCards": "Ativar/Desativar Cartões",
"resetLayout": "Repor para a Predefinição",
"serverOverviewCard": "Visão Geral do Servidor",
"recentActivityCard": "Atividade Recente",
"networkGraphCard": "Gráfico de Rede",
"networkGraph": "Gráfico de Rede",
"quickActionsCard": "Ações Rápidas",
"serverStatsCard": "Estatísticas do Servidor",
"panelMain": "Principal",
"panelSide": "Lateral",
"justNow": "agora mesmo",
"serviceLinks": "Links de Serviço",
"homepagePreview": "Pré-visualização da Página Inicial"
},
"donation": {
"title": "Está a gostar do Termix?",
"body": "O Termix é gratuito e de código aberto, desenvolvido e mantido por uma equipa de duas pessoas nos nossos tempos livres. Se substituiu uma ferramenta comercial pela qual estaria a pagar, um donativo ajuda a cobrir os custos de alojamento e mantém o desenvolvimento ativo. De momento, os donativos são apenas em criptomoedas.",
"milestones": "Os donativos também ajudam a financiar o tempo para pesquisar e aprender o necessário para criar funcionalidades como suporte para SAML e Kubernetes. Veja o progresso na página de donativos.",
"cta": "Doar",
"dismiss": "Talvez mais tarde"
},
"dashboardTab": {
"stable": "ESTÁVEL",
"hostsOnline": "Hosts Online",
"activeTunnels": "Túneis Ativos",
"registerNewServer": "Registar um novo servidor",
"storeSshKeysOrPasswords": "Armazenar chaves SSH ou palavras-passe",
"manageUsersAndRoles": "Gerir utilizadores e funções",
"manageYourAccount": "Gerir a sua conta",
"hostStatus": "Estado do Host",
"noHostsConfigured": "Nenhum host configurado",
"online": "ONLINE",
"offline": "OFFLINE",
"checking": "A VERIFICAR",
"onlineLower": "Online",
"nodes": "{{count}} nós",
"add": "Adicionar:",
"commandPalette": "Paleta de Comandos",
"done": "Concluído",
"editModeInstructions": "Arraste cartões para reordenar · Arraste o divisor de coluna para redimensionar colunas · Arraste a borda inferior de um cartão para redimensionar a sua altura · Lixo para remover",
"empty": "Vazio",
"clear": "Limpar",
"serviceLinksTitle": "Links de Serviço",
"serviceLinksEmpty": "Ainda sem links de serviço",
"serviceLinksAddLabel": "Etiqueta",
"serviceLinksAddUrl": "URL",
"serviceLinksAdd": "Adicionar",
"serviceLinksLabelPlaceholder": "O Meu Serviço",
"serviceLinksUrlPlaceholder": "http://192.168.1.10:8080",
"serviceLinksInvalidUrl": "Insira um endereço web válido",
"serviceLinksAddFailed": "Falha ao adicionar link de serviço",
"disk": "Disco",
"viewServerDetails": "Ver detalhes do servidor"
},
"sessionLogs": {
"title": "Registos de Sessão",
"noLogs": "Ainda sem registos de sessão",
"noLogsDesc": "Ative o registo de sessão num host para começar a gravar",
"duration": "Duração",
"viewLog": "Ver registo",
"downloadLog": "Transferir",
"downloadAsText": "Descarregar como texto",
"deleteLog": "Eliminar",
"confirmDelete": "Eliminar este registo de sessão?",
"confirmDeleteDesc": "Esta ação não pode ser desfeita.",
"copyContent": "Copiar",
"copied": "Copiado!",
"loadError": "Falha ao carregar registos de sessão",
"deleteError": "Falha ao eliminar registo de sessão",
"filterByHost": "Filtrar por host..."
},
"networkGraph": {
"addHost": "Adicionar Host",
"addGroup": "Adicionar Grupo",
"addLink": "Adicionar Ligação",
"zoomIn": "Ampliar",
"zoomOut": "Reduzir",
"resetView": "Repor Vista",
"selectHost": "Selecionar Host",
"chooseHost": "Escolher um host...",
"parentGroup": "Grupo Pai",
"noGroup": "Nenhum grupo",
"groupName": "Nome do Grupo",
"color": "Cor",
"source": "Origem",
"target": "Destino",
"moveToGroup": "Mover para Grupo",
"selectGroup": "Selecionar grupo...",
"addConnection": "Adicionar Ligação",
"hostDetails": "Detalhes do Host",
"removeFromGroup": "Remover do Grupo",
"addHostHere": "Adicionar Host Aqui",
"editGroup": "Editar Grupo",
"delete": "Eliminar",
"add": "Adicionar",
"create": "Criar",
"move": "Mover",
"connect": "Ligar",
"createGroup": "Criar Grupo",
"selectSourcePlaceholder": "Selecionar Origem...",
"selectTargetPlaceholder": "Selecionar Destino...",
"invalidFile": "Ficheiro Inválido",
"hostAlreadyExists": "O host já está na topologia.",
"connectionExists": "A ligação já existe",
"unknown": "Desconhecido",
"name": "Nome",
"ip": "IP",
"status": "Estado",
"failedToAddNode": "Falha ao adicionar nó",
"sourceDifferentFromTarget": "A origem e o destino devem ser diferentes",
"exportJSON": "Exportar JSON",
"importJSON": "Importar JSON",
"terminal": "Terminal",
"fileManager": "Gestor de ficheiros",
"tunnel": "Túnel",
"docker": "Docker",
"serverStats": "Métricas do host",
"hostMetrics": "Métricas do host",
"noNodes": "Ainda sem nós"
},
"docker": {
"notEnabled": "Docker não está ativado para este host",
"validating": "A validar o Docker...",
"connecting": "A ligar...",
"error": "Erro",
"version": "{{runtime}} {{version}}",
"connectionFailed": "Falha ao ligar ao Docker",
"containerStarted": "Contentor {{name}} iniciado",
"failedToStartContainer": "Falha ao iniciar o contentor {{name}}",
"containerStopped": "Contentor {{name}} parado",
"failedToStopContainer": "Falha ao parar o contentor {{name}}",
"containerRestarted": "Contentor {{name}} reiniciado",
"failedToRestartContainer": "Falha ao reiniciar o contentor {{name}}",
"containerPaused": "Contentor {{name}} suspenso",
"containerUnpaused": "Contentor {{name}} retomado",
"failedToTogglePauseContainer": "Falha ao alternar estado de pausa do contentor {{name}}",
"containerRemoved": "Contentor {{name}} removido",
"failedToRemoveContainer": "Falha ao remover o contentor {{name}}",
"image": "Imagem",
"ports": "Portas",
"noPorts": "Sem portas",
"start": "Iniciar",
"confirmRemoveContainer": "Tem a certeza de que pretende remover o contentor '{{name}}'? Esta ação não pode ser desfeita.",
"runningContainerWarning": "Aviso: Este contentor está em execução. Removê-lo irá pará-lo primeiro.",
"loadingContainers": "A carregar contentores...",
"manager": "Gestor Docker",
"autoRefresh": "Atualização automática",
"timestamps": "Marcas de tempo",
"lines": "Linhas",
"filterLogs": "Filtrar registos...",
"refresh": "Atualizar",
"download": "Transferir",
"clear": "Limpar",
"logsDownloaded": "Registos transferidos com sucesso",
"last50": "Últimos 50",
"last100": "Últimos 100",
"last500": "Últimos 500",
"last1000": "Últimos 1000",
"allLogs": "Todos os registos",
"noLogsMatching": "Nenhum registo corresponde a \"{{query}}\"",
"noLogsAvailable": "Nenhum registo disponível",
"noContainersFound": "Nenhum contentor encontrado",
"noContainersFoundHint": "Não existem contentores Docker disponíveis neste host",
"searchPlaceholder": "Pesquisar contentores...",
"allStatuses": "Todos os estados",
"stateRunning": "Em execução",
"statePaused": "Em pausa",
"stateExited": "Terminado",
"stateRestarting": "A reiniciar",
"noContainersMatchFilters": "Nenhum contentor corresponde aos seus filtros",
"noContainersMatchFiltersHint": "Tente ajustar os seus critérios de pesquisa ou filtro",
"failedToFetchStats": "Falha ao obter estatísticas do contentor",
"containerNotRunning": "O contentor não está em execução",
"startContainerToViewStats": "Inicie o contentor para ver as estatísticas",
"loadingStats": "A carregar estatísticas...",
"errorLoadingStats": "Erro ao carregar estatísticas",
"noStatsAvailable": "Nenhuma estatística disponível",
"cpuUsage": "Utilização da CPU",
"current": "Atual",
"memoryUsage": "Utilização da memória",
"networkIo": "I/O de rede",
"input": "Entrada",
"output": "Saída",
"blockIo": "E/S de blocos",
"read": "Leitura",
"write": "Escrita",
"pids": "PIDs",
"containerInformation": "Informações do contentor",
"name": "Nome",
"id": "ID",
"state": "Estado",
"containerMustBeRunning": "O contentor tem de estar em execução para aceder à consola",
"verificationCodePrompt": "Introduza o código de verificação",
"totpVerificationFailed": "A verificação TOTP falhou. Por favor, tente novamente.",
"warpgateVerificationFailed": "A autenticação Warpgate falhou. Por favor, tente novamente.",
"connectedTo": "Ligado a {{containerName}}",
"disconnected": "Desligado",
"consoleError": "Erro da consola",
"errorMessage": "Erro: {{message}}",
"failedToConnect": "Falha ao ligar ao contentor",
"console": "Consola",
"selectShell": "Selecionar shell",
"bash": "Bash",
"sh": "sh",
"ash": "ash",
"connect": "Ligar",
"disconnect": "Desligar",
"notConnected": "Não ligado",
"clickToConnect": "Clique em Ligar para iniciar uma sessão shell",
"connectingTo": "A ligar a {{containerName}}...",
"containerNotFound": "Contentor não encontrado",
"backToList": "Voltar à lista",
"logs": "Registos",
"stats": "Estatísticas",
"consoleTab": "Consola",
"startContainerToAccess": "Inicie o contentor para aceder à consola"
},
"admin": {
"sectionGeneral": "Geral",
"sectionOidc": "OIDC",
"sectionSso": "Provedores de SSO",
"ssoAddProvider": "Adicionar Provedor",
"ssoDocsLink": "Ver docs",
"ssoProviderDocsLink": "Ver docs",
"ssoNoProviders": "Nenhum provedor de SSO configurado.",
"ssoProviderName": "Nome de apresentação",
"ssoProviderType": "Tipo de Provedor",
"ssoDeleteProvider": "Eliminar Provedor",
"ssoDeleteConfirm": "Eliminar este provedor? Os utilizadores associados não poderão iniciar sessão.",
"ssoTypeOidc": "OIDC",
"ssoTypeLdap": "LDAP",
"ssoTypeGithub": "GitHub",
"ssoTypeGoogle": "Google",
"ssoEnabled": "Ativado",
"ssoDisabled": "Desativado",
"ssoSaveProvider": "Guardar Provedor",
"ssoTestConnection": "Testar Ligação",
"ssoEditProvider": "Editar Provedor",
"ldapHost": "Servidor LDAP",
"ldapPort": "Porta",
"ldapUseTls": "Usar TLS (LDAPS)",
"ldapBindDn": "Bind DN",
"ldapBindPassword": "Palavra-passe de Bind",
"ldapUserSearchBase": "Base de pesquisa de utilizadores",
"ldapUserSearchFilter": "Filtro de pesquisa de utilizadores",
"ldapUsernameAttr": "Atributo de nome de utilizador",
"ldapDisplayNameAttr": "Atributo de nome de apresentação",
"ldapGroupSearchBase": "Base de pesquisa de grupos",
"ldapAdminGroup": "Grupo de administradores",
"ldapAllowedUsers": "Utilizadores permitidos",
"sectionUsers": "Utilizadores",
"sectionSessions": "Sessões",
"sectionRoles": "Funções",
"sectionDatabase": "Base de Dados",
"sectionApiKeys": "Chaves API",
"sectionAuditLog": "Registo de auditoria",
"sectionSsl": "SSL / Let's Encrypt",
"sectionTouchInput": "Entrada por toque",
"touchEnabled": "Ativar entrada por toque",
"touchEnabledDesc": "Permitir a rolagem com um único dedo nos terminais.",
"touchMomentumEnabled": "Ativar o impulso",
"touchMomentumEnabledDesc": "Continue a rolar brevemente após deslizar o dedo.",
"touchAdvanced": "Avançado",
"touchDragThreshold": "Limiar de arrasto",
"touchMaxWheelDelta": "Delta máximo da roda",
"touchMomentumSampleWindow": "Janela de amostra de momento",
"touchReleaseGracePeriod": "Período de carência para lançamento",
"touchMinimumVelocity": "Velocidade mínima",
"touchMaximumVelocity": "Velocidade máxima",
"touchMaximumDuration": "Duração máxima",
"touchMaximumTravel": "Viagem máxima",
"touchDecayTime": "Tempo de decaimento",
"touchPixelsPerTick": "Pixels por tick",
"touchMaximumFrameInterval": "Intervalo máximo entre fotogramas",
"touchMaximumTicksPerFrame": "Número máximo de ticks por frame",
"touchResetDefaults": "Restaurar as predefinições de fábrica",
"touchSaved": "Configurações de entrada por toque guardadas",
"touchSaveFailed": "Falha ao guardar as definições de entrada por toque",
"sectionImageStorage": "Armazenamento de imagens",
"imageStorageMode": "Modo de armazenamento",
"imageStorageModeDesc": "Local onde são apresentadas as imagens de terminal coladas e carregadas. As seleções automáticas por ligação, Local e Remota (SFTP), foram corrigidas.",
"imageStorageModeAuto": "Auto",
"imageStorageModeLocal": "Local",
"imageStorageModeRemoteSftp": "Remoto (SFTP)",
"imageStorageLocalDir": "Diretório local",
"imageStorageLocalDirDesc": "Caminho absoluto no painel administrativo do Termix. Não é apresentado após guardar por motivos de segurança.",
"imageStorageLocalDirPlaceholder": "Deixe em branco para manter atualizado.",
"imageStorageHostPath": "Caminho do host",
"imageStorageHostPathDesc": "Vista do diretório local recebida pelos agentes de terminal, do lado do host.",
"imageStorageTtl": "TTL (ms)",
"imageStorageMaxCount": "Contagem máxima de imagens",
"imageStorageMaxBytes": "Bytes de armazenamento máximo",
"imageStorageSaved": "Configurações de armazenamento de imagens guardadas",
"imageStorageSaveFailed": "Falha ao guardar as definições de armazenamento de imagens",
"imageStorageInstanceId": "ID da instância da sessão do terminal",
"imageStorageInstanceIdDesc": "ID da instância de uma das suas abas de terminal ligadas, utilizada para testar a visibilidade.",
"imageStorageInstanceIdRequired": "Introduza primeiro o ID da instância da sessão do terminal.",
"imageStorageTest": "Teste",
"imageStorageTesting": "Testando...",
"imageStorageTestFailed": "Falha ao testar o armazenamento de imagens",
"imageStorageTestConnected": "A sessão do terminal está ligada.",
"imageStorageTestNotConnected": "Nenhuma sessão de terminal ligada com este ID de instância.",
"imageStorageTestSelectedMode": "Um upload utilizaria: {{mode}}",
"imageStorageSelectedModeUnavailable": "Indisponível",
"imageStorageTestLocalVisible": "O diretório local está visível a partir do host ligado.",
"imageStorageTestLocalNotVisible": "O diretório local NÃO está visível a partir do host ligado.",
"sslDescription": "Emitir e renovar automaticamente um certificado SSL confiável da Let's Encrypt. Requer um domínio público e acesso à porta 80 ou DNS.",
"sslDocsLink": "Ver documentação SSL",
"sslDomain": "Domínio",
"sslDomainPlaceholder": "termix.example.com",
"sslDomainDesc": "O nome de domínio público para o certificado.",
"sslEmail": "E-mail",
"sslEmailPlaceholder": "admin@example.com",
"sslEmailDesc": "E-mail de contacto para notificações e conta Let's Encrypt.",
"sslChallengeType": "Tipo de desafio",
"sslChallengeTypeDesc": "Como provar a propriedade do domínio à Let's Encrypt.",
"sslChallengeHttp": "HTTP (webroot) - requer que a porta 80 esteja acessível a partir da internet",
"sslChallengeDns": "DNS (Cloudflare) - requer um token de API da Cloudflare",
"sslCloudflareToken": "Token de API da Cloudflare",
"sslCloudflareTokenPlaceholder": "Introduzir token...",
"sslCloudflareTokenDesc": "Token com âmbito e permissão Zone:DNS:Edit para o seu domínio.",
"sslCertStatus": "Estado do certificado",
"sslCertStatusNone": "Sem certificado",
"sslCertStatusValid": "Válido",
"sslCertStatusExpiring": "A expirar em breve",
"sslCertStatusExpired": "Expirado",
"sslCertExpiresAt": "Expira a {{date}}",
"sslLastIssued": "Última emissão a {{date}}",
"sslRequestCert": "Emitir / Renovar certificado",
"sslRequestCertLoading": "A solicitar certificado...",
"sslRequestCertSuccess": "Certificado emitido e instalado com sucesso",
"sslRequestCertFailed": "Pedido de certificado falhou",
"sslSave": "Guardar definições",
"sslSaved": "Definições SSL guardadas",
"sslSaveFailed": "Falha ao guardar definições SSL",
"sslRequiresDomain": "Domínio e e-mail são obrigatórios",
"sslInfoNote": "Após a emissão ou o carregamento de um certificado, o Termix irá ativar automaticamente o HTTPS na porta SSL_PORT (padrão 8443), para além da porta HTTP existente. Certifique-se de que esta porta está publicada/mapeada para este contentor, de forma a que esteja acessível.",
"sslManualOption": "Manual (envio do certificado)",
"sslManualCert": "Certificado (PEM)",
"sslManualCertPlaceholder": "-----INÍCIO DO CERTIFICADO-----",
"sslManualKey": "Chave privada (PEM)",
"sslManualKeyPlaceholder": "-----INÍCIO DA CHAVE PRIVADA-----",
"sslManualDesc": "Cole aqui o seu certificado e chave privada existentes, incluindo a cadeia completa, se tal for exigido pela sua Autoridade Certificadora.",
"sslManualUpload": "Carregar e instalar certificado",
"sslManualUploadLoading": "Envio de certificado...",
"sslManualUploadSuccess": "Certificado carregado e instalado com sucesso.",
"sslManualUploadFailed": "O envio do certificado falhou",
"sslManualRequiresFields": "É necessário certificado e chave privada.",
"auditLogTotal": "{{total}} entradas no total",
"auditLogEmpty": "Nenhuma entrada de registo de auditoria encontrada",
"auditLogSuccess": "Sucesso",
"auditLogFailed": "Falhou",
"auditLogClearFilters": "Limpar Filtros",
"auditLogPage": "Página {{page}} de {{totalPages}} ({{total}} total)",
"auditLogIp": "IP",
"auditLogResourceId": "ID do Recurso",
"auditLogFilterUser": "Utilizador",
"auditLogFilterAction": "Ação",
"auditLogFilterResourceType": "Tipo de Recurso",
"auditLogFilterStatus": "Estado",
"auditLogFilterFrom": "De",
"auditLogFilterTo": "Até",
"auditLogFilterAll": "Todos",
"allowRegistration": "Permitir Registo de Utilizadores",
"allowRegistrationDesc": "Permitir que novos utilizadores se auto-registem com nome de utilizador e palavra-passe",
"allowPasswordLogin": "Permitir Início de Sessão com Palavra-passe",
"allowPasswordLoginDesc": "Início de sessão com nome de utilizador/palavra-passe",
"oidcAutoProvision": "Aprovisionamento Automático OIDC",
"oidcAutoProvisionDesc": "Criar automaticamente contas para utilizadores OIDC/SSO no primeiro início de sessão (independente da opção de registo)",
"oidcSilentLoginDefault": "Início de Sessão Silencioso OIDC por Defeito",
"oidcSilentLoginDefaultDesc": "Redirecionar automaticamente para o início de sessão OIDC em cada visita, ignorando completamente o formulário de início de sessão",
"allowPasswordReset": "Permitir Reposição de Palavra-passe",
"allowPasswordResetDesc": "Código de reposição via registos do Docker",
"commandHistoryEnabled": "Histórico de Comandos",
"commandHistoryEnabledDesc": "Permitir o registo do histórico de comandos. Quando desativado, o histórico não é guardado independentemente das definições por máquina.",
"updateCommandHistoryFailed": "Falha ao atualizar a definição de histórico de comandos",
"analyticsEnabled": "Partilhar estatísticas de uso anónimas",
"analyticsEnabledDesc": "Envia uma contagem diária anónima de utilizadores, hosts e utilização de recursos para ajudar a melhorar o Termix. Nenhum dado pessoal ou detalhe de ligação é incluído.",
"analyticsEnabledLockedDesc": "Esta definição está bloqueada pela variável de ambiente ENABLE_TELEMETRY e não pode ser alterada aqui.",
"updateAnalyticsFailed": "Falha ao atualizar as definições de análise",
"sessionSharingGloballyEnabled": "Permitir partilha de sessão",
"sessionSharingGloballyEnabledDesc": "Permite que as sessões de terminal ao vivo, RDP, VNC e Telnet sejam partilhadas em toda a instância. Substitui todas as definições de partilha por host quando desativada.",
"updateSessionSharingFailed": "Falha ao atualizar as definições de partilha de sessão.",
"sessionTimeout": "Tempo Limite da Sessão",
"hours": "horas",
"sessionTimeoutRange": "Mín. 1h · Máx. 720h",
"monitoringDefaults": "Padrões de Monitorização",
"statusCheck": "Verificação de Estado",
"metrics": "Métricas",
"sec": "seg",
"logLevel": "Nível de Registo",
"enableGuacamole": "Ativar Guacamole",
"enableGuacamoleDesc": "Ambiente de trabalho remoto RDP/VNC",
"enableGuacamoleDocsLink": "Ver documentação",
"guacdUrl": "URL do guacd",
"tailscaleApiKey": "Chave de API do Tailscale",
"tailscaleApiKeyDescription": "Utilizado para a descoberta de dispositivos no editor de hosts. Compatível com as chaves Tailscale (tskey-) e Headscale (hskey-). Gere uma chave em tailscale.com/admin/settings/keys ou a partir da sua instância Headscale.",
"tailscaleApiKeyDocsLink": "Ver documentação",
"tailscaleApiBaseUrl": "URL base da API",
"tailscaleApiBaseUrlDescription": "Opcional. Aponte para uma instância auto-hospedada do Headscale em vez de api.tailscale.com. Deixe em branco para utilizar o padrão do Tailscale.",
"oidcDescription": "Configurar o OpenID Connect para SSO. Os campos marcados com * são obrigatórios.",
"oidcDocsLink": "Ver documentação",
"oidcClientId": "ID do cliente",
"oidcClientSecret": "Segredo do cliente",
"oidcAuthUrl": "URL de autorização",
"oidcIssuerUrl": "URL do emissor",
"oidcTokenUrl": "URL do token",
"oidcUserIdentifier": "Caminho do identificador do utilizador",
"oidcDisplayName": "Caminho do nome de exibição",
"oidcScopes": "Âmbitos",
"oidcUserinfoUrl": "Substituir URL do Userinfo",
"oidcAllowedUsers": "Utilizadores permitidos",
"oidcAllowedUsersDesc": "Um email por linha. Deixe em branco para permitir todos.",
"oidcAdminGroup": "Grupo de administração",
"oidcAdminGroupDesc": "Os utilizadores neste grupo recebem privilégios de administrador. Deixe em branco para desativar a sincronização de grupos.",
"oidcGroupClaim": "Atributo de grupo",
"oidcGroupClaimDesc": "Opcional. O caminho do atributo que contém os grupos do utilizador. Predefinido para groups, roles e depois group. Utilize para fornecedores com um atributo personalizado (ex.: Zitadel).",
"oidcCaCert": "Certificado CA personalizado",
"oidcCaCertDesc": "Opcional. Certificado CA codificado em PEM para fornecedores OIDC que utilizam uma CA privada ou autoassinada. Deixe em branco para utilizar o repositório de confiança do sistema.",
"removeOidc": "Remover",
"usersCount": "{{count}} utilizadores",
"searchUsers": "Pesquisar utilizadores...",
"noUsers": "Nenhum utilizador",
"noUsersMatch": "Nenhum utilizador corresponde à sua pesquisa.",
"pageOf": "Página {{page}} de {{total}}",
"createUser": "Criar",
"newRole": "Nova função",
"roleName": "Nome",
"roleDisplayName": "Nome de exibição",
"roleDescription": "Descrição",
"rolesCount": "{{count}} funções",
"createRole": "Criar",
"creating": "A criar...",
"exportDatabase": "Exportar Base de Dados",
"exportDatabaseDesc": "Transferir uma cópia de segurança de todos os hosts, credenciais e definições",
"export": "Exportar",
"exporting": "A exportar...",
"importDatabase": "Importar Base de Dados",
"importDatabaseDesc": "Restaurar a partir de um ficheiro de cópia de segurança .sqlite",
"importDatabaseSelected": "Selecionado: {{name}}",
"selectFile": "Selecionar Ficheiro",
"changeFile": "Alterar",
"import": "Importar",
"importing": "A importar...",
"apiKeysCount": "{{count}} chaves",
"apiKeysDocsLink": "Ver docs",
"apiKeysCliHint": "Utilize uma chave API com a CLI do Termix para gerir servidores a partir do seu terminal.",
"apiKeysCliLink": "Ver documentação da CLI",
"newApiKey": "Nova Chave API",
"apiKeyCreatedWarning": "Chave criada - copie-a agora, não será mostrada novamente.",
"apiKeyName": "Nome",
"apiKeyUser": "Utilizador",
"apiKeySelectUser": "Selecionar um utilizador...",
"apiKeyExpiresAt": "Expira em",
"createKey": "Criar Chave",
"apiKeyNoExpiry": "Sem expiração",
"revokedBadge": "REVOGADA",
"authTypeDual": "Autenticação Dupla",
"authTypeOidc": "OIDC",
"authTypeLocal": "Local",
"adminStatusAdministrator": "Administrador",
"adminStatusRegularUser": "Utilizador Regular",
"adminBadge": "ADMIN",
"systemBadge": "SYS",
"customBadge": "PERSONALIZADO",
"youBadge": "VOCÊ",
"sessionsActive": "{{count}} ativas",
"sessionActive": "Ativa: {{time}}",
"sessionExpires": "Exp: {{time}}",
"revokeAll": "Todas",
"revokeAllSessionsSuccess": "Todas as sessões do utilizador foram revogadas.",
"revokeAllSessionsFailed": "Falha ao revogar sessões",
"revokeSessionFailed": "Falha ao revogar a sessão",
"addRole": "Adicionar função",
"noCustomRoles": "Nenhuma função personalizada definida.",
"removeRoleFailed": "Falha ao remover a função",
"assignRoleFailed": "Falha ao atribuir a função",
"deleteRoleFailed": "Falha ao eliminar a função",
"userAdminAccess": "Administrador",
"userAdminAccessDesc": "Acesso total a todas as definições de administrador.",
"userRoles": "Funções",
"revokeAllUserSessions": "Revogar todas as sessões",
"revokeAllUserSessionsDesc": "Forçar novo início de sessão em todos os dispositivos.",
"revoke": "Revogar",
"deleteUserWarning": "A eliminação deste utilizador é permanente.",
"deleteUser": "Eliminar {{username}}",
"deleting": "A eliminar...",
"deleteUserFailed": "Falha ao eliminar o utilizador",
"deleteUserSuccess": "Utilizador \"{{username}}\" eliminado.",
"deleteRoleSuccess": "Função \"{{name}}\" eliminada.",
"revokeKeySuccess": "Chave \"{{name}}\" revogada.",
"revokeKeyFailed": "Falha ao revogar a chave",
"copiedToClipboard": "Copiado para a área de transferência.",
"done": "Concluído",
"createUserTitle": "Criar Utilizador",
"createUserDesc": "Criar uma nova conta local.",
"createUserUsername": "Nome de utilizador",
"createUserPassword": "Palavra-passe",
"createUserPasswordHint": "Mínimo 6 caracteres.",
"createUserEnterUsername": "Introduzir nome de utilizador",
"createUserEnterPassword": "Introduzir palavra-passe",
"createUserSubmit": "Criar Utilizador",
"editUserTitle": "Gerir Utilizador: {{username}}",
"editUserDesc": "Editar funções, estado de administrador, sessões e definições da conta.",
"editUserUsername": "Nome de utilizador",
"editUserAuthType": "Tipo de autenticação",
"editUserAdminStatus": "Estado de administrador",
"editUserUserId": "ID de utilizador",
"linkAccountTitle": "Associar contas",
"linkAccountDesc": "Fundir a conta OIDC {{username}} com uma conta local existente.",
"linkAccountDescLocal": "Associar uma conta local {{username}} a uma conta exclusivamente OIDC existente.",
"linkAccountWarningTitle": "Isto irá:",
"linkAccountEffect1": "Eliminar a conta exclusivamente OIDC",
"linkAccountEffect2": "Adicionar início de sessão OIDC à conta de destino",
"linkAccountEffect3": "Permitir início de sessão por OIDC e palavra-passe",
"linkAccountTargetUsername": "Nome de utilizador da conta local",
"linkAccountTargetPlaceholder": "Introduza o nome de utilizador da conta local a associar",
"linkAccountOidcUsername": "Nome de utilizador da conta OIDC",
"linkAccountOidcPlaceholder": "Introduza o nome de utilizador da conta exclusivamente OIDC a fundir",
"linkAccountOidcNotFound": "Nenhuma conta exclusivamente OIDC encontrada com esse nome de utilizador",
"linkAccounts": "Associar contas",
"linkAccountSuccess": "Contas associadas com sucesso",
"linkAccountFailed": "Falha ao associar contas",
"linkAccountInProgress": "A associar...",
"unlinkAccountTitle": "Desassociar OIDC",
"unlinkAccountDesc": "Remover a autenticação OIDC de {{username}}. Poderá iniciar sessão apenas com a sua palavra-passe.",
"unlinkAccountWarning": "Isto irá remover o início de sessão OIDC desta conta. O utilizador deve ter uma palavra-passe definida para continuar a iniciar sessão.",
"unlinkAccount": "Desassociar OIDC",
"unlinkAccountInProgress": "A desassociar...",
"unlinkAccountSuccess": "OIDC desassociado com sucesso",
"unlinkAccountFailed": "Falha ao desassociar OIDC",
"saving": "A guardar...",
"updateRegistrationFailed": "Falha ao atualizar a definição de registo",
"updatePasswordLoginFailed": "Falha ao atualizar a definição de início de sessão por palavra-passe",
"cannotDisablePasswordLoginWithTotp": "Não é possível desativar o início de sessão por palavra-passe enquanto a 2FA estiver ativa para um ou mais utilizadores. Desative a 2FA primeiro.",
"updateOidcAutoProvisionFailed": "Falha ao atualizar a definição de provisionamento automático OIDC",
"updateOidcSilentLoginDefaultFailed": "Falha ao atualizar a definição de início de sessão silencioso OIDC",
"updatePasswordResetFailed": "Falha ao atualizar a definição de reposição de palavra-passe",
"sessionTimeoutRange2": "O tempo limite da sessão deve estar entre 1 e 720 horas",
"sessionTimeoutSaved": "Timeout da sessão guardado",
"sessionTimeoutSaveFailed": "Falha ao guardar timeout da sessão",
"monitoringIntervalInvalid": "Valores de intervalo inválidos",
"monitoringSaved": "Definições de monitorização guardadas",
"monitoringSaveFailed": "Falha ao guardar definições de monitorização",
"metricsHistoryRetention": "Retenção do histórico de métricas",
"metricsHistoryRetentionRange": "1 a 90 dias",
"days": "dias",
"guacamoleSaved": "Definições do Guacamole guardadas",
"guacamoleSaveFailed": "Falha ao guardar definições do Guacamole",
"guacamoleUpdateFailed": "Falha ao atualizar definição do Guacamole",
"tailscaleSettingsSaved": "Definições do Tailscale guardadas",
"tailscaleSettingsSaveFailed": "Falha ao guardar definições do Tailscale",
"logLevelUpdateFailed": "Falha ao atualizar nível de registo",
"oidcSaved": "Configuração OIDC guardada",
"oidcSaveFailed": "Falha ao guardar configuração OIDC",
"oidcRemoved": "Configuração OIDC removida",
"oidcRemoveFailed": "Falha ao remover configuração OIDC",
"createUserRequired": "Nome de utilizador e palavra-passe são obrigatórios",
"createUserPasswordTooShort": "A palavra-passe deve ter pelo menos 6 caracteres",
"createUserSuccess": "Utilizador \"{{username}}\" criado",
"createUserFailed": "Falha ao criar utilizador",
"updateAdminStatusFailed": "Falha ao atualizar estado de administrador",
"allSessionsRevoked": "Todas as sessões revogadas",
"revokeSessionsFailed": "Falha ao revogar sessões",
"manageUserData": "Gerir dados do utilizador",
"backToUsers": "Voltar aos utilizadores",
"manageTabAccount": "Conta",
"manageTabHosts": "Máquinas",
"manageTabCredentials": "Credenciais",
"manageTabSnippets": "Snippets",
"manageTabSessions": "Sessões",
"manageTabDanger": "Perigo",
"manageEditorBack": "Voltar aos dados de {{username}}",
"dataLockedBadge": "BLOQUEADO",
"dataLockedNotice": "Os dados de {{username}} permanecem bloqueados até ao próximo início de sessão. As suas máquinas, credenciais e fragmentos não podem ser visualizados nem editados até lá.",
"resetPasswordTitle": "Redefinir palavra-passe",
"resetPasswordOidcOnly": "Este utilizador autentica-se através de um fornecedor externo e não tem palavra-passe.",
"resetPasswordPlaceholder": "Nova palavra-passe",
"resetPasswordBtn": "Redefinir",
"resetPasswordWorking": "A redefinir...",
"resetPasswordSuccess": "Palavra-passe redefinida",
"resetPasswordSuccessWiped": "Palavra-passe redefinida. Os dados encriptados do utilizador foram eliminados.",
"resetPasswordFailed": "Falha ao redefinir a palavra-passe",
"resetPasswordConfirmWipe": "{{username}} não iniciou sessão desde a atualização da encriptação, pelo que os seus dados não podem ser recuperados. Redefinir agora eliminará as suas máquinas, credenciais e fragmentos. Continuar?",
"totpSectionTitle": "Autenticação de dois fatores",
"totpStatusEnabled": "TOTP está ativado para este utilizador",
"totpStatusDisabled": "TOTP não está ativado para este utilizador",
"disableTotp": "Desativar",
"disableTotpConfirm": "Desativar a autenticação de dois fatores para {{username}}? Poderá iniciar sessão apenas com a sua palavra-passe.",
"totpDisabledSuccess": "TOTP desativado",
"totpDisableFailed": "Falha ao desativar TOTP",
"manageApiKeys": "Chaves de API",
"apiKeyNamePlaceholder": "Nome da chave",
"apiKeyCopyNotice": "Copie esta chave agora, não será mostrada novamente.",
"noApiKeysForUser": "Sem chaves de API",
"apiKeyDeleteFailed": "Falha ao eliminar a chave de API",
"exportUserData": "Exportação de dados",
"exportUserDataDesc": "Descarregar as máquinas, credenciais e dados do gestor de ficheiros deste utilizador como JSON. Os segredos são desencriptados.",
"exportUserDataSuccess": "Dados do utilizador exportados",
"exportUserDataFailed": "Falha ao exportar os dados do utilizador",
"hostsCount": "{{count}} máquinas",
"addHostForUser": "Adicionar máquina",
"noHostsForUser": "Este utilizador não tem máquinas",
"connectToHost": "Ligar",
"deleteHostConfirm": "Eliminar a máquina \"{{name}}\" pertencente a {{username}}?",
"hostDeletedSuccess": "Máquina eliminada",
"hostDeleteFailed": "Falha ao eliminar a máquina",
"credentialsCount": "{{count}} credenciais",
"addCredentialForUser": "Adicionar credencial",
"noCredentialsForUser": "Este utilizador não tem credenciais",
"deleteCredentialConfirm": "Eliminar credencial \"{{name}}\" de {{username}}?",
"credentialDeletedSuccess": "Credencial eliminada",
"credentialDeleteFailed": "Falha ao eliminar credencial",
"snippetsCount": "{{count}} snippets",
"addSnippetForUser": "Adicionar snippet",
"noSnippetsForUser": "Este utilizador não tem snippets",
"snippetRequiredFields": "O nome e o conteúdo do snippet são obrigatórios",
"snippetNamePlaceholder": "Nome do snippet",
"snippetContentPlaceholder": "Conteúdo do comando",
"snippetFolderPlaceholder": "Pasta (opcional)",
"snippetSaved": "Snippet guardado",
"snippetSaveFailed": "Falha ao guardar snippet",
"deleteSnippetConfirm": "Eliminar snippet \"{{name}}\" de {{username}}?",
"snippetDeletedSuccess": "Snippet eliminado",
"snippetDeleteFailed": "Falha ao eliminar snippet",
"noSessionsForUser": "Sem sessões ativas",
"deleteUserDangerDesc": "Eliminar permanentemente {{username}} e todos os seus dados (hosts, credenciais, snippets, histórico). Esta ação não pode ser desfeita.",
"deleteUserConfirm": "Eliminar permanentemente {{username}} e todos os seus dados?",
"deleteUserAdminBlocked": "Remova o estatuto de administrador antes de eliminar este utilizador.",
"createRoleRequired": "O nome e o nome de exibição são obrigatórios",
"createRoleSuccess": "Função \"{{name}}\" criada",
"createRoleFailed": "Falha ao criar função",
"apiKeyNameRequired": "O nome da chave é obrigatório",
"apiKeyUserRequired": "O ID do utilizador é obrigatório",
"apiKeyCreatedSuccess": "Chave de API \"{{name}}\" criada",
"apiKeyCreateFailed": "Falha ao criar chave de API",
"exportSuccess": "Base de dados exportada com sucesso",
"exportFailed": "Falha na exportação da base de dados",
"importSelectFile": "Selecione um ficheiro primeiro",
"importCompleted": "Importação concluída: {{total}} itens importados, {{skipped}} ignorados",
"importFailed": "Importação falhou: {{error}}",
"importError": "Falha na importação da base de dados",
"sectionHostDefaults": "Predefinições de Host",
"hostDefaultsDesc": "Definições aplicadas automaticamente ao criar um novo host. Os hosts individuais podem substituí-las.",
"hostDefaultsSocks5": "Proxy SOCKS5",
"hostDefaultsUseSocks5": "Ativar Proxy SOCKS5",
"hostDefaultsUseSocks5Desc": "Preencher automaticamente o proxy SOCKS5 em todos os novos hosts",
"hostDefaultsSocks5Host": "Host / Porta do proxy",
"hostDefaultsSocks5Username": "Nome de utilizador do proxy",
"hostDefaultsSocks5Password": "Palavra-passe do proxy",
"hostDefaultsMetrics": "Métricas do Host",
"hostDefaultsMetricsEnabled": "Ativar Métricas",
"hostDefaultsMetricsEnabledDesc": "Recolher CPU, memória e outras estatísticas nos novos hosts por predefinição",
"hostDefaultsStatusCheckEnabled": "Ativar Verificação de Estado",
"hostDefaultsStatusCheckEnabledDesc": "Consultar o estado online/offline nos novos hosts por predefinição",
"hostDefaultsTerminal": "Terminal",
"hostDefaultsSessionLogging": "Registo de Sessão",
"hostDefaultsSessionLoggingDesc": "Gravar sessões de terminal nos novos hosts por predefinição",
"hostDefaultsCommandHistory": "Histórico de Comandos",
"hostDefaultsCommandHistoryDesc": "Acompanhar o histórico de comandos nos novos hosts por predefinição",
"hostDefaultsSaved": "Predefinições do host guardadas",
"hostDefaultsSaveFailed": "Falha ao guardar as predefinições do host",
"rolePermissions": {
"count": "{{count}} permissões",
"editAction": "Editar permissões",
"loadError": "Falha ao carregar o catálogo de permissões",
"saved": "Permissões do cargo guardadas",
"saveError": "Falha ao guardar as permissões do cargo",
"save": "Guardar",
"saving": "A guardar..."
},
"aiGloballyEnabled": "assistente de IA",
"aiGloballyEnabledDesc": "Permita que os utilizadores ativem o assistente de IA. Quando estiver desativado, o assistente ficará oculto e bloqueado para todos.",
"aiPrivateEndpoints": "Hosts de IA privados permitidos",
"aiPrivateEndpointsDesc": "Hosts na sua rede privada que os utilizadores podem utilizar como fornecedores, como um Ollama auto-hospedado. Separe-os com vírgulas.",
"updateAiEnabledFailed": "Não foi possível atualizar as definições de IA.",
"updateAiEndpointsFailed": "Não foi possível atualizar os hosts permitidos."
},
"newUi": {
"sidebar": {
"quickConnect": {
"hostLabel": "Host",
"hostPlaceholder": "192.168.1.1 or example.com",
"portLabel": "Porta",
"portPlaceholder": "22",
"usernameLabel": "Nome de utilizador",
"usernamePlaceholder": "utilizador",
"authLabel": "Autenticação",
"passwordLabel": "Palavra-passe",
"passwordPlaceholder": "palavra-passe",
"privateKeyLabel": "Chave Privada",
"privateKeyPlaceholder": "Colar chave privada...",
"credentialLabel": "Credencial",
"credentialPlaceholder": "Selecionar uma credencial guardada",
"connectToTerminal": "Ligar ao Terminal",
"connectToFiles": "Ligar aos Ficheiros"
},
"history": {
"noTerminalSelected": "Nenhum terminal selecionado",
"noTerminalSelectedHint": "Abra um separador de terminal SSH para ver o histórico de comandos",
"searchPlaceholder": "Pesquisar histórico...",
"clearAll": "Limpar Tudo",
"noHistoryEntries": "Sem entradas no histórico",
"trackingDisabled": "O rastreio do histórico está desativado",
"trackingDisabledHint": "Ative-o nas definições do terminal do anfitrião."
},
"sshTools": {
"keyRecordingTitle": "Gravação de Teclas",
"recordToTerminals": "Gravar para terminais",
"selectAll": "Todos",
"selectNone": "Nenhum",
"noTerminalTabsOpen": "Nenhum separador de terminal aberto",
"selectTerminalsAbove": "Selecionar terminais acima",
"broadcastInputPlaceholder": "Digite aqui para difundir as teclas premidas...",
"fillPassword": "Preencher palavra-passe",
"fillPasswordSuccess": "Palavra-passe preenchida em {{count}} terminal(is)",
"fillPasswordMissing": "Nenhuma palavra-passe guardada para {{count}} terminal(is) selecionado(s)",
"stopRecording": "Parar Gravação",
"startRecording": "Iniciar Gravação",
"settingsTitle": "Definições",
"enableRightClickCopyPaste": "Ativar copiar/colar com clique direito"
},
"splitScreen": {
"layoutTitle": "Esquema",
"selectLayoutAbove": "Selecionar um esquema acima",
"selectLayoutHint": "Escolha quantos painéis mostrar",
"panesTitle": "Painéis",
"openTabsTitle": "Separadores abertos",
"dragTabsHint": "Arraste os separadores para os painéis acima ou use Atribuição Rápida",
"dropHere": "Largar aqui",
"emptyPane": "Vazio",
"dashboard": "Painel",
"clearSplitScreen": "Limpar Ecrã Dividido",
"quickAssign": "Atribuição Rápida",
"alreadyAssigned": "Painel {{index}}",
"splitTab": "Dividir Separador",
"addToSplit": "Adicionar à Divisão",
"removeFromSplit": "Remover da Divisão",
"assignToPane": "Atribuir ao painel",
"hotkeysTitle": "Atalhos de Teclado",
"hotkeysSplitRight": "Alternar divisão de 2 painéis",
"hotkeysSplitBelow": "Alternar divisão de 3 painéis",
"hotkeysNavigatePane": "Navegar entre painéis",
"hotkeysNextTab": "Separador seguinte",
"hotkeysPrevTab": "Separador anterior",
"hotkeysJumpTab": "Ir para o separador"
},
"snippets": {
"title": "Fragmentos",
"createSnippetTitle": "Criar Fragmento",
"createSnippetDescription": "Criar um novo fragmento de comando para execução rápida",
"nameLabel": "Nome",
"namePlaceholder": "p. ex., Reiniciar Nginx",
"descriptionLabel": "Descrição",
"descriptionPlaceholder": "Descrição opcional",
"optional": "Opcional",
"folderLabel": "Pasta",
"noFolder": "Sem pasta (Não categorizado)",
"commandLabel": "Comando",
"commandPlaceholder": "p. ex., sudo systemctl restart nginx",
"typeLabel": "Tipo",
"typeCommand": "Comando",
"typeNote": "Nota",
"noteLabel": "Nota",
"notePlaceholder": "Por exemplo, um texto de lembrete ou aviso reutilizável.",
"cancel": "Cancelar",
"createSnippetButton": "Criar Fragmento",
"createFolderTitle": "Criar Pasta",
"createFolderDescription": "Organize os seus fragmentos em pastas",
"folderNameLabel": "Nome da Pasta",
"folderNamePlaceholder": "p. ex., Comandos de Sistema, Scripts Docker",
"folderColorLabel": "Cor da Pasta",
"folderIconLabel": "Ícone da Pasta",
"previewLabel": "Pré-visualização",
"folderNameFallback": "Nome da Pasta",
"createFolderButton": "Criar Pasta",
"targetTerminals": "Terminais de Destino",
"selectAll": "Todos",
"selectNone": "Nenhum",
"noTerminalTabsOpen": "Nenhum separador de terminal aberto",
"searchPlaceholder": "Pesquisar snippets...",
"newSnippet": "Novo Snippet",
"newFolder": "Nova Pasta",
"run": "Executar",
"noSnippetsInFolder": "Nenhum snippet nesta pasta",
"uncategorized": "Sem categoria",
"editSnippetTitle": "Editar Snippet",
"editSnippetDescription": "Atualizar este snippet de comando",
"saveSnippetButton": "Guardar Alterações",
"createSuccess": "Snippet criado com sucesso",
"createFailed": "Falha ao criar snippet",
"updateSuccess": "Snippet atualizado com sucesso",
"updateFailed": "Falha ao atualizar snippet",
"deleteFailed": "Falha ao eliminar snippet",
"folderCreateSuccess": "Pasta criada com sucesso",
"folderCreateFailed": "Falha ao criar pasta",
"editFolderTitle": "Editar Pasta",
"editFolderDescription": "Renomear ou alterar a aparência desta pasta",
"saveFolderButton": "Guardar Alterações",
"editFolder": "Editar pasta",
"deleteFolder": "Eliminar pasta",
"folderDeleteSuccess": "Pasta \"{{name}}\" eliminada",
"folderDeleteFailed": "Falha ao eliminar pasta",
"folderEditSuccess": "Pasta atualizada com sucesso",
"folderEditFailed": "Falha ao atualizar pasta",
"confirmRunMessage": "Executar \"{{name}}\"?",
"confirmRunButton": "Executar",
"runSuccess": "Executado \"{{name}}\" em {{count}} terminal(is)",
"pasteSuccess": "Colado \"{{name}}\" em {{count}} terminal(is)",
"pasteToTerminal": "Colar",
"copySuccess": "Copiado \"{{name}}\" para a área de transferência",
"shareTitle": "Partilhar Snippet",
"shareUser": "Utilizador",
"shareRole": "Função",
"selectUser": "Selecionar um utilizador...",
"selectRole": "Selecionar uma função...",
"shareSuccess": "Fragmento partilhado com sucesso",
"shareFailed": "Falha ao partilhar fragmento",
"revokeSuccess": "Acesso revogado",
"revokeFailed": "Falha ao revogar acesso",
"currentAccess": "Acesso Atual",
"shareLoadError": "Falha ao carregar dados de partilha",
"loading": "A carregar...",
"close": "Fechar",
"reorderFailed": "Falha ao guardar ordem dos fragmentos",
"importExport": "Importar / Exportar",
"exportBtn": "Exportar JSON",
"importBtn": "Importar JSON",
"exportSuccess": "Fragmentos exportados com sucesso",
"exportFailed": "Falha ao exportar fragmentos",
"importTitle": "Importar Fragmentos",
"importDescription": "Importar fragmentos e pastas de um ficheiro JSON exportado pelo Termix",
"importDropOrClick": "Arraste um ficheiro JSON aqui ou clique para procurar",
"importSelectedFile": "Selecionado: {{name}}",
"importOverwrite": "Substituir fragmentos existentes com o mesmo nome e pasta",
"importStartBtn": "Importar",
"importSuccess": "Importação concluída: {{snippets}} fragmento(s) adicionado(s), {{updated}} atualizado(s), {{skipped}} ignorado(s), {{folders}} pasta(s) adicionada(s)",
"importFailed": "Falha ao importar fragmentos",
"importInvalidFile": "Ficheiro inválido: esperado um objeto JSON com arrays de fragmentos ou pastas",
"targetHostsLabel": "Máquinas de Destino",
"targetHostsHint": "Atribuir máquinas para executar este fragmento diretamente sem um terminal aberto.",
"noHostsAvailable": "Nenhuma máquina configurada",
"clearTargetHosts": "Limpar tudo",
"hasTargetHosts": "Possui máquinas de destino",
"runOnTargets": "Executar nos Destinos",
"directRunSuccess": "Executou \"{{name}}\" em {{count}} máquina(s)",
"directRunPartialFail": "\"{{name}}\" falhou numa ou mais máquinas",
"executionResultTitle": "Resultados da Execução: {{name}}",
"executionResultDescription": "Saída da execução do fragmento em cada host de destino.",
"executionSuccess": "Sucesso",
"executionFailed": "Falhou",
"expandAll": "Expandir todas as pastas",
"collapseAll": "Recolher todas as pastas",
"settings": "Configurações de excertos de código",
"variablesHint": "Variáveis: $HOST, $USER, $PORT, $NAME, ${INPUT_1:Label}",
"variablesDialogTitle": "Executar \"{{name}}\"",
"variablesDialogDescription": "Preencha os valores necessários para este excerto de código antes de o executar.",
"variablesPreviewLabel": "Pré-visualização",
"variablesConfirmButton": "Correr"
},
"automations": {
"title": "Automações",
"tabAutomations": "Automações",
"tabRuns": "Corridas",
"tabChannels": "Canais",
"createAutomation": "Nova Automação",
"backToAutomations": "Voltar para Automações",
"createTitle": "Nova Automação",
"editTitle": "Editar Automação",
"empty": "Ainda não há automatizações. Crie uma para reagir a uma métrica, a um agendamento ou a um evento.",
"emptyRuns": "Ainda não houve qualquer corrida.",
"emptyChannels": "Ainda não há canais. Adicione um para enviar notificações para algum lugar.",
"noChannelsHint": "Nenhum canal configurado ainda. Adicione um no separador Canais.",
"addChannel": "Adicionar canal",
"testChannel": "Teste",
"channelTestSent": "Notificação de teste enviada",
"channelTestFailed": "Falha na notificação de teste",
"channelDeleted": "Canal excluído",
"deleteChannelConfirm": "Apagar este canal? As automatizações que o utilizam deixarão de enviar notificações.",
"nameLabel": "Nome",
"namePlaceholder": "Por exemplo, limpe a pasta /data quando esta estiver cheia.",
"nameRequired": "O nome é obrigatório.",
"descriptionLabel": "Descrição",
"descriptionPlaceholder": "Descrição opcional",
"enabledLabel": "Habilitado",
"concurrencyLabel": "Se já estiver em execução",
"concurrencyHint": "O que fazer quando este for novamente acionado antes da última execução terminar?",
"concurrency": {
"skip": "Salte a nova corrida",
"queue": "Espere e corra atrás.",
"allow": "Execute ambos em simultâneo"
},
"save": "Guardar",
"created": "Automação criada",
"updated": "A automação economizou",
"deleted": "Automação excluída",
"deleteConfirm": "Apagar esta automação? O histórico de execução da mesma também será eliminado.",
"runNow": "Corra agora",
"testRun": "Teste de execução",
"testRunHint": "Executa cada passo, mas não toca em nada fora do Termix.",
"runStarted": "A corrida começou.",
"runFinished": "Execução concluída: {{status}}",
"trigger": "Gatilho",
"steps": "Passos",
"addStep": "Adicionar etapa",
"removeStep": "Remover etapa",
"moveUp": "Suba",
"moveDown": "Desça",
"noSteps": "Ainda não há etapas. Adicione uma para descrever o que deve acontecer.",
"webhookTokenTitle": "URL do Webhook",
"webhookTokenDescription": "Esta mensagem será apresentada apenas uma vez. Guarde-a agora, pois não poderá ser recuperada posteriormente.",
"copy": "Cópia",
"copied": "Copiado",
"viewJson": "JSON",
"viewBuilder": "Construtor",
"viewGraph": "Gráfico",
"lastRun": "Última corrida",
"never": "Nunca",
"duration": "{{seconds}}s",
"stepOutput": "Saída",
"stepError": "Erro",
"dryRunBadge": "Teste de execução",
"hostSelector": {
"trigger": "Host que desencadeia o ataque",
"host": "hospedeiro específico",
"fleet": "Frota",
"all": "Todos os anfitriões"
},
"triggerKinds": {
"metric_threshold": "Limiar métrico",
"host_status": "O host sobe ou desce.",
"health_check": "Alterações na verificação de saúde",
"schedule": "De acordo com um cronograma",
"docker_event": "Evento de contentor",
"internal_event": "Evento Termix",
"webhook": "Webhook de entrada"
},
"stepTypes": {
"notify": "Enviar notificação",
"http": "Chamar um URL",
"run_snippet": "Executar um excerto de código",
"run_command": "Executar um comando",
"docker": "Controle um contentor",
"tunnel": "Controle um túnel",
"wol": "Acorde um anfitrião",
"wait": "Espera",
"set_var": "Defina uma variável",
"if": "Se/caso contrário",
"run_automation": "Execute outra automatização",
"stop": "Parar"
},
"statuses": {
"running": "Corrida",
"success": "Sucesso",
"failed": "Falhou",
"timeout": "Tempo limite excedido",
"skipped": "Ignorado",
"cancelled": "Cancelado"
},
"fields": {
"host": "Anfitrião",
"metric": "Métrica",
"mount": "Ponto de montagem",
"operator": "É",
"value": "Valor",
"forSeconds": "Sustentado por (segundos)",
"cooldown": "Tempo de arrefecimento (minutos)",
"cron": "Expressão de Cron",
"intervalSeconds": "A cada (segundos)",
"timezone": "Fuso horário",
"timezoneServer": "Hora do servidor",
"timezoneHint": "Os tempos cron são lidos nesta zona. Não se aplica a agendamentos por intervalo.",
"container": "Recipiente",
"command": "Comando",
"url": "URL",
"method": "Método",
"body": "Corpo",
"channels": "Canais",
"title": "Título",
"message": "Mensagem",
"snippet": "Trecho",
"seconds": "Segundos",
"conditionLeftPlaceholder": "Valor a verificar",
"conditionRightPlaceholder": "Compare com",
"variableName": "Nome da variável",
"variableValue": "Valor",
"elevated": "Executar com sudo",
"onError": "Se isso falhar",
"allowPrivateNetwork": "Permitir endereços de rede local",
"allowPrivateNetworkHint": "Necessário para um serviço auto-hospedado na sua rede local (LAN). Desativado por defeito para evitar pedidos a endereços internos."
},
"onError": {
"stop": "Pare a corrida",
"continue": "Continuar"
}
},
"fleets": {
"title": "Frotas",
"createFleet": "Criar Frota",
"createFleetTitle": "Criar Frota",
"editFleetTitle": "Editar frota",
"createFleetDescription": "Uma frota é um grupo nomeado de hosts contra os quais pode executar ações como uma unidade.",
"nameLabel": "Nome",
"namePlaceholder": "Por exemplo, os servidores web",
"nameRequired": "É necessário dar um nome à frota.",
"descriptionLabel": "Descrição",
"descriptionPlaceholder": "Descrição opcional",
"colorLabel": "Cor",
"tagRulesLabel": "Regras de etiqueta",
"tagRulesPlaceholder": "prod-web, edge",
"tagRulesHint": "Os hosts com qualquer uma destas etiquetas são incluídos automaticamente, para além dos hosts adicionados manualmente.",
"fleetCreated": "Frota criada",
"fleetUpdated": "Frota atualizada",
"fleetDeleted": "Frota excluída",
"saveFailed": "Não conseguiram salvar a frota.",
"deleteFailed": "Falha ao eliminar a frota",
"loadFailed": "Falha ao carregar as frotas",
"deleteFleetTitle": "Excluir frota",
"deleteFleetDescription": "Tem a certeza que pretende eliminar \"{{name}}\"? Isto não exclui os próprios hosts membros.",
"searchFleets": "Pesquisar frotas...",
"noFleets": "Ainda não há frotas. Crie uma para começar.",
"memberCount": "{{count}} anfitrião",
"memberCount_other": "{{count}} anfitriões",
"manageMembers": "Gerir membros",
"manageMembersTitle": "Gerir membros da frota",
"manageMembersDescription": "Ative ou desative a inclusão de hosts nesta frota estática. Os hosts que corresponderem às regras das tags serão sempre incluídos.",
"searchHosts": "Pesquisar hosts...",
"noHostsFound": "Nenhum host encontrado",
"noMembers": "Esta frota ainda não tem membros. Adicione anfitriões ou defina uma regra de etiqueta.",
"membersLoadFailed": "Falha ao carregar membros da frota",
"memberUpdateFailed": "Falha na atualização da adesão à frota",
"tabRun": "Executar comando",
"tabTransfer": "Transferir ficheiros",
"tabInventory": "Inventário",
"openInventoryTab": "Abrir em separador inteiro",
"tabPackages": "Pacotes",
"runOnFleet": "Executar na frota",
"commandPlaceholder": "tempo de atividade e df -h",
"commandRequired": "É necessário um comando.",
"commandInputsLabel": "Entradas de comando",
"commandSucceeded": "O comando foi executado com sucesso em todos os hosts.",
"commandPartialFailure": "{{failed}} de {{total}} os hosts falharam",
"commandFailed": "Falha ao executar o comando",
"resultSuccess": "Sucesso",
"resultFailed": "Falhou",
"push": "Pressionar",
"pull": "Puxar",
"remotePathLabel": "Caminho remoto",
"remotePathRequired": "É necessário um caminho remoto.",
"fileLabel": "Ficheiro",
"fileRequired": "É necessário um ficheiro.",
"pushHint": "O ficheiro selecionado é gravado exatamente nesse caminho em todos os hosts da frota.",
"pullHint": "O ficheiro neste caminho é lido de cada host e descarregado como um único ficheiro zip, uma pasta por host.",
"transferComplete": "Transferência concluída",
"transferFailed": "A transferência falhou",
"refreshInventory": "Atualizar inventário",
"inventoryLoadFailed": "Falha ao carregar o inventário",
"inventoryRefreshed": "Inventário atualizado",
"inventoryRefreshFailed": "Falha ao atualizar o inventário",
"inventoryNoData": "Ainda não há dados de stock - atualize a página para os recolher.",
"inventoryHost": "Anfitrião",
"inventoryCollectedCount": "{{count}}/{{total}} recolhido",
"inventoryOs": "SO",
"inventoryKernel": "Kernel",
"inventoryArch": "Arco",
"inventoryUptime": "Tempo de atividade",
"inventoryPackageManager": "Gestor de pacotes",
"inventoryCollectedAt": "Coletado",
"packageActionLabel": "Ação",
"packageInstall": "Instalar",
"packageRemove": "Remover",
"packageUpgradeAll": "Atualize todos os pacotes",
"packageNameLabel": "Nome do pacote",
"packageNameRequired": "É necessário informar o nome do pacote.",
"packageHint": "Requer acesso de nível de gestão por host e eleva os privilégios utilizando a palavra-passe sudo armazenada no host."
},
"workspaces": {
"title": "Espaços de trabalho",
"saveCurrent": "Guardar atual",
"saveCurrentTitle": "Guardar espaço de trabalho atual",
"saveCurrentDescription": "Guarde cada separador aberto, layout dividido e disposição de painéis como um novo espaço de trabalho nomeado.",
"nameLabel": "Nome",
"namePlaceholder": "Exemplo: Depuração de Produção",
"nameRequired": "É obrigatório dar um nome ao espaço de trabalho.",
"colorLabel": "Cor",
"workspaceCreated": "Espaço de trabalho guardado",
"workspaceUpdated": "Espaço de trabalho atualizado",
"workspaceDeleted": "Espaço de trabalho excluído",
"workspaceDuplicated": "Espaço de trabalho duplicado",
"saveFailed": "Falha ao guardar o espaço de trabalho",
"updateFailed": "Falha ao atualizar o espaço de trabalho",
"deleteFailed": "Falha ao eliminar o espaço de trabalho",
"duplicateFailed": "Falha ao duplicar o espaço de trabalho",
"loadFailed": "Falha ao carregar os espaços de trabalho.",
"applyFailed": "Falha ao aplicar o espaço de trabalho",
"deleteWorkspaceTitle": "Apagar espaço de trabalho",
"deleteWorkspaceDescription": "Tem a certeza que pretende eliminar \"{{name}}\"? Esta ação não pode ser anulada.",
"noWorkspaces": "Ainda não há espaços de trabalho guardados. Guarde a sua configuração atual de separadores para começar.",
"tabCount": "{{count}} separador",
"tabCount_other": "{{count}} separadores",
"apply": "Candidatar-se",
"applyConfirmTitle": "Aplicar Espaço de Trabalho",
"applyConfirmDescription": "Aplicar \"{{name}}\" fechará os seus separadores atuais e substituí-los-á pela configuração guardada deste espaço de trabalho. As alterações não guardadas no seu layout atual serão perdidas.",
"applyConfirmButton": "Aplicar Espaço de Trabalho",
"updateWithCurrent": "Atualizar com as informações atuais",
"updateWithCurrentConfirm": "Substituir \"{{name}}\" pela sua configuração de tabulação atual?",
"rename": "Renomear",
"duplicate": "Duplicado",
"duplicateNameSuffix": "{{name}} (copiar)",
"setDefault": "Definir como padrão",
"unsetDefault": "Remover como padrão",
"defaultBadge": "Predefinição",
"lastSession": "Última sessão",
"lastSessionDescription": "Atualizado automaticamente com a sua última configuração de separadores. Aplique para recuperar o que estava aberto.",
"lastUsed": "Última utilização {{time}}",
"neverUsed": "Nunca aplicado",
"tabsSkipped": "Espaço de trabalho aplicado — {{count}} separador(es) ignorado(s) (o host já não existe): {{names}}"
},
"keybindings": {
"title": "Atalhos de teclado",
"description": "Personalize os atalhos de copiar, colar e controlar o terminal, ou associe teclas para enviar texto ou executar um trecho de código.",
"defaultsHeading": "Atalhos integrados",
"customHeading": "Atalhos personalizados",
"addBinding": "Adicionar atalho",
"addBindingTitle": "Adicionar atalho",
"editBindingTitle": "Atalho para edição",
"loading": "Carregando...",
"noCustomBindings": "Ainda não existem atalhos personalizados.",
"defaultBadge": "Predefinição",
"customizedBadge": "Personalizado",
"customize": "Personalizar",
"resetToDefault": "Restaurar para as definições padrão",
"resetAllToDefaults": "Repor tudo para os valores de fábrica",
"close": "Perto",
"cancel": "Cancelar",
"saveBinding": "Atalho para guardar",
"saveError": "Falha ao guardar os atalhos de teclado.",
"pressKeysToRecord": "Combinação de teclas",
"pressKeysPlaceholder": "Clique e pressione as teclas.",
"recording": "Pressione as teclas...",
"comboRequiredError": "Pressione primeiro uma combinação de teclas",
"textRequiredError": "Introduza o texto que pretende enviar.",
"controlCodeRequiredError": "Introduza uma única letra para o código de controlo.",
"snippetRequiredError": "Selecione um excerto",
"conflictWarning": "Esta combinação já está ligada a {{combo}}. Guardar fará com que ambas disparem.",
"actionLabel": "Ação",
"actionCopy": "Copiar seleção",
"actionPaste": "Colar",
"actionSendControlCode": "Enviar sinal Ctrl+letra",
"actionSendText": "Enviar mensagem de texto",
"actionRunSnippet": "Executar excerto de código existente",
"controlCodeLabel": "Carta",
"textLabel": "Texto a enviar",
"appendEnterLabel": "Prima Enter após enviar",
"snippetLabel": "Trecho",
"selectSnippetPlaceholder": "Selecione um excerto",
"orphanedSnippetWarning": "trecho não encontrado",
"clipboardPermissionNote": "Pode solicitar permissão para aceder à área de transferência na primeira utilização em alguns navegadores."
},
"connectionDefaults": {
"title": "Configurações de ligação padrão",
"description": "Defina valores que todos os hosts herdarão, a menos que os substituam.",
"manage": "Gerir",
"dialogDescription": "Estas definições aplicam-se a hosts que deixam alguma configuração indefinida. Qualquer configuração definida no host prevalece.",
"tabTerminal": "terminal",
"tabRemoteDesktop": "Área de Trabalho Remota",
"inherit": "Herdar",
"on": "Em",
"off": "Desligado",
"resizeDisplayUpdate": "Atualização de visualização",
"resizeReconnect": "Reconectar",
"clearAll": "Limpar tudo",
"saved": "Configurações de ligação guardadas",
"saveFailed": "Falha ao guardar as definições padrão de ligação."
},
"userProfile": {
"donateTitle": "Mantenha o Termix ativo",
"donateDescription": "O Termix é gratuito, auto-hospedado e desenvolvido por apenas algumas pessoas no seu tempo livre. Se lhe poupou tempo ou dinheiro, uma doação em criptomoeda ajuda a mantê-lo a funcionar.",
"donateMilestones": "As doações ajudam a financiar o tempo para investigar e aprender o que é necessário para implementar suporte para SAML, Kubernetes e Agente. Veja o progresso e doe.",
"donateButton": "Doar criptomoeda",
"storageModeLocal": "Navegador",
"storageModeCloud": "Base de Dados",
"storageModeDescription": "O navegador guarda as definições apenas neste navegador. A base de dados sincroniza com o servidor e carrega em qualquer dispositivo.",
"resetToDefaults": "Repor Predefinições",
"resetToDefaultsSuccess": "Definições repostas para as predefinições.",
"storageModeSwitch": "Armazenamento de Preferências",
"sectionAccount": "Conta",
"desktopProfileTitle": "Perfil de área de trabalho local automático",
"desktopProfileDescription": "Este perfil está restrito ao backend integrado e o login é automático. Não possui password de login; a Sincronização Remota abaixo utiliza uma conta de servidor separada.",
"sectionInterface": "Interface",
"interfacePresetDesc": "O nível de detalhe exibido pelo Termix é impressionante. Todas as funcionalidades continuam disponíveis.",
"preset_simple": "Simples",
"preset_simple_desc": "Apenas o essencial.",
"preset_balanced": "Equilibrado",
"preset_balanced_desc": "O layout padrão.",
"preset_advanced": "Avançado",
"preset_advanced_desc": "Tudo ligado, muito compacto.",
"presetClearOverrides": "Redefinir tudo",
"presetOverridesTitle": "Personalizado",
"presetRevertArea": "Reverter",
"presetConfirmTitle": "Alternar para {{preset}}?",
"presetConfirmDesc": "Isto redefine a sua barra lateral, navegação, layout do painel, barra de ferramentas do terminal e visualização do gestor de ficheiros. Os seus hosts, credenciais e página inicial não serão alterados.",
"presetConfirmApply": "Aplicar predefinição",
"runSetupAgainDesc": "Repita o processo de configuração da primeira execução.",
"runSetupAgainButton": "Executar configuração",
"uiArea_chrome": "Aplicativo Chrome",
"uiArea_hostList": "Lista de anfitriões",
"uiArea_credentialList": "Lista de credenciais",
"uiArea_rail": "Navegação",
"uiArea_dashboard": "Painel",
"uiArea_terminal": "terminal",
"uiArea_fileManager": "Gestor de arquivos",
"uiArea_docker": "Docker",
"uiArea_hostMetrics": "Métricas do host",
"uiArea_hostEditor": "Editor de alojamento",
"uiArea_homepage": "Página inicial",
"sectionAppearance": "Aparência",
"sectionSecurity": "Segurança",
"sectionApiKeys": "Chaves API",
"sectionData": "Dados",
"sectionC2sTunnels": "Túneis C2S",
"usernameLabel": "Nome de utilizador",
"roleLabel": "Função",
"roleAdministrator": "Administrador",
"authMethodLabel": "Método de Autenticação",
"authMethodLocal": "Local",
"twoFaLabel": "2FA",
"twoFaOn": "Ativado",
"twoFaOff": "Desativado",
"versionLabel": "Versão",
"betaProgramTitle": "Programa Beta",
"betaProgramDescription": "Experimente novas funcionalidades antecipadamente com a tag Docker semanal :beta. Instável, não para produção.",
"betaProgramFeedback": "Encontrou um bug? Reporte-o aqui.",
"betaProgramLearnMore": "Saber Mais",
"cliTitle": "Termix CLI",
"cliDescription": "Abra terminais, execute comandos e mova ficheiros a partir do seu próprio shell.",
"cliLearnMore": "Saber mais",
"deleteAccount": "Eliminar Conta",
"deleteAccountDescription": "Eliminar permanentemente a sua conta",
"changeServerDescription": "Mudar para um servidor de backend Termix diferente",
"deleteButton": "Eliminar",
"deleteAccountPermanent": "Esta ação é permanente e não pode ser anulada.",
"deleteAccountWarning": "Todas as sessões, anfitriões, credenciais e configurações serão permanentemente eliminadas.",
"confirmPasswordDeletePlaceholder": "Introduza a sua palavra-passe para confirmar",
"languageLabel": "Idioma",
"themeLabel": "Tema",
"fontSizeLabel": "Tamanho da fonte",
"accentColorLabel": "Cor de destaque",
"settingsTerminal": "Terminal",
"commandAutocomplete": "Autocompletar comandos",
"commandAutocompleteDesc": "Exibir a funcionalidade de autocompletar enquanto escreve ao premir a tecla Tab.",
"localEcho": "Eco Local",
"localEchoDesc": "Reduza a latência de entrada percebida utilizando a previsão segura de pressão de teclas local.",
"keyboardShortcuts": "Atalhos de teclado",
"keyboardShortcutsDescription": "Personalize os atalhos de copiar, colar e os comandos do terminal.",
"manageShortcuts": "Gerir",
"terminalLinkBehavior": "Clique em links do terminal",
"terminalLinkBehaviorDesc": "Comportamento predefinido ao clicar em links no terminal",
"historyTracking": "Registo de histórico",
"historyTrackingDesc": "Registar comandos do terminal",
"commandPalette": "Paleta de Comandos",
"commandPaletteDesc": "Ativar atalho de teclado",
"reopenTabsOnLogin": "Reabrir separadores ao iniciar sessão",
"reopenTabsOnLoginDesc": "Restaurar os separadores abertos ao iniciar sessão ou atualizar a página, mesmo a partir de outro dispositivo",
"confirmTabClose": "Confirmar fecho de separador",
"confirmTabCloseDesc": "Perguntar antes de fechar separadores do terminal",
"settingsAppRail": "Aplicativo Rail",
"sidebarSettingsMoved": "As definições de visualização da barra lateral do host foram movidas para o painel Personalizar barra lateral, acessível através da barra de ferramentas Hosts.",
"showHostTags": "Mostrar etiquetas de anfitrião",
"showHostTagsDesc": "Apresentar etiquetas na lista de anfitriões",
"hostTrayOnClick": "Clicar para expandir ações do anfitrião",
"hostTrayOnClickDesc": "Mostrar sempre os botões de ligação; clicar para expandir as opções de gestão em vez de passar o rato",
"compactHostView": "Vista compacta de anfitriões",
"compactHostViewDesc": "Reduzir cada anfitrião a uma única linha mostrando apenas o nome e o endereço",
"statusColors": "Cores de estado reais",
"statusColorsDesc": "Usar verde/vermelho para estado online/offline em vez da cor de destaque",
"pinAppRail": "Fixar barra de aplicações",
"pinAppRailDesc": "Manter a barra de aplicações da barra lateral esquerda sempre expandida em vez de expandir ao passar o rato",
"openFullscreenSettings": "Abrir definições em tela cheia",
"exitFullscreenSettings": "Sair do modo de ecrã inteiro",
"expandAppRailOnHover": "Expandir barra de aplicações ao passar o rato",
"expandAppRailOnHoverDesc": "Permitir que a barra de aplicações da barra lateral esquerda se expanda quando o ponteiro passa sobre ela",
"settingsNavigation": "Navegação",
"navigationTabsDesc": "Escolha quais separadores aparecem na barra lateral da aplicação",
"foldersCollapsed": "Pastas recolhidas",
"foldersCollapsedDesc": "Recolher pastas por predefinição",
"confirmExecution": "Confirmar execução",
"confirmExecutionDesc": "Confirmar antes de executar fragmentos",
"settingsUpdates": "Atualizações",
"disableUpdateChecks": "Desativar verificações de atualizações",
"disableUpdateChecksDesc": "Parar de verificar atualizações",
"totpAuthenticator": "Autenticador TOTP",
"totpEnabled": "2FA está ativada",
"totpDisabled": "Adicionar segurança extra de início de sessão",
"disable": "Desativar",
"enable": "Ativar",
"setupTotp": "Configurar TOTP",
"qrCode": "Código QR",
"totpInstructions": "Leia o código QR ou introduza o segredo na sua aplicação autenticadora e depois introduza o código de 6 dígitos",
"totpCodePlaceholder": "000000",
"verify": "Verificar",
"changePassword": "Alterar palavra-passe",
"currentPasswordLabel": "Palavra-passe atual",
"currentPasswordPlaceholder": "Palavra-passe atual",
"newPasswordLabel": "Nova palavra-passe",
"newPasswordPlaceholder": "Nova palavra-passe",
"confirmPasswordLabel": "Confirmar nova palavra-passe",
"confirmPasswordPlaceholder": "Confirmar nova palavra-passe",
"updatePassword": "Atualizar palavra-passe",
"createApiKeyTitle": "Criar chave API",
"createApiKeyDescription": "Gerar uma nova chave API para acesso programático.",
"apiKeyNameLabel": "Nome",
"apiKeyNamePlaceholder": "ex.: CI Pipeline",
"expiryDateLabel": "Data de validade",
"optional": "opcional",
"cancel": "Cancelar",
"createKey": "Criar chave",
"apiKeyCreatedWarning": "Chave criada - copie-a agora, não voltará a ser apresentada.",
"copyApiKey": "Copiar chave API",
"copiedToClipboard": "Copiado para a área de transferência",
"apiKeyCount": "{{count}} chaves",
"newKey": "Nova Chave",
"noApiKeys": "Ainda sem chaves de API.",
"apiKeyActive": "Ativa",
"apiKeyUsageHint": "Inclua a sua chave no",
"apiKeyUsageHintHeader": "cabeçalho.",
"apiKeyPermissionsHint": "As chaves herdam as permissões do utilizador que as criou.",
"exportData": "Exportar os meus dados",
"exportDataDesc": "Faça o download de um backup dos seus hosts, credenciais e definições para transferir para outro dispositivo.",
"export": "Exportar",
"exporting": "Exportador...",
"importData": "Importar os meus dados",
"importDataDesc": "Restaure os seus hosts, credenciais e definições a partir de um ficheiro de cópia de segurança . sqlite.",
"importDataSelected": "Selecionado: {{name}}",
"selectFile": "Selecionar ficheiro",
"changeFile": "Mudar",
"import": "Importação",
"importing": "Importando...",
"exportSuccess": "Dados exportados com sucesso",
"exportFailed": "A exportação de dados falhou",
"importSelectFile": "Por favor, selecione primeiro um ficheiro.",
"importCompleted": "Importação concluída: {{total}} artigos importados, {{skipped}} ignorados",
"importFailed": "A importação falhou: {{error}}",
"roleUser": "Utilizador",
"authMethodDual": "Autenticação Dupla",
"authMethodOidc": "OIDC",
"totpSetupFailed": "Falha ao iniciar a configuração de TOTP",
"totpEnter6Digits": "Insira um código de 6 dígitos",
"totpEnabledSuccess": "Autenticação de dois fatores ativada",
"totpInvalidCode": "Código inválido, tente novamente",
"totpDisableInputRequired": "Insira o seu código TOTP ou palavra-passe",
"totpDisabledSuccess": "Autenticação de dois fatores desativada",
"totpDisableFailed": "Falha ao desativar 2FA",
"totpDisableTitle": "Desativar 2FA",
"totpDisablePlaceholder": "Insira o código TOTP ou palavra-passe",
"totpDisableConfirm": "Desativar 2FA",
"totpContinueVerify": "Continuar para Verificação",
"totpVerifyTitle": "Verificar Código",
"totpBackupTitle": "Códigos de Backup",
"totpDownloadBackup": "Descarregar Códigos de Backup",
"passkeys": "Passkeys",
"passkeysDesc": "Utilize credenciais WebAuthn/FIDO2 para iniciar sessão sem palavra-passe",
"passkeyName": "Nome da passkey",
"passkeyUvPreferred": "Preferencial",
"passkeyUvRequired": "Obrigatório",
"passkeyUvDiscouraged": "Desaconselhado",
"addPasskey": "Adicionar Passkey",
"noPasskeys": "Nenhuma passkey registada.",
"passkeyAdded": "Passkey adicionada",
"passkeyAddFailed": "Falha ao adicionar passkey",
"passkeyDeleted": "Passkey eliminada",
"passkeyDeleteFailed": "Falha ao eliminar chave de acesso",
"done": "Concluído",
"secretCopied": "Segredo copiado para a área de transferência",
"apiKeyNameRequired": "Nome da chave é obrigatório",
"apiKeyCreated": "Chave de API \"{{name}}\" criada",
"apiKeyCreateFailed": "Falha ao criar chave de API",
"apiKeyUser": "Utilizador",
"apiKeyExpires": "Expira",
"apiKeyRevoked": "Chave de API \"{{name}}\" revogada",
"apiKeyRevokeFailed": "Falha ao revogar chave de API",
"passwordFieldsRequired": "As palavras-passe atual e nova são obrigatórias",
"passwordMismatch": "As palavras-passe não coincidem",
"passwordTooShort": "A palavra-passe deve ter pelo menos 6 caracteres",
"passwordUpdated": "Palavra-passe atualizada com sucesso",
"passwordUpdateFailed": "Falha ao atualizar palavra-passe",
"deletePasswordRequired": "É necessária a palavra-passe para eliminar a sua conta",
"deleteFailed": "Falha ao eliminar conta",
"deleting": "A eliminar...",
"colorPickerTooltip": "Abrir seletor de cores",
"themeSystem": "Sistema",
"themeLight": "Claro",
"themeDark": "Escuro",
"themeDracula": "Dracula",
"themeCatppuccin": "Catppuccin",
"themeNord": "Nord",
"themeSolarized": "Solarized",
"themeTokyoNight": "Tokyo Night",
"themeOneDark": "One Dark",
"themeGruvbox": "Gruvbox"
}
}
},
"terminalToolbar": {
"title": "Barra de ferramentas do terminal",
"showActions": "Exibir barra de ferramentas",
"hideToolbar": "Ocultar barra de ferramentas",
"showToolbar": "Expandir barra de ferramentas",
"moveToolbar": "Mover barra de ferramentas",
"moveToolbarHint": "Arraste para reposicionar a barra de ferramentas.",
"layout": "Modo de visualização da barra de ferramentas",
"layoutIcon": "Apenas o ícone",
"layoutLabeled": "Ícones e rótulos",
"layoutExpanded": "Expandido com métricas",
"image": "Ações de imagem (apenas imagens)",
"upload": "Carregar imagem",
"paste": "Colar imagem",
"detachTmux": "Desanexar tmux",
"detachTmuxDescription": "Desanexar sessão tmux",
"imageActionFailed": "A ação de imagem falhou",
"retry": "Tentar novamente",
"dismissError": "Ignorar erro de imagem",
"cpu": "CPU",
"memory": "Memória",
"disk": "Disco",
"statsUnavailable": "Estatísticas ao vivo indisponíveis",
"tmuxDetach": "Desanexar sessão tmux",
"uploadImage": "Faça o upload de uma imagem para o host.",
"uploadingImage": "Carregando...",
"pasteImage": "Colar imagem da área de transferência (apenas imagens)",
"openFiles": "Abrir ficheiros",
"openDocker": "Abra o Docker",
"openTunnel": "Túnel aberto",
"openHostMetrics": "Métricas de host abertas",
"openProxmoxStats": "Estatísticas do Open Proxmox",
"openTmuxMonitor": "Abra o monitor Tmux"
},
"tmuxMonitor": {
"title": "Monitor Tmux",
"failedToLoadHosts": "Falha ao carregar anfitriões",
"failedToLoad": "Falha ao carregar sessões tmux",
"tmuxUnavailable": "tmux não está instalado neste anfitrião",
"noSessions": "Sem sessões tmux neste anfitrião",
"noHostSelected": "Nenhum anfitrião selecionado",
"attached": "Anexado",
"detached": "Desanexado",
"attach": "Anexar",
"editTags": "Editar etiquetas",
"tagsHint": "Etiquetas separadas por vírgulas (ex: YOLO, lab, training)",
"tagsSaved": "Etiquetas guardadas",
"tagsSaveFailed": "Falha ao guardar etiquetas",
"searchPlaceholder": "Pesquisar saída em todas as sessões...",
"searchResults": "{{count}} correspondências",
"searchFailed": "Pesquisa falhou",
"selectPaneHint": "Selecione um painel para pré-visualizar a sua saída",
"closePreview": "Fechar pré-visualização",
"newSession": "Nova sessão",
"newSessionHint": "Nome da sessão (letras, dígitos, _ @ % + = -)",
"newSessionPlaceholder": "my-session",
"create": "Criar",
"sessionCreated": "Sessão \"{{name}}\" criada",
"sessionCreateFailed": "Falha ao criar sessão",
"splitRight": "Dividir à direita",
"splitDown": "Dividir para baixo",
"splitFailed": "Falha ao dividir painel",
"newWindow": "Nova janela",
"windowCreateFailed": "Falha ao criar janela",
"attachSessionTooltip": "Anexar a {{session}}",
"refresh": "Atualizar",
"refreshFailed": "Falha ao atualizar sessões",
"collapseAll": "Recolher tudo",
"expandAll": "Expandir tudo",
"moreActions": "Mais ações",
"sessionStats": "Estatísticas da sessão",
"renameSessionTitle": "Renomear sessão \"{{name}}\"",
"rename": "Renomear",
"sessionRenamed": "Sessão renomeada para \"{{name}}\"",
"sessionRenameFailed": "Falha ao renomear sessão",
"editTagsTitle": "Editar etiquetas para \"{{name}}\"",
"killPane": "Terminar painel",
"resizeTree": "Arraste para redimensionar — clique duplo para repor",
"reattach": "Reanexar (corrige uma visualização distorcida)",
"killWindow": "Terminar janela",
"killWindowTitle": "Terminar janela {{index}} de \"{{session}}\"?",
"killWindowBody": "Todos os painéis e processos nesta janela serão terminados. Terminar a última janela encerra a sessão.",
"windowKillFailed": "Falha ao terminar janela",
"statusActivity": "Atividade",
"statusWindows": "Janelas",
"statusPanes": "painéis",
"statusTags": "Etiquetas",
"killPaneTitle": "Terminar painel {{id}}?",
"killPaneBody": "O processo em execução neste painel será terminado. Terminar o último painel fecha a sua janela.",
"paneKillFailed": "Falha ao terminar painel",
"killSessionTitle": "Terminar sessão \"{{name}}\"?",
"killSessionBody": "Todas as janelas e processos em execução nesta sessão serão terminados. Isto não pode ser desfeito.",
"kill": "Terminar",
"sessionKilled": "Sessão \"{{name}}\" terminada",
"sessionKillFailed": "Falha ao terminar sessão",
"hostUnreachable": "Não foi possível ligar ao anfitrião. Verifique se está online e acessível.",
"noServer": "Não há nenhum servidor tmux em execução neste anfitrião.",
"searchTruncated": "Resultados parciais — a pesquisa abrange as últimas {{lines}} linhas de cada painel e, no máximo, {{panes}} painéis.",
"closeSearchResults": "Fechar resultados da pesquisa",
"retry": "Tentar novamente",
"noHosts": "Nenhum anfitrião SSH disponível",
"noHostsHint": "Ative a opção Monitor Tmux num anfitrião SSH (Gestor de Anfitriões → separador Terminal) para monitorizar as suas sessões tmux.",
"tmuxInstallHint": "Instale-o no anfitrião com:",
"attachTooltip": "Abrir um terminal para {{host}}",
"attachTooltipPane": "Abrir um terminal para {{host}} — sessão tmux {{session}}",
"timeJustNow": "agora mesmo",
"timeMinutes": "há {{count}} min",
"timeHours": "há {{count}} h",
"timeDays": "há {{count}} d"
},
"mobileKeyboard": {
"shift": "Shift",
"ctrl": "Ctrl",
"esc": "Esc",
"tab": "Tab",
"backTab": "⇥",
"arrowUp": "Seta para Cima",
"arrowDown": "Seta para Baixo",
"arrowLeft": "Seta para a Esquerda",
"arrowRight": "Seta para a Direita",
"home": "Início",
"end": "Fim",
"pageUp": "PgUp",
"pageDown": "PgDn",
"delete": "Del",
"paste": "Colar",
"editQuickKeys": "Editar teclas rápidas",
"quickKeysTitle": "Teclas Rápidas",
"quickKeysDesc": "Toque no × para remover. Suporta até 8 caracteres.",
"quickKeyPlaceholder": "ex: sudo ",
"addQuickKey": "Adicionar",
"removeQuickKey": "Remover",
"resetDefaults": "Restaurar predefinições",
"done": "Concluir"
},
"serial": {
"title": "Serial",
"portLabel": "Porta",
"portPlaceholder": "/dev/ttyUSB0 ou COM3",
"baudRateLabel": "Taxa Baud",
"dataBitsLabel": "Dados",
"stopBitsLabel": "Stop",
"parityLabel": "Paridade",
"parityNone": "Nenhuma",
"parityEven": "Par",
"parityOdd": "Ímpar",
"connect": "Ligar à Serial",
"disconnect": "Desligar",
"refreshPorts": "Atualizar portas",
"connected": "Ligado a {{path}} a {{baud}} baud",
"disconnected": "Porta série desligada",
"connectionError": "Falha ao abrir a porta série",
"wsError": "Erro de WebSocket",
"errorNoServerUrl": "Nenhum URL de servidor configurado",
"notSupportedTitle": "Série não suportada",
"notSupported": "As ligações série requerem um navegador com suporte à Web Serial API (Chrome, Edge ou Firefox 151+) ou a aplicação de ambiente de trabalho Termix.",
"hideHint": "Pode ocultar o separador Série em Perfil do Utilizador > Aparência > Barra Lateral > Navegação.",
"browserPickerHint": "Clique em Ligar e o seu navegador abrirá um seletor de porta para escolher o dispositivo."
},
"metricsHistory": {
"title": "Histórico de Métricas",
"historySuffix": "Histórico",
"cpuMemoryDisk": "CPU / Memória / Disco",
"network": "Rede",
"download": "RX",
"upload": "TX",
"noData": "Sem dados de histórico disponíveis para este intervalo de tempo.",
"custom": "Personalizado",
"to": "a",
"apply": "Aplicar",
"viewHistory": "Ver Histórico"
},
"alerts": {
"tabFirings": "Alertas",
"tabRules": "Regras",
"tabChannels": "Canais",
"noFirings": "Nenhum alerta por reconhecer",
"noRules": "Nenhuma regra de alerta configurada",
"noChannels": "Nenhum canal de notificação configurado",
"rulesDesc": "As regras de alerta disparam notificações",
"channelsDesc": "Onde as notificações de alerta são enviadas",
"acknowledge": "Reconhecer",
"ackAll": "Reconhecer Todos",
"allAcknowledged": "Todos os alertas reconhecidos",
"ackFailed": "Falha ao reconhecer o alerta",
"ackAllFailed": "Falha ao reconhecer todos os alertas",
"showAcknowledged": "Mostrar Todos",
"hideAcknowledged": "Ocultar Reconhecidos",
"addChannel": "Adicionar Canal",
"editChannel": "Editar Canal",
"channelName": "Nome",
"channelType": "Tipo",
"channelNameRequired": "O nome é obrigatório",
"webhookUrl": "URL",
"webhookUrlRequired": "O URL do webhook é obrigatório",
"webhookDesc": "Enviar payload JSON via POST para este URL em cada disparo do alerta",
"ntfyServer": "URL do servidor",
"ntfyTopic": "Tópico",
"ntfyTopicRequired": "O tópico é obrigatório",
"ntfyToken": "Token de acesso (opcional)",
"channelSaveFailed": "Falha ao guardar o canal",
"test": "Testar",
"testSent": "Notificação de teste enviada",
"testFailed": "Falha na notificação de teste",
"testFailedWithReason": "Falha na notificação de teste: {{reason}}",
"addRule": "Adicionar regra de alerta",
"editRule": "Editar regra de alerta",
"ruleName": "Nome da regra",
"ruleNameRequired": "O nome é obrigatório",
"triggerType": "Gatilho",
"thresholdValue": "Limiar (%)",
"durationSeconds": "Duração (segundos, 0 = disparar imediatamente)",
"cooldownMinutes": "Período de arrefecimento (minutos)",
"channels": "Canais de notificação",
"noChannelsHint": "Adicione canais primeiro no separador Canais",
"ruleSaveFailed": "Falha ao guardar a regra"
},
"ai": {
"title": "Assistente",
"send": "Enviar",
"stop": "Parar",
"save": "Guardar",
"cancel": "Cancelar",
"running": "corrida",
"approve": "Aprovar",
"reject": "Rejeitar",
"inputPlaceholder": "Pergunte pelos seus servidores ou descreva uma alteração que gostaria de propor.",
"selectProvider": "Selecione um fornecedor",
"providerSettings": "Configurações do fornecedor",
"addProvider": "Adicionar provedor",
"removeProvider": "Remover fornecedor",
"providerType": "Fornecedor",
"providerLabel": "Nome",
"providerLabelPlaceholder": "Por exemplo: Ollama local",
"baseUrl": "Endereço do servidor",
"apiKey": "Chave API",
"defaultModel": "Modelo padrão",
"defaultModelPlaceholder": "Por exemplo: llama3.1 ou claude-opus-5",
"labelRequired": "Dê um nome a este fornecedor.",
"providerSaveFailed": "Não foi possível guardar o fornecedor.",
"providerDeleteFailed": "Não foi possível remover o fornecedor.",
"privateEndpointHint": "Os endereços na sua rede privada necessitam que um administrador autorize primeiro o host.",
"providerOllama": "Ollama",
"providerAnthropic": "Antrópico",
"providerOpenai": "OpenAI",
"providerGemini": "Google Gemini",
"providerOpenaiCompatible": "Compatível com OpenAI",
"toolArguments": "Entrada",
"toolResult": "Resultado",
"statusApplied": "Aplicado",
"statusRejected": "Rejeitado",
"proposalApplied": "Alteração aplicada",
"proposalApplyFailed": "Não foi possível aplicar a alteração.",
"proposalRejectFailed": "Não foi possível rejeitar a alteração.",
"enableTitle": "Ative o assistente de IA",
"enableDescription": "Deixe o assistente ler a sua configuração e sugerir alterações para que a aprove.",
"readOnlyCommands": "Permitir comandos de diagnóstico de leitura apenas",
"readOnlyCommandsDescription": "O assistente pode executar uma pequena lista de comandos seguros, como `df` e `uptime`, sem perguntar de cada vez. Qualquer alteração que faça no servidor será sempre sugerida em primeiro lugar.",
"modelDetectFailed": "Não foi possível contactar o fornecedor, pelo que esta é uma lista genérica. Pode digitar o nome de qualquer modelo.",
"modelCustom": "Introduza o nome do modelo",
"modelRefresh": "Atualizar lista",
"modelPlaceholder": "Selecione ou introduza um modelo",
"attachHint": "Digite @ para fazer referência a um host, snippet ou automação. As alterações são propostas para a sua aprovação.",
"runCommandTitle": "Executar comando"
},
"macros": {
"title": "Macros",
"description": "Execute uma série de comandos guardados num terminal e reaja ao que o servidor envia de volta.",
"target": "Objetivo",
"noTerminal": "Nenhum terminal aberto",
"empty": "Ainda não existem macros.",
"emptyHint": "Crie uma macro para automatizar um fluxo de trabalho no terminal, como por exemplo, iniciar sessão, reiniciar um serviço ou responder a pedidos.",
"create": "Nova macro",
"back": "Voltar às macros",
"name": "Nome",
"namePlaceholder": "Reinicie o servidor web.",
"nameRequired": "Dê um nome à macro antes de guardar.",
"descriptionLabel": "Descrição",
"descriptionPlaceholder": "O que faz esta macro (opcional)",
"unsaved": "Alterações não guardadas",
"save": "Guardar",
"saved": "Macro salvo",
"saveFailed": "Não foi possível guardar a macro.",
"delete": "Eliminar",
"deleteTitle": "Apagar esta macro?",
"deleteBody": "\"{{name}}\" será eliminado permanentemente. Esta ação não pode ser anulada.",
"deleted": "Macro excluída",
"cancel": "Cancelar",
"run": "Correr",
"stop": "Parar",
"running": "Corrida...",
"completed": "Macro finalizado",
"failed": "A macro falhou",
"loadFailed": "Não foi possível carregar as macros",
"needTerminal": "Primeiro, abra e ligue um terminal.",
"noSteps": "Esta macro ainda não tem etapas. Adicione uma abaixo.",
"addStep": "Adicionar etapa",
"stepNumber": "Passo {{number}}",
"removeStep": "Remover etapa",
"confirmRunTitle": "Executar esta macro?",
"confirmRunBody": "\"{{name}}\" enviará comandos para {{host}}.",
"confirmRunAction": "Executar macro",
"stepTypes": {
"send": {
"label": "Enviar comando",
"help": "Digita o texto no terminal, da mesma forma que se o digitasse."
},
"wait": {
"label": "Aguarde a saída",
"help": "Aguarda até que o servidor imprima o texto que introduziu, como por exemplo um pedido de palavra-passe."
},
"delay": {
"label": "Pausa",
"help": "Aguarda um período de tempo fixo antes da etapa seguinte."
},
"if": {
"label": "Se a saída contiver",
"help": "Verifica tudo o que o servidor imprimiu até à data e, em seguida, executa uma das duas ramificações."
},
"repeat": {
"label": "Repetir",
"help": "Executa os passos internos um número definido de vezes."
}
},
"send": {
"text": "Comando ou texto",
"textPlaceholder": "systemctl restart nginx",
"pressEnter": "Prima Enter após enviar",
"pressEnterHelp": "Desative esta opção para digitar texto sem o enviar."
},
"wait": {
"pattern": "Aguarde até que a saída contenha",
"patternPlaceholder": "palavra-passe:",
"timeout": "Desistir depois",
"onTimeout": "Se nunca aparecer",
"stop": "Pare a macro",
"continue": "Continue mesmo assim"
},
"delay": {
"duration": "Aguarde"
},
"ifStep": {
"pattern": "Se a saída contiver",
"patternPlaceholder": "Ativo: ativo (em execução)",
"then": "Então faça isso",
"else": "Caso contrário, faça-o",
"emptyBranch": "Sem degraus"
},
"repeat": {
"count": "Número de vezes",
"times": "vezes"
},
"match": {
"useRegex": "Combinar com uma expressão regular",
"useRegexHelp": "Deixe este campo em branco para que o texto corresponda exatamente ao que foi escrito.",
"invalidRegex": "Expressão regular inválida; será interpretada como texto simples."
},
"seconds": "segundos",
"secondsShort": "{{count}}s"
}
}