From 3673ec44b2e4d61c42d0fb1d775592522e394c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9lio=20Pereira?= Date: Fri, 23 Oct 2026 10:59:10 -0300 Subject: [PATCH 1/2] feat(i18n): add Portuguese (pt, pt-BR, pt-PT) locales --- src/i18n/bundles.ts | 113 +- src/i18n/index.ts | 142 +- src/i18n/locales/pt-BR/_meta.json | 6 + src/i18n/locales/pt-PT/_meta.json | 6 + src/i18n/locales/pt-PT/changelog.json | 22 + src/i18n/locales/pt-PT/common.json | 309 ++++ src/i18n/locales/pt-PT/connections.json | 239 +++ src/i18n/locales/pt-PT/errors.json | 39 + src/i18n/locales/pt-PT/fileTransfer.json | 226 +++ src/i18n/locales/pt-PT/folders.json | 36 + src/i18n/locales/pt-PT/hosts.json | 176 +++ src/i18n/locales/pt-PT/importExport.json | 235 +++ src/i18n/locales/pt-PT/keychain.json | 167 +++ src/i18n/locales/pt-PT/knownHosts.json | 22 + src/i18n/locales/pt-PT/layout.json | 327 +++++ src/i18n/locales/pt-PT/logs.json | 165 +++ src/i18n/locales/pt-PT/members.json | 361 +++++ src/i18n/locales/pt-PT/mobile.json | 308 ++++ src/i18n/locales/pt-PT/notes.json | 54 + src/i18n/locales/pt-PT/notifications.json | 116 ++ src/i18n/locales/pt-PT/omni.json | 120 ++ src/i18n/locales/pt-PT/panes.json | 52 + src/i18n/locales/pt-PT/portForwarding.json | 167 +++ src/i18n/locales/pt-PT/settings.json | 1553 ++++++++++++++++++++ src/i18n/locales/pt-PT/shared.json | 189 +++ src/i18n/locales/pt-PT/snippets.json | 258 ++++ src/i18n/locales/pt-PT/terminal.json | 370 +++++ src/i18n/locales/pt-PT/themeCreator.json | 107 ++ src/i18n/locales/pt/_meta.json | 6 + src/i18n/locales/pt/changelog.json | 22 + src/i18n/locales/pt/common.json | 309 ++++ src/i18n/locales/pt/connections.json | 239 +++ src/i18n/locales/pt/errors.json | 39 + src/i18n/locales/pt/fileTransfer.json | 224 +++ src/i18n/locales/pt/folders.json | 36 + src/i18n/locales/pt/home.json | 56 + src/i18n/locales/pt/hosts.json | 176 +++ src/i18n/locales/pt/importExport.json | 223 +++ src/i18n/locales/pt/keychain.json | 167 +++ src/i18n/locales/pt/knownHosts.json | 22 + src/i18n/locales/pt/layout.json | 327 +++++ src/i18n/locales/pt/logs.json | 165 +++ src/i18n/locales/pt/members.json | 357 +++++ src/i18n/locales/pt/mobile.json | 308 ++++ src/i18n/locales/pt/notes.json | 54 + src/i18n/locales/pt/notifications.json | 116 ++ src/i18n/locales/pt/omni.json | 120 ++ src/i18n/locales/pt/panes.json | 52 + src/i18n/locales/pt/portForwarding.json | 165 +++ src/i18n/locales/pt/settings.json | 1322 +++++++++++++++++ src/i18n/locales/pt/shared.json | 189 +++ src/i18n/locales/pt/snippets.json | 258 ++++ src/i18n/locales/pt/terminal.json | 370 +++++ src/i18n/locales/pt/themeCreator.json | 107 ++ src/plugins/docker/i18n.ts | 237 +++ src/plugins/gist-sync/i18n.ts | 133 +- src/plugins/monitoring/i18n.ts | 49 + src/plugins/process-manager/i18n.ts | 53 + src/plugins/proxmox/i18n.ts | 89 ++ src/stores/localeStore.test.ts | 108 +- src/stores/localeStore.ts | 90 +- 61 files changed, 11871 insertions(+), 202 deletions(-) create mode 100644 src/i18n/locales/pt-BR/_meta.json create mode 100644 src/i18n/locales/pt-PT/_meta.json create mode 100644 src/i18n/locales/pt-PT/changelog.json create mode 100644 src/i18n/locales/pt-PT/common.json create mode 100644 src/i18n/locales/pt-PT/connections.json create mode 100644 src/i18n/locales/pt-PT/errors.json create mode 100644 src/i18n/locales/pt-PT/fileTransfer.json create mode 100644 src/i18n/locales/pt-PT/folders.json create mode 100644 src/i18n/locales/pt-PT/hosts.json create mode 100644 src/i18n/locales/pt-PT/importExport.json create mode 100644 src/i18n/locales/pt-PT/keychain.json create mode 100644 src/i18n/locales/pt-PT/knownHosts.json create mode 100644 src/i18n/locales/pt-PT/layout.json create mode 100644 src/i18n/locales/pt-PT/logs.json create mode 100644 src/i18n/locales/pt-PT/members.json create mode 100644 src/i18n/locales/pt-PT/mobile.json create mode 100644 src/i18n/locales/pt-PT/notes.json create mode 100644 src/i18n/locales/pt-PT/notifications.json create mode 100644 src/i18n/locales/pt-PT/omni.json create mode 100644 src/i18n/locales/pt-PT/panes.json create mode 100644 src/i18n/locales/pt-PT/portForwarding.json create mode 100644 src/i18n/locales/pt-PT/settings.json create mode 100644 src/i18n/locales/pt-PT/shared.json create mode 100644 src/i18n/locales/pt-PT/snippets.json create mode 100644 src/i18n/locales/pt-PT/terminal.json create mode 100644 src/i18n/locales/pt-PT/themeCreator.json create mode 100644 src/i18n/locales/pt/_meta.json create mode 100644 src/i18n/locales/pt/changelog.json create mode 100644 src/i18n/locales/pt/common.json create mode 100644 src/i18n/locales/pt/connections.json create mode 100644 src/i18n/locales/pt/errors.json create mode 100644 src/i18n/locales/pt/fileTransfer.json create mode 100644 src/i18n/locales/pt/folders.json create mode 100644 src/i18n/locales/pt/home.json create mode 100644 src/i18n/locales/pt/hosts.json create mode 100644 src/i18n/locales/pt/importExport.json create mode 100644 src/i18n/locales/pt/keychain.json create mode 100644 src/i18n/locales/pt/knownHosts.json create mode 100644 src/i18n/locales/pt/layout.json create mode 100644 src/i18n/locales/pt/logs.json create mode 100644 src/i18n/locales/pt/members.json create mode 100644 src/i18n/locales/pt/mobile.json create mode 100644 src/i18n/locales/pt/notes.json create mode 100644 src/i18n/locales/pt/notifications.json create mode 100644 src/i18n/locales/pt/omni.json create mode 100644 src/i18n/locales/pt/panes.json create mode 100644 src/i18n/locales/pt/portForwarding.json create mode 100644 src/i18n/locales/pt/settings.json create mode 100644 src/i18n/locales/pt/shared.json create mode 100644 src/i18n/locales/pt/snippets.json create mode 100644 src/i18n/locales/pt/terminal.json create mode 100644 src/i18n/locales/pt/themeCreator.json diff --git a/src/i18n/bundles.ts b/src/i18n/bundles.ts index 3daa14a0e..438532da1 100644 --- a/src/i18n/bundles.ts +++ b/src/i18n/bundles.ts @@ -1,35 +1,78 @@ -type LocaleModule = { default: Record }; - -const localeOf = (path: string) => { - const segments = path.split("/"); - return segments[segments.length - 2]; -}; - -export function assembleLocales( - glob: Record, -): Record> { - const out: Record> = {}; - for (const [path, mod] of Object.entries(glob)) { - const bundle = (out[localeOf(path)] ??= {}); - for (const [k, v] of Object.entries(mod.default)) { - bundle[k] = { ...(bundle[k] as object), ...(v as object) }; - } - } - return out; -} - -export const englishBundle = assembleLocales( - import.meta.glob("./locales/en/*.json", { eager: true }) as Record, -).en; - -const otherLocales = import.meta.glob(["./locales/*/*.json", "!./locales/en/*.json"]) as Record< - string, - () => Promise ->; - -export async function loadLocaleBundle(locale: string): Promise | undefined> { - const files = Object.entries(otherLocales).filter(([path]) => localeOf(path) === locale); - if (files.length === 0) return undefined; - const modules = await Promise.all(files.map(async ([path, load]) => [path, await load()] as const)); - return assembleLocales(Object.fromEntries(modules))[locale]; -} +type LocaleModule = { default: Record }; + +const localeOf = (path: string) => { + const segments = path.split("/"); + return segments[segments.length - 2]; +}; + +function declaredFallback(bundle: Record): string | undefined { + const meta = bundle._meta; + return meta && typeof meta === "object" ? (meta as { fallback?: string }).fallback : undefined; +} + +export function assembleLocales( + glob: Record, +): Record> { + const raw: Record> = {}; + for (const [path, mod] of Object.entries(glob)) { + const bundle = (raw[localeOf(path)] ??= {}); + for (const [k, v] of Object.entries(mod.default)) { + bundle[k] = { ...(bundle[k] as object), ...(v as object) }; + } + } + + // A locale such as pt-BR may ship only a _meta.json declaring `fallback: "pt"`. + // Resolve those chains so its bundle carries the base language's strings. + const resolved: Record> = {}; + const resolving = new Set(); + const resolve = (locale: string): Record => { + const cached = resolved[locale]; + if (cached) return cached; + const bundle = raw[locale]; + if (!bundle) return {}; + const fallback = declaredFallback(bundle); + if (!fallback || fallback === locale || resolving.has(locale) || !raw[fallback]) { + resolved[locale] = bundle; + return bundle; + } + resolving.add(locale); + const merged = { ...resolve(fallback), ...bundle }; + resolving.delete(locale); + resolved[locale] = merged; + return merged; + }; + + return Object.fromEntries(Object.keys(raw).map((locale) => [locale, resolve(locale)])); +} + +export const englishBundle = assembleLocales( + import.meta.glob("./locales/en/*.json", { eager: true }) as Record, +).en; + +const otherLocales = import.meta.glob(["./locales/*/*.json", "!./locales/en/*.json"]) as Record< + string, + () => Promise +>; + +/** Walks `_meta.fallback` from `locale` so a regional bundle also loads its base language. */ +async function localeChain(locale: string): Promise> { + const chain = new Set([locale]); + let current = locale; + for (;;) { + const load = otherLocales[`./locales/${current}/_meta.json`]; + if (!load) break; + const fallback = declaredFallback((await load()).default); + if (!fallback || chain.has(fallback)) break; + chain.add(fallback); + current = fallback; + } + return chain; +} + +export async function loadLocaleBundle(locale: string): Promise | undefined> { + const chain = await localeChain(locale); + const files = Object.entries(otherLocales).filter(([path]) => chain.has(localeOf(path))); + if (files.length === 0) return undefined; + const modules = await Promise.all(files.map(async ([path, load]) => [path, await load()] as const)); + return assembleLocales(Object.fromEntries(modules))[locale]; +} diff --git a/src/i18n/index.ts b/src/i18n/index.ts index e11b89316..18b577e34 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -1,71 +1,71 @@ -import i18n from "i18next"; -import { initReactI18next, useTranslation } from "react-i18next"; -import { useLocaleStore } from "@/stores/localeStore"; -import { englishBundle, loadLocaleBundle } from "./bundles"; - -// No async backend: i18n.changeLanguage() mutates i18n.language synchronously, which -// non-component callers (e.g. getSettingsNav()) rely on. Only a locale not loaded yet switches late. -i18n.use(initReactI18next).init({ - resources: { en: { translation: englishBundle } }, - lng: useLocaleStore.getState().locale, - fallbackLng: "en", - interpolation: { escapeValue: false }, - returnNull: false, -}); - -const loaded = new Set(["en"]); -const loading = new Map>(); - -/** Adds a locale's strings to i18n; English ships in the main bundle, the rest load on demand. */ -export function ensureLocale(locale: string): Promise { - if (loaded.has(locale)) return Promise.resolve(); - let pending = loading.get(locale); - if (!pending) { - pending = loadLocaleBundle(locale) - .then((bundle) => { - if (bundle) i18n.addResourceBundle(locale, "translation", bundle, true, false); - loaded.add(locale); - }) - .catch(() => {}) - .finally(() => loading.delete(locale)); - loading.set(locale, pending); - } - return pending; -} - -/** Resolves once the persisted locale's strings are in, so the first render is already translated. */ -export const i18nReady = ensureLocale(useLocaleStore.getState().locale); - -function followLocaleSetting() { - const { locale } = useLocaleStore.getState(); - if (i18n.language !== locale) i18n.changeLanguage(locale); - document.documentElement.lang = locale; -} - -useLocaleStore.subscribe((state) => { - if (loaded.has(state.locale)) followLocaleSetting(); - else void ensureLocale(state.locale).then(followLocaleSetting); -}); - -/** The language the UI strings are in; trails the locale setting while its strings load. */ -export function useUiLanguage(): string { - return (useTranslation().i18n ?? i18n).language; -} -document.documentElement.lang = useLocaleStore.getState().locale; - -/** A label that translates on every read, plus its English text for search. */ -export interface LazyLabel { - (): string; - en: () => string; -} - -/** For UI definitions that live outside components (command lists, - * registries): resolve the label at render, never at module load, so it - * follows the app language. */ -export function lazyT(key: string, options?: Record): LazyLabel { - return Object.assign(() => i18n.t(key, options), { - en: () => i18n.t(key, { ...options, lng: "en" }), - }); -} - -export default i18n; +import i18n from "i18next"; +import { initReactI18next, useTranslation } from "react-i18next"; +import { useLocaleStore } from "@/stores/localeStore"; +import { englishBundle, loadLocaleBundle } from "./bundles"; + +// No async backend: i18n.changeLanguage() mutates i18n.language synchronously, which +// non-component callers (e.g. getSettingsNav()) rely on. Only a locale not loaded yet switches late. +i18n.use(initReactI18next).init({ + resources: { en: { translation: englishBundle } }, + lng: useLocaleStore.getState().locale, + fallbackLng: { "pt-BR": ["pt", "en"], "pt-PT": ["pt", "en"], default: ["en"] }, + interpolation: { escapeValue: false }, + returnNull: false, +}); + +const loaded = new Set(["en"]); +const loading = new Map>(); + +/** Adds a locale's strings to i18n; English ships in the main bundle, the rest load on demand. */ +export function ensureLocale(locale: string): Promise { + if (loaded.has(locale)) return Promise.resolve(); + let pending = loading.get(locale); + if (!pending) { + pending = loadLocaleBundle(locale) + .then((bundle) => { + if (bundle) i18n.addResourceBundle(locale, "translation", bundle, true, false); + loaded.add(locale); + }) + .catch(() => {}) + .finally(() => loading.delete(locale)); + loading.set(locale, pending); + } + return pending; +} + +/** Resolves once the persisted locale's strings are in, so the first render is already translated. */ +export const i18nReady = ensureLocale(useLocaleStore.getState().locale); + +function followLocaleSetting() { + const { locale } = useLocaleStore.getState(); + if (i18n.language !== locale) i18n.changeLanguage(locale); + document.documentElement.lang = locale; +} + +useLocaleStore.subscribe((state) => { + if (loaded.has(state.locale)) followLocaleSetting(); + else void ensureLocale(state.locale).then(followLocaleSetting); +}); + +/** The language the UI strings are in; trails the locale setting while its strings load. */ +export function useUiLanguage(): string { + return (useTranslation().i18n ?? i18n).language; +} +document.documentElement.lang = useLocaleStore.getState().locale; + +/** A label that translates on every read, plus its English text for search. */ +export interface LazyLabel { + (): string; + en: () => string; +} + +/** For UI definitions that live outside components (command lists, + * registries): resolve the label at render, never at module load, so it + * follows the app language. */ +export function lazyT(key: string, options?: Record): LazyLabel { + return Object.assign(() => i18n.t(key, options), { + en: () => i18n.t(key, { ...options, lng: "en" }), + }); +} + +export default i18n; diff --git a/src/i18n/locales/pt-BR/_meta.json b/src/i18n/locales/pt-BR/_meta.json new file mode 100644 index 000000000..5fbc94c9c --- /dev/null +++ b/src/i18n/locales/pt-BR/_meta.json @@ -0,0 +1,6 @@ +{ + "_meta": { + "status": "native-speaker contribution (pt-BR); inherits machine-drafted pt baseline — pt-BR-specific overrides welcome", + "fallback": "pt" + } +} diff --git a/src/i18n/locales/pt-PT/_meta.json b/src/i18n/locales/pt-PT/_meta.json new file mode 100644 index 000000000..25968d2b0 --- /dev/null +++ b/src/i18n/locales/pt-PT/_meta.json @@ -0,0 +1,6 @@ +{ + "_meta": { + "status": "machine-generated from pt; native-speaker review welcome", + "fallback": "pt" + } +} diff --git a/src/i18n/locales/pt-PT/changelog.json b/src/i18n/locales/pt-PT/changelog.json new file mode 100644 index 000000000..a9ec2c051 --- /dev/null +++ b/src/i18n/locales/pt-PT/changelog.json @@ -0,0 +1,22 @@ +{ + "changelog": { + "title": "Novidades", + "autoDownload": "Download automático", + "quickLinks": { + "documentation": "Documentação" + }, + "loading": "A carregar changelog…", + "unavailable": "Changelog indisponível off-line. Reconecte para ver as novidades.", + "hidePreviousReleases": "Ocultar versões anteriores", + "previousReleases": "Versões anteriores ({{count}})", + "newBadge": "Novo", + "updateBanner": { + "checking": "A verificar atualizações…", + "downloading": "A transferir v{{version}}… {{progress}}%", + "ready": "v{{version}} está pronto para instalar", + "restartToUpdate": "Reiniciar para atualizar", + "available": "v{{version}} está disponível", + "download": "Baixar" + } + } +} diff --git a/src/i18n/locales/pt-PT/common.json b/src/i18n/locales/pt-PT/common.json new file mode 100644 index 000000000..3edcf447d --- /dev/null +++ b/src/i18n/locales/pt-PT/common.json @@ -0,0 +1,309 @@ +{ + "common": { + "action": { + "retry": "Tentar novamente", + "dismiss": "Descartar", + "cancel": "Cancelar", + "save": "Guardar", + "delete": "Eliminar", + "close": "Fechar", + "confirm": "Confirmar", + "edit": "Editar", + "create": "Criar", + "copy": "Copiar", + "cut": "Recortar", + "paste": "Colar", + "rename": "Renomear", + "remove": "Remover", + "add": "Adicionar", + "connect": "Conectar", + "disconnect": "Desconectar", + "duplicate": "Duplicar", + "moveTo": "Mover para", + "copyTo": "Copiar para", + "pin": "Fixar", + "unpin": "Desfixar", + "moreOptions": "Mais opções", + "closePanel": "Fechar painel" + }, + "entity": { + "host": "Host", + "hosts": "Hosts", + "vault": "Cofre", + "vaults": "Cofres", + "key": "Chave", + "keys": "Chaves", + "snippet": "Snippet", + "snippets": "Snippets", + "folder": "Pasta", + "session": "Sessão", + "sessions": "Sessões", + "rule": "Regra", + "rules": "Regras", + "tags": "Tags", + "personal": "Pessoal" + }, + "state": { + "loading": "A carregar…", + "saving": "A guardar…", + "none": "Nenhum", + "empty": "Ainda não há nada aqui", + "error": "Algo deu errado", + "noResults": "Sem resultados" + }, + "viewMode": { + "grid": "Grade", + "list": "Lista" + }, + "placeholder": { + "filter": "Filtrar…", + "search": "Pesquisar…" + }, + "toast": { + "proSubscriptionEnded": "Sua assinatura Pro terminou — a sincronização foi pausada.", + "managePlan": "Gerenciar plano →", + "undoFailed": "Falha ao desfazer: {{error}}", + "redoFailed": "Falha ao refazer: {{error}}", + "fileSaved": "Guardado em {{path}}", + "fileSaveFailed": "Não foi possível guardar o ficheiro: {{error}}", + "sessionRevoked": "Este dispositivo foi desconectado da sua conta Voltius. Entre novamente para continuar a sincronizar.", + "signInAgain": "Entrar" + }, + "error": { + "identityPickUnavailable": "Sua identidade para {{host}} não está disponível", + "failedToListIdentityPicks": "Não foi possível carregar suas opções de identidade ({{status}})", + "failedToSaveIdentityPick": "Não foi possível guardar sua escolha de identidade ({{status}})", + "notConnectedToServer": "Não conectado ao servidor", + "notAuthenticated": "Não autenticado", + "invalidSessionKey": "A chave da sessão deve ter 32 bytes", + "sessionExpired": "Sessão expirada — faça login novamente", + "connectNotAllowed": "Você não tem permissão para conectar a este host", + "vaultLocked": "Cofre está trancado", + "vaultUnreadable": "O cofre deste dispositivo não pode ser aberto com sua chave", + "identityUnproven": "Este dispositivo não pôde verificar suas chaves de conta. Saia e entre novamente com sua palavra-passe mestra.", + "rateLimited": "Limite de taxa atingido — tente novamente em {{seconds}}s", + "serverError": "Erro do servidor: {{status}}", + "connectionNotFound": "Conexão não encontrada", + "noConnectionsSelected": "Nenhuma conexão selecionada", + "serialPortConfigNotFound": "Configuração de porta serial não encontrada", + "connectionConfigNotFound": "Configuração de conexão não encontrada", + "failedToFetchAuditLogs": "Falha ao buscar registros de auditoria: {{status}}", + "failedToExportAuditLogs": "Falha ao exportar registros de auditoria: {{status}}", + "serverUnreachableTimeout": "Servidor inalcançável (tempo esgotado) — verifique sua conexão com a internet e a URL do servidor", + "networkError": "Erro de rede — {{message}}", + "emailAlreadyRegistered": "E-mail já registrado", + "registrationFailed": "Falha no registro: {{status}}", + "registrationDisabled": "O registro de novas contas está desativado neste servidor. Peça uma conta ao administrador.", + "accountNotFound": "Conta não encontrada", + "tooManyAttempts": "Muitas tentativas — aguarde um minuto e tente novamente", + "noAccountFoundCreateOne": "Nenhuma conta encontrada. Crie uma primeiro.", + "serverLoginFailed": "Falha no login do servidor", + "sessionRefreshFailed": "Falha na atualização da sessão", + "resendVerificationFailed": "Não foi possível reenviar o e-mail de verificação", + "noAccountFound": "Nenhuma conta encontrada", + "setMasterPasswordBeforeLinking": "Defina uma palavra-passe mestra antes de vincular à nuvem", + "masterPasswordRequired": "Palavra-passe mestre necessária", + "invalidEmailOrPassword": "E-mail ou palavra-passe inválidos", + "fetchAccountInfoFailed": "Falha ao buscar informações da conta", + "accountNotMigrated": "Conta não migrada ainda — faça login no aplicativo Tauri primeiro", + "currentPasswordIncorrect": "Palavra-passe atual incorreta", + "passwordChangeFailed": "Falha na alteração de palavra-passe: {{status}}", + "emailInUse": "E-mail já está em uso", + "incorrectPassword": "Palavra-passe incorreta", + "emailUpdateFailed": "Falha na atualização do e-mail: {{status}}", + "userNotFoundVoltiusAccount": "Utilizador não encontrado — ele deve ter uma conta Voltius", + "userNotFound": "Utilizador não encontrado", + "cannotAddYourself": "Não é possível adicionar a si mesmo", + "seatLimitReached": "Limite de vagas atingido", + "insufficientPermissionAssignRoles": "Permissão insuficiente para atribuir funções", + "cannotRemoveThisRole": "Não é possível remover esta função", + "roleNameExists": "Já existe uma função com este nome", + "cannotModifyBuiltinRoles": "Não é possível modificar funções internas", + "cannotDeleteBuiltinRoles": "Não é possível eliminar funções internas", + "noPermissionInviteMembers": "Você não tem permissão para convidar membros", + "teamInvitesDisabled": "O administrador deste servidor desativou novos convites para a equipe.", + "handleManaged": "Sua organização gerencia os identificadores neste servidor.", + "failedToCreateTeam": "Falha ao criar equipe: {{status}}", + "failedToRenameTeam": "Falha ao renomear equipe: {{status}}", + "failedToListTeams": "Falha ao listar equipes: {{status}}", + "failedToSaveLockPolicy": "Falha ao guardar a política de bloqueio: {{status}}", + "lockPolicyServerTooOld": "Atualize seu servidor Voltius para usar políticas de bloqueio.", + "failedToDeleteTeam": "Falha ao eliminar equipe: {{status}}", + "failedToListMembers": "Falha ao listar membros: {{status}}", + "failedToListVaultKeyHolders": "Falha ao listar detentores da chave do cofre: {{status}}", + "failedToCheckRotationStatus": "Falha ao verificar status de rotação: {{status}}", + "failedToRotateVaultKey": "Falha ao rotacionar a chave do cofre: {{status}}", + "failedToAddMember": "Falha ao adicionar membro: {{status}}", + "failedToRemoveMember": "Falha ao remover membro: {{status}}", + "failedToAssignRole": "Falha ao atribuir função: {{status}}", + "billingTransferNeedsPlan": "Eles precisam de seu próprio plano Teams ou Business, pelo menos tão alto quanto o desta equipe, com uma vaga para todos em suas equipes e nesta", + "billingTransferNeedsOwner": "Torne-os Proprietário primeiro", + "billingTransferForbidden": "Apenas o proprietário primário pode repassar isto", + "failedToTransferBilling": "Falha ao alterar o proprietário primário: {{status}}", + "failedToRemoveRole": "Falha ao remover função: {{status}}", + "insufficientPermissionSetMemberPermissions": "Você não tem permissão para alterar as permissões deste membro", + "insufficientPermissionNameMembers": "Você não tem permissão para nomear membros", + "invalidMemberName": "Os nomes podem ter até 64 caracteres e não podem conter caracteres de controle", + "failedToNameMember": "Não foi possível guardar o nome ({{status}})", + "failedToSetMemberPermissions": "Falha ao definir permissões do membro: {{status}}", + "failedToCreateRole": "Falha ao criar função: {{status}}", + "failedToUpdateRole": "Falha ao atualizar função: {{status}}", + "failedToDeleteRole": "Falha ao eliminar função: {{status}}", + "failedToUpdatePublicKey": "Falha ao atualizar a chave pública: {{status}}", + "failedToInviteMember": "Falha ao convidar membro: {{status}}", + "failedToRevokeInvitation": "Falha ao revogar convite: {{status}}", + "failedToAcceptInvitation": "Falha ao aceitar convite: {{status}}", + "failedToDeclineInvitation": "Falha ao recusar convite: {{status}}", + "failedToSavePreferences": "Falha ao guardar preferências", + "failedToDecline": "Falha ao recusar", + "failedToUninvite": "Falha ao remover pessoa", + "userNoLongerAvailable": "Esta pessoa não está mais disponível", + "failedToFetchPublicKey": "Falha ao buscar a chave pública: {{status}}", + "noPermissionTeamVaultOp": "Você não tem permissão para esta operação de cofre da equipe", + "teamVaultRequiresSubscription": "O cofre da equipe requer uma assinatura ativa do Teams ou Business", + "clientTooOldForTeamVault": "Esta versão do Voltius é muito antiga para guardar alterações neste cofre da equipe. Atualize o Voltius para continuar.", + "failedToListTeamObjects": "Falha ao listar objetos da equipe: {{status}}", + "failedToSaveTeamObject": "Falha ao guardar objeto da equipe: {{status}}", + "failedToDeleteTeamObject": "Falha ao eliminar objeto da equipe: {{status}}", + "failedToSaveRuleSet": "Não foi possível guardar as permissões ({{status}})", + "failedToLoadRuleSet": "Não foi possível carregar as permissões ({{status}})", + "tooManyRuleEntries": "Muitas regras: um objeto pode ter no máximo 256.", + "failedToListTeamObjectPrefs": "Falha ao listar preferências de objetos da equipe: {{status}}", + "failedToSaveTeamObjectPref": "Falha ao guardar preferência de objeto da equipe: {{status}}", + "failedToDeleteTeamObjectPref": "Falha ao eliminar preferência de objeto da equipe: {{status}}", + "failedToListTeamSecrets": "Falha ao listar segredos da equipe: {{status}}", + "failedToDeleteTeamSecret": "Falha ao eliminar segredo da equipe: {{status}}", + "secretsLeftInSourceVault": "Movido, mas suas credenciais não puderam ser removidas do cofre de origem e ainda são legíveis lá: {{error}}", + "secretsUploadPending": "Movido, mas suas credenciais não puderam ser enviadas ainda. Elas permanecem neste dispositivo e são tentadas na próxima vez que o cofre carregar: {{error}}", + "failedToSaveTeamSecret": "Falha ao guardar segredo da equipe: {{status}}", + "serverLacksTeamSecretType": "Este servidor Voltius é muito antigo para armazenar isto em um cofre da equipe. Peça ao seu administrador para atualizar o servidor, então salve novamente.", + "teamSecretRefused": "O cofre da equipe não aceitou isto, portanto não foi guardado: {{error}}", + "teamSecretUploadPending": "Não enviado ao cofre da equipe ainda. Ele é mantido até o Voltius ser fechado e tentado na próxima vez que o cofre carregar: {{error}}", + "failedToLoadServerCapabilities": "Não foi possível verificar o que o servidor suporta ({{status}})", + "keyFetchFailed": "Falha ao buscar a chave: {{error}}", + "failedToUploadVaultKeys": "Falha ao fazer upload das chaves do cofre: {{status}}", + "failedToDistributeVaultKey": "Falha ao distribuir a chave do cofre: {{status}}", + "failedToSaveTeamData": "Falha ao guardar dados da equipe: {{status}}", + "failedToCreateSession": "Falha ao criar sessão: {{status}}", + "failedToInvite": "Não foi possível convidar um colega de equipe ({{status}})", + "cannotInviteWithoutSessionKey": "Não é possível convidar um colega de equipe para esta sessão — ela não tem uma chave por utilizador.", + "failedToCreateInviteLinkSession": "Falha ao criar sessão de link de convite: {{status}}", + "failedToGetSessionKey": "Falha ao obter a chave da sessão: {{status}}", + "hostDidNotShareKey": "O host não compartilhou a chave da sessão. Peça para eles compartilharem novamente.", + "invalidJson": "JSON inválido", + "notVoltiusExportBundle": "Não é um pacote de exportação Voltius (esperado { version: 1, ... })", + "invalidEncryptedFile": "Ficheiro encriptado inválido", + "notEncryptedVoltiusBackup": "Não é um cópia de segurança encriptado do Voltius", + "unsupportedEncryptedBackup": "Cópia de segurança encriptado do Voltius não suportado", + "wrongPasswordOrCorrupted": "Palavra-passe incorreta ou ficheiro corrompido", + "wrongConfigPassphrase": "Esta frase de acesso não corresponde a esta configuração do SecureCRT.", + "notVoltiusUserDataFile": "Não é um ficheiro de dados do utilizador Voltius", + "unsupportedUserDataVersion": "Versão de dados do utilizador não suportada: {{version}}", + "failedToLoadLogs": "Falha ao carregar logs", + "couldNotDetectFormat": "Não foi possível detectar o formato. Suportado: Voltius JSON, CSV, MobaXterm.ini / .mxtsessions, ZOC HostDirectory.zhd, PuTTY .reg / ficheiros de sessão, exportação de sessão .ini / XML do SecureCRT, ou extração ao vivo do Termius.", + "noPuttySessions": "Nenhuma sessão guardada do PuTTY ou KiTTY foi encontrada para este utilizador.", + "csvMissingColumns": "O CSV deve ter uma coluna 'host'", + "termiusDumpInvalidJson": "O dump do Termius deve ser JSON válido", + "legacyTermiusUnsupported": "O formato de dump legado do Termius não é mais suportado; use a Extração Automática.", + "termiusExtractionFormat": "A extração do Termius deve retornar { version: 2, records: [...] }", + "failedToFetchSource": "Falha ao buscar a fonte: HTTP {{status}}", + "failedToMintInviteCode": "Falha ao criar código de convite: {{status}}", + "failedToRedeemInviteCode": "Falha ao usar código de convite: {{status}}", + "inviteCodeMalformed": "Este código não está no formato correto", + "inviteCodeNotFound": "Este código expirou ou está incorreto", + "inviteCodeTooManyAttempts": "Muitas tentativas — aguarde um momento e tente novamente", + "businessPlanRequired": "Isto precisa do plano Business da equipe.", + "twoFactorRequired": "Confirme com seu segundo fator: um código, uma chave de acesso ou um código de recuperação.", + "twoFactorInvalid": "Código errado. Tente o próximo que seu aplicativo mostrar.", + "twoFactorLocked": "Muitos códigos errados. Tente novamente em 15 minutos.", + "twoFactorUnavailable": "Este servidor não pode verificar códigos de autenticador agora. Use um código de recuperação.", + "twoFactorAlreadyEnabled": "A autenticação de dois fatores já está ativada.", + "twoFactorNotEnabled": "A autenticação de dois fatores não está ativada.", + "twoFactorExpired": "Esta entrada demorou demais. Comece novamente.", + "passkeyIncomplete": "A etapa da chave de acesso não foi concluída. Tente novamente.", + "passkeyLimit": "Esta conta já tem tantas chaves de acesso quanto pode conter." + }, + "clipboard": { + "cut_one": "{{count}} item recortado", + "cut_other": "{{count}} itens recortados", + "cut_many": "{{count}} itens recortados", + "copied_one": "{{count}} item copiado", + "copied_other": "{{count}} itens copiados", + "copied_many": "{{count}} itens copiados", + "toMove": "{{shortcut}} para mover", + "toPaste": "{{shortcut}} para colar", + "clear": "Limpar área de transferência", + "crossVaultMoveHeading": "Mover itens para", + "crossVaultCopyHeading": "Copiar itens para", + "crossVaultMoveDescription_one": "{{count} item sairá de seu cofre atual e se moverá para {{targetVaultName}}.", + "crossVaultMoveDescription_other": "{{count} itens sairão de seu cofre atual e se moverão para {{targetVaultName}}.", + "crossVaultMoveDescription_many": "{{count} itens sairão de seu cofre atual e se moverão para {{targetVaultName}}.", + "crossVaultCopyDescription_one": "{{count} item será copiado para {{targetVaultName}}.", + "crossVaultCopyDescription_other": "{{count} itens serão copiados para {{targetVaultName}}.", + "crossVaultCopyDescription_many": "{{count} itens serão copiados para {{targetVaultName}}.", + "cascadeMoved_one": "Seus {{names}} se movem com ele.", + "cascadeMoved_other": "Seus {{names}} se movem com ele.", + "cascadeMoved_many": "Seus {{names}} se movem com ele.", + "cascadeCopied_one": "{{names}} é copiado em vez de movido, porque objetos que ficam para trás ainda o usam.", + "cascadeCopied_other": "{{names}} são copiados em vez de movidos, porque objetos que ficam para trás ainda os usam.", + "cascadeCopied_many": "{{names}} são copiados em vez de movidos, porque objetos que ficam para trás ainda os usam.", + "cascadeAlsoCopied_one": "Seus {{names}} também são copiados.", + "cascadeAlsoCopied_other": "Seus {{names}} também são copiados.", + "cascadeAlsoCopied_many": "Seus {{names}} também são copiados.", + "pasteRootCrossVault": "Colar no nível superior não pode mover itens entre cofres enquanto vários cofres estão exibidos — selecione um único cofre, ou abra uma pasta no cofre de destino.", + "pasteFailed": "Falha ao colar: {{error}}", + "pasteBlocked": "Nada foi colado: você está sem {{permissions}} em um dos cofres envolvidos.", + "permissionsMissing": "você está sem {{permissions}} em um dos cofres envolvidos", + "pasteSkipped_one": "{{count} item não existe mais e foi ignorado.", + "pasteSkipped_other": "{{count} itens não existem mais e foram ignorados.", + "pasteSkipped_many": "{{count} itens não existem mais e foram ignorados.", + "pasteWouldDangle": "Nada foi colado: os itens referenciam {{kinds}} que ficariam em outro cofre e parariam de funcionar lá. Mova-os para o cofre de destino primeiro.", + "kind": { + "connection": "hosts", + "identity": "identidades", + "key": "chaves SSH", + "snippet": "snippets", + "port_forward": "regras de encaminhamento de porta" + } + }, + "contentCounts": { + "connections_one": "{{count}} conexão", + "connections_other": "{{count}} conexões", + "connections_many": "{{count}} conexões", + "identities_one": "{{count}} identidade", + "identities_other": "{{count}} identidades", + "identities_many": "{{count}} identidades", + "keys_one": "{{count}} chave", + "keys_other": "{{count}} chaves", + "keys_many": "{{count}} chaves", + "snippets_one": "{{count}} snippet", + "snippets_other": "{{count}} snippets", + "snippets_many": "{{count}} snippets", + "portForwardingRules_one": "{{count}} regra de encaminhamento de porta", + "portForwardingRules_other": "{{count}} regras de encaminhamento de porta", + "portForwardingRules_many": "{{count}} regras de encaminhamento de porta" + }, + "serialDevice": "Dispositivo Serial", + "localShellTitle": "Shell Local › {{shell}}", + "memberFallback": "Membro", + "dragItemFallback": "Item", + "relativeTime": { + "justNow": "agora mesmo", + "secondsAgo": "{{count}}s atrás", + "minutesAgo": "{{count}}m atrás", + "hoursAgo": "{{count}}h atrás", + "daysAgo": "{{count}}d atrás" + }, + "history": { + "movedItems_one": "Movido {{count}} item", + "movedItems_other": "Movidos {{count}} itens", + "movedItems_many": "Movidos {{count}} itens", + "pastedItems_one": "Colado {{count}} item", + "pastedItems_other": "Colados {{count}} itens", + "pastedItems_many": "Colados {{count}} itens", + "movedToFolder_one": "Movido {{count}} item para a pasta", + "movedToFolder_other": "Movidos {{count}} itens para a pasta", + "movedToFolder_many": "Movidos {{count}} itens para a pasta" + } + } +} diff --git a/src/i18n/locales/pt-PT/connections.json b/src/i18n/locales/pt-PT/connections.json new file mode 100644 index 000000000..d7b0233d4 --- /dev/null +++ b/src/i18n/locales/pt-PT/connections.json @@ -0,0 +1,239 @@ +{ + "connections": { + "common": { + "general": "Geral", + "labelField": "Rótulo", + "tags": "Tags", + "folder": "Pasta", + "port": "Porta", + "advanced": "Avançado", + "baudRate": "Taxa de Baud", + "dataBits": "Bits de Dados", + "stopBits": "Bits de Parada", + "parity": "Paridade", + "flowControl": "Controle de Fluxo", + "even": "Par", + "odd": "Ímpar", + "xonXoff": "XON/XOFF", + "rtsCts": "RTS/CTS", + "on": "Ligado", + "off": "Desligado", + "username": "Utilizador", + "password": "Password", + "privateKey": "Private Key", + "sshKey": "Chave SSH", + "manageInKeychain": "Gerenciar no Keychain", + "hostsChaining": "Encadeamento de Hosts", + "environmentVariables": "Variáveis de Ambiente", + "preCommandPlaceholder": "Comando pré-sessão", + "postCommandPlaceholder": "Comando pós-sessão", + "sessionCommands": "Comandos da sessão", + "sessionCommandsHint": "Executar na sessão após ela abrir, e quando a aba fechar.", + "hostCommand": { + "useSnippet": "Usar um snippet", + "useInline": "Usar comando em linha", + "missingSnippet": "Snippet não encontrado", + "askEachTime": "Pedir variáveis cada vez", + "pickerTitle": "Escolher um snippet", + "searchPlaceholder": "Pesquisar snippets…" + } + }, + "form": { + "titleEdit": "Editar Host", + "titleNew": "Novo Host", + "changeIcon": "Alterar ícone", + "changeIconWithLabel": "Alterar ícone ({{label}})", + "changeIconAriaLabel": "Alterar ícone da conexão", + "namePlaceholder": "Meu Servidor (opcional)", + "sectionConnection": "Conexão", + "sectionCredentials": "Credenciais", + "sectionIdentity": "Identidade", + "sectionNotes": "Notas", + "protocol": "Protocolo", + "protocolSsh": "SSH / SFTP", + "protocolFtp": "FTP", + "protocolWebdav": "WebDAV", + "webdavUrl": "URL do Servidor", + "webdavUrlPlaceholder": "https://cloud.example.com/remote.php/dav/files/me/", + "webdavUrlInvalid": "Insira um endereço http:// ou https://, sem utilizador, palavra-passe, ? ou #", + "webdavPlaintextWarning": "Não encriptado — sua palavra-passe é enviada em texto claro. Use https:// se o servidor suportar.", + "hostIp": "Host / IP", + "hostPlaceholder": "192.168.1.1", + "legacyAlgorithms": "Algoritmos Legados", + "legacyAlgorithmsTooltip": "Permitir algoritmos legados fracos (diffie-hellman-group1-sha1, 3des-cbc, hmac-sha1, …) para dispositivos antigos, como Cisco IOS legado. Algoritmos fortes ainda são preferidos. Habilite apenas para hosts que exigirem.", + "agentForwarding": "Encaminhamento de Agente", + "serialAutoReconnect": "Reconectar automaticamente", + "serialAutoReconnectTooltip": "Reabrir a porta automaticamente após uma queda. Desligue isso para placas que você reflasha: o loop de tentativas pegaria a porta de volta enquanto a ferramenta de gravação precisa dela.", + "shellIntegration": "Integração de Shell", + "keepalive": "Keepalive", + "inheritKeepalive": "Herdar ({{label}})", + "persistentSession": "Sessão persistente", + "inheritPersist": "Herdar ({{state}})", + "inheritShellIntegration": "Herdar ({{state}})", + "ftpsToggle": "FTPS explícito (AUTH TLS)", + "anonymousLogin": "Login anônimo", + "keychainIdentity": "Identidade do Keychain", + "passphrase": "Frase de acesso", + "optional": "(opcional)", + "keyPassphrasePlaceholder": "Frase de acesso da chave", + "proxy": { + "label": "Proxy", + "inherit": "Herdar ({{label}})", + "modes": { + "direct": "Direto", + "system": "Sistema", + "socks5": "SOCKS5", + "http": "HTTP", + "https": "HTTPS" + }, + "host": "Host do proxy", + "port": "Porta do proxy", + "hostMissing": "O proxy está definido como {{kind}} mas não tem host", + "portInvalid": "A porta deve estar entre 1 e 65535", + "username": "Utilizador do proxy", + "password": "Proxy password", + "passwordSaved": "••• guardado" + }, + "connectAsHost": "Credencial do host", + "sharedWithTeam": "compartilhado com a equipe", + "youConnectAs": "Você se conecta como", + "change": "Alterar", + "connectAsYours": "{{username}} · seu, apenas seu", + "connectAsTeam": "{{username}} · identidade da equipe", + "connectAsAsk": "Você será perguntado ao conectar", + "connectAsUnavailable": "Sua identidade escolhida não está disponível" + }, + "distroIconPicker": { + "title": "Ícone", + "searchPlaceholder": "Pesquisar ícone", + "autoDetectOs": "Detectar SO automaticamente" + }, + "encodingSelector": { + "title": "Codificação", + "utf8Default": "UTF-8 (padrão)", + "groups": { + "unicode": "Unicode", + "westernEuropean": "Europa Ocidental", + "centralEuropean": "Europa Central", + "cyrillic": "Cirílico", + "greek": "Grego", + "hebrew": "Hebraico", + "arabic": "Árabe", + "turkish": "Turco", + "baltic": "Báltico", + "vietnamese": "Vietnamita", + "chineseSimplified": "Chinês Simplificado", + "chineseTraditional": "Chinês Tradicional", + "japanese": "Japonês", + "korean": "Coreano" + }, + "options": { + "utf-16le": "UTF-16 LE", + "utf-16be": "UTF-16 BE", + "iso-8859-1": "ISO-8859-1 (Latin-1)", + "iso-8859-15": "ISO-8859-15 (Latin-9)", + "windows-1252": "Windows-1252", + "iso-8859-2": "ISO-8859-2 (Latin-2)", + "windows-1250": "Windows-1250", + "iso-8859-5": "ISO-8859-5", + "koi8-r": "KOI8-R", + "koi8-u": "KOI8-U", + "windows-1251": "Windows-1251", + "ibm866": "IBM866", + "iso-8859-7": "ISO-8859-7", + "windows-1253": "Windows-1253", + "iso-8859-8": "ISO-8859-8", + "windows-1255": "Windows-1255", + "iso-8859-6": "ISO-8859-6", + "windows-1256": "Windows-1256", + "iso-8859-9": "ISO-8859-9", + "windows-1254": "Windows-1254", + "iso-8859-13": "ISO-8859-13", + "windows-1257": "Windows-1257", + "windows-1258": "Windows-1258", + "gbk": "GBK / GB2312", + "gb18030": "GB18030", + "big5": "Big5", + "shift-jis": "Shift-JIS", + "euc-jp": "EUC-JP", + "euc-kr": "EUC-KR" + } + }, + "envVarsPanel": { + "emptyTitle": "Nenhuma variável de ambiente", + "emptySubtitle": "As variáveis serão definidas ao conectar a este host", + "hint": "Variáveis definidas no ambiente da sessão remota", + "keyPlaceholder": "CHAVE", + "valuePlaceholder": "valor", + "removeAriaLabel": "Remover variável", + "addButton": "Adicionar Variável" + }, + "serialConfigOverlay": { + "title": "Conexão Serial", + "subtitle": "Configure a porta antes de conectar" + }, + "identitySelector": { + "title": "Identidade", + "noIdentityInline": "Sem identidade — credenciais em linha", + "badgeKey": "chave", + "badgePwd": "palavra-passe", + "sharedGroup": "cofre {{vault}} · compartilhado", + "ownGroup": "Suas identidades · apenas você" + }, + "jumpHostsPanel": { + "dragToReorderAriaLabel": "Arraste para reordenar", + "emptyTitle": "Nenhum host de salto configurado", + "emptySubtitle": "Adicione hosts para conectar antes do destino final", + "hint": "Segure e arraste para reordenar · Conectado em ordem antes de alcançar o host final", + "removeAriaLabel": "Remover host de salto", + "addButton": "Adicionar Host de Salto" + }, + "keySelector": { + "inlinePrivateKey": "Chave privada em linha", + "unnamedKey": "Chave Sem Nome" + }, + "serialForm": { + "titleEdit": "Editar Host Serial", + "titleNew": "Novo Host Serial", + "duplicate": "Duplicar", + "namePlaceholder": "Meu Dispositivo (opcional)", + "sectionSerialPort": "Porta Serial", + "customBaudButton": "Personalizado", + "presetBaudButton": "Predefinido" + }, + "vaultIdentity": { + "title": "Sua identidade para {{vault}}", + "subtitle": "Apenas você. Colegas de equipe nunca veem.", + "useOn": "Usar em hosts {{vault}} sem credencial compartilhada", + "none": "Sem padrão", + "noneHint": "Hosts sem uma credencial pedem a você, como hoje", + "footnote": "Hosts com uma credencial compartilhada a mantêm. Substitua um host com Conectar como." + }, + "knock": { + "title": "Port Knocking", + "enable": "Bater antes de conectar", + "hint": "Enviado deste dispositivo, através do proxy deste host, antes de toda conexão SSH, SFTP e de encaminhamento de porta.", + "viaBastion": "Este host se conecta através de {{name}}, então o Voltius bate em {{name} usando as configurações de batida daquele host.", + "sequence": "Sequência", + "reorderHint": "Segure e arraste para reordenar · Enviado nesta ordem", + "port": "Porta", + "dragToReorder": "Arrastar para reordenar", + "remove": "Remover porta", + "addPort": "Adicionar porta", + "timing": "Temporização", + "delay": "Atraso entre batidas", + "settle": "Aguardar após a última batida", + "window": "Janela de firewall", + "windowHint": "Por quanto tempo o firewall mantém o SSH aberto após uma batida. O ponto de acessibilidade apenas sondará dentro desta janela, então o cartão do host nunca bate sozinho. Deixe vazio se desconhecido.", + "issue": { + "empty": "Adicione pelo menos uma porta.", + "port": "Portas devem estar entre 1 e 65535.", + "udp-proxy": "Batidas UDP não podem passar pelo proxy deste host. Use etapas TCP ou uma conexão direta.", + "udp-system": "Falha nas batidas UDP se o proxy do sistema estiver em uso." + }, + "serverTooOld": "Este servidor Voltius é muito antigo para armazenar sequências de batida para hosts do cofre da equipe. Peça ao seu administrador para atualizar o servidor para usar port knocking aqui.", + "sequenceUnavailable": "A sequência de batida para este host não está disponível neste dispositivo.", + "sequenceInvalid": "A sequência de batida deste host é inválida. Corrija-a nas configurações de Port Knocking do host." + } + } +} diff --git a/src/i18n/locales/pt-PT/errors.json b/src/i18n/locales/pt-PT/errors.json new file mode 100644 index 000000000..9b222cc3d --- /dev/null +++ b/src/i18n/locales/pt-PT/errors.json @@ -0,0 +1,39 @@ +{ + "errors": { + "permission-denied": "Permissão negada", + "not-found": "Ficheiro ou diretório não encontrado", + "already-exists": "Já existe um ficheiro ou pasta com esse nome", + "storage-full": "Espaço em disco ou cota insuficiente", + "read-only-filesystem": "O sistema de ficheiros é somente leitura", + "connection-refused": "O host recusou a conexão — verifique o endereço e a porta, e se o serviço está em execução", + "host-unreachable": "O host está inalcançável — verifique o endereço e sua conexão de rede", + "timed-out": "Tempo da operação esgotado", + "connection-lost": "A conexão foi perdida", + "connection-lost-resumable": "A conexão foi perdida — tente a transferência novamente para continuar de onde parou", + "transfer-verify-failed": "A cópia não correspondeu ao original, então foi descartada — tente copiar novamente", + "transfer-source-changed": "O ficheiro continuou mudando enquanto era copiado — tente novamente depois que terminar de ser gravado", + "port-in-use": "A porta {{port}} e as portas seguintes já estão em uso ({{attempts}} tentativas)", + "bind-address-unavailable": "Este computador não tem o endereço {{address}}", + "remote-forward-denied": "O servidor recusou o encaminhamento remoto — a porta pode já estar em uso lá, ou o encaminhamento não é permitido", + "ssh-key-rejected": "Autenticação por chave pública rejeitada", + "ssh-password-rejected": "Autenticação por palavra-passe rejeitada — verifique o utilizador e a palavra-passe", + "ssh-password-expired": "O servidor exige uma nova palavra-passe — faça login uma vez a partir de um terminal e altere-a lá", + "ssh-prompt-unanswerable": "O servidor perguntou \"{{prompt}}\", que não pode ser respondido automaticamente", + "ssh-no-usable-auth-method": "Nenhum método de autenticação utilizável — o servidor aceita apenas: {{methods}}", + "ssh-auth-timeout": "Tempo de autenticação esgotado após {{seconds}}s — o servidor aceitou a conexão mas nunca respondeu. Alguns servidores SSH antigos travam aqui; tente a opção \"Algoritmos Legados\" do host, ou outro método de autenticação.", + "login-rejected": "O servidor rejeitou o utilizador ou a palavra-passe", + "resource-locked": "O ficheiro está bloqueado no servidor — outra pessoa pode tê-lo aberto", + "vault-locked": "$t(common.error.vaultLocked)", + "vault-unreadable": "$t(common.error.vaultUnreadable)", + "vault-sign-in-required": "Cofres de equipe exigem uma conexão ativa com o servidor. Entre para continuar.", + "vault-read-only": "Você não tem acesso de gravação a este cofre. Peça a um gerente de cofre um papel que possa fazer alterações.", + "vault-role-read-only": "Você não tem acesso de gravação a este cofre (seu papel: {{role}}). Apenas proprietários, gerentes e editores podem fazer alterações.", + "vault-permissions-unavailable": "Não foi possível verificar permissões do cofre porque o keychain está indisponível. Tente novamente.", + "vault-permissions-corrupted": "Os dados de permissão do cofre estão corrompidos. Entre novamente para atualizar o acesso.", + "knock-udp-via-proxy": "Batidas UDP não podem passar por um proxy. Use etapas TCP ou uma conexão direta para este host." + }, + "errorAt": { + "proxy": "Proxy {{proxy}}: {{cause}}", + "jumpHost": "Host de salto {{jumpHost}}: {{cause}}" + } +} diff --git a/src/i18n/locales/pt-PT/fileTransfer.json b/src/i18n/locales/pt-PT/fileTransfer.json new file mode 100644 index 000000000..90a0056d6 --- /dev/null +++ b/src/i18n/locales/pt-PT/fileTransfer.json @@ -0,0 +1,226 @@ +{ + "fileTransfer": { + "common": { + "localMachine": "Máquina Local", + "remoteFallback": "remoto", + "itemsCount_one": "{{count}} item", + "itemsCount_other": "{{count}} itens", + "itemsCount_many": "{{count}} itens" + }, + "acceleratedBadge": { + "title": "Aceleração Tar", + "description": "Agrupado em um único ficheiro e extraído do outro lado — muito menos viagens de ida e volta do que ficheiro por ficheiro.", + "howItWorks": "Como funciona" + }, + "perFileBadge": { + "reason": "Ficheiro por ficheiro: este host não pode fazer streaming tar" + }, + "conflict": { + "title": "Ficheiro já existe", + "conflictOf": "Conflito {{number}} de {{total}}", + "description": "Um item com este nome já existe no destino. O que você gostaria de fazer?", + "skip": "Pular", + "skipAll": "Pular Todos", + "overwrite": "Sobrescrever", + "overwriteAll": "Sobrescrever Todos" + }, + "pane": { + "toolbar": { + "parentDirectory": "Pasta pai", + "homeDirectory": "Pasta inicial", + "browse": "Procurar…", + "selectFolder": "Selecionar pasta", + "newFolder": "Nova pasta", + "newFile": "Novo ficheiro", + "refresh": "Atualizar" + }, + "dropToTransfer": "Solte para transferir", + "placeholder": { + "folderName": "Nome da pasta", + "fileName": "Nome do ficheiro" + }, + "emptyDirectory": "Diretório vazio", + "refreshFailed": "Não foi possível atualizar: {{reason}}", + "selection": { + "selected": "{{count}} selecionado", + "clear": "Limpar" + }, + "confirmDelete": { + "title": "Confirmar exclusão", + "messageSingle": "Eliminar \"{{name}}\"?", + "messageMulti": "Eliminar {{count}} itens?" + }, + "menu": { + "download_one": "Baixar", + "download_other": "Baixar {{count}} itens", + "download_many": "Baixar {{count}} itens", + "copyToTarget_one": "Copiar para o destino", + "copyToTarget_other": "Copiar {{count}} itens para o destino", + "copyToTarget_many": "Copiar {{count}} itens para o destino", + "moveToTarget_one": "Mover para o destino", + "moveToTarget_other": "Mover {{count}} itens para o destino", + "moveToTarget_many": "Mover {{count}} itens para o destino", + "delete_one": "Eliminar", + "delete_other": "Eliminar {{count}} itens", + "delete_many": "Eliminar {{count}} itens", + "copyPath_one": "Copiar caminho", + "copyPath_other": "Copiar {{count}} caminhos", + "copyPath_many": "Copiar {{count}} caminhos", + "permissions": "Permissões…", + "compress": "Compactar para .tar.gz", + "extractHere": "Extrair aqui", + "openInTerminal": "Abrir no terminal", + "uploadFiles": "Fazer upload de ficheiros", + "selectAll": "Selecionar Tudo", + "deselect": "Deselecionar", + "disconnect": "Desconectar", + "hideHiddenFiles": "Ocultar ficheiros ocultos", + "showHiddenFiles": "Mostrar ficheiros ocultos", + "sizeColumn": "Coluna de tamanho", + "dateColumn": "Coluna de data", + "permissionsColumn": "Coluna de permissões" + }, + "columns": { + "name": "Nome", + "size": "Tamanho", + "modified": "Modificado", + "permissions": "Permissões" + } + }, + "permissions": { + "items_one": "{{count}} item", + "items_other": "{{count}} itens", + "items_many": "{{count}} itens", + "bit": "{{who}}: {{what}}", + "read": "Ler", + "write": "Gravar", + "execute": "Executar", + "owner": "Proprietário", + "group": "Grupo", + "others": "Outros", + "octal": "Modo octal", + "uid": "uid {{id}}", + "gid": "gid {{id}}", + "mixed": "misto", + "noShell": "Alterar o proprietário ou o conteúdo de uma pasta precisa de um shell POSIX no host.", + "recurse": "Recursivo", + "scopeAll": "Todos", + "scopeFiles": "Ficheiros", + "scopeDirs": "Pastas", + "apply": "Aplicar", + "applyItems_one": "Aplicar a {{count}}", + "applyItems_other": "Aplicar a {{count}}", + "applyItems_many": "Aplicar a {{count}}" + }, + "side": { + "chooseHost": "Escolher host…", + "back": "Voltar", + "forward": "Avançar", + "filterPlaceholder": "Filtrar…", + "uploadHere": "Fazer upload de ficheiros aqui", + "selectFilesToDownload": "Selecionar ficheiros para baixar", + "download_one": "Baixar \"{{name}}\"", + "download_other": "Baixar {{count}} itens", + "download_many": "Baixar {{count}} itens", + "viewOptions": "Opções de exibição", + "moreOptions": "Mais opções", + "tryAgain": "Tentar novamente", + "sparkline": { + "min": "mín {{value}}ms", + "avg": "méd {{value}}ms", + "max": "máx {{value}}ms" + } + }, + "page": { + "transferLeftToRight_one": "Transferir \"{{name}}\" →", + "transferLeftToRight_other": "Transferir {{count}} itens →", + "transferLeftToRight_many": "Transferir {{count}} itens →", + "transferRightToLeft_one": "Transferir \"{{name}}\" ←", + "transferRightToLeft_other": "Transferir {{count}} itens ←", + "transferRightToLeft_many": "Transferir {{count}} itens ←", + "selectFileLeft": "Selecione um ficheiro à esquerda", + "selectFileRight": "Selecione um ficheiro à direita", + "compareTitle": "Comparar \"{{leftName}}\" ↔ \"{{rightName}}\"", + "compareHint": "Selecione um ficheiro de cada lado para comparar", + "selectFilesToUpload": "Selecionar ficheiros para enviar", + "downloadToFolder": "Baixar para a pasta", + "connectionLost": "Conexão perdida", + "moveSourceNotDeleted": "Copiado, mas não foi possível remover o original de {{names}}: {{error}}" + }, + "queue": { + "title": "Transferências", + "transferCount_one": "{{count}} transferência", + "transferCount_other": "{{count}} transferências", + "transferCount_many": "{{count}} transferências", + "combinedThroughput": "Taxa combinada", + "cancelAll": "Cancelar todas as transferências", + "clearFinished": "Limpar transferências concluídas", + "cancelTransfer": "Cancelar transferência", + "retryTransfer": "Tentar transferência novamente", + "waiting": "A aguardar conexão…", + "resumedAt": "Retomado em {{size}}", + "resumedTooltip": "Retomado de onde a transferência interrompida parou", + "skipped_one": "Ignorado {{count}} nome que este sistema não pode armazenar:", + "skipped_other": "Ignorados {{count}} nomes que este sistema não pode armazenar:", + "skipped_many": "Ignorados {{count}} nomes que este sistema não pode armazenar:", + "mcpTooltip": "Iniciado por {{client}}", + "mcpTooltipUnknown": "Iniciado por um cliente MCP", + "status": { + "done": "Concluído", + "error": "Erro", + "cancelled": "Cancelado" + }, + "transferCountActive_one": "{{transfers}} · {{count}} ativo", + "transferCountActive_other": "{{transfers}} · {{count}} ativos", + "transferCountActive_many": "{{transfers}} · {{count}} ativos" + }, + "editor": { + "common": { + "saveCtrlS": "Guardar (Ctrl+S)", + "saveFailed": "Falha ao guardar", + "retrySave": "Tentar guardar novamente", + "retry": "Tentar novamente", + "dismiss": "Descartar" + }, + "diff": { + "loadError": "Falha ao carregar um ou ambos os ficheiros para diff.", + "loading": "A carregar diff…", + "previousChange": "Alteração anterior", + "nextChange": "Próxima alteração", + "saveErrorLine": "{{label}}: {{msg}}", + "applyToRight": "Aplicar à direita (→)", + "applyToLeft": "Aplicar à esquerda (←)" + }, + "tab": { + "autoSave": "Salvamento automático", + "saveFailedReason": "Falha ao guardar: {{error}}", + "error": { + "default": "Falha ao abrir o ficheiro.", + "tooLarge": "Ficheiro muito grande ({{size}} bytes, limite {{limit}}). Baixe-o em vez disso.", + "binary": "Ficheiro binário — não é possível editar. Baixe-o em vez disso." + } + }, + "image": { + "fit": "Ajustar", + "toggleFit": "Ajustar à aba ou mostrar tamanho real (0 / 1)", + "zoomIn": "Ampliar (+)", + "zoomOut": "Reduzir (−)", + "copy": "Copiar imagem", + "copied": "Imagem copiada para a área de transferência", + "copyFailed": "Não foi possível copiar a imagem: {{error}}", + "download": "Baixar", + "tooLarge": "Esta imagem tem {{size}}, acima do limite de pré-visualização {{limit}}.", + "previewAnyway": "Pré-visualizar mesmo assim" + }, + "tabStrip": { + "filesTab": "Ficheiros", + "pendingNameFallback": "este ficheiro", + "pendingNameDiffFallback": "este diff", + "discardTitle": "Descartar alterações não guardadas?", + "discardMessage": "\"{{name}}\" tem alterações não guardadas. Fechar esta aba as descartará.", + "discard": "Descartar", + "diffTitle": "diff: {{name}}" + } + } + } +} diff --git a/src/i18n/locales/pt-PT/folders.json b/src/i18n/locales/pt-PT/folders.json new file mode 100644 index 000000000..3eeded0e4 --- /dev/null +++ b/src/i18n/locales/pt-PT/folders.json @@ -0,0 +1,36 @@ +{ + "folders": { + "card": { + "pin": "Fixar", + "unpin": "Desfixar", + "openFolder": "Abrir pasta", + "cloudSyncDisabled": "Sincronização em nuvem desativada", + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "exportFolder": "Exportar pasta", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableCloudSync": "Ativar sincronização em nuvem", + "deleteFolder": "Eliminar pasta", + "itemCount_one": "{{count}} item", + "itemCount_other": "{{count}} itens", + "itemCount_many": "{{count}} itens" + }, + "editPanel": { + "title": "Editar Pasta", + "general": "Geral", + "nameLabel": "Nome", + "parentLabel": "Pasta pai" + }, + "appearance": { + "title": "Aparência da pasta", + "change": "Alterar ícone e cor", + "color": "Cor", + "icon": "Ícone", + "clear": "Limpar" + } + } +} diff --git a/src/i18n/locales/pt-PT/hosts.json b/src/i18n/locales/pt-PT/hosts.json new file mode 100644 index 000000000..76bc9f7a4 --- /dev/null +++ b/src/i18n/locales/pt-PT/hosts.json @@ -0,0 +1,176 @@ +{ + "hosts": { + "toolbar": { + "filterPlaceholder": "Filtrar hosts…", + "openSerialConsole": "Abrir console serial", + "serial": "Serial", + "terminal": "Terminal", + "importExport": "Importar/Exportar", + "import": "Importar…", + "export": "Exportar…", + "importFrom": "Importar de", + "newHost": "Novo Host", + "newSerialHost": "Novo Host Serial", + "newFolder": "Nova Pasta" + }, + "card": { + "pin": "Fixar", + "unpin": "Desfixar", + "pinned": "Fixado", + "pinnedByTeam": "Fixado por {{name}} para a equipe", + "pinnedByTeamAndPersonal": "Fixado por {{name}} para a equipe · você também fixou isto", + "hiddenPinnedByTeam": "Oculto da sua visualização · fixado por {{name}} para a equipe", + "teamMemberFallback": "um membro da equipe", + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "openInSftp": "Abrir no SFTP", + "copyHostnameIp": "Copiar Hostname/IP", + "copiedHost": "Copiado {{host}}", + "executeSnippet": "Executar Snippet", + "cloudSyncDisabled": "Sincronização em nuvem desativada", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableReachability": "Ativar verificação de acessibilidade", + "disableReachability": "Desativar verificação de acessibilidade", + "connectTitle": "Conectar (ou clique duplo)", + "openFilesTitle": "Abrir ficheiros (ou clique duplo)", + "inUseBy": "Em uso por {{name}}", + "inUseByOverflow_one": "Em uso por {{name}} + {{count}} outro", + "inUseByOverflow_other": "Em uso por {{name}} + {{count}} outros", + "inUseByOverflow_many": "Em uso por {{name}} + {{count}} outros", + "filesSuffix": "ficheiros", + "knockProtected": "Protegido por batida de porta. Sondado apenas após o Voltius bater.", + "knockWindowOpen": "Janela de batida aberta", + "knockProtectedShort": "protegido-por-batida" + }, + "page": { + "all": "Todos", + "folders": "Pastas", + "new": "Novo", + "pinned": "Fixados", + "folderEmpty": "Esta pasta está vazia", + "addHost": "Adicionar Host", + "noSearchResults": "Nenhum host corresponde a \"{{search}}\"", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "emptyState": { + "title": "Nenhum host ainda", + "subtitle": "Adicione seu primeiro host SSH para começar" + }, + "draft": { + "unsaved": "Não guardado" + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá os seguintes itens para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará os seguintes itens para {{targetVaultName}}:" + }, + "bulk": { + "executeSnippetOn_one": "Executar Snippet em {{count}} host", + "executeSnippetOn_other": "Executar Snippet em {{count}} hosts", + "executeSnippetOn_many": "Executar Snippet em {{count}} hosts", + "connectHosts": "Conectar {{count}} hosts", + "duplicateHosts": "Duplicar {{count}} hosts", + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_other": "Mover {{count}} itens para", + "moveItemsTo_many": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização em nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização em nuvem ({{count}})", + "enableReachability": "Ativar verificação de acessibilidade ({{count}})", + "disableReachability": "Desativar verificação de acessibilidade ({{count}})", + "exportHosts": "Exportar {{count}} hosts", + "deleteItems_one": "Eliminar {{count}} item", + "deleteItems_other": "Eliminar {{count}} itens", + "deleteItems_many": "Eliminar {{count}} itens" + }, + "confirmDelete": { + "title_one": "Eliminar {{count}} item", + "title_other": "Eliminar {{count}} itens", + "title_many": "Eliminar {{count}} itens", + "message_one": "Tem certeza de que deseja eliminar {{count}} item? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja eliminar {{count}} itens? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja eliminar {{count}} itens? Isto não pode ser desfeito.", + "folderCascade_one": "{{count}} host arquivado nas pastas selecionadas também será eliminado.", + "folderCascade_other": "{{count}} hosts arquivados nas pastas selecionadas também serão eliminados.", + "folderCascade_many": "{{count}} hosts arquivados nas pastas selecionadas também serão eliminados." + }, + "confirmDeleteFolder": { + "title": "Eliminar pasta", + "message_one": "Isto eliminará a pasta, suas subpastas e o {{count}} host dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto eliminará a pasta, suas subpastas e os {{count}} hosts dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto eliminará a pasta, suas subpastas e os {{count}} hosts dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto eliminará a pasta e tudo dentro dela. Isto não pode ser desfeito." + } + }, + "remoteSessions": { + "title": "Ao vivo em outros dispositivos", + "kill": "Encerrar sessão", + "join": "Participar da sessão", + "killing": "A encerrar sessão…", + "undo": "Desfazer", + "killFailed": "Não foi possível encerrar remotamente — abra a sessão para encerrá-la", + "dismiss": "Descartar", + "deviceActive": "{{device}} · ativo {{age}}", + "unknownDevice": "Dispositivo desconhecido" + }, + "teamSessions": { + "title": "Sessões da Equipe", + "joinByCode": "Participar por código", + "emptyHint": "Terminais que seus colegas compartilham aparecem aqui. Tem um código de convite? Cole-o na pesquisa para participar.", + "live": "AO VIVO", + "pasteInviteCode": "Cole um link ou código de convite para participar de uma sessão privada:", + "inviteCodePlaceholder": "voltius://join?… ou sessionId:token", + "join": "Participar", + "resume": "Retomar", + "invalidCodeFormat": "Convite inválido — cole o link ou código que o host compartilhou com você", + "failedToJoinSession": "Falha ao participar da sessão", + "sharedTerminalFallback": "Terminal Compartilhado" + }, + "snippetPicker": { + "title": "Executar Snippet", + "goToSnippets": "Ir para Snippets", + "filterPlaceholder": "Filtrar snippets…", + "newSnippetTitle": "Novo snippet", + "new": "Novo", + "noSnippetsYet": "Nenhum snippet ainda", + "createSnippet": "Criar snippet", + "noSnippetsMatch": "Nenhum snippet corresponde", + "recent": "Recentes", + "allSnippets": "Todos os Snippets", + "hostsSelected_one": "{{count}} host selecionado", + "hostsSelected_other": "{{count}} hosts selecionados", + "hostsSelected_many": "{{count}} hosts selecionados", + "insert": "Inserir", + "execute": "Executar" + }, + "hostCommand": { + "labelPre": "{{host}} — Pré-comando", + "labelPost": "{{host}} — Pós-comando", + "failed": "Falha no comando do host para {{host}}: {{error}}", + "missingSnippet": "Snippet do comando do host está faltando para {{host}}", + "postPromptTimedOut": "Pós-comando para {{host}} foi ignorado: sem resposta dentro de 60s" + }, + "connectAs": { + "title": "Conectar como", + "yours": "seu", + "hostDefault": "padrão do host", + "vaultDefault": "Minha identidade para {{vault}}…", + "clearPick": "Limpar minha escolha" + }, + "managed": { + "badge": "ssh config", + "tooltip": "Gerenciado por ~/.ssh/config · alias {{alias}}", + "bannerTitle": "Gerenciado por ~/.ssh/config", + "bannerBodyBefore": "Alias ", + "bannerBodyAfter": ". Campos bloqueados seguem o ficheiro.", + "detach": "Desvincular", + "detachMenu": "Desvincular do ~/.ssh/config" + } + } +} diff --git a/src/i18n/locales/pt-PT/importExport.json b/src/i18n/locales/pt-PT/importExport.json new file mode 100644 index 000000000..546ba469c --- /dev/null +++ b/src/i18n/locales/pt-PT/importExport.json @@ -0,0 +1,235 @@ +{ + "importExport": { + "modal": { + "title": "Importar / Exportar", + "sectionUserData": "Dados do Utilizador", + "tabExport": "Exportar", + "tabImport": "Importar" + }, + "include": "Incluir", + "copied": "Copiado!", + "downloadExt": "Baixar .{{ext}}", + "passwordPlaceholder": "Palavra-passe", + "export": { + "format": "Formato", + "formatCsvDescription": "Apenas conexões — amigável para planilha", + "formatJsonDescription": "Dados completos incluindo conteúdo de chave", + "encryptBackup": "Criptografar cópia de segurança", + "plaintextSecretsWarning": "Esta exportação contém palavras-passe, chaves ou notas de host em texto simples. Mantenha a criptografia ativada, a menos que você deliberadamente precise de um ficheiro não encriptado.", + "snippetRefMissing": "“{{name}}” executa outro snippet ({{target}}) que não faz parte desta exportação. Inclua-o na seleção, ou remova essa etapa.", + "exportFailed": "Não foi possível exportar: {{error}}", + "confirmPasswordPlaceholder": "Confirmar palavra-passe", + "passwordsDontMatch": "As palavras-passe não coincidem", + "building": "A criar…", + "nothingToExport": "Nada para exportar", + "downloadEncrypted": "Baixar encriptado", + "hidePreview": "Ocultar pré-visualização", + "showPreview": "Mostrar pré-visualização", + "selectedItem_one": "{{count}} item selecionado", + "selectedItem_other": "{{count}} itens selecionados", + "selectedItem_many": "{{count}} itens selecionados", + "autoInclude": { + "connections_one": "{{count}} conexão", + "connections_other": "{{count}} conexões", + "connections_many": "{{count}} conexões", + "snippets_one": "{{count}} snippet", + "snippets_other": "{{count}} snippets", + "snippets_many": "{{count}} snippets" + }, + "autoIncludeHint": "Também incluído: usado pelos itens exportados, para que continuem funcionando após a importação", + "relatedCredentials": "Incluir credenciais vinculadas", + "relatedCredentialsHint": "As identidades e chaves SSH que estas conexões usam. Deixe desmarcado para exportar apenas as configurações de conexão; na importação eles se reconectam a uma identidade ou chave já existente no cofre.", + "checkboxLabel": { + "connections_one": "Conexão ({{count}})", + "connections_other": "Conexões ({{count}})", + "connections_many": "Conexões ({{count}})", + "identities_one": "Identidade ({{count}})", + "identities_other": "Identidades ({{count}})", + "identities_many": "Identidades ({{count}})", + "keys_one": "Chave SSH ({{count}})", + "keys_other": "Chaves SSH ({{count}})", + "keys_many": "Chaves SSH ({{count}})", + "snippets": "Snippets ({{count}})", + "portForwarding": "Encaminhamento de Porta ({{count}})" + } + }, + "import": { + "importFrom": "Importar de", + "importInto": "Importar para", + "autoExtractTitle": "Extração automática de {{label}}", + "autoExtractDescription": "Lê seus dados locais {{label}} — nenhuma exportação manual necessária", + "extracting": "A extrair…", + "extractFrom": "Extrair de {{label}}", + "chooseConfigFolder": "Ou escolha uma pasta Config {{label}}…", + "orImportFromFile": "ou importar de ficheiro", + "openFileLabel": "Abrir ficheiro {{sub}}…", + "encryptedBackupTitle": "Cópia de segurança encriptado — insira sua palavra-passe para desbloquear", + "unlock": "Desbloquear", + "configPassphraseTitle": "Esta configuração SecureCRT tem uma frase de acesso de configuração — insira-a para importar palavras-passe guardadas", + "skipPasswords": "Importar sem palavras-passe guardadas", + "reviewItems_one": "Revisar {{count}} item", + "reviewItems_other": "Revisar {{count}} itens", + "reviewItems_many": "Revisar {{count}} itens", + "back": "Voltar", + "reviewImportTitle": "Revisar importação", + "reIncludeDuplicates": "Reincluir duplicatas", + "skipAllDuplicates": "Pular todas as duplicatas", + "filterItemsPlaceholder": "Filtrar itens…", + "groupConnections": "Conexões", + "groupKeys": "Chaves SSH", + "groupIdentities": "Identidades", + "groupLinkedCredentials": "Credenciais vinculadas", + "linkedTo": "Vinculado a “{{name}}” neste cofre", + "linkedNotFound": "Não está neste cofre — atribua-o após a importação", + "groupPortForwarding": "Encaminhamento de Porta", + "selectAll": "Selecionar tudo", + "deselectAll": "Deselecionar tudo", + "advanced": "Avançado", + "tagLabel": "Tag:", + "tagPlaceholder": "opcional", + "importing": "A importar…", + "importButton_one": "Importar {{count}} item", + "importButton_other": "Importar {{count}} itens", + "importButton_many": "Importar {{count}} itens", + "importButtonMultiVault_one": "Importar {{count}} item × {{vaultCount}} cofres", + "importButtonMultiVault_other": "Importar {{count}} itens × {{vaultCount}} cofres", + "importButtonMultiVault_many": "Importar {{count}} itens × {{vaultCount}} cofres", + "nothingSelected": "Nada selecionado", + "unnamedKey": "Chave sem nome", + "sshKeyFallback": "Chave SSH", + "actionSkip": "Pular", + "actionInclude": "Importar", + "actionOverwrite": "Sobrescrever", + "resultImportedSuccess_one": "Importado com sucesso {{count}} item{{vaultNote}}.", + "resultImportedSuccess_other": "Importados com sucesso {{count}} itens{{vaultNote}}.", + "resultImportedSuccess_many": "Importados com sucesso {{count}} itens{{vaultNote}}.", + "resultVaultNote": " em {{count}} cofres", + "resultError": "Erro: {{error}}", + "resultImportedWithErrors_one": "Importado {{count}} item{{vaultNote}}, {{errors}} falhou.", + "resultImportedWithErrors_other": "Importados {{count}} itens{{vaultNote}}, {{errors}} falhou.", + "resultImportedWithErrors_many": "Importados {{count}} itens{{vaultNote}}, {{errors}} falhou.", + "groupNotImported": "Não importado", + "viaJump": "via {{hosts}}", + "teamKeysWarning": "Estas chaves privadas serão compartilhadas com todos os membros de {{team}}.", + "notice": { + "pattern": "Padrão: aplicado a hosts correspondentes, não importado por conta própria", + "match": "Bloco de correspondência: não suportado, ignorado", + "include": "Incluir não pôde ser lido", + "includeOutside": "Incluir fora de ~/.ssh: não lido", + "key": "Caminho IdentityFile usa tokens que não podem ser resolvidos", + "proxyCommand": "ProxyCommand não suportado ainda" + } + }, + "fileInput": { + "openFileDefault": "Abrir ficheiro…", + "pasteFromClipboard": "Colar da Área de Transferência", + "clear": "Limpar", + "dropToLoad": "Solte para carregar" + }, + "userData": { + "import": { + "openFileLabel": "Abrir Ficheiro…", + "placeholder": "Cole um JSON de configurações do utilizador Voltius aqui, ou solte um ficheiro…\n\n{ \"type\": \"voltius-user-data\", \"version\": 2, \"sections\": { ... } }", + "foundSections_one": "Encontrada {{count}} seção de configurações", + "foundSections_other": "Encontradas {{count}} seções de configurações", + "foundSections_many": "Encontradas {{count}} seções de configurações", + "applying": "Aplicando…", + "applyButton_one": "Aplicar {{count}} seção", + "applyButton_other": "Aplicar {{count}} seções", + "applyButton_many": "Aplicar {{count}} seções", + "applyDefault": "Aplicar", + "resultApplied_one": "Aplicado {{count}} configuração: {{list}}.", + "resultApplied_other": "Aplicadas {{count}} configurações: {{list}}.", + "resultApplied_many": "Aplicadas {{count}} configurações: {{list}}.", + "resultError": "Erro: {{error}}", + "themesReplaceWarning": "Substitui os temas personalizados deste dispositivo." + }, + "handlers": { + "themes": { + "label": "Temas" + }, + "uiPreferences": { + "label": "Preferências da UI" + }, + "shortcuts": { + "label": "Atalhos" + }, + "appSettings": { + "label": "Configurações do App" + }, + "recentPeople": { + "label": "Pessoas Recentes" + }, + "vaults": { + "label": "Cofres" + } + }, + "describe": { + "themes_one": "{{count}} tema personalizado", + "themes_other": "{{count}} temas personalizados", + "themes_many": "{{count}} temas personalizados", + "uiPreferences": "escala {{scale}}× · layout {{layout}}", + "shortcutsOverrides_one": "{{count}} sobrescrita", + "shortcutsOverrides_other": "{{count}} sobrescritas", + "shortcutsOverrides_many": "{{count}} sobrescritas", + "shortcutsDefaults": "Padrões", + "appSettingsShell": "shell: {{shell}}", + "appSettingsDefault": "Configurações padrão", + "recentPeople_one": "{{count}} pessoa recente", + "recentPeople_other": "{{count}} pessoas recentes", + "recentPeople_many": "{{count}} pessoas recentes", + "vaults_one": "{{count}} cofre", + "vaults_other": "{{count}} cofres", + "vaults_many": "{{count}} cofres" + } + }, + "importers": { + "voltius": { + "sub": "JSON", + "placeholder": "Cole o JSON do Voltius aqui, ou solte um ficheiro .json…\n\n{ \"version\": 1, \"connections\": [...] }" + }, + "csv": { + "sub": "Planilha", + "placeholder": "Cole o CSV aqui, ou solte um ficheiro…\n\nname,host,port,username,auth_type,tags" + }, + "openssh": { + "sub": "~/.ssh/config", + "hint": "Lê ~/.ssh/config, seus ficheiros Include e as chaves nomeadas por IdentityFile. Você também pode colar um config ou abrir um ficheiro.", + "hintMobile": "Cole seu ~/.ssh/config ou abra o ficheiro. As chaves são correspondidas pelo nome de ficheiro com as chaves já no cofre.", + "placeholder": "Host my-server\n HostName 10.0.0.5\n User alex\n IdentityFile ~/.ssh/id_ed25519", + "notFound": "Nenhum ~/.ssh/config foi encontrado neste computador.", + "unreadable": "~/.ssh/config não pôde ser lido ({{reason}})." + }, + "mobaxterm": { + "sub": "Instalação local · auto-descriptografia", + "hint": "Requer MobaXterm instalado (apenas Windows).", + "placeholder": "Solte MobaXterm.ini aqui, ou cole seu conteúdo…" + }, + "termius": { + "sub": "Instalação local · extração automática", + "hint": "Requer Termius instalado e logado.", + "placeholder": "Use a Extração Automática para o Termius. Dumps legados do Termius colados não são suportados para importação fiel." + }, + "zoc": { + "sub": "Host Directory · .zhd", + "hint": "Encontre-o em Documents\\ZOC9 Files\\Options (Windows) ou ~/Library/Application Support/ZOC9 Files/Options (macOS). Entradas SSH e serial são importadas; palavras-passe guardadas não são.", + "placeholder": "Solte HostDirectory.zhd aqui, ou cole seu conteúdo…" + }, + "putty": { + "sub": ".reg ou sessão", + "hint": "Lê sessões guardadas do registro no Windows, ou de ~/.putty/sessions no Linux e macOS. Você também pode soltar uma exportação .reg ou colar ficheiros de sessão. Sessões SSH e serial, proxies e túneis são importados; ficheiros de chave não são.", + "placeholder": "Solte uma exportação .reg do PuTTY aqui, ou cole ficheiros de sessão…" + }, + "securecrt": { + "sub": "Sessão .ini · exportação XML", + "hint": "A extração automática lê a configuração local do SecureCRT. Você também pode soltar um ficheiro .ini de sessão de Config/Sessions, ou o ficheiro XML de Ficheiro → Exportar Configurações. Sessões SSH e serial são importadas com suas palavras-passe guardadas; Telnet, RLogin, Raw e outros protocolos são ignorados.", + "placeholder": "Solte um ficheiro .ini de sessão do SecureCRT ou um ficheiro .xml de Exportar Configurações aqui, ou cole seu conteúdo…" + } + }, + "menu": { + "export": "Exportar", + "importEllipsis": "Importar…", + "exportEllipsis": "Exportar…" + } + } +} diff --git a/src/i18n/locales/pt-PT/keychain.json b/src/i18n/locales/pt-PT/keychain.json new file mode 100644 index 000000000..bc0d89d73 --- /dev/null +++ b/src/i18n/locales/pt-PT/keychain.json @@ -0,0 +1,167 @@ +{ + "keychain": { + "common": { + "general": "Geral", + "label": "Rótulo", + "tags": "Tags", + "folder": "Pasta", + "optional": "(opcional)", + "username": "Utilizador", + "password": "Password", + "privateKey": "Private Key", + "publicKey": "Chave Pública", + "passphrase": "Frase de acesso", + "addToHost": "Adicionar ao host", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableCloudSync": "Ativar sincronização em nuvem", + "cloudSyncDisabledTitle": "Sincronização em nuvem desativada" + }, + "toolbar": { + "filterPlaceholder": "Filtrar…", + "newKey": "Nova Chave", + "newKeyOptionsAriaLabel": "Opções de nova chave", + "generateKeyPair": "Gerar Par de Chaves", + "newIdentity": "Nova Identidade", + "newFolder": "Nova Pasta" + }, + "page": { + "all": "Todos", + "folders": "Pastas", + "new": "Novo", + "pinned": "Fixados", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "bulk": { + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_other": "Mover {{count}} itens para", + "moveItemsTo_many": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização em nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização em nuvem ({{count}})", + "exportPublicKeys_one": "Exportar {{count}} chave pública", + "exportPublicKeys_other": "Exportar {{count}} chaves públicas", + "exportPublicKeys_many": "Exportar {{count}} chaves públicas", + "deleteItems_one": "Eliminar {{count}} item", + "deleteItems_other": "Eliminar {{count}} itens", + "deleteItems_many": "Eliminar {{count}} itens" + }, + "confirmDeleteFolder": { + "title": "Eliminar pasta", + "message_one": "Isto eliminará a pasta, suas subpastas e o {{count}} item dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto eliminará a pasta, suas subpastas e os {{count}} itens dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto eliminará a pasta, suas subpastas e os {{count}} itens dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto eliminará a pasta e tudo dentro dela. Isto não pode ser desfeito." + }, + "confirmDelete": { + "title_one": "Eliminar {{count}} item", + "title_other": "Eliminar {{count}} itens", + "title_many": "Eliminar {{count}} itens", + "message_one": "Tem certeza de que deseja eliminar {{count}} item? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja eliminar {{count}} itens? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja eliminar {{count}} itens? Isto não pode ser desfeito.", + "folderCascade_one": "{{count}} item arquivado nas pastas selecionadas também será eliminado.", + "folderCascade_other": "{{count}} itens arquivados nas pastas selecionadas também serão eliminados.", + "folderCascade_many": "{{count}} itens arquivados nas pastas selecionadas também serão eliminados." + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá os seguintes itens para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará os seguintes itens para {{targetVaultName}}:" + } + }, + "cards": { + "addedOn": "adicionado {{date}}", + "passwordBadge": "Palavra-passe", + "sshKeysLabel": "Chaves SSH", + "identitiesLabel": "Identidades", + "keySection": { + "emptyTitle": "Ainda não há chaves SSH", + "emptyDescription": "Armazene pares de chaves SSH reutilizáveis", + "addButton": "Adicionar Chave" + }, + "identitySection": { + "emptyTitle": "Ainda não há identidades", + "emptyDescription": "Combine um nome de utilizador com credenciais para reutilizar em hosts", + "addButton": "Adicionar Identidade" + }, + "pin": { + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpin": "Desfixar", + "pin": "Fixar", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe" + } + }, + "keyForm": { + "titleEdit": "Editar Chave", + "modeImport": "Importar", + "modeGenerate": "Gerar", + "sectionKeyMaterial": "Material da Chave", + "sectionImportFromFile": "Importar do Ficheiro", + "sectionKeyExport": "Exportação de Chave", + "unknownType": "Tipo desconhecido", + "invalidKey": "Chave inválida", + "invalidPublicKey": "Não é uma chave pública SSH — esperado \"ssh-ed25519 AAAA… comentário\" em uma linha. Não será guardada e não pode ser adicionada a um host.", + "keyPassphrasePlaceholder": "Frase de acesso da chave", + "incompleteKey": "Chave incompleta", + "unrecognizedKey": "Formato de chave não reconhecido" + }, + "identityForm": { + "titleEdit": "Editar Identidade", + "sectionCredentials": "Credenciais", + "sectionNewKeyMaterial": "Novo Material de Chave", + "sectionLinkedTo": "Vinculado a", + "sshKeyLabel": "Chave SSH", + "noKey": "Sem chave", + "newKeyInline": "Nova chave (em linha)...", + "unnamedKey": "Chave Sem Nome", + "namePlaceholder": "Minha Identidade (opcional)", + "keyLabel": "Rótulo da Chave", + "keyLabelPlaceholder": "Minha Chave SSH (opcional)", + "editHostTitle": "Editar host", + "unlinkTitle": "Desvincular — copiar credenciais em linha para o host" + }, + "exportPanel": { + "exportSectionLabel": "Exportar", + "destinationHost": "Host de destino", + "selectHostPlaceholder": "Selecione um host…", + "location": "Localização", + "filename": "Nome do ficheiro", + "unixOnlyNotice": "A exportação de chave atualmente suporta apenas sistemas UNIX. Use a seção Avançado para personalizar o script de exportação.", + "missingPublicKeyNotice": "Esta chave não tem metade pública para enviar. Abra-a no Keychain e cole sua linha .pub — ou adicione sua frase de acesso, para que a metade pública possa ser derivada da privada.", + "advanced": "Avançado", + "exportScriptLabel": "Script de exportação", + "successMessage": "Chave exportada com sucesso", + "exportingLabel": "A exportar…", + "publicKeyNotFoundError": "Chave pública não encontrada", + "multilinePublicKeyError": "Chave pública não é válida — deve ser uma única linha", + "invalidPublicKeyError": "Chave pública não é válida — deve ser uma chave SSH pública no formato \"tipo base64 [comentário]\"", + "invalidLocationError": "Localização deve ser um caminho sob o diretório home remoto, sem segmento \"..\"", + "invalidFilenameError": "Nome do ficheiro não deve conter um separador de caminho", + "remoteCommandFailedError": "Comando remoto falhou: {{detail}}", + "remoteCommandFailedUnknownError": "Comando remoto falhou (código de saída {{code}})" + }, + "dropZone": { + "loaded": "Ficheiro de chave carregado", + "error": "Não foi possível ler o ficheiro", + "dropToLoad": "Solte o ficheiro de chave para carregar", + "dropHere": "Solte um ficheiro de chave aqui", + "hint": ".pem, .key, .pub ou qualquer ficheiro de chave SSH" + }, + "genFields": { + "sectionKeyType": "Tipo de Chave", + "ellipticCurve": "Curva elíptica", + "keySizeBits": "Tamanho da chave (bits)", + "passphrasePlaceholder": "Frase de acesso opcional", + "savePassphrase": "Guardar frase de acesso", + "cipher": "Cifra", + "rounds": "Rodadas", + "roundsTooltip": "Número de iterações bcrypt-pbkdf usadas para derivar a chave de criptografia da sua frase de acesso. Valores mais altos tornam ataques de força bruta mais lentos, com o custo de carregamento de chave ligeiramente mais lento. O padrão do OpenSSH é 16; 100 é um bom equilíbrio.", + "generating": "A gerar…" + } + } +} diff --git a/src/i18n/locales/pt-PT/knownHosts.json b/src/i18n/locales/pt-PT/knownHosts.json new file mode 100644 index 000000000..d2f4485ca --- /dev/null +++ b/src/i18n/locales/pt-PT/knownHosts.json @@ -0,0 +1,22 @@ +{ + "knownHosts": { + "tlsBadge": "TLS", + "caVerified": "Autoridade certificadora", + "toolbar": { + "deleteSelected": "Eliminar selecionados", + "deleteButton": "ELIMINAR" + }, + "page": { + "noSearchResults": "Nenhum host conhecido corresponde à sua pesquisa", + "emptyState": "Nenhum host conhecido ainda — eles aparecem quando você se conecta a um servidor", + "confirmDelete": { + "title_one": "Eliminar host conhecido?", + "title_other": "Eliminar {{count}} hosts conhecidos?", + "title_many": "Eliminar {{count}} hosts conhecidos?", + "message_one": "Isto removerá a impressão digital confiável. A próxima conexão com este host será tratada como nova.", + "message_other": "Isto removerá as impressões digitais confiáveis. A próxima conexão com estes hosts será tratada como nova.", + "message_many": "Isto removerá as impressões digitais confiáveis. A próxima conexão com estes hosts será tratada como nova." + } + } + } +} diff --git a/src/i18n/locales/pt-PT/layout.json b/src/i18n/locales/pt-PT/layout.json new file mode 100644 index 000000000..0ec09c0ec --- /dev/null +++ b/src/i18n/locales/pt-PT/layout.json @@ -0,0 +1,327 @@ +{ + "layout": { + "nav": { + "hosts": "Hosts", + "keychain": "Keychain", + "port-forwarding": "Encaminhamento de Porta", + "snippets": "Snippets", + "known-hosts": "Hosts Conhecidos", + "members": "Membros", + "logs": "Logs" + }, + "auth": { + "unlockPrompt": "Digite sua palavra-passe mestra para desbloquear", + "masterPasswordPlaceholder": "Palavra-passe mestre", + "unlock": "Desbloquear", + "resetVault": "Redefinir cofre (exclui todos os dados locais)", + "vaultUnreadableTitle": "O cofre deste dispositivo não pode ser aberto", + "vaultUnreadableBody": "Sua palavra-passe está correta, mas o ficheiro de segredos deste dispositivo foi encriptado com uma chave diferente. Nada foi eliminado. Você pode deixá-lo de lado e baixar seus segredos da nuvem novamente.", + "vaultSetAside": "Deixar de lado e baixar novamente", + "vaultSetAsideSub": "Mantém uma cópia de cópia de segurança neste dispositivo", + "vaultSetAsideToast": "Cofre deixado de lado como {{file}}", + "vaultUnreadableRetry": "Tente outra palavra-passe", + "chooseHowToUse": "Escolha como você quer usar o Voltius", + "getStarted": "Começar", + "getStartedSub": "Protegido pelo keychain do SO — sem palavra-passe necessária", + "or": "ou", + "cloudAccount": "Conta na nuvem", + "cloudAccountSub": "Sincronizar entre dispositivos — entre ou crie uma", + "back": "Voltar", + "signupPrompt": "Crie uma conta para sincronizar entre dispositivos", + "signinPrompt": "Entre para restaurar seus dados sincronizados", + "emailPlaceholder": "E-mail", + "masterPasswordMinPlaceholder": "Palavra-passe mestre (mínimo 8 caracteres)", + "confirmPasswordPlaceholder": "Confirmar palavra-passe", + "customServerUrl": "URL personalizada do servidor", + "serverNamed": "Servidor: {{host}}", + "errorInvalidEmail": "E-mail inválido", + "errorMinLength8": "Pelo menos 8 caracteres", + "errorPasswordMismatch": "As palavras-passe não coincidem", + "createAccount": "Criar conta", + "signIn": "Entrar", + "alreadyHaveAccount": "Já tem uma conta? ", + "newHere": "Novo aqui? ", + "e2eeNotice": "Seus dados são encriptados ponta a ponta — o servidor não pode lê-los.", + "openSource": "Código aberto.", + "agreeToTerms": "Ao criar uma conta, você concorda com nossos Termos de Serviço e Política de Privacidade.", + "accountCreatedToast": "Conta criada! Verifique seu e-mail para confirmar.", + "vaultUnreadableBodyNoPassword": "O ficheiro de segredos deste dispositivo não pode ser aberto com a chave armazenada nesta máquina. Nada foi eliminado. Deixe-o de lado para começar com um cofre vazio, ou restaure um dos cópias de segurança abaixo.", + "vaultSetAsideLocal": "Deixar de lado e começar do zero", + "vaultSetAsideLocalSub": "Mantém uma cópia de cópia de segurança neste dispositivo" + }, + "cloudAuthModal": { + "registerTitle": "Criar conta na nuvem", + "signinTitle": "Entrar na conta na nuvem", + "registerDesc": "Crie uma conta para sincronizar este cofre e desbloquear recursos na nuvem. Seus dados permanecem encriptados ponta a ponta.", + "signinDesc": "Entre para ativar sincronização, assinaturas, recursos de equipe e cofres compartilhados.", + "addTitle": "Adicionar outra conta", + "addDesc": "Entre ou crie outra conta na nuvem. A atual permanece no menu de contas para você voltar.", + "createMasterPasswordPlaceholder": "Criar palavra-passe mestra", + "confirmMasterPasswordPlaceholder": "Confirmar palavra-passe mestra", + "errorPasswordRequired": "Palavra-passe necessária", + "errorMinLength4": "Pelo menos 4 caracteres", + "pleaseWait": "Aguarde…", + "reauthTitle": "Entrar novamente", + "reauthDesc": "Sua sessão neste dispositivo terminou. Digite sua palavra-passe mestra para se reconectar." + }, + "twoFactor": { + "prompt": "Digite o código de 6 dígitos do seu aplicativo autenticador.", + "recoveryPrompt": "Digite um de seus códigos de recuperação. Cada um funciona apenas uma vez.", + "codePlaceholder": "Código de 6 dígitos", + "recoveryPlaceholder": "Código de recuperação", + "useRecovery": "Usar um código de recuperação", + "useCode": "Usar um código do autenticador", + "verify": "Verificar", + "usePasskey": "Usar uma chave de acesso", + "passkeyOrCodePrompt": "Use sua chave de acesso, ou digite o código de 6 dígitos do seu aplicativo autenticador.", + "passkeyOrRecoveryPrompt": "Use sua chave de acesso, ou digite um de seus códigos de recuperação.", + "passkeyWaiting": "Continue no seu navegador, então volte aqui.", + "passkeyDoneTitle": "Concluído", + "passkeyDoneBody": "Volte ao Voltius. Você pode fechar esta aba." + }, + "mainPanel": { + "noVaultSelectedTitle": "Nenhum cofre selecionado", + "noVaultSelectedBody": "Por favor, selecione pelo menos um cofre no seletor de cofres.", + "teamVault": { + "offlineTitle": "Cofre da equipe off-line", + "offlineBody": "Cofres de equipe exigem uma conexão com a internet. Seu cofre pessoal está disponível off-line.", + "forbiddenTitle": "Acesso revogado", + "forbiddenBody": "Você não tem mais acesso a este cofre de equipe. Entre em contato com o proprietário da equipe.", + "planLapsedTitle": "Plano Business expirado", + "planLapsedBody": "Seu acesso veio de permissões Business. Peça ao proprietário da equipe para renovar o Business.", + "waitingForAccessTitle": "A aguardar acesso", + "waitingForAccessBody": "Um proprietário de cofre de equipe precisa conceder acesso a você. Isto acontece automaticamente na próxima vez que um proprietário estiver online.", + "waitingForAccessBodyNamed": "A aguardar {{owner}} conceder acesso — eles precisam ficar online uma vez.", + "paymentRequiredTitle": "Cofre da equipe indisponível", + "paymentRequiredBodyOwner": "Sua assinatura terminou. Cofres de equipe exigem um plano ativo.", + "paymentRequiredBodyMember": "A assinatura do proprietário terminou. Cofres de equipe exigem um plano ativo.", + "keyMismatchTitle": "Este dispositivo não pode abrir a chave do cofre", + "keyMismatchBody": "Sua chave está no servidor, mas as chaves de conta deste dispositivo não correspondem a ela. Saia desta conta e entre novamente com sua palavra-passe mestra.", + "errorTitle": "Não foi possível carregar o cofre da equipe", + "errorBody": "Algo deu errado. Tente novamente.", + "updateRequiredTitle": "Atualização necessária", + "updateRequiredBody": "Este cofre da equipe usa recursos que esta versão do Voltius não suporta. Atualize o Voltius para abri-lo." + }, + "manageSubscription": "Gerenciar assinatura →", + "tryAgain": "Tentar novamente", + "checkForUpdates": "Verificar atualizações" + }, + "newSession": { + "searchPlaceholder": "ssh user@host · serial · local …", + "sectionQuickConnect": "Conexão Rápida", + "sectionRecent": "Recentes", + "sectionLocal": "Local", + "noHostsMatch": "Nenhum host corresponde a \"{{query}}\"", + "noHostsYet": "Nenhum host ainda", + "connectTo": "Conectar a {{user}}@{{host}}", + "portSsh": "Porta {{port}} · SSH", + "serialConnection": "Conexão serial", + "configurePortBaud": "Configurar porta e baud", + "localShellFallback": "Shell local" + }, + "sidebarAccount": { + "copyHandle": "Copiar seu identificador", + "accountTitle": "Conta", + "localAccountFallback": "Conta Local", + "modeCloud": "Conta na nuvem", + "modeLocalPassword": "Local · protegido por palavra-passe", + "modeLocal": "Conta local", + "lockVault": "Bloquear agora", + "reportBug": "Relatar um bug…", + "appearance": "Aparência", + "toggleTheme": "Alternar claro / escuro", + "signInSignUp": "Entrar / Criar conta", + "switchAccount": "Trocar conta", + "removeSavedAccount": "Remover conta guardada", + "savedAccountCloud": "Nuvem", + "savedAccountLocal": "Local", + "switchFailed": "Falha ao trocar conta: {{error}}", + "saveFailed": "Esta conta não pôde ser guardada no alternador: {{error}}", + "leaveLocalTitle": "Sair desta conta local?", + "leaveLocalMessage": "Os hosts, chaves e snippets desta conta são armazenados apenas nesta máquina. Mudar para {{account}} os apaga e eles não podem ser recuperados.", + "leaveLocalConfirm": "Apagar e trocar", + "removeTitle": "Remover esta conta deste dispositivo?", + "removeMessage": "Os hosts, chaves e snippets de {{account}} guardados neste dispositivo são eliminados. Tudo que não foi sincronizado não pode ser recuperado.", + "removeConfirm": "Remover", + "autoLock": "Configurações de bloqueio automático…", + "autoLockOff": "Bloqueio automático desativado", + "autoLockAfter": "Bloqueia automaticamente após {{duration}}", + "addAccount": "Adicionar outra conta…", + "autoLockImmediately": "Bloqueia quando você sai do aplicativo" + }, + "splash": { + "steps": { + "init": "A inicializar aplicativo", + "vault": "A verificar cofre", + "connections": "A carregar conexões" + }, + "vaultLocked": "Cofre trancado", + "firstLaunch": "Primeira inicialização", + "vaultCheckFailed": "Falha na verificação do cofre", + "sessionRestored": "Sessão restaurada", + "vaultFound": "Cofre encontrado", + "connectionsUnavailable": "Conexões indisponíveis", + "sshClient": "Cliente SSH", + "vaultUnreadable": "Cofre ilegível", + "keychainHint": "Se o macOS pedir a palavra-passe do seu keychain, digite a palavra-passe de login do seu Mac e escolha \"Sempre Permitir\". O macOS pede uma vez após cada atualização do Voltius." + }, + "sync": { + "title": "Sincronização", + "voltiusSync": "Sincronização Voltius", + "moreProviders": "Mais provedores de sincronização", + "syncNow": "Sincronizar agora", + "signInForSync": "Entre para sincronização em nuvem", + "requiresPro": "Requer Pro", + "upgradeArrow": "Atualizar →", + "pluginDisabled": "Plugin desativado", + "enableArrow": "Ativar →", + "notConfigured": "Não configurado", + "configureArrow": "Configurar →", + "paused": "Pausado", + "resumeArrow": "Retomar →", + "pause": "Pausar sincronização", + "resume": "Retomar sincronização", + "encryptedBlob": "Blob encriptado · {{size}}", + "status": { + "syncing": "A sincronizar…", + "synced": "Sincronizado", + "syncedAt": "Sincronizado · {{time}}", + "error": "Erro de sincronização", + "errorDetail": "Erro de sincronização: {{error}}", + "errorDetailFrom": "Erro de sincronização · {{source}}: {{error}}", + "offline": "Não é possível alcançar o servidor", + "offlineDetail": "Não é possível alcançar o servidor: {{error}}", + "idle": "Ocioso", + "notConfigured": "Sincronização não configurada", + "paused": "Sincronização pausada", + "default": "Sincronização", + "unknown": "desconhecido" + } + }, + "titleBar": { + "sftp": "SFTP", + "sftpTitle": "Transferência de Ficheiros (SFTP)", + "unifiedSplitTab": "Aba dividida unificada", + "splitFallback": "Dividir", + "ended": "Encerrado", + "watching": "Assistindo", + "sharingCurrently": "Compartilhando atualmente", + "signInToShare": "Entre para compartilhar seu terminal", + "sharingRequiresPro": "Compartilhamento de terminal requer Pro — clique para atualizar", + "shareTerminal": "Compartilhar terminal", + "sharing": "Compartilhando", + "share": "Compartilhar", + "terminalFallback": "Terminal", + "themesTools": "Temas e ferramentas · {{theme}}", + "minimize": "Minimizar", + "maximize": "Maximizar", + "close": "Fechar", + "newSession": "Nova sessão", + "renameTab": "Renomear aba", + "closeTab": "Fechar aba", + "stack": { + "sessions_one": "{{host}} · {{count}} sessão", + "sessions_other": "{{host}} · {{count}} sessões", + "sessions_many": "{{host}} · {{count}} sessões", + "heading_one": "{{host}} · {{count}} sessão", + "heading_other": "{{host}} · {{count}} sessões", + "heading_many": "{{host}} · {{count}} sessões", + "count_one": "{{count}} sessão", + "count_other": "{{count}} sessões", + "count_many": "{{count}} sessões", + "newSessionOn": "Nova sessão em {{host}}", + "closeAll": "Fechar todas {{count}}", + "openInSplit": "Abrir em divisão", + "inSplit": "em divisão", + "pin": "Fixar lista de sessões", + "unpin": "Desfixar lista de sessões", + "status": { + "connected": "Conectado · {{time}}", + "connecting": "A ligar…", + "disconnected": "Desconectado", + "offline": "A aguardar rede", + "reconnecting": "Rea ligar…", + "error": "Erro · {{message}}" + } + }, + "splitMenu": { + "rename": "Renomear aba…", + "broadcastOn": "Transmitir entrada para todos os painéis", + "broadcastOff": "Parar de transmitir entrada", + "panes": "Painéis", + "pane": "{{index}} · {{name}}", + "splitApart": "Dividir em abas", + "closeTab_one": "Fechar aba ({{count}} sessão)", + "closeTab_other": "Fechar aba ({{count}} sessões)", + "closeTab_many": "Fechar aba ({{count}} sessões)" + }, + "plan": { + "proTrial": "Avaliação Pro — {{daysLeft}}d restantes", + "teams": "Teams", + "business": "Business", + "pro": "Pro", + "upgradeTrial": "Atualizar · Avaliação Gratuita de 14d", + "upgrade": "Atualizar" + }, + "splitLabelMore": "{{label}} + {{count}}" + }, + "vaultHeader": { + "members": "Membros", + "lastSync": "Última sincronização {{time}}", + "e2ee": "E2EE", + "noOneOnline": "ninguém online", + "onlineCount": "{{count}} online", + "inviteMember": "Convidar membro", + "jumpTo": "Pular para..." + }, + "vaultMenu": { + "share": "Compartilhar…", + "members": "Membros", + "roles": "Funções", + "security": "Política de segurança…", + "rename": "Renomear…", + "makePrivate": "Tornar privado…", + "delete": "Eliminar cofre…", + "leave": "Sair do cofre…", + "openMenu": "Menu do cofre" + }, + "vaultSidebar": { + "cloudVaultLabel": "{{name}} (Cofre na nuvem)", + "unknownVaultLabel": "Cofre desconhecido {{id}} — o nome dele ainda não chegou a este dispositivo", + "vaultInviteTitle": "Convite de cofre: {{name}}", + "vaultInvitation": "Convite de cofre", + "inviterFallback": "Alguém", + "invitedYouTo": "convidou você a", + "asRole": "como", + "accepting": "Aceitando…", + "accept": "Aceitar", + "declining": "Recusando…", + "decline": "Recusar", + "multipleVaultsTitle": "Vários cofres requerem Pro", + "multipleVaultsBody": "Contas gratuitas podem criar um cofre. Atualize para Pro para organizar suas credenciais em vários cofres.", + "upgradeToPro": "Atualizar para Pro", + "signInOrCreate": "Entrar ou criar conta na nuvem", + "maybeLater": "Talvez depois", + "home": "Início", + "whatsNew": "Novidades", + "checkingForUpdates": "A verificar atualizações…", + "downloadingUpdate": "A transferir atualização v{{version}}…", + "updateReady": "Atualização v{{version}} pronta — clique para ver e reiniciar", + "updateAvailable": "Atualização v{{version}} disponível — clique para ver e baixar", + "settings": "Configurações", + "addVault": "Adicionar cofre" + }, + "appLock": { + "title": "O Voltius está trancado", + "subtitle": "Suas sessões ainda estão em execução.", + "unlockWith": "Desbloquear com {{method}}", + "tryAgain": "Tentar novamente", + "systemAuthFailed": "Autenticação falhou.", + "wrongPassword": "Palavra-passe mestre incorreta.", + "keychainEmpty": "Sua chave de cofre não está mais no keychain do sistema. Digite sua palavra-passe mestra.", + "promptReason": "Desbloquear Voltius", + "sealReason": "Confirmar para manter sua chave de cofre neste dispositivo", + "bindingLost": "Seu login no dispositivo mudou. Digite sua palavra-passe mestra." + } + } +} diff --git a/src/i18n/locales/pt-PT/logs.json b/src/i18n/locales/pt-PT/logs.json new file mode 100644 index 000000000..bf205f5ca --- /dev/null +++ b/src/i18n/locales/pt-PT/logs.json @@ -0,0 +1,165 @@ +{ + "logs": { + "gate": { + "noVaultSelected": { + "title": "Nenhum cofre selecionado", + "description": "Selecione um único cofre para visualizar registros de auditoria." + }, + "restricted": { + "title": "Acesso restrito", + "description": "Você precisa da permissão Visualizar Registro de Auditoria para acessar esta página." + } + }, + "filters": { + "searchPlaceholder": "Filtrar registros…", + "allActors": "Todos os atores", + "fromDate": "De data", + "toDate": "Até data", + "dateRangeSeparator": "a", + "reset": "Redefinir", + "actionOptions": { + "all": "Todas as ações", + "memberInvited": "Membro convidado", + "memberJoined": "Membro entrou", + "memberRemoved": "Membro removido", + "memberRoleChanged": "Função alterada", + "memberPermissionsChanged": "Permissões alteradas", + "connectionCreated": "Host criado", + "connectionUpdated": "Host atualizado", + "connectionDeleted": "Host eliminado", + "identityCreated": "Identidade criada", + "identityUpdated": "Identidade atualizada", + "identityDeleted": "Identidade excluída", + "keyCreated": "Chave criada", + "keyUpdated": "Chave atualizada", + "keyDeleted": "Chave excluída", + "snippetCreated": "Snippet criado", + "snippetUpdated": "Snippet atualizado", + "snippetDeleted": "Snippet eliminado", + "folderCreated": "Pasta criada", + "folderUpdated": "Pasta atualizada", + "folderDeleted": "Pasta excluída", + "portForwardCreated": "Encaminhamento de porta criado", + "portForwardUpdated": "Encaminhamento de porta atualizado", + "portForwardDeleted": "Encaminhamento de porta eliminado", + "vaultRenamed": "Cofre renomeado", + "vaultKeyRotated": "Chave rotacionada", + "teamLockPolicySet": "Política de bloqueio definida", + "teamLockPolicyRemoved": "Política de bloqueio removida", + "roleCreated": "Função criada", + "roleUpdated": "Função atualizada", + "roleDeleted": "Função excluída", + "connectionStarted": "Conexão iniciada", + "connectionEnded": "Conexão encerrada", + "secretViewed": "Segredo revelado", + "sessionStarted": "Sessão iniciada", + "sessionEnded": "Sessão encerrada", + "sessionJoined": "Sessão participada", + "memberRenamed": "Membro renomeado", + "permissionGranted": "Permissão concedida", + "permissionRevoked": "Permissão revogada", + "sessionLeft": "Sessão deixada", + "vaultCreated": "Cofre criado", + "vaultDeleted": "Cofre eliminado" + } + }, + "timeRange": { + "lastDay": "Últimas 24 horas", + "lastWeek": "Última semana", + "lastMonth": "Últimos 30 dias", + "all": "Todo o tempo", + "custom": "Intervalo personalizado" + }, + "layout": { + "timeline": "Linha do tempo", + "horizontal": "Visual", + "list": "Lista" + }, + "export": { + "button": "Exportar", + "failed": "Falha na exportação" + }, + "badges": { + "client": "cliente", + "clientTooltip": "Reportado pelo aplicativo cliente — não autoritativo", + "ownKey": "própria chave", + "ownKeyTooltip": "Conectado com a própria identidade do membro; nunca sai do dispositivo deles", + "shared": "compartilhado · {{name}}", + "sharedUnknown": "compartilhado" + }, + "eventLabels": { + "memberInvited": "convidou {{name}}", + "memberJoined": "entrou na equipe como {{role}}", + "memberRemoved": "removeu {{name}}", + "memberRenamed": "nomeou {{name}} “{{to}}”", + "memberNameRemoved": "removeu o nome de {{name}}", + "memberRoleChanged": "alterou a função de {{name}}", + "memberPermissionsChanged": "alterou as permissões de {{name}}", + "vaultCreated": "criou o cofre \"{{name}}\"", + "vaultDeleted": "excluiu o cofre \"{{name}}\"", + "vaultRenamed": "renomeou o cofre para \"{{name}}\"", + "vaultKeyRotated": "rotacionou a chave do cofre \"{{name}}\"", + "lockPolicySet": "definiu a política de bloqueio (bloqueio automático: {{timeout}})", + "lockPolicySetVault": "definiu a política de bloqueio (bloqueio automático: {{timeout}}, bloqueio de cofre necessário)", + "lockPolicyRemoved": "removeu a política de bloqueio", + "roleCreated": "criou a função \"{{name}}\"", + "roleUpdated": "atualizou a função \"{{name}}\"", + "roleDeleted": "excluiu a função \"{{name}}\"", + "permissionGranted": "concedeu permissão em {{name}}", + "permissionRevoked": "revogou permissão em {{name}}", + "connectionCreated": "criou o host \"{{name}}\"", + "connectionUpdated": "atualizou o host \"{{name}}\"", + "connectionDeleted": "excluiu o host \"{{name}}\"", + "connectionStarted": "conectou a {{name}}", + "connectionEnded": "desconectou de {{name}}", + "identityCreated": "criou a identidade \"{{name}}\"", + "identityUpdated": "atualizou a identidade \"{{name}}\"", + "identityDeleted": "excluiu a identidade \"{{name}}\"", + "keyCreated": "criou a chave \"{{name}}\"", + "keyUpdated": "atualizou a chave \"{{name}}\"", + "keyDeleted": "excluiu a chave \"{{name}}\"", + "snippetCreated": "criou o snippet \"{{name}}\"", + "snippetUpdated": "atualizou o snippet \"{{name}}\"", + "snippetDeleted": "excluiu o snippet \"{{name}}\"", + "folderCreated": "criou a pasta \"{{name}}\"", + "folderUpdated": "atualizou a pasta \"{{name}}\"", + "folderDeleted": "excluiu a pasta \"{{name}}\"", + "portForwardCreated": "criou o encaminhamento de porta \"{{name}}\"", + "portForwardUpdated": "atualizou o encaminhamento de porta \"{{name}}\"", + "portForwardDeleted": "excluiu o encaminhamento de porta \"{{name}}\"", + "secretViewed": "revelou o segredo \"{{name}}\"", + "sessionStarted": "iniciou sessão de terminal", + "sessionEnded": "encerrou sessão de terminal", + "sessionJoined": "participou da sessão de terminal", + "sessionLeft": "saiu da sessão de terminal", + "fallbackUser": "um utilizador", + "fallbackMember": "um membro", + "fallbackRole": "membro", + "fallbackResource": "um recurso", + "fallbackHost": "um host", + "you": "Você" + }, + "timeline": { + "today": "Hoje", + "yesterday": "Ontem", + "weekOf": "Semana de {{date}}" + }, + "list": { + "columns": { + "actor": "Ator", + "action": "Ação", + "target": "Alvo", + "time": "Hora" + } + }, + "pagination": { + "prev": "Anterior", + "next": "Próximo", + "pageOf": "Página {{page}} / {{totalPages}}" + }, + "emptyState": "Nenhum evento corresponde aos seus filtros.", + "error": { + "retry": "Tentar novamente" + } + } +} diff --git a/src/i18n/locales/pt-PT/members.json b/src/i18n/locales/pt-PT/members.json new file mode 100644 index 000000000..42c61a2c0 --- /dev/null +++ b/src/i18n/locales/pt-PT/members.json @@ -0,0 +1,361 @@ +{ + "members": { + "roles": "Funções", + "info": "Info", + "memberSince": "Membro desde", + "invitedBy": "Convidado por", + "dangerZone": "Zona de Perigo", + "ownership": { + "title": "Propriedade", + "primary": "Proprietário primário", + "primaryHintBilling": "Paga por esta equipe e é a única que pode excluí-la.", + "primaryHintSelfHosted": "A única que pode eliminar esta equipe.", + "makePrimary": "Tornar proprietário primário", + "leaveBlocked": "Torne outro Proprietário o proprietário primário antes de sair desta equipe.", + "confirmPrimary": { + "title": "Tornar {{name}} o proprietário primário?", + "bodyBilling": "A própria assinatura Teams ou Business de {{name}} paga por esta equipe daqui em diante, e apenas eles podem excluí-la. Sua assinatura permanece como está: reduza suas vagas ou cancele você mesmo.", + "bodySelfHosted": "Apenas {{name}} poderá eliminar esta equipe. Você permanece como Proprietário e pode sair depois." + }, + "grant": { + "title": "Tornar {{name}} um Proprietário?", + "body": "Proprietários têm todas as permissões, incluindo adicionar e remover outros Proprietários.", + "confirm": "Tornar Proprietário" + }, + "revoke": { + "title": "Remover Proprietário de {{name}}?", + "body": "{{name}} mantém quaisquer outras funções que detenha.", + "confirm": "Remover Proprietário" + } + }, + "confirmRemoval": "Clique novamente para confirmar remoção", + "removeFromTeam": "Remover da equipe", + "newRole": "Nova função", + "you": "Você", + "youBadge": "você", + "kick": "Expulsar", + "morePermissions": "+{{count}} mais", + "noRole": "Sem função", + "noRoleAddPrompt": "Sem função · Adicionar →", + "ownerRoleLabel": "proprietário", + "loading": "A carregar membros…", + "noMatch": "Nenhum membro corresponde a \"{{search}}\"", + "revokeInvitationTitle": "Revogar convite", + "pendingBadge": "Pendente", + "toolbar": { + "filterPlaceholder": "Filtrar membros…", + "sortByRole": "Por função", + "selectedCount": "{{count}} selecionados", + "inviteBtn": "Convidar", + "clear": "Limpar" + }, + "heading": { + "members": "Membros", + "pendingInvitations": "Convites Pendentes" + }, + "permission": { + "VIEW_SECRETS": "Ver segredos", + "COPY_SECRETS": "Copiar segredos", + "CONNECT": "Conectar", + "EDIT_CONNECTIONS": "Editar conexões", + "EDIT_IDENTITIES": "Editar identidades", + "EDIT_KEYS": "Editar chaves", + "EDIT_SNIPPETS": "Editar snippets", + "EDIT_FOLDERS": "Editar pastas", + "VIEW_AUDIT_LOG": "Ver registro de auditoria", + "INVITE_MEMBERS": "Convidar membros", + "MANAGE_MEMBERS": "Gerenciar membros", + "CREATE_CUSTOM_ROLES": "Gerenciar funções (legado)", + "MANAGE_ROLES": "Gerenciar funções", + "MANAGE_VAULT": "Gerenciar cofre", + "START_TERMINAL_SESSION": "Iniciar sessões", + "JOIN_TERMINAL_SESSION": "Participar de sessões", + "VIEW_TERMINAL_SESSIONS": "Ver sessões", + "VIEW": "Ver", + "ADMINISTRATOR": "Administrador" + }, + "permissions": { + "title": "Permissões", + "inheritedFrom": "De {{roles}}", + "notGranted": "Nenhuma função concede isto", + "effectiveAllowed": "permitido", + "effectiveDenied": "negado", + "state": { + "deny": "Negar", + "inherit": "Herdar", + "allow": "Permitir" + }, + "readOnlyNoManage": "Você precisa da permissão Gerenciar membros", + "readOnlyOwner": "As permissões de um proprietário não podem ser sobrescritas", + "readOnlySelf": "Você não pode alterar suas próprias permissões", + "readOnlyHigherRole": "Este membro detém uma função igual ou superior à sua", + "readOnlyNotHeld": "Você não pode conceder uma permissão que não detém", + "overrideMarker": "Tem sobrescritas de permissão", + "filterPlaceholder": "Filtrar permissões…", + "group": { + "administration": "Administração", + "secrets": "Segredos e Conectar", + "vaultContent": "Conteúdo do cofre", + "team": "Equipe e cofre", + "sessions": "Sessões" + } + }, + "revokeKeyAccess": { + "title": "Revogar o acesso de {{name}} à chave do cofre?", + "body": "{{name}} não poderá mais conectar ou ver segredos neste cofre. Eles mantêm uma cópia da chave atual e ainda podem ler segredos já sincronizados no dispositivo deles, então a chave do cofre será rotacionada para os membros restantes.", + "confirm": "Revogar e rotacionar chave" + }, + "convert": { + "title": "Compartilhar \"{{vault}}\" com outras pessoas?", + "body": "Isto transforma seu cofre privado em um cofre de equipe. Tudo já nele move-se para lá, então as pessoas que você adicionar veem também.", + "offlineWarning": "Abre apenas enquanto o Voltius puder alcançar o servidor de sincronização — sem acesso off-line.", + "keyCustody": "Todos que você adiciona recebem uma cópia de sua chave. Removê-los depois não tira de volta.", + "change": "Você pode torná-lo privado novamente depois — isto remove o acesso de todos, mas não as cópias que já têm.", + "cancel": "Cancelar", + "confirm": "Tornar um cofre de equipe" + }, + "share": { + "shareVerb": "Compartilhar", + "title": "Compartilhar {{vault}}", + "tabPeople": "Pessoas", + "tabInvite": "Convidar", + "manage": "Gerenciar membros e funções", + "inviteSomeone": "Convidar alguém", + "loadFailed": "Não foi carregar todos — tente novamente", + "tabLinks": "Links" + }, + "detail": { + "nameLabel": "Nome nesta equipe", + "nameHint": "Deixe vazio para mostrar o identificador deles." + }, + "invite": { + "nameLabel": "Nome nesta equipe", + "namePlaceholder": "ex. Jan Novák", + "nameHint": "Colegas de equipe veem isto em vez do identificador deles. Apenas admins podem alterá-lo.", + "title": "Convidar membro", + "seatsLabel": "Vagas", + "seatsSummary": "{{used}} usadas · {{available}} disponíveis · {{total}} total", + "seatsScope": "Contadas em todas as equipes que você possui, não apenas nesta.", + "seatsTrialClamp": "Sua avaliação limita você a {{cap}} vagas até terminar, das {{purchased}} que você comprou.", + "buySeats": "Comprar vagas", + "initialRoles": "Funções Iniciais", + "initialRole": "Função Inicial", + "searchOrInviteLabel": "Buscar identificador ou inserir e-mail", + "searchUserLabel": "Buscar por identificador ou e-mail", + "searchUserPlaceholder": "Buscar por identificador ou e-mail…", + "addWithRole": "Adicionar ({{role}})", + "addAsRole": "Adicionar como {{role}}", + "noRoleFallback": "sem função", + "sendInviteLabel": "Enviar convite para", + "inviteArrow": "Convidar →", + "handleRule": "Apenas identificadores personalizados correspondem a parte de um nome. Para um identificador gerado como rapid-violet-8884, digite-o completo ou use o e-mail deles.", + "seatsUnknown": "Contagem de vagas indisponível — verifique sua conexão com o servidor de sincronização", + "seatsUnlimited": "{{used}} usadas · ilimitado", + "inviteAction": "Convidar", + "joinsAs": "Eles entram como", + "selectRoleHint": "Selecione pelo menos uma função antes de convidar", + "expiresIn_one": "Expira amanhã", + "expiresIn_other": "Expira em {{count}} dias", + "expiresIn_many": "Expira em {{count}} dias", + "expiresToday": "Expira hoje", + "expired": "Expirado", + "resendTitle": "Enviar este convite novamente", + "expiredOn": "Expirado em {{date}}" + }, + "roleBlurb": { + "manager": "Gerentes podem convidar pessoas, alterar funções e gerenciar links.", + "editor": "Editores podem adicionar e alterar hosts, chaves e snippets neste cofre.", + "member": "Membros podem usar tudo neste cofre, mas não alterar.", + "connect-only": "Pessoas apenas-conectar podem abrir conexões, mas nunca veem as credenciais por trás delas." + }, + "toast": { + "makingPrimaryOwner": "Tornando {{name}} o proprietário primário…", + "primaryOwnerChanged": "{{name}} é agora o proprietário primário", + "removingRoleFrom": "Removendo {{role}} de {{name}}...", + "roleRemovedFrom": "{{role}} removido de {{name}}", + "assigningRoleTo": "Atribuindo {{role}} a {{name}}...", + "roleAssignedTo": "{{role}} atribuído a {{name}}", + "removingMember": "Removendo {{name}}...", + "memberRemoved": "{{name}} removido", + "revokingInvitation": "A revogar convite para {{name}}...", + "invitationRevoked": "Convite revogado para {{name}}", + "invitingUser": "A convidar {{name}}...", + "invitationSentToUser": "Convite enviado para {{name}}", + "userAdded": "{{name}} adicionado", + "invitingEmail": "A convidar {{email}}...", + "invitationSentToEmail": "Convite enviado para {{email}}", + "invitingToSession": "A convidar {{name}} para a sessão...", + "invitedToSession": "Convidado {{name}} para a sessão", + "convertingVault": "Transformando {{vault}} em um cofre de equipe...", + "vaultConverted": "{{vault}} é agora um cofre de equipe", + "grantingKey": "Concedendo acesso ao cofre para {{name}}…", + "keyGranted": "{{name}} pode agora abrir o cofre", + "leavingTeam": "A sair da equipe...", + "leftTeam": "Você saiu da equipe" + }, + "error": { + "cannotRemoveOwnerRole": "Torne outro Proprietário o proprietário primário primeiro", + "failedToUpdateRole": "Falha ao atualizar função", + "failedToUpdatePermissions": "Falha ao atualizar permissões", + "failedToRemoveMember": "Falha ao remover membro", + "failedToAddMember": "Falha ao adicionar membro", + "inviteFailed": "Não foi convidar {{name}} — {{reason}}", + "seatLimitReached": "Não há vagas disponíveis. Peça ao administrador do servidor para aumentar o limite de vagas.", + "convertFailed": "Não foi transformar {{vault}} em um cofre de equipe — {{reason}}", + "serverUnreachable": "o servidor de sincronização não pôde ser alcançado", + "removeFailed": "Não foi remover {{name}} — {{reason}}", + "revokeFailed": "Não foi revogar o convite para {{name}} — {{reason}}", + "grantKeyFailed": "Não foi conceder acesso ao cofre para {{name}} — {{reason}}", + "memberHasNoPublicKey": "Eles não publicaram uma chave ainda — peça para eles entrarem uma vez.", + "notAKeyHolder": "Você não detém a chave deste cofre, então não pode concedê-la." + }, + "history": { + "removeRole": "Remover função: {{name}}", + "assignRole": "Atribuir função: {{name}}", + "changePermissions": "Alterar permissões de {{name}}", + "remove": "Remover: {{name}}", + "assignRoleBulk": "Atribuir função ×{{count}}", + "removeRoleBulk": "Remover função ×{{count}}", + "removeBulk": "Remover ×{{count}}" + }, + "contextMenu": { + "viewDetails": "Ver detalhes", + "inviteToSession": "Convidar para a Sessão", + "noActiveSessions": "Nenhuma sessão ativa", + "noInvitableSessions": "Nenhuma sessão pode aceitar este convite", + "assignRoleBulk": "Atribuir Função ({{count}})", + "removeRoleBulk": "Remover Função ({{count}})", + "kickBulk_one": "Expulsar {{count}} membro", + "kickBulk_other": "Expulsar {{count}} membros", + "kickBulk_many": "Expulsar {{count}} membros" + }, + "empty": { + "noVaultTitle": "Nenhum cofre selecionado", + "noVaultDesc": "Selecione um cofre na barra lateral para gerenciar seus membros.", + "signInToInvite": "Entre para convidar colegas para este cofre.", + "vaultNotFound": "Cofre não encontrado." + }, + "people": { + "pending": "Pendente", + "awaitingKey": "A aguardar uma chave — eles não podem abrir o cofre ainda", + "grantKey": "Conceder agora", + "copyInviteLink": "Copiar link de convite", + "revoke": "Revogar convite", + "remove": "Remover do cofre", + "inviteLinkCopied": "Link de convite copiado — ele abre o convite deles no Voltius." + }, + "cta": { + "signInTitle": "Entre para usar recursos de equipe", + "signInDesc": "Membros, convites e acesso a cofres compartilhados exigem uma conta na nuvem antes de você poder atualizar ou gerenciar uma equipe.", + "signInBtn": "Entrar ou criar conta na nuvem →", + "upgradeTitle": "Cofres de Equipe exigem Teams", + "upgradeDesc": "Convidar membros, atribuir funções e compartilhar credenciais com segurança com sua equipe.", + "upgradeBtn": "Experimente Teams gratuitamente por {{days}} dias →", + "trialNote": "Cartão necessário · sem cobrança durante a avaliação" + }, + "joinLinks": { + "explainer": "Qualquer pessoa com o link entra neste cofre na função que você escolhe. O link nunca carrega a chave do cofre — ela chega separadamente, assim que alguém que já a tem estiver online.", + "empty": "Nenhum link ativo.", + "loadFailed": "Não foi carregar links — {{reason}}", + "joinsAs": "Entra como", + "usesLabel": "Usos", + "expiryLabel": "Expira depois de", + "create": "Criar link", + "copy": "Copiar", + "copied": "Copiado", + "revoke": "Revogar link", + "shownOnce": "Um link é mostrado apenas uma vez, quando você o cria. Nada pode mostrá-lo novamente.", + "secretNotRecoverable": "Link não está mais visualizável — revogue-o e crie um novo.", + "usesLeft_one": "{{count}} uso restante de {{max}}", + "usesLeft_other": "{{count}} usos restantes de {{max}}", + "usesLeft_many": "{{count}} usos restantes de {{max}}", + "expiringNow": "expirando agora", + "expiresIn": { + "minutes_one": "{{count}} min restantes", + "minutes_other": "{{count}} min restantes", + "minutes_many": "{{count}} min restantes", + "hours_one": "{{count}} hora restante", + "hours_other": "{{count}} horas restantes", + "hours_many": "{{count}} horas restantes", + "days_one": "{{count}} dia restante", + "days_other": "{{count}} dias restantes", + "days_many": "{{count}} dias restantes" + }, + "ttl": { + "hour1": "1 hora", + "day1": "1 dia", + "day7": "7 dias", + "day30": "30 dias" + }, + "toast": { + "creating": "A criar link…", + "created": "Link criado", + "createFailed": "Não foi criar o link — {{reason}}", + "revoking": "A revogar link…", + "revoked": "Link revogado", + "revokeFailed": "Não foi revogar o link — {{reason}}" + }, + "error": { + "notFound": "Este link não é válido.", + "revokedOrExpired": "Este link foi revogado ou expirou.", + "exhausted": "Este link foi esgotado.", + "seatLimit": "Esta equipe não tem vaga disponível. Peça a quem enviou o link para adicionar uma.", + "noPublicKey": "Seu dispositivo não publicou uma chave ainda. Entre uma vez, então abra o link novamente.", + "generic": "O servidor recusou ({{status}})." + }, + "confirm": { + "title": "Juntar-se a {{team}}?", + "titleGeneric": "Juntar-se a um cofre de equipe?", + "loading": "A verificar o link…", + "body": "Este link o adiciona a {{team}} como {{role}}.", + "bodyNamed": "{{inviter}} está a convidar você a {{team}} como {{role}}.", + "keyFollowsLater": "Você entrará imediatamente, mas o cofre permanecerá trancado até que alguém que já tenha sua chave esteja online.", + "action": "Juntar-se", + "failed": "Não foi juntar-se — o link pode ter sido revogado." + }, + "newLink": "Novo link", + "cancel": "Cancelar" + }, + "offboarding": { + "removeTitle_one": "Remover {{names}} desta equipe?", + "removeTitle_other": "Remover {{count}} pessoas desta equipe?", + "removeTitle_many": "Remover {{count}} pessoas desta equipe?", + "leaveTitle": "Sair desta equipe?", + "removeConfirm_one": "Remover", + "removeConfirm_other": "Remover {{count}}", + "removeConfirm_many": "Remover {{count}}", + "leaveConfirm": "Sair da equipe", + "pointAccessEnds": "O acesso deles aos hosts, chaves e snippets deste cofre termina imediatamente, em todos os dispositivos.", + "pointLocalWipe": "O conteúdo do cofre é eliminado dos dispositivos deles, incluindo palavras-passe guardadas e chaves privadas.", + "pointAlreadySeen": "Eles mantêm qualquer coisa que já viram. Rotacione credenciais que eles tiveram acesso.", + "pointSessions": "Eles são removidos de qualquer sessão de terminal compartilhado que participaram.", + "leavePointAccessEnds": "Você perde o acesso aos hosts, chaves e snippets deste cofre em todos os dispositivos.", + "leavePointLocalWipe": "Seu conteúdo é eliminado deste dispositivo, incluindo palavras-passe guardadas e chaves privadas.", + "leavePointIrreversible": "Você não pode se juntar novamente sem um novo convite." + }, + "leaveTeam": "Sair da equipe", + "roleName": { + "owner": "Proprietário", + "manager": "Gerente", + "editor": "Editor", + "member": "Membro", + "connect-only": "Apenas-conectar" + }, + "security": { + "button": "Segurança", + "title": "Política de segurança", + "enforce": "Aplicar bloqueio automático", + "enforceDesc": "Membros podem escolher um tempo menor, nunca um maior.", + "maxLabel": "Bloquear após no máximo", + "forceVault": "Exigir Bloqueio de cofre", + "forceVaultDesc": "Membros não podem escolher Bloquear tela, então o bloqueio sempre remove a chave do cofre da memória.", + "immediateVaultWarning": "Com Imediatamente e Bloqueio de cofre, as sessões abertas dos membros fecham sempre que eles saem do Voltius, mesmo que brevemente.", + "appliesToAll": "Aplica-se a todos os membros, você incluído. Versões mais antigas do Voltius não impõem isto.", + "lockBody": "Políticas de bloqueio precisam do plano Business da equipe.", + "lapsed": "Plano Business expirado: esta política permanece aplicada. Você pode removê-la.", + "remove": "Remover política", + "saving": "A guardar política de bloqueio…", + "saved": "Política de bloqueio guardada" + } + } +} diff --git a/src/i18n/locales/pt-PT/mobile.json b/src/i18n/locales/pt-PT/mobile.json new file mode 100644 index 000000000..48f92177e --- /dev/null +++ b/src/i18n/locales/pt-PT/mobile.json @@ -0,0 +1,308 @@ +{ + "mobile": { + "tabBar": { + "terminal": "Terminal", + "sftp": "SFTP", + "more": "Mais" + }, + "filterBar": { + "placeholder": "Filtrar…" + }, + "snippets": { + "searchPlaceholder": "Buscar snippets", + "noMatches": "Sem correspondências", + "empty": "Nenhum snippet ainda", + "insertAriaLabel": "Inserir", + "executeAriaLabel": "Executar", + "moreAriaLabel": "Mais", + "newFolderTitle": "Nova pasta" + }, + "terminalGestures": { + "paste": "Colar" + }, + "terminalTopBar": { + "exitAriaLabel": "Sair do terminal", + "newSessionAriaLabel": "Nova sessão", + "panelsAriaLabel": "Painéis" + }, + "panelItems": { + "sftp": "SFTP", + "docker": "Docker", + "metrics": "Métricas", + "processes": "Processos", + "proxmox": "Proxmox" + }, + "morePages": { + "keychain": "Keychain", + "portForwarding": "Encaminhamento de Porta", + "knownHosts": "Hosts Conhecidos", + "members": "Membros", + "logs": "Logs" + }, + "account": { + "title": "Conta", + "email": "E-mail", + "notSignedIn": "Não conectado", + "plan": "Plano", + "cloudSync": "Sincronização em nuvem", + "off": "Desligado", + "proTrial": "Avaliação Pro — {{days}}d restantes", + "tier": { + "free": "Gratuito", + "pro": "Pro", + "teams": "Teams", + "business": "Business" + }, + "cancelsOn": "Cancela em {{date}}. Você mantém acesso até então.", + "periodEnd": "o fim do período", + "renewsOn": "Renova em {{date}}.", + "subscriptionActive": "Sua assinatura está ativa.", + "seats": "Vagas", + "seatsUsed": "{{used}} / {{total}} usadas", + "upgradeToPro": "Atualizar para Pro", + "upgradeToTeams": "Experimente Teams gratuitamente por {{days}} dias", + "teamsTrialNote": "Cartão necessário · sem cobrança durante a avaliação", + "manageBilling": "Gerenciar cobrança", + "viewAllPlans": "Ver todos os planos", + "signInToSync": "Entrar para sincronizar", + "signOutConfirm": "Sair? Seu cofre encriptado é removido deste dispositivo e re-sincronizado quando você entrar novamente.", + "signOut": "Sair" + }, + "more": { + "settings": "Configurações", + "planLabel": "{{tier}} plano" + }, + "host": { + "newTitle": "Novo host", + "editTitle": "Editar host" + }, + "hostsScreen": { + "searchPlaceholder": "Buscar hosts", + "clearSearchAriaLabel": "Limpar busca", + "emptyNoHosts": "Nenhum host ainda — toque em + para adicionar um" + }, + "keychainScreen": { + "filterPlaceholder": "Filtrar keychain…", + "sshKeysHeader": "CHAVES SSH", + "identitiesHeader": "IDENTIDADES", + "addedOn": "adicionado {{date}}", + "noSearchMatches": "Nada corresponde à sua busca", + "empty": "Keychain está vazio", + "generateKey": "Gerar chave SSH", + "importKey": "Importar chave SSH", + "newIdentity": "Nova identidade" + }, + "knownHostsScreen": { + "filterPlaceholder": "Filtrar hosts…", + "noSearchMatches": "Nenhum host conhecido corresponde à sua busca", + "empty": "Nenhum host conhecido ainda — eles aparecem quando você se conecta a um servidor." + }, + "logsScreen": { + "filterPlaceholder": "Filtrar logs…", + "retry": "Tentar novamente", + "prev": "Anterior", + "next": "Próximo", + "pageIndicator": "Página {{page}} / {{total}}" + }, + "portForwardingScreen": { + "filterPlaceholder": "Filtrar regras…", + "summary": "{{total}} total · {{active}} ativas", + "noSearchMatches": "Nenhuma regra corresponde à sua busca", + "empty": "Nenhuma regra de encaminhamento de porta ainda" + }, + "snippetEdit": { + "editTitle": "Editar snippet", + "newTitle": "Novo snippet", + "namePlaceholder": "Nome do snippet", + "contentPlaceholder": "echo hello", + "delete": "Eliminar snippet", + "nameLabel": "Nome", + "contentLabel": "Script" + }, + "editForm": { + "required": "Obrigatório", + "incompleteTitle": "Sair sem guardar?", + "incompleteBody": "Um campo obrigatório está vazio, então suas últimas alterações não podem ser guardadas ainda.", + "unsavedTitle": "Descartar alterações?", + "unsavedBody": "Suas alterações neste snippet não foram guardadas.", + "keepEditing": "Continuar editando", + "discard": "Descartar" + }, + "snippetsScreen": { + "newSnippetLabel": "Novo snippet" + }, + "terminalScreen": { + "noActiveSessions": "Nenhuma sessão ativa", + "pickHost": "Escolha um host" + }, + "sftp": { + "transferFailed": "Falha na transferência", + "chooseHost": "Escolha um host", + "hidden": "Oculto", + "visible": "Visível", + "connecting": "A ligar…", + "reconnecting": "Rea ligar…", + "reconnectNow": "Reconectar agora", + "permissionDenied": "Permissão negada", + "goUp": "Subir", + "emptyFolder": "Pasta vazia", + "selectedCount": "{{count}} selecionado", + "downloadSelectedAriaLabel": "Baixar selecionados", + "deleteSelectedAriaLabel": "Eliminar selecionados", + "clearSelectionAriaLabel": "Limpar seleção", + "copyToOtherPane": "Copiar para outro painel", + "download": "Baixar", + "details": "Detalhes", + "copyPath": "Copiar caminho", + "renameTitle": "Renomear {{name}}", + "deleteConfirmTitle": "Eliminar {{name}}?", + "detail": { + "path": "Caminho", + "type": "Tipo", + "size": "Tamanho", + "permissions": "Permissões", + "modified": "Modificado" + }, + "typeSymlink": "Link simbólico", + "typeFile": "Ficheiro", + "batchDeleteTitle_one": "Eliminar {{count}} item?", + "batchDeleteTitle_other": "Eliminar {{count}} itens?", + "batchDeleteTitle_many": "Eliminar {{count}} itens?", + "newFileOption": "Novo ficheiro", + "folderNamePlaceholder": "Nome da pasta", + "fileNamePlaceholder": "Nome do ficheiro", + "selectAll": "Selecionar tudo", + "onePane": "Um painel", + "twoPanes": "Dois painéis", + "moreActions": "Mais ações", + "itemActions": "Ações para {{name}}" + }, + "folders": { + "home": "Início" + }, + "sheets": { + "newSession": { + "noHosts": "Sem hosts" + }, + "shared": { + "moveToVault": "Mover para cofre", + "copyToVault": "Copiar para cofre", + "moveToFolder": "Mover para pasta", + "back": "Voltar", + "duplicate": "Duplicar", + "pin": "Fixar", + "unpin": "Desfixar", + "confirmDeleteBody": "Eliminar permanentemente {{name}}? Isto não pode ser desfeito." + }, + "folderActions": { + "deleteTitle": "Eliminar pasta?", + "deleteBody": "Eliminar {{name}} e tudo dentro dela? Isto não pode ser desfeito." + }, + "hostActions": { + "deleteTitle": "Eliminar host?", + "openFiles": "Abrir ficheiros", + "copyAddress": "Copiar endereço", + "copiedAddress": "Copiado {{host}}", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableReachabilityCheck": "Ativar verificação de acessibilidade", + "disableReachabilityCheck": "Desativar verificação de acessibilidade" + }, + "keychainActions": { + "unnamedKey": "Chave sem nome", + "deleteKeyTitle": "Eliminar chave?", + "deleteIdentityTitle": "Eliminar identidade?", + "copyPublicKey": "Copiar chave pública", + "copiedPublicKey": "Chave pública copiada", + "noPublicKeyStored": "Nenhuma chave pública armazenada", + "copyUsername": "Copiar utilizador", + "copiedUsername": "Utilizador copiado" + }, + "knownHostActions": { + "deleteTitle": "Eliminar host conhecido?", + "deleteBody": "Isto remove a impressão digital confiável. A próxima conexão com este host será tratada como nova.", + "copyFingerprint": "Copiar impressão digital", + "copiedFingerprint": "Impressão digital copiada" + }, + "logsExport": { + "title": "Exportar logs", + "exportCsv": "Exportar como CSV", + "exportJson": "Exportar como JSON" + }, + "snippetActions": { + "deleteTitle": "Eliminar snippet?" + }, + "snippetTarget": { + "executeTitle": "Executar \"{{name}}\"", + "insertTitle": "Inserir \"{{name}}\"", + "confirmExecute_one": "Executar em {{count}} alvo", + "confirmExecute_other": "Executar em {{count}} alvos", + "confirmExecute_many": "Executar em {{count}} alvos", + "confirmInsert_one": "Inserir em {{count}} alvo", + "confirmInsert_other": "Inserir em {{count}} alvos", + "confirmInsert_many": "Inserir em {{count}} alvos", + "activeSessions": "Sessões Ativas", + "openNewConnection": "Abrir Nova Conexão", + "noHosts": "Sem hosts" + }, + "ruleActions": { + "deleteTitle": "Eliminar regra?" + }, + "sftpHostPicker": { + "noSshHosts": "Sem hosts SSH" + }, + "vaultSwitcher": { + "newVault": "Novo cofre", + "namePlaceholder": "Nome do cofre" + } + }, + "shortcuts": { + "hostGone": "Esse host não existe mais. Seu atalho foi removido." + }, + "share": { + "action": "Compartilhar", + "publicKey": "Compartilhar chave pública", + "failed": "Não foi abrir a tela de compartilhamento", + "downloadFailed": "Não foi baixar o ficheiro para compartilhar", + "largeTitle": "Compartilhar {{size}}?", + "largeBody": "Os ficheiros são baixados neste telefone primeiro, então entregues ao aplicativo que você escolher.", + "tooLong": "Muito longo para compartilhar como texto" + }, + "vaultSettings": { + "title": "Configurações do cofre", + "gone": "Este cofre não existe mais neste dispositivo.", + "openFor": "Configurações para {{name}}", + "nameRequired": "Um cofre precisa de um nome.", + "nameReadOnly": "Apenas os gerentes do cofre podem renomeá-lo.", + "kindTeam": "Cofre de equipe", + "kindPrivate": "Cofre privado", + "sections": { + "general": "Geral", + "people": "Pessoas", + "danger": "Zona de perigo" + }, + "rows": { + "name": "Nome", + "share": "Compartilhar e convidar", + "members": "Membros", + "roles": "Funções", + "security": "Política de segurança", + "makePrivate": "Tornar privado", + "delete": "Eliminar cofre", + "leave": "Sair do cofre" + }, + "summaries": { + "share": "Convidar pessoas e gerenciar links de participação", + "members_one": "{{count}} membro", + "members_other": "{{count}} membros", + "members_many": "{{count}} membros", + "roles": "O que cada função pode fazer", + "security": "Bloqueio e regras de sessão para membros", + "makePrivate": "Remover todos e manter uma cópia privada", + "delete": "Exclui o cofre e tudo dentro dele", + "deleteTeam": "Exclui para todos os membros", + "leave": "Remove seu acesso a este cofre" + } + } + } +} diff --git a/src/i18n/locales/pt-PT/notes.json b/src/i18n/locales/pt-PT/notes.json new file mode 100644 index 000000000..cf7321120 --- /dev/null +++ b/src/i18n/locales/pt-PT/notes.json @@ -0,0 +1,54 @@ +{ + "notes": { + "toolbar": { + "heading": "Título", + "h1": "Título 1", + "h2": "Título 2", + "h3": "Título 3", + "bold": "Negrito", + "italic": "Itálico", + "code": "Código em linha", + "link": "Link", + "bullet": "Lista com marcadores", + "ordered": "Lista numerada", + "task": "Lista de tarefas", + "codeBlock": "Bloco de código", + "more": "Mais formatação", + "preview": "Pré-visualizar", + "edit": "Editar" + }, + "editor": { + "placeholder": "Escreva notas em Markdown — digite / para blocos" + }, + "slash": { + "h1": "Título 1", + "h2": "Título 2", + "h3": "Título 3", + "bullet": "Lista com marcadores", + "numbered": "Lista numerada", + "todo": "Lista de tarefas", + "code": "Bloco de código", + "table": "Tabela", + "divider": "Divisor", + "link": "Link" + }, + "empty": { + "title": "Nenhuma nota ainda", + "start": "Comece a escrever" + }, + "code": { + "copy": "Copiar", + "copied": "Copiado", + "sendToTerminal": "Enviar para o terminal" + }, + "panel": { + "noHost": "Notas são anexadas a hosts guardados", + "readOnly": "Somente leitura", + "conflict": "Notas alteradas em outro lugar", + "reload": "Recarregar", + "keepMine": "Manter as minhas", + "saveFailed": "Não foi guardar notas: {{error}}", + "retry": "Tentar novamente" + } + } +} diff --git a/src/i18n/locales/pt-PT/notifications.json b/src/i18n/locales/pt-PT/notifications.json new file mode 100644 index 000000000..ec37fc2e5 --- /dev/null +++ b/src/i18n/locales/pt-PT/notifications.json @@ -0,0 +1,116 @@ +{ + "notifications": { + "bell": { + "title": "Notificações", + "clearHistory": "Limpar histórico", + "noNotifications": "Sem notificações", + "emptyHint": "Você está em dia", + "newSection": "Novas", + "earlierSection": "Anteriores" + }, + "emailVerification": { + "banner": { + "message": "Verifique seu e-mail para desbloquear recursos na nuvem. Enviamos um link para {{email}}.", + "yourEmail": "seu e-mail", + "resend": "Reenviar e-mail", + "resending": "A enviar...", + "verified": "Já verifiquei", + "checking": "A verificar...", + "dismissAriaLabel": "Descartar banner de verificação de e-mail", + "undeliverable": "Não foi entregar e-mail para {{email}}. Verifique o endereço e altere se estiver errado.", + "changeEmail": "Alterar e-mail" + }, + "modal": { + "title": "Verifique seu e-mail primeiro", + "body": "Atualizações na nuvem exigem um endereço de e-mail verificado. Verifique sua caixa de entrada para o link de verificação, ou envie um novo.", + "resend": "Reenviar e-mail", + "resending": "A enviar..." + }, + "toast": { + "sent": "E-mail de verificação enviado.", + "sendFailed": "Não foi reenviar o e-mail de verificação.", + "refreshFailed": "Não foi atualizar a sessão.", + "verified": "E-mail verificado.", + "verifiedPending": "Não verificado ainda. Abra o link no seu e-mail, então tente novamente.", + "verifiedOther": "E-mail verificado para {{email}}.", + "verifiedSwitch": "Alternar", + "verifiedUnknown": "E-mail verificado. Entre para continuar.", + "undeliverable": "O e-mail para este endereço retorna, então não podemos enviar o link. Altere seu e-mail em Configurações → Conta." + } + }, + "progressToast": { + "timedOut": "Tempo da operação esgotado" + }, + "seededPluginsFailed": { + "message": "Plugins integrados falharam ao carregar, então o app está rodando sem eles. Isto é um bug — por favor, reporte.", + "action": "Diagnósticos" + }, + "inbox": { + "someone": "Alguém", + "invite": { + "message": "{{inviter}} convidou você para {{team}}", + "accept": "Aceitar", + "decline": "Recusar" + }, + "session": { + "message": "Um colega de equipe compartilhou {{name}}", + "join": "Participar", + "joined": "Participou" + }, + "sessionInvite": { + "message": "{{inviter}} convidou você para {{name}}" + }, + "sessionKnock": { + "message": "{{inviter}} quer compartilhar um terminal", + "join": "Participar", + "decline": "Recusar", + "blockPermanently": "Bloquear permanentemente" + }, + "control": { + "request": "{{requester}} está solicitando controle", + "grant": "Conceder", + "deny": "Negar", + "granted": "Você tem controle" + }, + "awaitingKey": { + "message": "A aguardar um proprietário de {{team}} conceder acesso ao cofre" + }, + "membershipEnded": { + "message": "Você foi removido de {{team}}. Seus hosts, chaves e snippets foram removidos deste dispositivo, e as credenciais que você usou lá devem ser rotacionadas.", + "review": "Revisar credenciais" + }, + "secretsNotWiped": { + "message": "Algumas credenciais de {{team}} não puderam ser removidas deste dispositivo. Elas permanecem legíveis aqui até que a limpeza tenha sucesso.", + "retry": "Remova-as agora" + }, + "sshConfigMigrated": { + "message": "Seus hosts de ~/.ssh/config não são mais sincronizados automaticamente. Eles são seus agora: suas alterações são mantidas.", + "turnOnSync": "Ativar sincronização contínua", + "dismiss": "OK" + } + }, + "sshConfigOffer": { + "message_one": "{{count}} host encontrado em ~/.ssh/config. Importá-lo para o Voltius? Você pode editá-lo livremente depois.", + "message_other": "{{count}} hosts encontrados em ~/.ssh/config. Importá-los para o Voltius? Você pode editá-los livremente depois.", + "message_many": "{{count}} hosts encontrados em ~/.ssh/config. Importá-los para o Voltius? Você pode editá-los livremente depois.", + "import": "Importar…", + "skip": "Não importar" + }, + "sshConfigSync": { + "unreadable": "~/.ssh/config não pôde ser lido. Hosts gerenciados são mantidos como estão.", + "failed": "Sincronização de ~/.ssh/config falhou. Veja os logs.", + "vaultGone": "O cofre escolhido para hosts de ~/.ssh/config não existe mais. Escolha outro em Configurações › Hosts.", + "detachedToTeam_one": "Um host movido para um cofre de equipe não segue mais ~/.ssh/config.", + "detachedToTeam_other": "{{count}} hosts movidos para um cofre de equipe não seguem mais ~/.ssh/config.", + "detachedToTeam_many": "{{count}} hosts movidos para um cofre de equipe não seguem mais ~/.ssh/config.", + "reviewHere": "Sincronização de ~/.ssh/config está ativada para sua conta. Revise os hosts e chaves deste computador antes de sincronizar aqui.", + "review": "Revisar…", + "detachedUnsynced_one": "Um host eliminado da sincronização não segue mais ~/.ssh/config, então seus outros computadores param de esperar por ele.", + "detachedUnsynced_other": "{{count}} hosts eliminados da sincronização não seguem mais ~/.ssh/config, então seus outros computadores param de esperar por eles.", + "detachedUnsynced_many": "{{count}} hosts eliminados da sincronização não seguem mais ~/.ssh/config, então seus outros computadores param de esperar por eles.", + "detachedProxied_one": "Um host cuja entrada ~/.ssh/config agora usa ProxyCommand não segue mais o ficheiro.", + "detachedProxied_other": "{{count}} hosts cujas entradas ~/.ssh/config agora usam ProxyCommand não seguem mais o ficheiro.", + "detachedProxied_many": "{{count}} hosts cujas entradas ~/.ssh/config agora usam ProxyCommand não seguem mais o ficheiro." + } + } +} diff --git a/src/i18n/locales/pt-PT/omni.json b/src/i18n/locales/pt-PT/omni.json new file mode 100644 index 000000000..e0f2706f2 --- /dev/null +++ b/src/i18n/locales/pt-PT/omni.json @@ -0,0 +1,120 @@ +{ + "omni": { + "searchPlaceholder": "Buscar hosts, chaves, identidades e comandos…", + "categoryBadges": { + "all": "Todos", + "join": "participar> Sessões", + "snippets": "> Snippets", + "marketplace": "m> Marketplace", + "settings": "@ Configurações" + }, + "sections": { + "quickConnect": "Conexão Rápida", + "activeConnections": "Conexões ativas", + "teamSessions": "Sessões da Equipe", + "recent": "Recentes", + "hosts": "Hosts", + "local": "Local", + "keychain": "Keychain", + "snippets": "Snippets", + "actions": "Ações", + "quickSettings": "Configurações Rápidas", + "settings": "Configurações", + "joinByInviteCode": "Participar por código de convite", + "importExport": "Importar / Exportar" + }, + "settingsDescription": "Configurações", + "pluginSettingsDescription": "Configurações de Plugin", + "editHost": "Editar host", + "deleteHost": "Eliminar host", + "resume": "Retomar", + "join": "Participar", + "participantCount_one": "{{count}} pessoa", + "participantCount_other": "{{count}} pessoas", + "participantCount_many": "{{count}} pessoas", + "joinCodePrompt": { + "title": "Participar por código de convite…", + "subtitle": "Cole seu código de convite aqui para participar de uma sessão privada" + }, + "joinCodeEntered": { + "title": "Participar por código de convite" + }, + "quickConnect": { + "connectTo": "Conectar a {{user}}@{{host}}", + "portSsh": "Porta {{port}} — SSH", + "serialConnection": "Conexão serial", + "configurePortAndBaud": "Configurar porta e baud", + "localShellNamed": "Shell local ({{shell}})", + "localShell": "Shell local", + "openLocalTerminal": "Abrir um terminal local" + }, + "localShellDefault": "Shell local", + "emptyState": { + "noSnippets": "Nenhum snippet ainda", + "marketplaceComingSoon": "Marketplace em breve", + "noSessionsMatch": "Nenhuma sessão corresponde a \"{{query}}\"", + "noActiveTeamSessions": "Nenhuma sessão ativa da equipe", + "noResultsFor": "Sem resultados para \"{{query}}\"" + }, + "theme": { + "toggle": "Alternar tema claro / escuro", + "toggleDesc": "Alternar entre seus temas claro e escuro", + "switch": "Alternar tema…", + "switchDesc": "Escolha um tema, pré-visualize ao vivo", + "automation": "Automação de tema…", + "automationDesc": "Manual, seguir o sistema, agendar, ou nascer/pôr do sol", + "backSwitch": "Alternar tema", + "backAutomation": "Automação de tema", + "searchThemes": "Buscar temas…", + "roleLight": "Claro", + "roleDark": "Escuro", + "setAsLight": "Definir como claro", + "setAsDark": "Definir como escuro", + "keyHints": "Alt+L define claro · Alt+D define escuro · Enter aplica", + "modeManual": "Manual", + "modeManualDesc": "Use o tema que você escolher, sem automação", + "modeSystem": "Seguir sistema", + "modeSystemDesc": "Corresponda à configuração claro/escuro do seu SO", + "modeSchedule": "Agendar", + "modeScheduleDesc": "Alternar em horários fixos", + "modeSunset": "Nascer / pôr do sol", + "modeSunsetDesc": "Claro durante o dia, escuro à noite, para sua localização", + "lightStarts": "Claro começa", + "darkStarts": "Escuro começa", + "useMyLocation": "Usar minha localização", + "latitude": "Latitude", + "longitude": "Longitude", + "locationNeeded": "Defina um local para usar nascer/pôr do sol", + "sunToday": "Hoje: nascer do sol {{sunrise}}, pôr do sol {{sunset}}", + "statusManual": "Manual", + "statusSystem": "Auto · seguindo o sistema", + "statusUntil": "Auto · {{phase}} até {{time}}" + }, + "commands": { + "newHost": "Novo Host", + "newKey": "Nova Chave SSH", + "newIdentity": "Nova Identidade", + "settings": "Configurações", + "checkForUpdate": "Verificar Atualização", + "whatsNew": "Novidades", + "portForwarding": "Encaminhamento de Porta", + "knownHosts": "Hosts Conhecidos", + "logs": "Logs", + "newSnippet": "Novo Snippet", + "teamMembers": "Membros da Equipe", + "disconnectAll": "Desconectar Todos", + "reportBug": "Relatar um bug", + "createTheme": "Criar Tema Personalizado", + "importFrom": "Importar de {{label}}", + "importFromEllipsis": "Importar de {{label}}…", + "exportAll": "Exportar dados do cofre…", + "exportConnections": "Exportar conexões…", + "exportIdentities": "Exportar identidades…", + "exportKeys": "Exportar chaves SSH…", + "exportSnippets": "Exportar snippets…", + "exportPortForwarding": "Exportar regras de encaminhamento de porta…", + "exportThemes": "Exportar temas personalizados…", + "importThemes": "Importar temas…" + } + } +} diff --git a/src/i18n/locales/pt-PT/panes.json b/src/i18n/locales/pt-PT/panes.json new file mode 100644 index 000000000..fc1ca3583 --- /dev/null +++ b/src/i18n/locales/pt-PT/panes.json @@ -0,0 +1,52 @@ +{ + "panes": { + "badge": { + "ssh": "SSH", + "serial": "SERIAL", + "multiplayer": "MPX", + "local": "LOCAL" + }, + "header": { + "copied": "Copiado!", + "loading": "a carregar…", + "localSystem": "Sistema local", + "excludedFromBroadcast": "Eliminado da transmissão", + "mcpBadge": "MCP", + "mcpTooltip": "Aberto por {{client}}", + "mcpTooltipUnknown": "Aberto por um cliente MCP", + "mcpTooltipDisconnected": "Aberto por {{client}} (desconectado)", + "disableBroadcast": "Desativar transmissão", + "broadcastInput": "Transmitir entrada", + "detachPane": "Desacoplar painel", + "restorePane": "Restaurar painel", + "maximizePane": "Maximizar painel", + "closePane": "Fechar painel", + "latencyTooltip": "{{ms}}ms — clique para copiar", + "reconnect": "Reconectar", + "rename": "Renomear…", + "duplicate": "Duplicar", + "duplicateSplit": "Duplicar em divisão", + "split": "Dividir", + "splitLeft": "Dividir esquerda", + "splitRight": "Dividir direita", + "splitTop": "Dividir topo", + "splitBottom": "Dividir fundo", + "noSessionToSplit": "Abra outra sessão ou arraste uma aba existente sobre um painel para dividir.", + "sparkline": { + "min": "mín {{ms}}ms", + "avg": "méd {{ms}}ms", + "max": "máx {{ms}}ms" + } + }, + "terminal": { + "emptyTitle": "Área de trabalho dividida está vazia", + "emptyHint": "Arraste uma aba de sessão aqui para começar a dividir painéis.", + "serialSubtitle": "{{port}} · {{baud}} baud" + }, + "dragToast": { + "alreadyVisible": "Essa sessão já está visível na área de trabalho dividida.", + "invalidDropTarget": "Solte no terminal ativo ou em um painel dividido para criar uma divisão.", + "cannotDuplicate": "Esta sessão não pode ser duplicada." + } + } +} diff --git a/src/i18n/locales/pt-PT/portForwarding.json b/src/i18n/locales/pt-PT/portForwarding.json new file mode 100644 index 000000000..bea918387 --- /dev/null +++ b/src/i18n/locales/pt-PT/portForwarding.json @@ -0,0 +1,167 @@ +{ + "portForwarding": { + "toolbar": { + "filterPlaceholder": "Filtrar regras…", + "deleteSelected": "Eliminar selecionadas", + "deleteButton": "ELIMINAR", + "newRule": "Nova Regra", + "newFolder": "Nova Pasta" + }, + "reach": { + "copied": "{{address}} copiado para a área de transferência" + }, + "page": { + "all": "Todas", + "folders": "Pastas", + "new": "Nova", + "noRulesMatchSearch": "Nenhuma regra corresponde à sua busca.", + "folderEmpty": "Esta pasta está vazia.", + "noRulesYet": "Nenhuma regra ainda. Crie uma para começar.", + "addRule": "Adicionar Regra", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "activeCount": "{{count}} ativas", + "errorCount": "{{count}} erro", + "confirmDelete": { + "title": "Eliminar regra", + "message": "Esta regra será permanentemente excluída." + }, + "confirmDeleteBulk": { + "title_one": "Eliminar {{count}} regra", + "title_other": "Eliminar {{count}} regras", + "title_many": "Eliminar {{count}} regras", + "message_one": "Tem certeza de que deseja eliminar {{count}} regra? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja eliminar {{count}} regras? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja eliminar {{count}} regras? Isto não pode ser desfeito." + }, + "confirmDeleteFolder": { + "title": "Eliminar pasta", + "message_one": "Isto eliminará a pasta, suas subpastas, e a {{count}} regra dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto eliminará a pasta, suas subpastas, e as {{count}} regras dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto eliminará a pasta, suas subpastas, e as {{count}} regras dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto eliminará a pasta e tudo dentro dela. Isto não pode ser desfeito." + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá as seguintes regras para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará as seguintes regras para {{targetVaultName}}:" + }, + "bulk": { + "duplicateRules": "Duplicar {{count}} regras", + "exportRules": "Exportar {{count}} regras", + "deleteRules": "Eliminar {{count}} regras" + } + }, + "ruleCard": { + "pause": "Pausar", + "resume": "Retomar", + "openWebLink": "Abrir link web", + "activateInSession": "Ativar na sessão", + "duplicate": "Duplicar", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "active": "Ativa", + "error": "Erro", + "stopped": "Parada", + "noSshSession": "Nenhuma sessão SSH", + "openUrl": "Abrir {{url}}", + "scopedToConnections_one": "Escopo para {{count}} conexão", + "scopedToConnections_other": "Escopo para {{count}} conexões", + "scopedToConnections_many": "Escopo para {{count}} conexões", + "connectionsCount_one": "{{count}} conexão", + "connectionsCount_other": "{{count}} conexões", + "connectionsCount_many": "{{count}} conexões" + }, + "activeTunnels": { + "sectionTitle": "Encaminhamentos da sessão ativa", + "tunnelCount_one": "{{count}} túnel", + "tunnelCount_other": "{{count}} túneis", + "tunnelCount_many": "{{count}} túneis", + "forwardCount_one": "{{count}} encaminhamento", + "forwardCount_other": "{{count}} encaminhamentos", + "forwardCount_many": "{{count}} encaminhamentos", + "errorCount": "{{count}} erro", + "activeCountLabel": "{{count}} ativos", + "connected": "Conectado", + "local": "Local", + "remote": "Remoto", + "socks5": "SOCKS5", + "auto": "Auto", + "adHoc": "Ad-hoc", + "portLabel": "Porta {{port}}", + "socksPortLabel": "SOCKS5 :{{port}}", + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "openUrl": "Abrir {{url}}" + }, + "ruleForm": { + "editRule": "Editar Regra", + "newRule": "Nova Regra", + "general": "Geral", + "name": "Nome", + "namePlaceholder": "Meu túnel", + "description": "Descrição", + "descriptionPlaceholder": "Servidor de dev, proxy de banco de dados…", + "type": "Tipo", + "tunnelTypes": { + "local": { + "label": "Local", + "title": "Túnel local", + "summary": "Abra algo do servidor SSH na sua própria máquina." + }, + "remote": { + "label": "Remoto", + "title": "Túnel remoto", + "summary": "Expõe algo da sua máquina no servidor SSH." + }, + "dynamic": { + "label": "Dinâmico", + "title": "Proxy SOCKS dinâmico", + "summary": "Cria um proxy SOCKS5 local que envia o tráfego do aplicativo através do servidor SSH." + } + }, + "route": "Rota", + "yourComputer": "Seu computador", + "sshServer": "Servidor SSH", + "service": "Serviço", + "anyDestination": "Qualquer destino", + "anyDestinationHelp": "Cada aplicativo escolhe para onde ir. O tráfego sai do servidor SSH.", + "listenPort": "Ouvir na porta", + "socksPort": "Porta do proxy SOCKS", + "whoCanConnect": "Quem pode se conectar", + "audience": { + "thisComputer": "Este computador", + "serverOnly": "Apenas servidor", + "network": "Rede", + "custom": "Personalizado", + "customAddress": "Endereço para ouvir" + }, + "sharedWarning": { + "computer": "Outros dispositivos que alcançam este endereço podem usar o túnel.", + "server": "Qualquer pessoa que alcançar este endereço no servidor pode usar o túnel." + }, + "host": "Host", + "port": "Porta", + "throughTunnel": "através do túnel", + "reaches": "alcança", + "backThroughTunnel": "de volta através do túnel", + "summary": { + "incomplete": "Preencha as portas para ver para onde o tráfego vai.", + "local": "Abra {{listener}} neste computador para alcançar {{target}} como o servidor SSH vê.", + "localShared": "Dispositivos na rede abrem {{listener}} para alcançar {{target}} como o servidor SSH vê.", + "remote": "O servidor SSH ouve em {{listener}} e envia cada conexão para {{target}} neste computador.", + "dynamic": "Aplicativos usando {{listener}} como um proxy SOCKS5 navegam a partir do servidor SSH.", + "dynamicShared": "Dispositivos usando {{listener}} como um proxy SOCKS5 navegam a partir do servidor SSH.", + "anyAddress": "", + "anyHost": "", + "copyCommand": "Copiar comando" + }, + "applyTo": "Aplicar a", + "allConnections": "Todas as conexões", + "specificConnections": "Específica", + "noSavedConnections": "Nenhuma conexão guardada.", + "removeHost": "Remover {{name}}" + } + } +} diff --git a/src/i18n/locales/pt-PT/settings.json b/src/i18n/locales/pt-PT/settings.json new file mode 100644 index 000000000..074befca1 --- /dev/null +++ b/src/i18n/locales/pt-PT/settings.json @@ -0,0 +1,1553 @@ +{ + "settings": { + "terminal": { + "heading": "Comportamento do terminal", + "preferredShell": { + "title": "Shell preferido" + }, + "scrollback": { + "title": "Histórico do terminal", + "desc": "Linhas mantidas por sessão de terminal. Aplica-se a novos terminais.", + "option": "{{count}} linhas" + }, + "cursorStyle": { + "title": "Estilo do cursor", + "desc": "Forma do cursor do terminal.", + "bar": "Barra", + "block": "Bloco", + "underline": "Sublinhado" + }, + "cursorBlink": { + "title": "Cursor piscante", + "desc": "Fazer o cursor do terminal piscar." + }, + "minimap": { + "title": "Minimapa de rolagem", + "desc": "Mostrar uma visão geral em miniatura do histórico ao lado dos terminais." + }, + "selectToCopy": { + "title": "Selecionar para copiar", + "desc": "Copiar o texto para a área de transferência assim que você o seleciona em um terminal." + }, + "dragSelectsText": { + "title": "Arrastar seleciona texto", + "desc": "Selecionar texto com um arrasto simples mesmo quando um programa (tmux, vim, htop) está capturando o mouse. Um clique ainda chega ao programa; segure Ctrl ao arrastar para enviar o arrasto a ele." + }, + "ignoreBracketedPaste": { + "title": "Colagem simples (sem colagem entre colchetes)", + "desc": "Colar como texto simples, sem os marcadores \\x1b[200~ / \\x1b[201~. Corrige entradas corrompidas (ex.: \"200~\") ao colar em prompts do sudo ou em aplicativos de CLI que não oferecem suporte à colagem entre colchetes." + }, + "pasteImageAsPath": { + "title": "Colar imagens como caminho de ficheiro", + "desc": "Quando a área de transferência contém uma imagem, enviá-la ao host SSH (~/.cache/voltius/pastes, somente para o proprietário, removida após 7 dias) e colar o caminho dela. Permite que ferramentas no host, como o Claude Code, anexem uma captura de tela. Se você fizer SSH a partir dali, o caminho aponta para este primeiro host." + }, + "volumeDownCtrl": { + "title": "Usar Volume Down como Ctrl", + "desc": "Ao digitar em um terminal, segure o botão Volume Down para adicionar Ctrl às teclas que pressiona: Volume Down + C envia Ctrl+C. Fora de um terminal, o botão altera o volume normalmente." + }, + "keywordHighlight": { + "title": "Destaque de palavras-chave", + "desc": "Colorir palavras como “error” ou “warning” na saída de comandos. Funciona em sessões com integração de shell.", + "addRule": "Adicionar regra", + "deleteRule": "Eliminar regra", + "ruleEnabled": "Ativar regra", + "color": "Cor", + "wordsPlaceholder": "Adicionar uma palavra…", + "removeWord": "Remover {{word}}" + } + }, + "appearance": { + "themeActions": "Ações do tema", + "interface": "Interface", + "language": { + "title": "Idioma" + }, + "groupTabsByHost": { + "title": "Agrupar abas por host", + "desc": "Sessões no mesmo host compartilham uma aba. Passe o mouse para alternar entre elas." + }, + "colorTheme": "Tema de cores", + "import": "Importar", + "importTitle": "Importar tema(s)", + "exportAll": "Exportar todos", + "exportAllTitle": "Exportar todos os temas personalizados", + "exportTheme": "Exportar tema", + "editTheme": "Editar tema", + "deleteTheme": "Eliminar tema", + "newCustomTheme": "Novo tema personalizado", + "dynamicThemeHint": "A partir do seu papel de parede", + "uiScale": { + "clickHintMobile": "Toque para inserir um valor", + "title": "Escala da interface", + "desc": "Aumentar ou reduzir o zoom de toda a interface.", + "clickHint": "Clique para inserir um valor", + "zoomOut": "Reduzir zoom", + "zoomIn": "Aumentar zoom", + "resetTitle": "Redefinir escala", + "reset": "Redefinir" + }, + "terminalFontSize": { + "clickHintMobile": "Toque para inserir um valor", + "title": "Tamanho da fonte do terminal", + "desc": "Ajustar o texto do terminal separadamente, sem escalar o restante da interface.", + "clickHint": "Clique para inserir um valor", + "zoomOut": "Texto menor", + "zoomIn": "Texto maior", + "resetTitle": "Seguir o tamanho da fonte do tema", + "reset": "Redefinir" + }, + "automation": { + "themeMode": "Modo automático de tema", + "title": "Tema automático", + "desc": "Alternar automaticamente entre um tema claro e um escuro", + "lightTheme": "Tema claro", + "darkTheme": "Tema escuro", + "mode": "Modo", + "modeManual": "Manual", + "modeSystem": "Seguir o sistema", + "modeSchedule": "Agenda", + "modeSunset": "Nascer / pôr do sol", + "lightStarts": "Início do claro", + "darkStarts": "Início do escuro", + "useMyLocation": "Usar minha localização", + "latitude": "Latitude", + "longitude": "Longitude", + "sunToday": "Hoje: nascer {{sunrise}}, pôr do sol {{sunset}}", + "locationNeeded": "Defina uma localização para usar o nascer/pôr do sol" + } + }, + "nav": { + "appearance": { + "mobileSub": "Tema, escala, idioma", + "label": "Aparência", + "keywords": [ + "tema", + "cor", + "fonte", + "interface" + ] + }, + "account": { + "mobileSub": "Modo da conta, bloqueio do aplicativo", + "label": "Conta", + "keywords": [ + "perfil", + "login", + "autenticação" + ] + }, + "sync": { + "mobileSub": "Sincronização na nuvem e o que é sincronizado", + "label": "Sincronização", + "keywords": [ + "cópia de segurança", + "nuvem", + "gist", + "sincronização", + "pro" + ] + }, + "plugins": { + "mobileSub": "Plugins instalados e o catálogo", + "label": "Plugins", + "keywords": [ + "extensões", + "complementos", + "marketplace" + ] + }, + "integrations": { + "mobileSub": "Servidor MCP para agentes de IA", + "label": "Integrações", + "keywords": [ + "mcp", + "claude", + "claude code", + "servidor", + "socket", + "agente" + ] + }, + "terminal": { + "mobileSub": "Cursor, histórico, colagem", + "label": "Terminal", + "keywords": [ + "histórico", + "cursor", + "colagem", + "colchetes", + "cópia", + "minimapa", + "buffer" + ] + }, + "sftp": { + "mobileSub": "Downloads, transferências, editor", + "label": "SFTP", + "keywords": [ + "ficheiro", + "transferência", + "ftp", + "ficheiros" + ] + }, + "portForwarding": { + "mobileSub": "Encaminhamento automático", + "label": "Encaminhamento de portas", + "keywords": [ + "túnel", + "encaminhar", + "portas", + "ssh", + "auto" + ] + }, + "hosts": { + "mobileSub": "Alcance, keepalive, proxy", + "label": "Hosts", + "keywords": [ + "ping", + "alcance", + "conectividade", + "status" + ] + }, + "shortcuts": { + "label": "Atalhos", + "keywords": [ + "tecla", + "atalho", + "combinação", + "remarcar", + "teclado" + ] + }, + "diagnostics": { + "mobileSub": "Logs e relatórios de bugs", + "label": "Diagnósticos", + "keywords": [ + "diagnóstico", + "bug", + "relatório", + "log", + "depuração", + "problema" + ] + }, + "about": { + "mobileSub": "Versão e links", + "label": "Sobre", + "keywords": [ + "versão", + "atualização", + "lançamento", + "changelog" + ] + } + }, + "chrome": { + "title": "Configurações", + "close": "Fechar configurações", + "back": "Voltar", + "openHint": "Ctrl+, para abrir", + "expandPluginGroup": "Expandir configurações do plugin", + "collapsePluginGroup": "Recolher configurações do plugin" + }, + "shared": { + "reset": "Redefinir", + "rowActions": "Ações da configuração", + "sync": { + "label": "Sincronizar esta configuração", + "on": "Sincronizada entre seus dispositivos", + "off": "Mantida neste dispositivo", + "deviceDefault": "Mantida neste dispositivo por padrão" + }, + "cancel": "Cancelar", + "resetToDefault": "Redefinir para o padrão", + "modifiedFromDefault": "Modificada em relação ao padrão" + }, + "account": { + "modeTitle": "Modo da conta", + "currentMode": "Modo atual", + "mode": { + "localNoPassword": "Local (chaveiro do SO)", + "local": "Local (palavra-passe mestra)", + "server": "Conta na nuvem", + "unknown": "Desconhecido" + }, + "sessionSecurity": { + "title": "Segurança da sessão", + "autoLockLabel": "Bloqueio automático após inatividade", + "autoLockDesc": "Bloqueia o Voltius após esse período de inatividade, ou assim que você sai do aplicativo.", + "timeout": { + "never": "Nunca", + "5min": "5 minutos", + "15min": "15 minutos", + "30min": "30 minutos", + "1h": "1 hora", + "4h": "4 horas", + "immediately": "Imediatamente" + }, + "lockAction": { + "label": "Ao bloquear", + "vault": "Bloquear cofre (fechar sessões)", + "screen": "Bloquear tela (manter sessões em execução)", + "vaultDesc": "Remove a chave do cofre da memória. As sessões abertas fecham e o Voltius recarrega.", + "screenDesc": "Cobre o Voltius enquanto sessões, encaminhamentos de portas e transferências continuam em execução." + }, + "systemAuth": { + "toggle": "Desbloquear com autenticação do sistema", + "desc": "Use {{method}} em vez de digitar sua palavra-passe mestra.", + "unavailable": "Não disponível neste dispositivo.", + "status": { + "bound": "Vinculada ao hardware deste dispositivo.", + "unbound": "Ainda não vinculada ao hardware deste dispositivo.", + "os-login": "Protegida pelo login do seu dispositivo.", + "no-password": "Protegida pelo login do seu dispositivo. Defina uma palavra-passe mestra para vincular a chave ao hardware deste dispositivo." + }, + "bindNow": "Vincular agora", + "confirm": "Confirmar", + "enableTitle": "Vincular a chave do cofre a este dispositivo", + "enableBody": "Digite sua palavra-passe mestra. Você precisará dela se o login deste dispositivo mudar.", + "disableTitle": "Desativar a autenticação do sistema", + "disableBody": "Digite sua palavra-passe mestra para continuar desbloqueando na inicialização sem um prompt.", + "method": { + "windows": "Windows Hello", + "macos": "Touch ID ou a palavra-passe do seu Mac", + "linux": "a palavra-passe do seu sistema", + "android": "sua impressão digital ou bloqueio de tela" + } + }, + "needsSystemAuth": "Ative a autenticação do sistema para bloquear uma conta sem palavra-passe mestra.", + "immediateVaultWarning": "Com Bloquear cofre, sair do Voltius, mesmo brevemente, fecha suas sessões abertas. Bloquear tela mantém as sessões em execução.", + "policy": { + "timeout": "Definido por {{teams}}: no máximo {{duration}}.", + "timeoutImmediately": "Definido por {{teams}}: bloquear assim que você sair do Voltius.", + "vault": "Definido por {{teams}}: Bloquear cofre é obrigatório.", + "yourTeam": "sua equipe" + } + }, + "email": "E-mail", + "editEmail": { + "title": "Alterar e-mail", + "currentLabel": "Atual:", + "newPlaceholder": "Novo endereço de e-mail", + "passwordPlaceholder": "Palavra-passe mestra atual", + "errorInvalidEmail": "Endereço de e-mail inválido", + "errorSameEmail": "O novo e-mail deve ser diferente do atual", + "errorPasswordRequired": "A palavra-passe é obrigatória para confirmar a alteração", + "pausedNote": "Até a verificação, os recursos pagos ficarão pausados.", + "done": "Concluído", + "saving": "A guardar…", + "save": "Guardar", + "toastVerification": "E-mail de verificação enviado para {{email}}.", + "updated": "E-mail atualizado para {{email}}. Verifique sua caixa de entrada para um link de verificação." + }, + "handle": { + "title": "Identificador", + "copy": "Copiar", + "copied": "Copiado", + "choose": "Escolha um identificador", + "change": "Alterar identificador", + "chooseSub": "Um identificador personalizado permite que você seja encontrado por pessoas fora das suas equipes.", + "generatedNote": "Seu identificador atual já funciona para qualquer pessoa a quem você o fornecer.", + "unverified": "Verifique seu e-mail para escolher um identificador personalizado.", + "managed": "Gerenciado pela sua organização. Peça ao administrador para alterá-lo.", + "placeholder": "seu-identificador", + "inputLabel": "Identificador", + "save": "Guardar", + "errorInvalid": "Os identificadores só podem conter letras, números e hífens.", + "errorTaken": "Esse identificador já está em uso.", + "errorEmailNotVerified": "Verifique seu e-mail primeiro e depois escolha seu identificador.", + "errorCooldown": "Você poderá alterar seu identificador novamente em breve.", + "errorGeneric": "Não foi possível atualizar seu identificador." + }, + "strangerInvites": { + "label": "Permitir convites de qualquer pessoa", + "desc": "Permitir que pessoas fora das suas equipes o convidem para um terminal compartilhado por @identificador ou e-mail." + }, + "changeMasterPassword": { + "label": "Alterar palavra-passe mestra", + "sub": "Atualize sua palavra-passe sem recriptografar seu cofre", + "title": "Alterar palavra-passe mestra", + "currentPlaceholder": "Palavra-passe atual", + "verifyWithDevice": "Esqueceu? Confirme com {{method}} em vez disso", + "verifiedWithDevice": "Confirmado neste dispositivo", + "deviceReason": "Confirme para alterar sua palavra-passe mestra", + "deviceFailed": "Este dispositivo não conseguiu confirmar sua identidade. Digite sua palavra-passe atual em vez disso.", + "deviceSignedOut": "Este dispositivo foi desconectado, provavelmente após uma alteração de palavra-passe em outro dispositivo. Entre novamente com a nova palavra-passe.", + "newPlaceholder": "Nova palavra-passe (mín. 8 caracteres)", + "confirmPlaceholder": "Confirme a nova palavra-passe", + "errorCurrentRequired": "A palavra-passe atual é obrigatória", + "errorMinLength": "A nova palavra-passe deve ter pelo menos 8 caracteres", + "errorSamePassword": "A nova palavra-passe deve ser diferente da atual", + "successMsg": "Palavra-passe alterada com sucesso.", + "successNote": "Você continua conectado. Os itens do seu cofre não foram alterados.", + "done": "Concluído", + "changing": "A alterar…", + "changeBtn": "Alterar palavra-passe" + }, + "twoFactor": { + "label": "Autenticação de dois fatores", + "subOff": "Pedir um código ou uma passkey ao entrar em um novo dispositivo", + "subOn": "Ativada. Entrar em um novo dispositivo pede uma segunda etapa", + "intro": "Depois da sua palavra-passe mestra, entrar em um novo dispositivo pedirá uma segunda etapa. Escolha uma; você pode adicionar a outra depois.", + "introDevices": "Ativar isso desconecta seus outros dispositivos. Eles precisam de uma versão recente do Voltius para entrar novamente.", + "continue": "Continuar", + "scan": "Escaneie isto com seu aplicativo autenticador, ou digite a chave abaixo nele.", + "qrLabel": "Código QR para seu aplicativo autenticador", + "copyKey": "Copiar chave", + "confirmPrompt": "Depois, digite o código de 6 dígitos que ele mostra.", + "turnOn": "Ativar", + "codesTitle": "Salve seus códigos de recuperação", + "codesBody": "Cada código permite entrar uma vez se você perder seu autenticador ou passkey. Eles não são mostrados novamente.", + "copy": "Copiar", + "copied": "Copiado", + "save": "Guardar em ficheiro", + "saved": "Eu os salvei", + "manageBody": "Entrar em um novo dispositivo pede um destes após sua palavra-passe mestra.", + "newCodes": "Novos códigos de recuperação", + "newCodesSub": "Os atuais deixam de funcionar", + "turnOff": "Desativar", + "turnOffSub": "Entrar apenas com a palavra-passe mestra", + "generate": "Gerar", + "regeneratePrompt": "Confirme com um segundo fator para substituir seus códigos de recuperação.", + "disablePrompt": "Digite sua palavra-passe mestra e confirme com um segundo fator para desativar a autenticação de dois fatores.", + "authenticator": "Aplicativo autenticador", + "authenticatorSub": "Códigos de 6 dígitos de um aplicativo no seu celular", + "authenticatorOn": "Ativado", + "authenticatorIntro": "Entrar em um novo dispositivo pedirá um código de 6 dígitos de um aplicativo autenticador.", + "passkey": "Passkey", + "passkeys": "Passkeys", + "passkeySub": "Impressão digital, rosto ou uma chave de segurança, pelo seu navegador", + "passkeyIntro": "O Voltius abre seu navegador para criar a passkey e depois traz você de volta aqui.", + "passkeyName": "Nome, por exemplo Notebook", + "passkeyCreate": "Continuar no navegador", + "passkeyAdd": "Adicionar uma passkey", + "passkeyAdded": "Adicionada em {{date}}", + "passkeyUsed": "usada por último em {{date}}", + "passkeyRemove": "Remover {{name}}", + "remove": "Remover", + "removeAuthenticatorPrompt": "Digite sua palavra-passe mestra e confirme com um segundo fator para remover o aplicativo autenticador.", + "removePasskeyPrompt": "Digite sua palavra-passe mestra e confirme com um segundo fator para remover a passkey “{{name}}”.", + "lastFactor": "Este é seu único segundo fator. Removê-lo desativa a autenticação de dois fatores e desconecta seus outros dispositivos.", + "codesLeft": "Códigos não utilizados: {{count}}", + "back": "Voltar" + }, + "setMasterPassword": { + "label": "Definir uma palavra-passe mestra", + "sub": "Proteja seu cofre localmente sem sincronização na nuvem" + }, + "lockVault": { + "label": "Bloquear agora", + "sub": "Bloqueia o Voltius com a ação escolhida acima" + }, + "signOut": { + "label": "Sair da conta na nuvem", + "sub": "Limpa a palavra-passe em cache e os tokens de sincronização" + }, + "wipeData": { + "label": "Apagar todos os dados locais", + "sub": "Exclui permanentemente todas as conexões, chaves, cofre e entradas do chaveiro" + }, + "confirmWipe": { + "confirm": "Apagar tudo", + "desc": "Isso eliminará permanentemente todos os dados locais: conexões, chaves SSH, identidades, segredos do cofre e entradas do chaveiro do SO. Isso não pode ser desfeito." + }, + "setPassword": { + "desc": "Escolha uma palavra-passe mestra. Seus dados existentes serão reencriptados.", + "newPlaceholder": "Nova palavra-passe mestra", + "confirmPlaceholder": "Confirme a palavra-passe", + "submit": "Definir palavra-passe" + }, + "error": { + "minLength": "Pelo menos 4 caracteres", + "mismatch": "As palavras-passe não coincidem", + "updateFailed": "Falha na atualização" + }, + "success": { + "passwordSet": "Palavra-passe mestra definida. Seu cofre agora está protegido por palavra-passe." + }, + "loading": "A trabalhar...", + "plan": { + "title": "Plano", + "badge": { + "business": "Business", + "teams": "Teams", + "proTrial": "Teste Pro — {{daysLeft}}d restantes", + "pro": "Pro", + "free": "Grátis" + }, + "manageBilling": "Gerenciar cobrança →", + "subscription": { + "cancelled": "Cancela em {{date}}. Você mantém o acesso até lá.", + "cancelledNoPeriod": "Cancela no fim do período. Você mantém o acesso até lá.", + "renews": "Renova em {{date}}.", + "active": "Sua assinatura está ativa." + }, + "seats": "Assentos", + "seatsUsed": "{{used}} / {{total}} usados", + "upgradeToPro": "Atualize para desbloquear a sincronização na nuvem e mais", + "upgrade": "Atualizar", + "upgradeToTeams": "Experimente o Teams grátis por {{days}} dias: cofres compartilhados e funções para sua equipe. Cartão obrigatório.", + "teamsButton": "Experimentar grátis →", + "viewAllPlans": "Ver todos os planos →", + "feature": { + "localVault": "Cofre local", + "auditLogs": "Registros de auditoria", + "gistSync": "Sincronização com GitHub Gist", + "realtimeSync": "Sincronização em nuvem em tempo real", + "unlimitedVaults": "Cofres privados ilimitados", + "terminalSharing": "Compartilhamento de terminal (1 sessão · 1 convidado)", + "teamVaults": "Cofres de equipe compartilhados", + "teamSharing": "Compartilhamento em equipe (5 sessões · 10 convidados)", + "seats": "Assentos (conforme adquiridos)", + "lockPolicy": "Política de bloqueio da equipe (limite de bloqueio automático, Bloquear cofre)", + "granularPermissions": "Funções personalizadas, permissões por membro e por objeto" + } + }, + "buySeats": { + "title": "Nenhum assento disponível", + "seatsUsed": "{{used}} / {{total}} assentos usados", + "inviting": "A convidar", + "additionalSeats": "Assentos adicionais", + "seatsTotal": "{{from}} → {{to}} no total", + "priceRow_one": "{{count}} assento × ${{price}}/mês", + "priceRow_many": "{{count}} assentos × ${{price}}/mês", + "priceRow_other": "{{count}} assentos × ${{price}}/mês", + "totalPerMonth": "${{amount}}/mês", + "proratedNote": "Cobrança proporcional aplicada imediatamente para o período de cobrança atual.", + "processing": "A processar…", + "buyAndInvite_one": "Comprar {{count}} assento e convidar", + "buyAndInvite_many": "Comprar {{count}} assentos e convidar", + "buyAndInvite_other": "Comprar {{count}} assentos e convidar", + "errorNotConnected": "Não conectado ao servidor", + "errorNoSubscription": "Nenhuma assinatura ativa encontrada", + "errorUpdateSeats": "Falha ao atualizar os assentos: {{status}}" + } + }, + "diagnostics": { + "intro": "Problemas com o Voltius? Crie um relatório e envie ao desenvolvedor — isso ajuda a rastrear bugs difíceis de reproduzir.", + "troubleshootingTitle": "Solução de problemas", + "verboseLabel": "Log detalhado (esta sessão)", + "verboseSub": "Registra detalhes extras para ajudar a diagnosticar problemas. Volta ao normal quando você reinicia o Voltius.", + "verboseHint": "O log detalhado está ativado. Para capturar o problema:\n1. Reproduza o problema agora\n2. Volte e crie um relatório de bug", + "reportTitle": "Relatório de bug", + "createButton": "Criar relatório de bug", + "creatingButton": "Coletando logs…", + "createdButton": "Relatório guardado", + "reportSub": "Inclui logs do aplicativo e informações do sistema. Nunca inclui suas palavras-passe, chaves ou conteúdo do terminal.", + "whatsIncluded": "O que está incluído?", + "includedBody": "Incluído:\n• Logs do aplicativo (o que o Voltius estava fazendo, com valores sensíveis removidos)\n• Versão do aplicativo, sistema operacional e plugins ativos\nNÃO incluído:\n• Palavras-passe, conteúdo do cofre ou chaves privadas\n• Saída do terminal ou qualquer coisa que você digitou\nO relatório é guardado no seu computador. Nada é enviado automaticamente — você escolhe onde compartilhá-lo.", + "toastSaved": "Relatório guardado — {{name}}", + "toastError": "Não foi possível criar o relatório: {{reason}}", + "toastGenericError": "Algo deu errado." + }, + "integrations": { + "mcp": { + "title": "MCP", + "sub": "Permite que clientes MCP locais (como o Claude Code) executem comandos, leiam, gravem e excluam ficheiros em todos os hosts do seu cofre e neste computador, criem, alterem ou excluam conexões, chaves e identidades guardadas, executem seus snippets guardados nesses hosts, autorizem chaves de host SSH, leiam os comandos que você digitou, vejam, cancelem ou repitam suas transferências de ficheiros, vejam quais dos seus hosts guardados estão acessíveis, reorganizem suas abas de terminal e painéis divididos, gerenciem a associação e os convites da sua equipe, compartilhem suas sessões de terminal com sua equipe ou transfiram o controle delas, leiam e alterem todas as configurações deste aplicativo e leiam sua assinatura, por meio de um socket privado. A aprovação acontece nesse cliente, não no Voltius. Desativado por padrão. Também pode instalar, atualizar e remover plugins, e exportar ou importar seus objetos guardados.", + "running": "Em execução", + "quickSetup": { + "title": "Configuração rápida", + "help": "Configura todos os agentes de IA que detectar neste computador, sem tocar nas suas outras configurações. Requer Node.js." + }, + "manualSetup": { + "toggleLabel": "Configuração manual", + "toggleSub": "Node.js não instalado ou seu cliente não é compatível com o comando acima? Configure-o manualmente abaixo." + }, + "setup": { + "title": "Configuração do cliente", + "clientLabel": "Cliente MCP", + "clients": { + "claudeCode": "Claude Code", + "mcpServers": "Claude Desktop / Cursor / Cline / Windsurf", + "vscode": "VS Code / GitHub Copilot", + "opencode": "OpenCode" + }, + "help": { + "claudeCode": "Execute isto uma vez para registrar o Voltius no Claude Code. O servidor precisa estar habilitado acima para que um cliente se conecte.", + "mcpServers": "Adicione este bloco ao claude_desktop_config.json (Claude Desktop) ou .cursor/mcp.json (Cursor, Cline, Windsurf). O servidor precisa estar habilitado acima para que um cliente se conecte.", + "vscode": "Adicione este bloco ao .vscode/mcp.json. O VS Code usa \"servers\", não \"mcpServers\" — colar um bloco no estilo do Cursor aqui não carrega nada silenciosamente.", + "opencode": "Adicione este bloco ao opencode.json (projeto) ou ~/.config/opencode/opencode.json (global)." + }, + "exePathLabel": "Caminho do executável", + "socketLabel": "Caminho do socket", + "copied": "Copiado" + }, + "plugins": { + "title": "Ferramentas de plugins expostas aos clientes", + "sub": "Plugins instalados podem adicionar seus próprios comandos ao servidor MCP. Desative um para mantê-lo fora da lista de ferramentas sem desinstalá-lo.", + "empty": "Nenhum plugin instalado expõe ferramentas.", + "count_one": "{{count}} ferramenta", + "count_many": "{{count}} ferramentas", + "count_other": "{{count}} ferramentas" + } + } + }, + "mcp": { + "consequence": { + "autoUpdate": "Desativa o download automático de atualizações, então as correções de segurança deixam de chegar sozinhas.", + "pluginInstallReview": "Desativa a tela de consentimento mostrada antes de instalar um plugin. Um plugin que pede uma permissão sensível ainda a mostrará.", + "sessionTimeout": "Desativa ou aumenta o bloqueio automático.", + "lockAction": "Muda o bloqueio para um bloqueio de tela que mantém a chave do cofre na memória.", + "systemAuthUnlock": "Permite que o login do dispositivo desbloqueie o Voltius, mantendo a chave do cofre no chaveiro do sistema enquanto bloqueado." + } + }, + "about": { + "versionTitle": "Versão", + "loading": "A carregar…", + "updatesTitle": "Atualizações", + "checkForUpdate": "Verificar atualizações", + "restartToUpdate": "Reiniciar para atualizar · v{{version}}", + "downloadUpdate": "Baixar atualização · v{{version}}", + "status": { + "idle": "Ainda não verificado", + "checking": "A verificar atualizações…", + "upToDate": "Você está atualizado", + "downloading": "A transferir v{{version}} — {{progress}}%", + "ready": "v{{version}} pronta para instalar", + "available": "v{{version}} disponível" + }, + "autoDownload": { + "title": "Baixar atualizações automaticamente", + "desc": "Baixar novas versões em segundo plano. O Voltius as verifica de qualquer forma." + }, + "whatsNew": { + "title": "Mostrar novidades após atualizações", + "desc": "Abrir o changelog automaticamente em um novo lançamento" + }, + "linksTitle": "Links", + "links": { + "github": "GitHub", + "documentation": "Documentação", + "x": "X", + "kofi": "Ko-Fi", + "contact": "Contato" + }, + "reportBug": "Relatar um bug" + }, + "sync": { + "voltiusCloud": "Voltius Cloud", + "active": { + "title": "Sincronização na nuvem ativa", + "syncing": "A sincronizar…", + "error": "Erro: {{error}}", + "lastSync": "Última sincronização: {{time}}", + "offline": "Não é possível alcançar o servidor", + "offlineDetail": "Não é possível alcançar o servidor: {{error}}", + "idle": "Ainda não sincronizado", + "paused": "Pausada neste dispositivo", + "syncNow": "Sincronizar agora" + }, + "pause": { + "label": "Pausar sincronização neste dispositivo", + "sub": "Interrompe a sincronização em segundo plano com o servidor. Os cofres de equipe param de atualizar e não carregam na inicialização até você retomar. Sincronizar agora sincroniza apenas seus próprios dados." + }, + "requiresPro": { + "title": "Sincronização na nuvem", + "sub": "Requer uma assinatura Pro", + "upgrade": "Atualizar" + }, + "notConnected": { + "title": "Conta na nuvem não conectada", + "sub": "Entre ou crie uma conta na nuvem para sincronizar entre dispositivos.", + "signIn": "Entrar" + }, + "providersTitle": "Plugins de sincronização", + "prefsTitle": "Preferências de sincronização", + "prefsFooter": "Os tipos desativados nunca são enviados. Objetos individuais também podem ser eliminados do painel de edição deles.", + "quickToggleLabel": "Sincronizar {{label}}", + "objectType": { + "connection": { + "label": "Hosts", + "sub": "Conexões SSH" + }, + "identity": { + "label": "Identidades", + "sub": "Nomes de utilizador e credenciais" + }, + "key": { + "label": "Chaves SSH", + "sub": "Pares de chaves armazenados no chaveiro" + }, + "folder": { + "label": "Pastas", + "sub": "Estrutura de pastas para organizar objetos" + }, + "snippet": { + "label": "Snippets", + "sub": "Comandos e scripts guardados" + }, + "port-forwarding-rule": { + "label": "Encaminhamento de portas", + "sub": "Regras de túnel guardadas" + } + }, + "settingsTitle": "Configurações", + "settingsFooter": "Tudo o que estiver desativado fica neste dispositivo. Nunca é enviado, nem encriptado. Reativar a sincronização publica os valores deste dispositivo.", + "settingDomain": { + "themes": { + "label": "Temas", + "sub": "Tema ativo e temas personalizados" + }, + "uiPreferences": { + "label": "Interface", + "sub": "Escala, layouts e ordem de classificação" + }, + "shortcuts": { + "label": "Atalhos", + "sub": "Substituições de teclado" + }, + "appSettings": { + "label": "Configurações do aplicativo", + "sub": "Terminal, SFTP, plugins, idioma" + }, + "recentPeople": { + "label": "Pessoas recentes", + "sub": "Quem você convidou ultimamente" + } + }, + "settingKey": { + "preferredShell": "Shell padrão", + "pluginOverrides": "Plugins habilitados", + "themeLocation": "Localização do nascer/pôr do sol" + }, + "keyButton": { + "hold": "Manter esta configuração neste dispositivo", + "resume": "Não sincronizada — clique para sincronizar esta configuração novamente", + "deviceDefault": "Não sincronizada: específica deste dispositivo. Clique para sincronizá-la mesmo assim.", + "domainOff": "A sincronização está desativada para todo este grupo" + }, + "heldBack": { + "summary": "Mantidas neste dispositivo: {{count}}", + "deviceDefault": "padrão do dispositivo", + "yourChoice": "sua escolha", + "resume": "Retomar sincronização" + } + }, + "vaults": { + "general": { + "renameFailedToast": "Não foi possível renomear este cofre. {{reason}}", + "vaultNameLabel": "Nome do cofre", + "save": "Guardar", + "makePrivate": { + "title": "Tornar privado", + "confirmAll": "Remover todos os membros e tornar privado?", + "confirm_one": "Remover {{count}} membro e tornar privado?", + "confirm_many": "Remover {{count}} membros e tornar privado?", + "confirm_other": "Remover {{count}} membros e tornar privado?", + "converting": "Convertendo…", + "confirmBtn": "Confirmar", + "copyFailedToast": "Não foi possível copiar tudo da equipe — nada foi eliminado, e este ainda é um cofre de equipe.", + "removeMembersFailedToast": "Não foi possível remover os membros — este ainda é um cofre de equipe. {{reason}}", + "failedToast": "Não foi possível tornar este cofre privado — {{reason}}" + }, + "deleteVault": { + "title": "Eliminar cofre", + "confirmDesc": "Exclui permanentemente este cofre e seus {{count}} itens. Isso não pode ser desfeito.", + "confirmDescTeam": "Exclui permanentemente este cofre e seus {{count}} itens para todos os membros. Isso não pode ser desfeito.", + "confirmBtn": "Confirmar exclusão", + "deleting": "A eliminar…", + "failedToast": "Não foi possível concluir a exclusão deste cofre — ele ainda está aqui, mas alguns de seus itens podem já ter sido removidos. {{reason}}", + "teamFailedToast": "Não foi possível eliminar este cofre — nada foi eliminado. {{reason}}" + }, + "madePrivateToast_one": "O cofre agora é privado. {{count}} membro perdeu o acesso.", + "madePrivateToast_many": "O cofre agora é privado. {{count}} membros perderam o acesso.", + "madePrivateToast_other": "O cofre agora é privado. {{count}} membros perderam o acesso.", + "madePrivateToastEmpty": "O cofre agora é privado." + }, + "rolesPanel": { + "permGroup": { + "administration": "Administração", + "dataAccess": "Acesso aos dados", + "connectionManagement": "Gerenciamento de conexões", + "teamAdministration": "Administração da equipe", + "terminalSessions": "Sessões de terminal" + }, + "perm": { + "VIEW": "Ver um objeto", + "ADMINISTRATOR": "Todas as permissões em todos os objetos, independentemente de suas regras", + "VIEW_SECRETS": "Ver palavras-passe e chaves privadas em texto simples", + "COPY_SECRETS": "Copiar palavras-passe e chaves para a área de transferência", + "CONNECT": "Iniciar conexões SSH", + "EDIT_CONNECTIONS": "Criar, modificar e eliminar conexões", + "EDIT_IDENTITIES": "Criar, modificar e eliminar identidades SSH", + "EDIT_KEYS": "Criar, modificar e eliminar chaves SSH", + "EDIT_SNIPPETS": "Criar, modificar e eliminar snippets de comando", + "EDIT_FOLDERS": "Gerenciar a estrutura de pastas", + "VIEW_AUDIT_LOG": "Ler o registro de auditoria de atividades", + "INVITE_MEMBERS": "Convidar novos membros para o cofre", + "MANAGE_MEMBERS": "Atribuir funções e remover membros", + "CREATE_CUSTOM_ROLES": "Permissão descontinuada — mantida por compatibilidade", + "MANAGE_ROLES": "Criar, editar e eliminar funções", + "MANAGE_VAULT": "Renomear o cofre e gerenciar as configurações do cofre", + "START_TERMINAL_SESSION": "Iniciar sessões de terminal multijogador", + "JOIN_TERMINAL_SESSION": "Entrar em sessões de terminal existentes", + "VIEW_TERMINAL_SESSIONS": "Ver sessões de terminal ativas" + }, + "builtinBadge": "Nativa", + "dragToReorder": "Arraste para reordenar", + "deleteRoleTitle": "Eliminar função", + "clickToConfirm": "Clique novamente para confirmar", + "failedToDelete": "Falha ao eliminar", + "editRole": "Editar função", + "newRole": "Nova função personalizada", + "roleName": "Nome da função", + "roleNamePlaceholder": "ex.: Somente leitura, Implantação, DevOps…", + "colorLabel": "Cor", + "clearColor": "Limpar", + "preview": "Prévia", + "permissionsLabel": "Permissões", + "objectOverrideNote": "Qualquer host, chave, identidade, snippet ou pasta pode substituir estas permissões.", + "saveChanges": "Guardar alterações", + "createRole": "Criar função", + "errorNameRequired": "O nome é obrigatório", + "errorFailedToSave": "Falha ao guardar a função", + "builtinRoles": "Funções nativas", + "customRoles": "Funções personalizadas", + "newRoleBtn": "Nova função", + "noCustomRolesCanEdit": "Nenhuma função personalizada ainda. Crie uma para atribuir permissões específicas.", + "noCustomRoles": "Nenhuma função personalizada definida para esta equipe." + } + }, + "plugins": { + "categoryLabel": "Plugin", + "tabs": { + "installed": "Instalados ({{count}})", + "browse": "Explorar", + "updateCount_one": "• {{count}} atualização", + "updateCount_many": "• {{count}} atualizações", + "updateCount_other": "• {{count}} atualizações" + }, + "installed": { + "filterPlaceholder": "Filtrar plugins…", + "scanTitle": "Procurar plugins locais", + "pluginSettingsTitle": "Configurações de {{name}}", + "noConfig": "Nenhuma configuração disponível.", + "bundledBadge": "Incluído", + "settingsTitle": "Configurações do plugin", + "reloadTitle": "Recarregar plugin", + "uninstallTitle": "Desinstalar plugin", + "noMatch": "Nenhum plugin corresponde à sua pesquisa.", + "noneInstalled": "Nenhum plugin instalado.", + "sourceLocal": "Local", + "sourceUrl": "URL", + "sourceInstalled": "Instalado", + "unverified": "Não verificado", + "update": "Atualizar", + "updating": "A atualizar…", + "updateTitle": "Atualizar para v{{version}}", + "confirmUninstallSeeded": { + "title": "Desinstalar {{name}}?", + "message": "{{name}} é um plugin incluído. Desinstalá-lo o remove da sua lista — você pode reinstalá-lo a qualquer momento na aba Explorar.", + "confirm": "Desinstalar" + } + }, + "browse": { + "searchPlaceholder": "Pesquisar plugins…", + "refreshTitle": "Atualizar catálogo", + "manageSourcesTitle": "Gerenciar fontes", + "sourcesHeader": "Fontes de plugins", + "addSource": "Adicionar fonte", + "addSourcePlaceholder": "https://example.com/plugins.json", + "add": "Adicionar", + "installedBadge": "Instalado", + "byAuthor": "por {{author}} · v{{version}}", + "noCatalog": "Nenhum plugin no catálogo.", + "noResults": "Nenhum resultado.", + "removing": "Removendo…", + "uninstall": "Desinstalar", + "installing": "A instalar…", + "install": "Instalar", + "updateBadge": "atualização disponível", + "requiresVersion": "Requer v{{version}} ou superior" + }, + "install": { + "integrityFailed": "O pacote do plugin falhou na verificação de integridade — instalação bloqueada.", + "alreadyInstalling": "Este plugin já está sendo instalado — verifique Configurações › Plugins.", + "failed": "Falha ao instalar o plugin.", + "versionUnsupported": "Este plugin requer a versão {{version}} ou superior do aplicativo." + }, + "deepLinkInstall": { + "title": "Instalar este plugin?", + "body": "Este link instala um plugin. Um plugin executa código dentro do Voltius com as permissões listadas abaixo.", + "summary": "{{name}} {{version}} por {{author}}", + "source": "Do catálogo {{source}}.", + "action": "Instalar", + "failed": "Este link não indica um plugin que o Voltius possa instalar" + }, + "permissionModal": { + "installTitle": "Instalar {{name}}?", + "installBody": "Este plugin é executado com privilégios totais do aplicativo. Ele solicita estas permissões:", + "updateTitle": "Atualizar {{name}}?", + "updateBody": "Esta atualização solicita novas permissões. Revise-as antes de continuar:", + "newPermissions": "Novas permissões", + "noPermissions": "Este plugin não solicita permissões especiais.", + "installConfirm": "Instalar", + "updateConfirm": "Atualizar", + "permissions": { + "readOnlyHeading": "Acesso somente leitura", + "readOnlyWarning": "O plugin pode ver isto, mas não pode alterar ou eliminar nada com isso.", + "dangerHeading": "Permissões poderosas", + "dangerWarning": "Estas concedem ao plugin acesso amplo. Conceda-as apenas a um plugin em que você confia.", + "terminalRead": { + "label": "Ler a saída do terminal", + "description": "Ler a saída visível e o histórico das suas sessões de terminal." + }, + "terminalStream": { + "label": "Observar a saída do terminal ao vivo", + "description": "Observar continuamente tudo o que é impresso nas suas sessões de terminal, à medida que acontece." + }, + "terminalWrite": { + "label": "Digitar nos seus terminais", + "description": "Enviar entrada e executar comandos nas suas sessões de terminal — como se você os digitasse." + }, + "keychainRead": { + "label": "Ler seus próprios segredos armazenados", + "description": "Ler segredos que este plugin armazenou anteriormente no chaveiro do seu dispositivo." + }, + "keychainWrite": { + "label": "Armazenar segredos no seu dispositivo", + "description": "Guardar segredos no chaveiro do SO do seu dispositivo." + }, + "metricsRead": { + "label": "Ler métricas do sistema", + "description": "Ler estatísticas de CPU, memória, disco e rede dos seus hosts conectados." + }, + "dockerRead": { + "label": "Ler informações do Docker", + "description": "Listar contêineres, imagens, volumes, redes e stacks, e ler logs de contêineres. Os logs podem conter palavras-passe ou tokens." + }, + "processesRead": { + "label": "Ler informações de processos", + "description": "Listar processos em execução nos seus hosts conectados." + }, + "processesManage": { + "label": "Gerenciar processos", + "description": "Listar e encerrar processos em execução nos seus hosts conectados." + }, + "dockerManage": { + "label": "Gerenciar o Docker", + "description": "Listar, iniciar, parar e eliminar contêineres, imagens, volumes, redes e stacks. Isso pode destruir dados permanentemente." + }, + "portsForward": { + "label": "Encaminhar portas para este computador", + "description": "Abrir túneis SSH dos seus hosts conectados para portas locais neste computador, e abrir o endereço resultante no seu navegador ou área de transferência." + }, + "proxmoxRead": { + "label": "Ler informações do Proxmox", + "description": "Listar contêineres LXC e seus snapshots." + }, + "proxmoxManage": { + "label": "Gerenciar o Proxmox", + "description": "Listar e controlar contêineres LXC, incluindo criar, eliminar e reverter snapshots. Isso pode destruir dados permanentemente." + }, + "sftpRead": { + "label": "Ler ficheiros", + "description": "Navegar e ler ficheiros nos seus hosts SSH/FTP guardados e neste computador." + }, + "sftpWrite": { + "label": "Gravar e mover ficheiros", + "description": "Criar, renomear, substituir e eliminar ficheiros nos seus hosts SSH/FTP guardados e neste computador, e copiar ficheiros entre eles. Isso pode destruir dados permanentemente." + }, + "audit": { + "label": "Registrar eventos de auditoria", + "description": "Adicionar entradas ao seu registro de auditoria descrevendo o que ele fez. Para um host em um cofre de equipe, essas entradas também são enviadas ao servidor dessa equipe." + }, + "auditRead": { + "label": "Ler o registro de atividades", + "description": "Ler o registro de atividades deste dispositivo, incluindo quais hosts foram acessados, quais ficheiros foram tocados e o que outros plugins fizeram. Quando uma equipe é indicada, também lê o log do lado do servidor dessa equipe — a atividade de todos os membros." + }, + "mcpContribute": { + "label": "Expor ferramentas a agentes de IA externos", + "description": "Permite que este plugin adicione seus próprios comandos ao servidor MCP do Voltius, para que qualquer agente de IA externo que você tenha conectado possa executá-los — usando as próprias permissões deste plugin." + }, + "vaultsRead": { + "label": "Ver seus cofres", + "description": "Ver os nomes dos seus cofres, incluindo cofres de equipe, e como estão organizados." + }, + "vaultsWrite": { + "label": "Criar e eliminar cofres", + "description": "Criar, renomear e eliminar seus cofres. Eliminar um cofre pode eliminar tudo o que está nele." + }, + "foldersRead": { + "label": "Ver suas pastas", + "description": "Ver as pastas em que você organiza hosts, chaves, encaminhamentos de portas e snippets." + }, + "foldersWrite": { + "label": "Criar e eliminar pastas", + "description": "Criar, renomear e eliminar pastas. Eliminar uma pasta pode eliminar tudo o que está nela." + }, + "sessionsRead": { + "label": "Ver suas sessões", + "description": "Ver quais sessões de terminal estão abertas e quando mudam." + }, + "sessionsWrite": { + "label": "Abrir e fechar sessões", + "description": "Abrir novas sessões de terminal e fechar as existentes." + }, + "connectionsRead": { + "label": "Ler suas conexões", + "description": "Ler suas conexões guardadas e seus detalhes." + }, + "connectionsWrite": { + "label": "Gerenciar suas conexões", + "description": "Criar, editar e eliminar suas conexões guardadas." + }, + "keysRead": { + "label": "Ler suas chaves SSH", + "description": "Listar suas chaves SSH guardadas e acrescentar uma à authorized_keys de um host guardado por SSH." + }, + "keysWrite": { + "label": "Gerenciar suas chaves SSH", + "description": "Criar e eliminar chaves SSH em seu nome." + }, + "identitiesRead": { + "label": "Ler suas identidades", + "description": "Listar suas identidades guardadas." + }, + "identitiesWrite": { + "label": "Gerenciar suas identidades", + "description": "Criar e eliminar identidades em seu nome." + }, + "snippetsRead": { + "label": "Ler seus snippets", + "description": "Listar seus snippets guardados e os comandos que executam." + }, + "snippetsWrite": { + "label": "Gerenciar seus snippets", + "description": "Criar, editar, mover e eliminar seus snippets guardados." + }, + "snippetsRun": { + "label": "Executar seus snippets nos seus hosts", + "description": "Executar um snippet guardado em um host, a ligar-se a ele se necessário. Seus comandos são executados com o seu próprio acesso, exatamente como se você os executasse." + }, + "portForwardingRead": { + "label": "Ler seus encaminhamentos de portas", + "description": "Listar suas regras de encaminhamento de portas guardadas e os túneis abertos no momento." + }, + "portForwardingWrite": { + "label": "Gerenciar seus encaminhamentos de portas", + "description": "Criar, editar, mover e eliminar suas regras de encaminhamento de portas guardadas." + }, + "knownHostsRead": { + "label": "Ler seus hosts conhecidos", + "description": "Listar as chaves de host SSH que você confiou, com suas impressões digitais." + }, + "knownHostsWrite": { + "label": "Confiar e remover chaves de host", + "description": "Autorizar uma chave de host SSH ou eliminar uma em que você confiou. Uma chave confiável significa que as conexões com esse host são aceitas sem perguntar a você." + }, + "historyRead": { + "label": "Ler seu histórico de comandos", + "description": "Pesquisar os comandos que você digitou nos terminais. Eles podem conter palavras-passe ou tokens que você digitou em texto simples." + }, + "transfersRead": { + "label": "Ver transferências de ficheiros", + "description": "Ver as transferências de ficheiros em andamento, incluindo nomes de ficheiros, progresso e erros." + }, + "transfersWrite": { + "label": "Cancelar e repetir transferências", + "description": "Cancelar uma transferência de ficheiros em andamento ou iniciar novamente uma que falhou — incluindo transferências que você mesmo iniciou." + }, + "healthRead": { + "label": "Ver a acessibilidade dos hosts", + "description": "Ver quais dos seus hosts guardados responderam pela última vez a uma verificação de acessibilidade, e com que rapidez." + }, + "vaultRead": { + "label": "Ler seu cofre", + "description": "Ler dados armazenados no seu cofre." + }, + "vaultWrite": { + "label": "Gravar no seu cofre", + "description": "Armazenar e alterar dados no seu cofre." + }, + "syncRead": { + "label": "Ler dados de sincronização", + "description": "Ler os próprios dados deste plugin sincronizados entre seus dispositivos, e ver o status da sincronização da sua própria configuração." + }, + "syncWrite": { + "label": "Gravar dados de sincronização", + "description": "Armazenar e alterar dados sincronizados entre seus dispositivos." + }, + "panesRead": { + "label": "Ler o layout do terminal", + "description": "Ver suas abas abertas e painéis divididos, e qual sessão está em cada um." + }, + "panesWrite": { + "label": "Organizar os painéis do terminal", + "description": "Dividir, mover, separar e focar painéis do terminal. As sessões permanecem abertas; nada é fechado." + }, + "teamRead": { + "label": "Ler suas equipes", + "description": "Ver suas equipes, quem pertence a elas, suas funções e quais membros possuem a chave do cofre da equipe." + }, + "teamWrite": { + "label": "Gerenciar membros da equipe", + "description": "Convidar pessoas para suas equipes, remover membros e alterar a função deles." + }, + "sharingRead": { + "label": "Ler terminais compartilhados", + "description": "Ver quais das suas sessões de terminal estão compartilhadas, quem as assiste e quem tem o controle." + }, + "sharingWrite": { + "label": "Compartilhar terminais ao vivo", + "description": "Transmitir uma sessão de terminal ao vivo para membros das suas equipes, parar o compartilhamento e passar o controle dela a um participante que o solicitou." + }, + "settingsRead": { + "label": "Ler as configurações do aplicativo", + "description": "Ver cada configuração deste aplicativo e seu valor atual." + }, + "settingsWrite": { + "label": "Alterar as configurações do aplicativo", + "description": "Alterar qualquer configuração deste aplicativo, incluindo as que desativam uma proteção." + }, + "accountRead": { + "label": "Ler sua assinatura", + "description": "Ver seu plano, status do teste, assentos e estado da cobrança." + }, + "pluginsManage": { + "label": "Gerenciar plugins", + "description": "Instalar, atualizar, remover, habilitar e desabilitar plugins, e adicionar fontes de marketplace. Um plugin instalado executa código dentro do Voltius com as permissões que declara." + }, + "importExportRead": { + "label": "Exportar seus dados", + "description": "Exportar conexões, identidades, chaves SSH, snippets e regras de encaminhamento de portas. Pacotes contendo palavras-passe ou chaves privadas só podem ser exportados encriptados." + }, + "importExportWrite": { + "label": "Importar dados", + "description": "Importar conexões, identidades, chaves SSH, snippets e regras de encaminhamento de portas para um cofre. Os itens existentes nunca são substituídos." + }, + "storage": { + "label": "Armazenar dados do plugin", + "description": "Guardar as próprias configurações e dados deste plugin no seu dispositivo." + }, + "http": { + "label": "Acessar a rede", + "description": "Fazer solicitações de rede a serviços externos." + }, + "cryptoDerive": { + "label": "Derivar chaves de criptografia", + "description": "Derivar uma chave de criptografia a partir de uma frase secreta que você fornece. Não concede acesso aos seus segredos armazenados." + }, + "fs": { + "label": "Acessar ficheiros", + "description": "Ler e gravar ficheiros no seu dispositivo." + }, + "ui": { + "label": "Mostrar elementos de interface", + "description": "Adicionar seus próprios painéis e controles ao aplicativo." + }, + "notifications": { + "label": "Mostrar notificações", + "description": "Mostrar notificações e avisos a você." + }, + "settingsPage": { + "label": "Adicionar uma página de configurações", + "description": "Adicionar sua própria página às Configurações." + }, + "rightPanel": { + "label": "Adicionar um painel lateral", + "description": "Adicionar um painel à área lateral da sessão." + }, + "globalPanel": { + "label": "Adicionar um painel global", + "description": "Adicionar um painel disponível em todo o aplicativo." + }, + "themes": { + "label": "Adicionar temas de cores", + "description": "Adicionar seus próprios temas de cores que você pode selecionar no aplicativo." + }, + "omniCommands": { + "label": "Adicionar ações à paleta de comandos", + "description": "Adicionar suas próprias ações à paleta de comandos." + }, + "uiContributions": { + "label": "Adicionar elementos de interface", + "description": "Adicionar seus próprios elementos à interface do aplicativo." + } + } + } + }, + "sftp": { + "downloads": { + "title": "Downloads", + "folderLabel": "Pasta de download", + "notSet": "Não definida — escolhida no primeiro download", + "changeFolder": "Alterar pasta" + }, + "transfers": { + "title": "Transferências", + "tarAcceleration": { + "title": "Aceleração com tar", + "desc": "Empacotar diretórios em um único tar.gz antes da transferência — muito mais rápido para muitos ficheiros pequenos. Requer tar nos dois lados." + } + }, + "filePanel": { + "showHidden": { + "title": "Mostrar ficheiros ocultos" + }, + "title": "Painel de ficheiros", + "autoRefresh": { + "title": "Atualização automática", + "desc": "Atualiza silenciosamente o conteúdo do diretório em segundo plano" + }, + "refreshInterval": { + "title": "Intervalo de atualização", + "desc": "Mínimo de 0,5 s", + "unit": "s" + } + }, + "editor": { + "maxBytes": { + "title": "Tamanho máximo de ficheiro editável" + }, + "title": "Editor", + "autoSave": { + "title": "Salvamento automático", + "desc": "Guardar alterações no ficheiro automaticamente enquanto você digita" + } + } + }, + "portForwarding": { + "automationTitle": "Automação", + "autoForward": { + "title": "Encaminhamento automático de portas", + "desc": "As portas de escuta detectadas são encaminhadas automaticamente durante as sessões SSH" + }, + "notifications": { + "title": "Notificações de encaminhamento", + "desc": "Mostrar uma notificação sempre que uma porta for encaminhada automaticamente" + } + }, + "hosts": { + "connectivityTitle": "Conectividade", + "reachability": { + "title": "Verificação de acessibilidade", + "desc": "Sonda a porta SSH e mostra um ponto de status + latência em cada cartão de host. Pode ser desativada por host nas configurações do host." + }, + "pollInterval": { + "title": "Intervalo de verificação", + "desc": "Frequência de verificação em segundo plano para a página de hosts." + }, + "ms": "ms", + "activeInterval": { + "title": "Intervalo da sessão ativa", + "desc": "Frequência mais rápida usada para o indicador de latência na barra de status do terminal." + }, + "keepalive": { + "title": "Keepalive", + "desc": "Com que rapidez uma sessão é declarada perdida quando o servidor para de responder. {{detail}}. Pode ser substituído por host." + }, + "keepalivePresets": { + "fast": { + "label": "Rápido", + "detail": "Detecta uma conexão perdida em ~4s" + }, + "balanced": { + "label": "Equilibrado", + "detail": "~9s; tolera uma breve oscilação de rede" + }, + "tolerant": { + "label": "Tolerante", + "detail": "~20s; para redes instáveis" + }, + "off": { + "label": "Desativado", + "detail": "Sem sondagens de keepalive" + } + }, + "proxy": { + "title": "Proxy", + "desc": "Encaminhar SSH, SFTP e verificações de acessibilidade por um proxy. Os hosts podem substituir isto.", + "modes": { + "none": "Sem proxy", + "system": "Sistema", + "socks5": "SOCKS5", + "http": "HTTP", + "https": "HTTPS" + }, + "detected": "Detectado: {{kind}} {{host}}:{{port}}", + "detectedNone": "Detectado: nenhum (a ligar diretamente)", + "passwordSaveFailed": "Não foi possível guardar a palavra-passe do proxy: {{error}}" + }, + "persistentSessions": { + "title": "Sessões persistentes", + "desc": "Mantenha seu shell e os processos em execução vivos entre desconexões envolvendo o shell remoto no tmux (recorre ao screen). Requer tmux ou screen no host. Pode ser substituído por host, em Avançado nas configurações da conexão." + }, + "terminalTitle": "Terminal", + "shellIntegration": { + "title": "Integração com o shell", + "desc": "Conecta o shell remoto/local para informar seu diretório de trabalho (OSC 7) para painéis de ficheiros cientes do diretório atual. Se a mensagem de boas-vindas ou o prompt de um host parecerem errados, desative-a nele. Pode ser substituído por host, em Avançado nas configurações da conexão." + }, + "teamPresenceTitle": "Presença da equipe", + "teamPresence": { + "title": "Compartilhar quais hosts do cofre de equipe você está usando", + "desc": "Quando ativado, seu avatar aparece em um cartão de host enquanto você tem um terminal aberto para ele. Apenas colegas de equipe com acesso ao host o veem." + }, + "sshConfig": { + "switch": { + "title": "Sincronizar continuamente a partir de ~/.ssh/config", + "desc": "Os hosts do seu config são criados e mantidos atualizados no Voltius, em todos os seus computadores. Útil quando uma ferramenta escreve o config (gcloud, MDM…)." + }, + "vault": { + "title": "Cofre", + "desc": "Onde novos hosts gerenciados são criados. Apenas cofres pessoais.", + "personal": "Pessoal" + }, + "status": { + "title": "Status", + "line": "Última leitura {{when}} · {{managed}} gerenciados · {{skipped}} não sincronizados", + "never": "Ainda não lido", + "view": "Ver hosts…", + "syncNow": "Sincronizar agora" + }, + "off": { + "title": "Desativar a sincronização contínua?", + "message_one": "O host gerenciado permanece no Voltius e se torna um host normal: ele deixa de seguir ~/.ssh/config, em todos os seus computadores.", + "message_many": "Os {{count}} hosts gerenciados permanecem no Voltius e se tornam hosts normais: eles deixam de seguir ~/.ssh/config, em todos os seus computadores.", + "message_other": "Os {{count}} hosts gerenciados permanecem no Voltius e se tornam hosts normais: eles deixam de seguir ~/.ssh/config, em todos os seus computadores.", + "confirm": "Desativar" + }, + "dialog": { + "activateTitle": "Ativar a sincronização contínua", + "reviewTitle": "Hosts de ~/.ssh/config", + "intro": "Os hosts vinculados mantêm seu nome, pasta e configurações. Apenas o que o ficheiro define (host, porta e utilizador, chave ou hosts de salto, quando presentes) será seguido, em todos os seus computadores.", + "turnOn": "Ativar", + "cancel": "Cancelar", + "close": "Fechar", + "linkAgain": "Vincular novamente", + "recreate": "Recriar", + "counts": "{{create}} para criar · {{link}} para vincular · {{skipped}} não sincronizados · cofre {{vault}}" + }, + "row": { + "create": "Será criado", + "link": { + "legacy": "Será vinculado a “{{name}}” · sincronização anterior", + "detached": "Será vinculado a “{{name}}” · separado anteriormente", + "name": "Será vinculado a “{{name}}” · mesmo nome e endereço", + "address": "Será vinculado a “{{name}}” · mesmo endereço" + }, + "ambiguous": "Ambíguo ({{names}} correspondem) · um novo host será criado", + "managed": "Gerenciado · “{{name}}”", + "detached": "Separado · “{{name}}” não segue mais o ficheiro", + "deleted": "Eliminado · não recriado pela sincronização", + "ignored": "Ignorado · não será sincronizado", + "identityReplaced": "A identidade “{{name}}” será substituída pela chave do ficheiro", + "skipped": { + "pattern": "Não sincronizado · padrão, não um host", + "match": "Não sincronizado · bloco Match", + "include": "Não sincronizado · não foi possível ler o Include", + "includeOutside": "Não sincronizado · Include fora de ~/.ssh", + "proxyCommand": "Não sincronizado · ProxyCommand não suportado", + "key": "Chave ilegível · host criado sem chave", + "keyNotCopied": "Chave não copiada · host criado sem chave", + "pending": "A aguardar · o host ainda não chegou do seu outro dispositivo" + } + }, + "keys": { + "title": "Chaves", + "switch": "Copiar chaves privadas para o cofre", + "warning": "As chaves copiadas vão para {{vault}} e são sincronizadas com todos os seus dispositivos, incluindo o celular (criptografadas).", + "settingDesc": "Desativado: os hosts usam uma chave já presente no cofre (mesma chave pública ou nome), ou nenhuma chave. As chaves copiadas são sincronizadas com todos os seus dispositivos.", + "copy": "Será copiada", + "notCopied": "Não copiada", + "exists": "Já está no cofre", + "unreadable": "Ilegível" + }, + "here": { + "title": "Este computador", + "desc": "A sincronização está ativada para sua conta, mas o ~/.ssh/config deste computador ainda não foi revisado. Nada é lido ou copiado aqui até você revisá-lo.", + "action": "Revisar…" + } + } + }, + "toggleDefs": { + "cursorBlink": { + "label": "Cursor piscante" + }, + "scrollMinimap": { + "label": "Minimapa de rolagem" + }, + "selectToCopy": { + "label": "Selecionar para copiar" + }, + "dragSelectsText": { + "label": "Arrastar seleciona texto" + }, + "groupTabsByHost": { + "label": "Agrupar abas por host" + }, + "ignoreBracketedPaste": { + "label": "Colagem simples (sem colagem entre colchetes)" + }, + "pasteImageAsPath": { + "label": "Colar imagens como caminho de ficheiro" + }, + "volumeDownCtrl": { + "label": "Usar Volume Down como Ctrl" + }, + "keywordHighlight": { + "label": "Destaque de palavras-chave" + }, + "autoForward": { + "label": "Encaminhamento automático de portas" + }, + "forwardingNotifications": { + "label": "Notificações de encaminhamento de portas" + }, + "sftpTar": { + "label": "Aceleração com tar no SFTP" + }, + "sftpAutoRefresh": { + "label": "Atualização automática do SFTP" + }, + "reachability": { + "label": "Verificação de acessibilidade" + }, + "teamPresence": { + "label": "Presença da equipe" + }, + "shellIntegration": { + "label": "Integração com o shell" + }, + "persistentSessions": { + "label": "Sessões persistentes" + }, + "restoreWorkspace": { + "label": "Restaurar área de trabalho ao iniciar" + }, + "crossDeviceSessions": { + "label": "Sessões entre dispositivos" + }, + "changelogPopup": { + "label": "Mostrar novidades após atualizações" + }, + "pluginInstallReview": { + "label": "Revisar permissões antes de instalar plugins" + }, + "mcpServer": { + "label": "Servidor MCP" + } + }, + "shortcuts": { + "searchPlaceholder": "Pesquisar atalhos…", + "clearSearch": "Limpar pesquisa", + "resetAll": "Redefinir tudo", + "resetAllTitle": "Redefinir todos os atalhos para os padrões", + "statusRecording": "Pressione uma combinação de teclas… (Esc para cancelar)", + "statusIdle": "Clique em um atalho para remarcá-lo.", + "result_one": "{{count}} resultado", + "result_many": "{{count}} resultados", + "result_other": "{{count}} resultados", + "noMatch": "Nenhum atalho corresponde a \"{{query}}\"", + "bindingRecordingTitle": "Pressione uma combinação de teclas ou Esc para cancelar", + "bindingIdleTitle": "Clique para remarcar", + "pressKey": "Pressione a tecla…", + "conflict": "Conflito", + "aliasTitle": "Atalho fixo — sempre ativo", + "group": { + "global": "Global", + "tabs": "Abas", + "navigation": "Navegação", + "editing": "Edição", + "other": "Outros" + }, + "items": { + "omni": { + "label": "Pesquisa Omni", + "desc": "Acesse tudo a partir de um único lugar" + }, + "shortcuts": { + "label": "Atalhos de teclado", + "desc": "Abrir as configurações de atalhos" + }, + "themes": { + "label": "Configurações", + "desc": "Abrir as configurações" + }, + "newTab": { + "label": "Nova aba", + "desc": "Ir para a visualização de hosts" + }, + "duplicateSession": { + "label": "Duplicar sessão", + "desc": "Abrir um segundo terminal no mesmo host" + }, + "duplicateSessionSplit": { + "label": "Duplicar em painel dividido", + "desc": "Abrir um segundo terminal ao lado do atual" + }, + "closeTab": { + "label": "Fechar aba", + "desc": "Fechar a sessão ativa" + }, + "nextTab": { + "label": "Próxima aba", + "desc": "Alternar para a próxima aba" + }, + "prevTab": { + "label": "Aba anterior", + "desc": "Alternar para a aba anterior" + }, + "sidebar": { + "label": "Alternar barra lateral", + "desc": "Mostrar/ocultar a barra lateral" + }, + "delete": { + "label": "Eliminar selecionados", + "desc": "Eliminar os itens selecionados" + }, + "rename": { + "label": "Renomear selecionado", + "desc": "Renomear o item selecionado no local" + }, + "copy": { + "label": "Copiar", + "desc": "Copiar os itens selecionados para a área de transferência" + }, + "cut": { + "label": "Recortar", + "desc": "Recortar os itens selecionados para a área de transferência" + }, + "paste": { + "label": "Colar", + "desc": "Colar os itens da área de transferência na pasta atual" + }, + "undo": { + "label": "Desfazer", + "desc": "Desfazer a última ação" + }, + "redo": { + "label": "Refazer", + "desc": "Refazer a última ação desfeita" + }, + "filter": { + "label": "Focar filtro", + "desc": "Focar o filtro de pesquisa" + }, + "terminalSearch": { + "label": "Localizar no terminal", + "desc": "Pesquisar no histórico do terminal" + }, + "history": { + "label": "Painel de histórico", + "desc": "Abrir o histórico de comandos no painel direito" + }, + "snippets": { + "label": "Painel de snippets", + "desc": "Abrir snippets no painel direito" + }, + "panelThemes": { + "label": "Painel de temas", + "desc": "Abrir temas no painel direito" + }, + "panelNotes": { + "label": "Painel de notas", + "desc": "Abrir notas do host no painel direito" + } + } + } + } +} diff --git a/src/i18n/locales/pt-PT/shared.json b/src/i18n/locales/pt-PT/shared.json new file mode 100644 index 000000000..bf04dd55e --- /dev/null +++ b/src/i18n/locales/pt-PT/shared.json @@ -0,0 +1,189 @@ +{ + "shared": { + "signOutConfirm": { + "title": "Sair e apagar os dados deste dispositivo?", + "noServerCopy": "Os hosts, chaves e snippets desta conta são armazenados apenas neste dispositivo. Sair irá apagá-los e eles não poderão ser recuperados.", + "unsynced": "A sincronização está pausada ou não conseguiu alcançar o servidor, então alterações recentes deste dispositivo podem não estar guardadas lá. Sair apaga a cópia deste dispositivo.", + "confirm": "Apagar e sair" + }, + "errorBanner": { + "dismiss": "dispensar" + }, + "trialExpiredModal": { + "title": "Seu teste Pro terminou", + "subtitle": "Estes três recursos param de funcionar hoje:", + "freeNote": "Cofre local, registros de auditoria e sincronização com o GitHub Gist continuam gratuitos, para sempre.", + "teamsPrompt": "Trabalha em equipe? Experimente o Teams grátis por {{days}} dias (cartão obrigatório).", + "upgradeButton": "Atualizar para Pro", + "laterButton": "Talvez depois" + }, + "createVaultModal": { + "title": "Novo cofre", + "subtitle": "Cofres mantêm suas credenciais organizadas", + "nameLabel": "Nome do cofre", + "namePlaceholder": "ex.: Trabalho, Pessoal, Homologação…", + "createButton": "Criar cofre" + }, + "vaultCascadeModal": { + "headingMove": "Mover itens vinculados para", + "headingCopy": "Copiar itens vinculados para", + "fallbackDescriptionMoved": "Os itens vinculados a seguir estão em outro cofre e também serão movidos:", + "fallbackDescriptionCopied": "Os itens vinculados a seguir estão em outro cofre e também serão copiados:", + "confirmMove": "Mover tudo", + "confirmCopy": "Copiar tudo", + "typeLabel": { + "identity": "Identidade", + "key": "Chave SSH" + } + }, + "formSelect": { + "title": "Selecionar" + }, + "folderSelector": { + "noFolder": "Nenhuma pasta", + "namePlaceholder": "Nome da pasta", + "newFolder": "Nova pasta" + }, + "tagSelector": { + "placeholder": "Adicionar tags…", + "removeTag": "Remover tag {{tag}}" + }, + "portInput": { + "placeholder": "/dev/ttyUSB0 ou COM3" + }, + "avatarStack": { + "participantCount_one": "{{count}} participante", + "participantCount_many": "{{count}} participantes", + "participantCount_other": "{{count}} participantes" + }, + "presence": { + "hasControl": "Tem o controle" + }, + "panel": { + "saveState": { + "dirty": "Editando...", + "saving": "A guardar...", + "saved": "Guardado" + } + }, + "vaultPicker": { + "memberBadge": "membro" + }, + "pickers": { + "thisComputer": "Este computador", + "recent": "Recentes" + }, + "sessionPicker": { + "insertTitle": "Inserir em...", + "executeTitle": "Executar em...", + "insertConfirm_one": "Inserir em {{count}} destino", + "insertConfirm_many": "Inserir em {{count}} destinos", + "insertConfirm_other": "Inserir em {{count}} destinos", + "executeConfirm_one": "Executar em {{count}} destino", + "executeConfirm_many": "Executar em {{count}} destinos", + "executeConfirm_other": "Executar em {{count}} destinos", + "noActiveSessions": "Nenhuma sessão ativa", + "activeSessionsHeader": "Sessões ativas", + "openNewConnectionHeader": "Abrir nova conexão", + "localShellFallbackName": "Shell local", + "sshSessionSub": "Sessão SSH", + "noRemoteHostsFound": "Nenhum host remoto encontrado", + "noHostsFound": "Nenhum host encontrado" + }, + "hostPicker": { + "selectHostTitle": "Selecionar host", + "filterPlaceholder": "Filtrar hosts...", + "localMachineName": "Máquina local", + "wslSub": "WSL", + "noHostsConfigured": "Nenhum host configurado", + "noHostsMatch": "Nenhum host corresponde", + "allVaults": "Todos os cofres" + }, + "sort": { + "nameAsc": "A → Z", + "nameDesc": "Z → A", + "newest": "Mais recentes primeiro", + "oldest": "Mais antigos primeiro" + }, + "tagFilter": { + "filterByTag": "Filtrar por tag", + "emptyTitle": "Adicionar tags", + "emptyDescription": "Tags ajudam a filtrar seus hosts. Você pode adicionar uma tag ao editar um host.", + "searchPlaceholder": "Filtrar tags...", + "clearSelection": "Limpar seleção ({{count}})", + "noTagsMatch": "Nenhuma tag corresponde a \"{{search}}\"", + "deleteTagTitle": "Eliminar a tag \"{{tag}}\"?", + "deleteTagBody_one": "Isso removerá a tag de {{count}} host. Os hosts em si não serão eliminados.", + "deleteTagBody_many": "Isso removerá a tag de {{count}} hosts. Os hosts em si não serão eliminados.", + "deleteTagBody_other": "Isso removerá a tag de {{count}} hosts. Os hosts em si não serão eliminados.", + "renameTagTitle": "Renomear tag", + "deleteTagButtonTitle": "Eliminar tag" + }, + "vaultUnavailable": { + "note": "Não foi possível ler o cofre, então os segredos armazenados não são exibidos aqui. Deixe um campo vazio para manter o que está guardado; digitar um novo valor o substitui." + }, + "teamCredentials": { + "unavailable": "Não foi possível carregar as credenciais armazenadas deste cofre de equipe, então hosts que precisam de uma palavra-passe, chave ou frase secreta guardada falharão ao conectar. Peça a um administrador do cofre para conceder acesso aos segredos do cofre à sua função." + }, + "vaultBackups": { + "title": "Cópias de segurança do cofre", + "description": "Ficheiros de cofre guardados quando não puderam ser abertos. Restaurar um deles o coloca de volta como seu cofre e mantém o atual como um novo cópia de segurança — nada é eliminado.", + "empty": "Nenhum cópia de segurança de cofre neste dispositivo.", + "restore": "Restaurar", + "confirm": "Restaurar este cópia de segurança", + "cancel": "Cancelar", + "warn": "Este cópia de segurança se tornará seu cofre. Ele abre com a palavra-passe mestra que estava em uso quando foi criado, então você será desconectado e solicitado a desbloquear.", + "warnReadable": "Seu cofre atual pode ser lido. Restaurar irá substituí-lo — ele é mantido como um novo cópia de segurança, e você será desconectado e solicitado a desbloquear com a palavra-passe que criou o ficheiro restaurado.", + "restoredToast": "Cópia de segurança restaurado. Seu cofre anterior foi mantido como {{file}}.", + "restoredToastNoPrevious": "Cópia de segurança restaurado." + }, + "tunnelStatus": { + "noRemoteListener": "Nada está escutando na porta remota" + }, + "permissions": { + "everyone": "@todos", + "moveWarning": { + "title": "As permissões serão alteradas", + "body": "Mover para cá aplica as permissões desta pasta:", + "bodyUnknown": "Mover para cá aplica as permissões desta pasta.", + "line": "{{subject}} · {{permission}}: {{before}} → {{after}}", + "confirm": "Mover", + "cancelled": "Movimentação cancelada" + }, + "section": { + "title": "Permissões", + "titleKey": "Quem pode usar esta chave", + "titleIdentity": "Quem pode usar esta identidade", + "adminNote": "Proprietários e administradores sempre podem usar todas as chaves.", + "syncedWith": "Sincronizado com {{folder}}", + "syncedTeam": "Usa as permissões da equipe", + "notSynced": "Não sincronizado", + "syncNow": "Sincronizar agora", + "ownPermissions": "Permissões próprias", + "useTeams": "Usar as da equipe", + "addSubject": "Adicionar função ou membro", + "searchSubjects": "Pesquisar funções e membros…", + "noSubjectsLeft": "Todas as funções e membros já estão listados", + "use": "Usar", + "requiresConnect": "Requer {{connect}}", + "roleCount_one": "{{count}} função", + "roleCount_many": "{{count}} funções", + "roleCount_other": "{{count}} funções", + "loadFailed": "Não foi possível carregar as permissões" + } + }, + "businessLock": { + "title": "Recurso do plano Business", + "upgrade": "Atualizar para Business", + "ownerOnly": "Apenas o proprietário da equipe pode atualizar.", + "removeRules": "Remover regras", + "confirmClear": "Clique novamente para remover", + "rolesBody": "Funções personalizadas exigem o plano Business da equipe.", + "memberLapsed": "Plano Business expirado: as permissões concedidas a {{name}} estão desativadas; as restrições continuam valendo.", + "objectLapsed": "Plano Business expirado: as regras de permissão estão desativadas; as regras de negação continuam valendo.", + "memberLine": "Permissões por membro exigem Business.", + "objectLine": "Permissões por objeto exigem Business.", + "removeOverrides": "Remover substituições" + } + } +} diff --git a/src/i18n/locales/pt-PT/snippets.json b/src/i18n/locales/pt-PT/snippets.json new file mode 100644 index 000000000..64188d3ad --- /dev/null +++ b/src/i18n/locales/pt-PT/snippets.json @@ -0,0 +1,258 @@ +{ + "snippets": { + "sequence": { + "summary": { + "partial": "{{count}} ok — {{details}}", + "failed": "falhou", + "success_one": "Snippet executado em {{count}} destino", + "success_many": "Snippet executado em {{count}} destinos", + "success_other": "Snippet executado em {{count}} destinos" + }, + "connectFailed": "não foi possível abrir uma sessão de terminal", + "flatten": { + "tooDeep": "Aninhamento de snippets profundo demais em \"{{name}}\"", + "tooManySteps": "O snippet expandiu etapas demais", + "cycle": "Ciclo de snippets detectado em \"{{name}}\"", + "missingRef": "Uma etapa do snippet faz referência a um snippet inexistente ({{id}})" + }, + "error": { + "needsTerminal": "A etapa de script requer uma sessão de terminal aberta para este destino", + "noSftp": "Nenhuma conexão SFTP para a etapa de transferência", + "destExists": "O destino já existe: {{path}}" + }, + "resumeFailed": "Falha no snippet: {{error}}" + }, + "toolbar": { + "filterPlaceholder": "Filtrar snippets...", + "gridLabel": "Grade", + "listLabel": "Lista", + "sortNameAsc": "A → Z", + "sortNameDesc": "Z → A", + "sortNewest": "Mais recentes primeiro", + "sortOldest": "Mais antigos primeiro", + "newSnippet": "Novo snippet", + "newSnippetOptions": "Opções de novo snippet", + "newFolder": "Nova pasta" + }, + "card": { + "duplicate": "Duplicar", + "unpin": "Desafixar", + "pin": "Fixar", + "unpinForMe": "Desafixar para mim", + "showInMyView": "Mostrar na minha visão", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desafixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "enableCloudSync": "Ativar sincronização na nuvem", + "disableCloudSync": "Desativar sincronização na nuvem", + "export": "Exportar", + "insert": "Inserir", + "execute": "Executar", + "noContent": "Sem conteúdo" + }, + "form": { + "nameLabel": "Nome", + "namePlaceholder": "Meu snippet", + "contentLabel": "Conteúdo", + "variablesLabel": "Variáveis:", + "autoBadge": "auto", + "descriptionLabel": "Descrição (opcional)", + "descriptionPlaceholder": "O que este snippet faz?", + "tagsLabel": "Tags", + "folderLabel": "Pasta", + "starred": "Fixado", + "starThisSnippet": "Fixar este snippet", + "generalSection": "Geral", + "contextualFiltersSection": "Filtros contextuais", + "contextualFiltersHint": "Deixe vazio para mostrar em todas as conexões. Snippets que não correspondem ficam esmaecidos, não ocultos.", + "onlyForConnectionTags": "Apenas para tags de conexão", + "connectionTagsPlaceholder": "ex.: produção", + "onlyForDistros": "Apenas para distribuições", + "distrosPlaceholder": "ex.: ubuntu, debian", + "removeTagAriaLabel": "Remover tag {{tag}}", + "dynamicVars": { + "connectionHost": "Hostname / IP SSH ativo", + "connectionUsername": "Nome de utilizador SSH ativo", + "connectionName": "Nome da conexão ativa", + "date": "Hoje — AAAA-MM-DD", + "datetime": "Data + hora — AAAA-MM-DD HH:MM:SS", + "timestamp": "Timestamp Unix", + "clipboard": "Conteúdo atual da área de transferência" + }, + "syntaxHint": "Digite {{open}} para autocompletar. Prompts personalizados: {{prompt}} — texto · número · palavra-passe · booleano · {{choice}}" + }, + "step": { + "kind": { + "script": "Script", + "transfer": "Transferência", + "snippet": "Chamar snippet" + }, + "endpoint": { + "local": "Local", + "remote": "Remoto" + }, + "from": "De", + "to": "Para", + "mode": { + "copy": "Copiar", + "move": "Mover" + }, + "conflict": { + "label": "Se existir", + "overwrite": "Substituir", + "skip": "Ignorar", + "fail": "Falhar" + }, + "remotePicker": { + "title": "Navegar pelo caminho remoto", + "pickHost": "Escolha um host para navegar", + "selectHostTitle": "Selecionar um host", + "back": "Voltar", + "connecting": "A ligar…", + "select": "Selecionar", + "selectFolder": "Usar esta pasta" + }, + "file": "Ficheiro", + "folder": "Pasta", + "localPath": "Caminho local", + "remotePath": "Caminho remoto", + "browse": "Procurar", + "dragToReorder": "Arraste para reordenar", + "selectSnippet": "Selecione um snippet...", + "addScript": "+ Script", + "addTransfer": "+ Transferência", + "addSnippet": "+ Chamar snippet", + "addStep": "Adicionar etapa", + "moveUp": "Mover etapa para cima", + "moveDown": "Mover etapa para baixo", + "remove": "Remover etapa" + }, + "page": { + "emptyState": { + "title": "Nenhum snippet ainda", + "subtitle": "Salve comandos de terminal reutilizáveis com variáveis dinâmicas.", + "cta": "Crie seu primeiro snippet" + }, + "pinned": "Fixados", + "folders": "Pastas", + "snippetsSection": "Snippets", + "other": "Outros", + "allSnippets": "Todos os snippets", + "folderEmpty": "Esta pasta está vazia", + "addSnippet": "Adicionar snippet", + "noSearchResults": "Nenhum snippet corresponde a \"{{search}}\"", + "clearSearch": "Limpar pesquisa", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "recent": { + "title": "Recentes", + "clear": "Limpar", + "showLess": "Mostrar menos", + "showMore": "Mostrar mais {{count}}", + "deletedSnippet": "Snippet eliminado", + "unknownTarget": "Desconhecido", + "targetMore": "{{name}} +{{count}} a mais", + "modeRun": "executar", + "modeInsert": "inserir", + "replay": "Repetir" + }, + "bulk": { + "duplicateSnippets": "Duplicar {{count}} snippets", + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_many": "Mover {{count}} itens para", + "moveItemsTo_other": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização na nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização na nuvem ({{count}})", + "exportSnippets_one": "Exportar {{count}} snippet", + "exportSnippets_many": "Exportar {{count}} snippets", + "exportSnippets_other": "Exportar {{count}} snippets", + "deleteSnippets": "Eliminar {{count}} snippets" + }, + "confirmDelete": { + "title_one": "Eliminar {{count}} item", + "title_many": "Eliminar {{count}} itens", + "title_other": "Eliminar {{count}} itens", + "message_one": "Tem certeza de que deseja eliminar {{count}} item? Isso não pode ser desfeito.", + "message_many": "Tem certeza de que deseja eliminar {{count}} itens? Isso não pode ser desfeito.", + "message_other": "Tem certeza de que deseja eliminar {{count}} itens? Isso não pode ser desfeito.", + "folderCascade_one": "{{count}} snippet arquivado nas pastas selecionadas também será eliminado.", + "folderCascade_many": "{{count}} snippets arquivados nas pastas selecionadas também serão eliminados.", + "folderCascade_other": "{{count}} snippets arquivados nas pastas selecionadas também serão eliminados." + }, + "confirmDeleteFolder": { + "title": "Eliminar \"{{name}}\"?", + "message_one": "Isso eliminará a pasta, suas subpastas e o {{count}} snippet dentro dela. Isso não pode ser desfeito.", + "message_many": "Isso eliminará a pasta, suas subpastas e os {{count}} snippets dentro dela. Isso não pode ser desfeito.", + "message_other": "Isso eliminará a pasta, suas subpastas e os {{count}} snippets dentro dela. Isso não pode ser desfeito.", + "messageEmpty": "Isso eliminará a pasta e tudo dentro dela. Isso não pode ser desfeito.", + "confirmLabel": "Eliminar pasta" + } + }, + "community": { + "shareTitle": "Compartilhar com a comunidade", + "shareIntro": "Isto é o que seria enviado. Nada é enviado automaticamente — você abre um pull request e um mantenedor o revisa.", + "shareCopy": "Copiar JSON", + "shareCopied": "Copiado", + "shareOpenGithub": "Abrir GitHub", + "shareGuidelines": "Leia as diretrizes de contribuição", + "shareAuthor": "Seu nome ou handle", + "shareDescription": "Descrição curta", + "secretsTitle": "Verifique estes itens antes de compartilhar", + "secretsIntro": "Parece que estes podem ser seus, e não de todo mundo:", + "secretKind_privateKey": "Chave privada", + "secretKind_credential": "Palavra-passe ou chave", + "secretKind_token": "Token", + "secretKind_host": "Host ou endereço", + "secretsNone": "Nada que pareça um segredo.", + "shareFailed": "Não é possível compartilhar isto: {{error}}", + "tabMine": "Meus snippets", + "tabCommunity": "Comunidade", + "packs": "Pacotes", + "snippets": "Snippets", + "searchPlaceholder": "Pesquisar na comunidade", + "snippetCount_one": "{{count}} snippet", + "snippetCount_many": "{{count}} snippets", + "snippetCount_other": "{{count}} snippets", + "by": "por {{author}}", + "updated": "Atualizado em {{date}}", + "back": "Comunidade", + "loading": "A carregar catálogo…", + "offline": "Offline — mostrando a última cópia guardada", + "empty": "Nenhum snippet da comunidade ainda.", + "noResults": "Nada corresponde a \"{{search}}\".", + "retry": "Tentar novamente", + "loadFailed": "Não foi possível carregar o catálogo da comunidade.", + "install_one": "Instalar {{count}} snippet em {{vault}}", + "install_many": "Instalar {{count}} snippets em {{vault}}", + "install_other": "Instalar {{count}} snippets em {{vault}}", + "installing": "A instalar…", + "installed_one": "{{count}} snippet instalado", + "installed_many": "{{count}} snippets instalados", + "installed_other": "{{count}} snippets instalados", + "installFailed": "Falha na instalação: {{error}}", + "autoIncluded": "Incluído porque \"{{name}}\" o chama", + "steps": "Etapas", + "stepScript": "Script", + "stepTransfer": "Transferência", + "stepSnippet": "Executa snippet", + "selectAll": "Selecionar tudo", + "selectNone": "Limpar", + "error": { + "unsupportedCatalog": "Este catálogo de snippets está em um formato que esta versão do Voltius não entende. Tente atualizar o aplicativo." + } + }, + "deepLinkInstall": { + "title": "Instalar estes snippets?", + "body": "Este link instala snippets do catálogo da comunidade Voltius. Snippets são comandos de shell que são executados nos seus hosts quando você os usa.", + "summary": "{{name}} por {{author}} — {{count}} snippets", + "unknownAuthor": "um autor sem nome", + "destination": "Eles serão adicionados ao cofre {{vault}}.", + "action": "Instalar", + "failed": "Não foi possível instalar estes snippets" + } + } +} diff --git a/src/i18n/locales/pt-PT/terminal.json b/src/i18n/locales/pt-PT/terminal.json new file mode 100644 index 000000000..8c9fe73ac --- /dev/null +++ b/src/i18n/locales/pt-PT/terminal.json @@ -0,0 +1,370 @@ +{ + "terminal": { + "shared": { + "copied": "Copiado", + "insert": "Inserir", + "insertAndExecute": "Inserir e executar", + "noActiveSession": "Nenhuma sessão ativa" + }, + "historyPanel": { + "removeFromHistory": "Remover do histórico", + "searchPlaceholder": "Pesquisar histórico…", + "showCurrentOnly": "Mostrando apenas a conexão atual", + "showAllConnections": "Mostrar todas as conexões", + "clearAllTitle": "Limpar todo o histórico", + "noCommandsMatch": "Nenhum comando corresponde", + "noHistoryForConnection": "Ainda não há histórico para esta conexão", + "noHistoryYet": "Ainda não há histórico de comandos.\nOs comandos que você digitar aparecerão aqui." + }, + "multiplayerBar": { + "ended": "Encerrada", + "sharing": "Compartilhando", + "watching": "Assistindo", + "requestControl": "Solicitar controle", + "requestPending": "Solicitado — a aguardar o anfitrião", + "youHaveControl": "Você tem o controle", + "controlRequested": "Controle solicitado", + "grant": "Conceder", + "deny": "Negar", + "revoke": "Revogar", + "stopSharingTitle": "Parar de compartilhar", + "leaveSessionTitle": "Sair da sessão", + "stop": "Parar", + "leave": "Sair", + "waitingForKey": "A aguardar o anfitrião…", + "keyFailed": "O anfitrião não compartilhou a chave" + }, + "sftp": { + "hostLabel": { + "remote": "remoto", + "localMachine": "Máquina local" + }, + "uploadDialogTitle": "Selecione os ficheiros para enviar", + "downloadDialogTitle": "Baixar para a pasta", + "waitingForSession": "A aguardar sessão", + "connecting": "A ligar…", + "notSupportedForSessionType": "SFTP não é compatível com este tipo de sessão", + "followPinned": "Seguindo o diretório atual do terminal · clique para desafixar", + "followWaiting": "Seguindo o diretório atual do terminal · a aguardar o shell informar o diretório (requer integração com o shell)", + "followTitle": "Seguir o diretório atual do terminal", + "uploadFiles": "Enviar ficheiros", + "downloadTitle_one": "Baixar \"{{name}}\"", + "downloadTitle_many": "Baixar {{count}} itens", + "downloadTitle_other": "Baixar {{count}} itens", + "selectFilesToDownload": "Selecione os ficheiros para baixar", + "viewOptions": "Opções de visualização", + "moreOptions": "Mais opções" + }, + "ports": { + "badge": { + "auto": "Auto", + "adHoc": "Ad-hoc" + }, + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "saveAsRule": "Guardar como regra", + "copyAddress": "Copiar localhost:{{port}}", + "openUrl": "Abrir {{url}}", + "sshRequired": "O encaminhamento de portas requer uma sessão SSH.", + "empty": "Nenhuma porta encaminhada. As portas detectadas no host remoto aparecerão aqui automaticamente.", + "sectionSaved": "GUARDADAS", + "sectionActive": "ATIVAS", + "sectionSuppressed": "SUPRIMIDAS", + "header": { + "title": "Portas", + "activeCount": "{{count}} ativas", + "addTitle": "Encaminhar uma porta" + }, + "quickForwardPlaceholder": "Encaminhar uma porta (ex.: 3000 ou 3000:8080)", + "quickForwardErrors": { + "emptyInput": "Informe uma porta", + "tooManyParts": "Use porta ou remota:local", + "invalidRemotePort": "A porta deve ser de 1 a 65535", + "invalidLocalPort": "A porta local deve ser de 1 a 65535" + }, + "toast": { + "viewPorts": "Ver portas →", + "forwardedOne": "Porta {{port}} → localhost:{{localPort}} encaminhada", + "forwardedMany_one": "{{count}} porta encaminhada", + "forwardedMany_many": "{{count}} portas encaminhadas", + "forwardedMany_other": "{{count}} portas encaminhadas", + "autoForwardCapped_one": "Encaminhamento automático pausado — {{count}} porta já encaminhada", + "autoForwardCapped_many": "Encaminhamento automático pausado — {{count}} portas já encaminhadas", + "autoForwardCapped_other": "Encaminhamento automático pausado — {{count}} portas já encaminhadas" + }, + "portLabel": "Porta {{port}}" + }, + "rightPanel": { + "font": "Fonte", + "themes": "Temas", + "themeActive": "ativo", + "themeBuiltin": "nativo", + "themeCustom": "personalizado", + "createNewTheme": "Criar novo tema", + "closePanelTitle": "Fechar painel", + "sections": { + "history": "Histórico", + "sftp": "SFTP", + "notes": "Notas" + }, + "pluginUnavailable": "Este painel não está mais disponível. O plugin que o fornecia foi removido ou desativado.", + "pluginUnavailableAction": "Voltar para Temas" + }, + "share": { + "signInToShare": "Entre para compartilhar", + "signInDescription": "Conecte uma conta de servidor para compartilhar seu terminal com colegas de equipe.", + "signInButton": "Entrar / Cadastrar-se", + "proRequired": "Pro necessário", + "proRequiredDescription": "O compartilhamento de terminal está disponível no Pro e superiores.", + "features": [ + "1 sessão por link de convite · 1 participante", + "Sincronização em nuvem em tempo real", + "Teams: 5 sessões · 10 participantes + cofres compartilhados" + ], + "upgradeToPro": "Atualizar para Pro", + "shareTerminal": "Compartilhar terminal", + "sessionNamePlaceholder": "Nome da sessão…", + "tabPeople": "Pessoas", + "tabTeam": "Cofre da equipe", + "tabInviteLink": "Link", + "sessionLimitReached": "Limite de sessões atingido para o seu plano.", + "failedToShare": "Falha ao compartilhar", + "failedToGenerateLink": "Falha ao gerar o link", + "noVaultsCreateTeamFirst": "Nenhum cofre — crie uma equipe primeiro", + "allRoles": "todas as funções", + "startSharingWithVault_one": "Começar a compartilhar com {{count}} cofre", + "startSharingWithVault_many": "Começar a compartilhar com {{count}} cofres", + "startSharingWithVault_other": "Começar a compartilhar com {{count}} cofres", + "selectVaultToShare": "Selecione um cofre para compartilhar", + "shareCodeDescription": "Compartilhe este código — qualquer pessoa que o tenha pode entrar:", + "generateLinkDescription": "Gere um link de uso único. Qualquer pessoa com uma conta Voltius pode entrar.", + "generateInviteLink": "Gerar link de convite", + "upToParticipants_one": "Até {{count}} participante", + "upToParticipants_many": "Até {{count}} participantes", + "upToParticipants_other": "Até {{count}} participantes", + "upgradeToTeamsForParticipants": "Atualize para Teams para 10 participantes + cofres compartilhados", + "live": "Ao vivo", + "waitingForGuests": "A aguardar alguém entrar…", + "participantsRatio_one": "{{participantCount}} / {{guestCap}} participante", + "participantsRatio_many": "{{participantCount}} / {{guestCap}} participantes", + "participantsRatio_other": "{{participantCount}} / {{guestCap}} participantes", + "guestsRatio_one": "{{participantCount}} de {{guestCap}} convidado", + "guestsRatio_many": "{{participantCount}} de {{guestCap}} convidados", + "guestsRatio_other": "{{participantCount}} de {{guestCap}} convidados", + "upgradeToTeams": "Atualizar para Teams", + "upgradeToBusiness": "Atualizar para Business", + "stopSharing": "Parar de compartilhar", + "inviteHasAccess": "Tem acesso", + "inviteSent": "Convidado", + "inviteCapReached": "Limite atingido", + "inviteFailed": "Não foi possível convidar {{name}}", + "withdrawInvite": "Retirar convite", + "uninviteFailed": "Não foi possível retirar o convite", + "inviteNoTeammates": "Nenhum colega de equipe ainda", + "inviteLoadFailed": "Não foi possível carregar os colegas de equipe", + "peopleSearchPlaceholder": "Pesquisar por @handle ou e-mail…", + "peopleNoMatch": "Ninguém nas suas equipes corresponde a \"{{query}}\".", + "peopleFindRule": "Pessoas fora das suas equipes são encontradas pelo @handle ou pelo endereço de e-mail completo.", + "recentLabel": "Recentes", + "recentEmpty": "As pessoas que você convidar aparecerão aqui.", + "yourTeamsLabel": "Suas equipes", + "elsewhereLabel": "Em outros lugares no Voltius", + "notInYourTeams": "Fora das suas equipes", + "presenceOnline": "Online", + "presenceOffline": "Offline", + "forgetPerson": "Remover dos recentes", + "deepLinkJoinTitle": "Entrar no terminal compartilhado?", + "deepLinkJoinBody": "Alguém compartilhou uma sessão de terminal ao vivo com você. Entrar conecta você a ela agora.", + "deepLinkJoinUnknownHost": "O Voltius não consegue identificar quem compartilhou até você entrar.", + "deepLinkJoinAction": "Entrar na sessão", + "deepLinkJoinFailed": "Não foi possível entrar nessa sessão — o link pode ter expirado.", + "deepLinkInviteTitle": "Convidar @{{handle}}?", + "deepLinkInviteBody": "Este link pede que você convide @{{handle}} para o terminal que você está compartilhando. Ele verá tudo naquele terminal.", + "deepLinkInviteUnknownUser": "Nenhuma conta Voltius corresponde exatamente a @{{handle}}.", + "deepLinkInviteNoActiveSession": "Você não está compartilhando um terminal agora. Comece a compartilhar um e abra este link novamente.", + "deepLinkInviteAction": "Convidar", + "deepLinkInviteFailed": "Não foi possível enviar o convite", + "getSpokenCode": "Obter um código para ler em voz alta", + "codeExpired": "Código expirado — obtenha um novo", + "newCode": "Novo código", + "readAloudHint": "Diga em voz alta", + "expiresIn": "expira em {{time}}", + "failedToMintCode": "Falha ao criar o código" + }, + "snippetVariableModal": { + "on": "Ligado", + "off": "Desligado", + "masked": "mascarado", + "preview": "Prévia", + "execute": "Executar" + }, + "snippets": { + "renameFolder": "Renomear pasta", + "newFolder": "Nova pasta", + "folderNamePlaceholder": "Nome da pasta", + "notRelevantForConnection": "Não é relevante para a conexão atual", + "removeFromFavorites": "Remover dos favoritos", + "addToFavorites": "Adicionar aos favoritos", + "duplicate": "Duplicar", + "moveToFolder": "Mover para a pasta", + "back": "Voltar", + "unfiled": "Sem pasta", + "searchPlaceholder": "Pesquisar snippets…", + "newSnippetTitle": "Novo snippet", + "favorites": "Favoritos", + "recent": "Recentes", + "noSnippetsMatch": "Nenhum snippet corresponde", + "noSnippetsYet": "Nenhum snippet ainda.\nClique em + para criar um." + }, + "search": { + "placeholder": "Localizar", + "invalid": "Inválido", + "noResults": "Nenhum resultado", + "resultCounter": "{{index}} de {{count}}", + "matchCase": "Diferenciar maiúsculas (Alt+C)", + "matchWholeWord": "Palavra inteira (Alt+W)", + "useRegex": "Usar expressão regular (Alt+R)", + "previousMatch": "Correspondência anterior (Shift+Enter)", + "nextMatch": "Próxima correspondência (Enter)", + "closeTitle": "Fechar (Escape)" + }, + "overlay": { + "continue": "Continuar", + "connectAndSave": "Conectar e guardar", + "continueAndSave": "Continuar e guardar", + "steps": { + "tcpConnection": "Conexão TCP", + "sshHandshake": "Handshake SSH", + "authenticating": "A autenticar", + "openingShell": "Abrindo shell", + "sftpSubsystem": "Subsistema SFTP", + "openingPort": "Abrindo porta", + "ready": "Pronto", + "portKnock": "Port knock" + }, + "reconnectWait": { + "offline": { + "title": "Você está offline", + "subtitle": "Rea ligar quando a rede voltar" + }, + "slow": { + "title": "Host ainda inacessível", + "subtitle": "Tentando novamente a cada {{seconds}} segundos" + }, + "retryNow": "Tentar agora" + }, + "connectionError": { + "title": "Falha na conexão", + "retry": "Tentar novamente", + "dismiss": "Dispensar" + }, + "hostKeyConflict": { + "title": "CHAVE DO HOST ALTERADA", + "replace": "Substituir", + "addAsNew": "Adicionar como novo", + "abort": "Abortar", + "stored": "Armazenada", + "received": "Recebida", + "description": "A impressão digital de {{address}} mudou." + }, + "passphrasePrompt": { + "title": "FRASE SECRETA DA CHAVE OBRIGATÓRIA", + "description": "Esta chave está criptografada. Informe a frase secreta para continuar.", + "placeholder": "Frase secreta" + }, + "usernamePrompt": { + "title": "NOME DE UTILIZADOR OBRIGATÓRIO", + "description": "Este host não tem nome de utilizador definido. Informe um ou escolha uma identidade para continuar.", + "placeholder": "root" + }, + "authPrompt": { + "title": "AUTENTICAÇÃO OBRIGATÓRIA", + "description": "Este host não tem método de autenticação. Escolha um para continuar.", + "modePassword": "Palavra-passe", + "modeKey": "Chave", + "modeIdentity": "Identidade", + "passwordPlaceholder": "Palavra-passe", + "keyPassphrasePlaceholder": "Frase secreta da chave (opcional)" + }, + "vaultError": { + "unreadableTitle": "Não foi possível ler o cofre", + "unreadableBody": "As credenciais deste host estão armazenadas, mas o cofre local não pôde ser desencriptado com a chave atual. Nada foi eliminado — desbloqueie o cofre para conectar.", + "lockedTitle": "O cofre está bloqueado", + "lockedBody": "As credenciais deste host estão armazenadas no cofre, que está bloqueado. Desbloqueie-o para conectar.", + "unlock": "Desbloquear cofre", + "retry": "Tentar novamente", + "dismiss": "Fechar aba" + }, + "identityPick": { + "title": "Sua identidade não está disponível", + "missingBody": "Você escolheu uma identidade para {{host}}, mas ela não está neste dispositivo ou foi removida. Nenhuma conexão foi tentada.", + "forbiddenBody": "Você escolheu {{identity}} para {{host}}, mas não pode mais usá-la. Nenhuma conexão foi tentada.", + "choose": "Escolher outra identidade", + "useHostNamed": "Usar {{name}} (host) desta vez", + "useHost": "Usar a credencial do host desta vez" + }, + "saveTarget": { + "rememberFor": "Lembrar para", + "saveFor": "Guardar para", + "thisHost": "Este host", + "allVaultHosts": "Todos os hosts de {{vault}}", + "everyone": "Todos", + "onlyMe": "Apenas eu", + "ownNote": "Apenas você. Os colegas de equipe mantêm as configurações do próprio host.", + "teamNote": "Todos atualizam {{host}} para toda a equipe. \"Apenas eu\" deixa o host como está." + } + }, + "statusBar": { + "badge": { + "ssh": "SSH", + "serial": "SERIAL", + "local": "LOCAL" + }, + "localSystemFallback": "Sistema local", + "serialFallback": "serial", + "pingUp": "Ativo · {{ms}}ms", + "pingDown": "Inativo", + "pingUnknown": "Desconhecido", + "copyLabel": "Copiar {{text}}", + "openPortsPanel": "Abrir painel de portas", + "reconnectTitle": "Reconectar", + "serialClose": "Fechar a porta serial (mantém a aba)", + "serialReopen": "Reabrir a porta serial", + "serialAutoReconnectOn": "Reconexão automática ativada — clique para parar de reivindicar a porta", + "serialAutoReconnectOff": "Reconexão automática desativada — a porta fica livre após uma queda", + "serialLineOn": "{{line}} ativado — clique para desativar", + "serialLineOff": "{{line}} desativado — clique para ativar", + "serialRtsFlowControlled": "RTS é controlado pelo fluxo RTS/CTS", + "serialBreak": "Enviar sinal de break", + "systemMetricsTitle": "Métricas do sistema", + "activeTunnels_one": "{{count}} túnel ativo", + "activeTunnels_many": "{{count}} túneis ativos", + "activeTunnels_other": "{{count}} túneis ativos", + "cpu": "CPU {{pct}}%", + "copiedBang": "Copiado!", + "loadingEllipsis": "a carregar…", + "sparklineMin": "mín. {{value}}ms", + "sparklineAvg": "méd. {{value}}ms", + "sparklineMax": "máx. {{value}}ms" + }, + "xterm": { + "linkTooltip": "Alt+clique para abrir", + "sessionClosed": "Sessão encerrada", + "serialClosed": "Conexão serial encerrada" + }, + "pasteImage": { + "uploading": "A enviar captura de tela", + "uploadingDetail": "para {{host}} · {{size}} · {{width}}×{{height}}", + "pasted": "Captura de tela colada", + "pastedDetail": "{{host}} · {{name}}", + "firstUse": "No host por 7 dias, apenas você pode lê-la", + "settings": "Configurações de colagem de imagem", + "deleteFromHost": "Eliminar do host", + "deleted": "Captura de tela excluída do host", + "deleteFailed": "Não foi possível eliminar a captura de tela", + "failed": "Não foi possível enviar a captura de tela", + "retry": "Tentar novamente", + "broadcast": "A colagem de imagem fica desativada enquanto você digita em vários painéis ao mesmo tempo." + } + } +} diff --git a/src/i18n/locales/pt-PT/themeCreator.json b/src/i18n/locales/pt-PT/themeCreator.json new file mode 100644 index 000000000..1b9dd04f3 --- /dev/null +++ b/src/i18n/locales/pt-PT/themeCreator.json @@ -0,0 +1,107 @@ +{ + "themeCreator": { + "header": { + "editTheme": "Editar tema", + "newTheme": "Novo tema", + "pickTooltip": "Escolha um elemento para inspecionar suas variáveis CSS" + }, + "font": { + "customLabel": "Fonte personalizada…", + "customPlaceholder": "'Minha Fonte', monospace", + "customHint": "Pressione Enter para aplicar", + "searchPlaceholder": "Pesquisar fontes instaladas…", + "loading": "A ler fontes instaladas…", + "noneInstalled": "Nenhuma fonte instalada encontrada", + "noMatches": "Nenhuma fonte correspondente", + "showAll": "Mostrar todas as fontes", + "showMonospaceOnly": "Mostrar apenas fontes monoespaçadas", + "notInstalled": "\"{{family}}\" não está instalada — o terminal usará outra fonte como alternativa" + }, + "varSearch": { + "hint_one": "{{count}} elemento usa {{name}} — Esc ou clique para fechar", + "hint_many": "{{count}} elementos usam {{name}} — Esc ou clique para fechar", + "hint_other": "{{count}} elementos usam {{name}} — Esc ou clique para fechar" + }, + "pickOverlay": { + "hint": "Clique em qualquer elemento — Esc para cancelar" + }, + "editor": { + "general": "Geral", + "name": "Nome", + "appFont": "Fonte do aplicativo", + "family": "Família", + "sizePx": "Tamanho (px)", + "lineHeight": "Altura da linha", + "terminalFont": "Fonte do terminal", + "highlightUsing": "Destacar elementos que usam {{varName}}", + "resetColor": "Redefinir para o padrão" + }, + "groups": { + "backgrounds": "Planos de fundo", + "borders": "Bordas", + "text": "Texto", + "accentAndTabs": "Destaque e abas", + "vaultTabs": "Abas do cofre", + "status": "Status", + "other": "Outros", + "terminalBase": "Base do terminal", + "ansiColors": "Cores ANSI", + "brightAnsiColors": "Cores ANSI brilhantes" + }, + "fields": { + "bgTerminal": "Terminal / Barra de título", + "bgStatusBar": "Barra de status", + "bgBase": "Fundo base", + "bgToolbar": "Barra de ferramentas", + "bgCard": "Cartões", + "bgCardHover": "Cartões em foco", + "bgCardAvatar": "Avatar do cartão", + "bgInput": "Campos de entrada", + "bgInputHover": "Campos de entrada em foco", + "bgElevated": "Elevado / Foco", + "bgModal": "Modal / Painel", + "border": "Borda", + "borderHover": "Borda em foco", + "textDim": "Texto esmaecido", + "textMuted": "Texto suave", + "textSecondary": "Texto secundário", + "textPrimary": "Texto principal", + "textBright": "Texto brilhante", + "accent": "Destaque", + "accentHover": "Destaque em foco", + "tabBg": "Fundo da aba", + "tabActiveBg": "Fundo da aba ativa", + "tabActiveText": "Texto da aba ativa", + "tabActiveBorder": "Borda da aba ativa", + "vaultTabBg": "Fundo da aba do cofre", + "vaultTabActiveBg": "Fundo da aba ativa do cofre", + "statusConnected": "Conectado", + "statusError": "Erro", + "statusConnecting": "A ligar", + "statusWarning": "Aviso", + "textNotice": "Texto de aviso", + "background": "Fundo", + "foreground": "Primeiro plano", + "cursor": "Cursor", + "selectionBackground": "Seleção", + "selectionForeground": "Texto selecionado", + "black": "Preto", + "red": "Vermelho", + "green": "Verde", + "yellow": "Amarelo", + "blue": "Azul", + "magenta": "Magenta", + "cyan": "Ciano", + "white": "Branco", + "brightBlack": "Preto brilhante", + "brightRed": "Vermelho brilhante", + "brightGreen": "Verde brilhante", + "brightYellow": "Amarelo brilhante", + "brightBlue": "Azul brilhante", + "brightMagenta": "Magenta brilhante", + "brightCyan": "Ciano brilhante", + "brightWhite": "Branco brilhante" + }, + "defaultName": "Meu tema" + } +} diff --git a/src/i18n/locales/pt/_meta.json b/src/i18n/locales/pt/_meta.json new file mode 100644 index 000000000..b803278f6 --- /dev/null +++ b/src/i18n/locales/pt/_meta.json @@ -0,0 +1,6 @@ +{ + "_meta": { + "status": "machine-drafted, needs native-speaker review", + "issue": "https://github.com/VoltiusApp/voltius/issues/339" + } +} diff --git a/src/i18n/locales/pt/changelog.json b/src/i18n/locales/pt/changelog.json new file mode 100644 index 000000000..67fbe4a03 --- /dev/null +++ b/src/i18n/locales/pt/changelog.json @@ -0,0 +1,22 @@ +{ + "changelog": { + "title": "Novidades", + "autoDownload": "Download automático", + "quickLinks": { + "documentation": "Documentação" + }, + "loading": "Carregando changelog…", + "unavailable": "Changelog indisponível off-line. Reconecte para ver as novidades.", + "hidePreviousReleases": "Ocultar versões anteriores", + "previousReleases": "Versões anteriores ({{count}})", + "newBadge": "Novo", + "updateBanner": { + "checking": "Verificando atualizações…", + "downloading": "Baixando v{{version}}… {{progress}}%", + "ready": "v{{version}} está pronto para instalar", + "restartToUpdate": "Reiniciar para atualizar", + "available": "v{{version}} está disponível", + "download": "Baixar" + } + } +} diff --git a/src/i18n/locales/pt/common.json b/src/i18n/locales/pt/common.json new file mode 100644 index 000000000..98fed87f3 --- /dev/null +++ b/src/i18n/locales/pt/common.json @@ -0,0 +1,309 @@ +{ + "common": { + "action": { + "retry": "Tentar novamente", + "dismiss": "Descartar", + "cancel": "Cancelar", + "save": "Salvar", + "delete": "Excluir", + "close": "Fechar", + "confirm": "Confirmar", + "edit": "Editar", + "create": "Criar", + "copy": "Copiar", + "cut": "Recortar", + "paste": "Colar", + "rename": "Renomear", + "remove": "Remover", + "add": "Adicionar", + "connect": "Conectar", + "disconnect": "Desconectar", + "duplicate": "Duplicar", + "moveTo": "Mover para", + "copyTo": "Copiar para", + "pin": "Fixar", + "unpin": "Desfixar", + "moreOptions": "Mais opções", + "closePanel": "Fechar painel" + }, + "entity": { + "host": "Host", + "hosts": "Hosts", + "vault": "Cofre", + "vaults": "Cofres", + "key": "Chave", + "keys": "Chaves", + "snippet": "Snippet", + "snippets": "Snippets", + "folder": "Pasta", + "session": "Sessão", + "sessions": "Sessões", + "rule": "Regra", + "rules": "Regras", + "tags": "Tags", + "personal": "Pessoal" + }, + "state": { + "loading": "Carregando…", + "saving": "Salvando…", + "none": "Nenhum", + "empty": "Ainda não há nada aqui", + "error": "Algo deu errado", + "noResults": "Sem resultados" + }, + "viewMode": { + "grid": "Grade", + "list": "Lista" + }, + "placeholder": { + "filter": "Filtrar…", + "search": "Pesquisar…" + }, + "toast": { + "proSubscriptionEnded": "Sua assinatura Pro terminou — a sincronização foi pausada.", + "managePlan": "Gerenciar plano →", + "undoFailed": "Falha ao desfazer: {{error}}", + "redoFailed": "Falha ao refazer: {{error}}", + "fileSaved": "Salvo em {{path}}", + "fileSaveFailed": "Não foi possível salvar o arquivo: {{error}}", + "sessionRevoked": "Este dispositivo foi desconectado da sua conta Voltius. Entre novamente para continuar sincronizando.", + "signInAgain": "Entrar" + }, + "error": { + "identityPickUnavailable": "Sua identidade para {{host}} não está disponível", + "failedToListIdentityPicks": "Não foi possível carregar suas opções de identidade ({{status}})", + "failedToSaveIdentityPick": "Não foi possível salvar sua escolha de identidade ({{status}})", + "notConnectedToServer": "Não conectado ao servidor", + "notAuthenticated": "Não autenticado", + "invalidSessionKey": "A chave da sessão deve ter 32 bytes", + "sessionExpired": "Sessão expirada — faça login novamente", + "connectNotAllowed": "Você não tem permissão para conectar a este host", + "vaultLocked": "Cofre está trancado", + "vaultUnreadable": "O cofre deste dispositivo não pode ser aberto com sua chave", + "identityUnproven": "Este dispositivo não pôde verificar suas chaves de conta. Saia e entre novamente com sua senha mestre.", + "rateLimited": "Limite de taxa atingido — tente novamente em {{seconds}}s", + "serverError": "Erro do servidor: {{status}}", + "connectionNotFound": "Conexão não encontrada", + "noConnectionsSelected": "Nenhuma conexão selecionada", + "serialPortConfigNotFound": "Configuração de porta serial não encontrada", + "connectionConfigNotFound": "Configuração de conexão não encontrada", + "failedToFetchAuditLogs": "Falha ao buscar registros de auditoria: {{status}}", + "failedToExportAuditLogs": "Falha ao exportar registros de auditoria: {{status}}", + "serverUnreachableTimeout": "Servidor inalcançável (tempo esgotado) — verifique sua conexão com a internet e a URL do servidor", + "networkError": "Erro de rede — {{message}}", + "emailAlreadyRegistered": "E-mail já registrado", + "registrationFailed": "Falha no registro: {{status}}", + "registrationDisabled": "O registro de novas contas está desativado neste servidor. Peça uma conta ao administrador.", + "accountNotFound": "Conta não encontrada", + "tooManyAttempts": "Muitas tentativas — aguarde um minuto e tente novamente", + "noAccountFoundCreateOne": "Nenhuma conta encontrada. Crie uma primeiro.", + "serverLoginFailed": "Falha no login do servidor", + "sessionRefreshFailed": "Falha na atualização da sessão", + "resendVerificationFailed": "Não foi possível reenviar o e-mail de verificação", + "noAccountFound": "Nenhuma conta encontrada", + "setMasterPasswordBeforeLinking": "Defina uma senha mestre antes de vincular à nuvem", + "masterPasswordRequired": "Senha mestre necessária", + "invalidEmailOrPassword": "E-mail ou senha inválidos", + "fetchAccountInfoFailed": "Falha ao buscar informações da conta", + "accountNotMigrated": "Conta não migrada ainda — faça login no aplicativo Tauri primeiro", + "currentPasswordIncorrect": "Senha atual incorreta", + "passwordChangeFailed": "Falha na alteração de senha: {{status}}", + "emailInUse": "E-mail já está em uso", + "incorrectPassword": "Senha incorreta", + "emailUpdateFailed": "Falha na atualização do e-mail: {{status}}", + "userNotFoundVoltiusAccount": "Usuário não encontrado — ele deve ter uma conta Voltius", + "userNotFound": "Usuário não encontrado", + "cannotAddYourself": "Não é possível adicionar a si mesmo", + "seatLimitReached": "Limite de vagas atingido", + "insufficientPermissionAssignRoles": "Permissão insuficiente para atribuir funções", + "cannotRemoveThisRole": "Não é possível remover esta função", + "roleNameExists": "Já existe uma função com este nome", + "cannotModifyBuiltinRoles": "Não é possível modificar funções internas", + "cannotDeleteBuiltinRoles": "Não é possível excluir funções internas", + "noPermissionInviteMembers": "Você não tem permissão para convidar membros", + "teamInvitesDisabled": "O administrador deste servidor desativou novos convites para a equipe.", + "handleManaged": "Sua organização gerencia os identificadores neste servidor.", + "failedToCreateTeam": "Falha ao criar equipe: {{status}}", + "failedToRenameTeam": "Falha ao renomear equipe: {{status}}", + "failedToListTeams": "Falha ao listar equipes: {{status}}", + "failedToSaveLockPolicy": "Falha ao salvar a política de bloqueio: {{status}}", + "lockPolicyServerTooOld": "Atualize seu servidor Voltius para usar políticas de bloqueio.", + "failedToDeleteTeam": "Falha ao excluir equipe: {{status}}", + "failedToListMembers": "Falha ao listar membros: {{status}}", + "failedToListVaultKeyHolders": "Falha ao listar detentores da chave do cofre: {{status}}", + "failedToCheckRotationStatus": "Falha ao verificar status de rotação: {{status}}", + "failedToRotateVaultKey": "Falha ao rotacionar a chave do cofre: {{status}}", + "failedToAddMember": "Falha ao adicionar membro: {{status}}", + "failedToRemoveMember": "Falha ao remover membro: {{status}}", + "failedToAssignRole": "Falha ao atribuir função: {{status}}", + "billingTransferNeedsPlan": "Eles precisam de seu próprio plano Teams ou Business, pelo menos tão alto quanto o desta equipe, com uma vaga para todos em suas equipes e nesta", + "billingTransferNeedsOwner": "Torne-os Proprietário primeiro", + "billingTransferForbidden": "Apenas o proprietário primário pode repassar isto", + "failedToTransferBilling": "Falha ao alterar o proprietário primário: {{status}}", + "failedToRemoveRole": "Falha ao remover função: {{status}}", + "insufficientPermissionSetMemberPermissions": "Você não tem permissão para alterar as permissões deste membro", + "insufficientPermissionNameMembers": "Você não tem permissão para nomear membros", + "invalidMemberName": "Os nomes podem ter até 64 caracteres e não podem conter caracteres de controle", + "failedToNameMember": "Não foi possível salvar o nome ({{status}})", + "failedToSetMemberPermissions": "Falha ao definir permissões do membro: {{status}}", + "failedToCreateRole": "Falha ao criar função: {{status}}", + "failedToUpdateRole": "Falha ao atualizar função: {{status}}", + "failedToDeleteRole": "Falha ao excluir função: {{status}}", + "failedToUpdatePublicKey": "Falha ao atualizar a chave pública: {{status}}", + "failedToInviteMember": "Falha ao convidar membro: {{status}}", + "failedToRevokeInvitation": "Falha ao revogar convite: {{status}}", + "failedToAcceptInvitation": "Falha ao aceitar convite: {{status}}", + "failedToDeclineInvitation": "Falha ao recusar convite: {{status}}", + "failedToSavePreferences": "Falha ao salvar preferências", + "failedToDecline": "Falha ao recusar", + "failedToUninvite": "Falha ao remover pessoa", + "userNoLongerAvailable": "Esta pessoa não está mais disponível", + "failedToFetchPublicKey": "Falha ao buscar a chave pública: {{status}}", + "noPermissionTeamVaultOp": "Você não tem permissão para esta operação de cofre da equipe", + "teamVaultRequiresSubscription": "O cofre da equipe requer uma assinatura ativa do Teams ou Business", + "clientTooOldForTeamVault": "Esta versão do Voltius é muito antiga para salvar alterações neste cofre da equipe. Atualize o Voltius para continuar.", + "failedToListTeamObjects": "Falha ao listar objetos da equipe: {{status}}", + "failedToSaveTeamObject": "Falha ao salvar objeto da equipe: {{status}}", + "failedToDeleteTeamObject": "Falha ao excluir objeto da equipe: {{status}}", + "failedToSaveRuleSet": "Não foi possível salvar as permissões ({{status}})", + "failedToLoadRuleSet": "Não foi possível carregar as permissões ({{status}})", + "tooManyRuleEntries": "Muitas regras: um objeto pode ter no máximo 256.", + "failedToListTeamObjectPrefs": "Falha ao listar preferências de objetos da equipe: {{status}}", + "failedToSaveTeamObjectPref": "Falha ao salvar preferência de objeto da equipe: {{status}}", + "failedToDeleteTeamObjectPref": "Falha ao excluir preferência de objeto da equipe: {{status}}", + "failedToListTeamSecrets": "Falha ao listar segredos da equipe: {{status}}", + "failedToDeleteTeamSecret": "Falha ao excluir segredo da equipe: {{status}}", + "secretsLeftInSourceVault": "Movido, mas suas credenciais não puderam ser removidas do cofre de origem e ainda são legíveis lá: {{error}}", + "secretsUploadPending": "Movido, mas suas credenciais não puderam ser enviadas ainda. Elas permanecem neste dispositivo e são tentadas na próxima vez que o cofre carregar: {{error}}", + "failedToSaveTeamSecret": "Falha ao salvar segredo da equipe: {{status}}", + "serverLacksTeamSecretType": "Este servidor Voltius é muito antigo para armazenar isto em um cofre da equipe. Peça ao seu administrador para atualizar o servidor, então salve novamente.", + "teamSecretRefused": "O cofre da equipe não aceitou isto, portanto não foi salvo: {{error}}", + "teamSecretUploadPending": "Não enviado ao cofre da equipe ainda. Ele é mantido até o Voltius ser fechado e tentado na próxima vez que o cofre carregar: {{error}}", + "failedToLoadServerCapabilities": "Não foi possível verificar o que o servidor suporta ({{status}})", + "keyFetchFailed": "Falha ao buscar a chave: {{error}}", + "failedToUploadVaultKeys": "Falha ao fazer upload das chaves do cofre: {{status}}", + "failedToDistributeVaultKey": "Falha ao distribuir a chave do cofre: {{status}}", + "failedToSaveTeamData": "Falha ao salvar dados da equipe: {{status}}", + "failedToCreateSession": "Falha ao criar sessão: {{status}}", + "failedToInvite": "Não foi possível convidar um colega de equipe ({{status}})", + "cannotInviteWithoutSessionKey": "Não é possível convidar um colega de equipe para esta sessão — ela não tem uma chave por usuário.", + "failedToCreateInviteLinkSession": "Falha ao criar sessão de link de convite: {{status}}", + "failedToGetSessionKey": "Falha ao obter a chave da sessão: {{status}}", + "hostDidNotShareKey": "O host não compartilhou a chave da sessão. Peça para eles compartilharem novamente.", + "invalidJson": "JSON inválido", + "notVoltiusExportBundle": "Não é um pacote de exportação Voltius (esperado { version: 1, ... })", + "invalidEncryptedFile": "Arquivo criptografado inválido", + "notEncryptedVoltiusBackup": "Não é um backup criptografado do Voltius", + "unsupportedEncryptedBackup": "Backup criptografado do Voltius não suportado", + "wrongPasswordOrCorrupted": "Senha incorreta ou arquivo corrompido", + "wrongConfigPassphrase": "Esta frase de acesso não corresponde a esta configuração do SecureCRT.", + "notVoltiusUserDataFile": "Não é um arquivo de dados do usuário Voltius", + "unsupportedUserDataVersion": "Versão de dados do usuário não suportada: {{version}}", + "failedToLoadLogs": "Falha ao carregar logs", + "couldNotDetectFormat": "Não foi possível detectar o formato. Suportado: Voltius JSON, CSV, MobaXterm.ini / .mxtsessions, ZOC HostDirectory.zhd, PuTTY .reg / arquivos de sessão, exportação de sessão .ini / XML do SecureCRT, ou extração ao vivo do Termius.", + "noPuttySessions": "Nenhuma sessão salva do PuTTY ou KiTTY foi encontrada para este usuário.", + "csvMissingColumns": "O CSV deve ter uma coluna 'host'", + "termiusDumpInvalidJson": "O dump do Termius deve ser JSON válido", + "legacyTermiusUnsupported": "O formato de dump legado do Termius não é mais suportado; use a Extração Automática.", + "termiusExtractionFormat": "A extração do Termius deve retornar { version: 2, records: [...] }", + "failedToFetchSource": "Falha ao buscar a fonte: HTTP {{status}}", + "failedToMintInviteCode": "Falha ao criar código de convite: {{status}}", + "failedToRedeemInviteCode": "Falha ao usar código de convite: {{status}}", + "inviteCodeMalformed": "Este código não está no formato correto", + "inviteCodeNotFound": "Este código expirou ou está incorreto", + "inviteCodeTooManyAttempts": "Muitas tentativas — aguarde um momento e tente novamente", + "businessPlanRequired": "Isto precisa do plano Business da equipe.", + "twoFactorRequired": "Confirme com seu segundo fator: um código, uma chave de acesso ou um código de recuperação.", + "twoFactorInvalid": "Código errado. Tente o próximo que seu aplicativo mostrar.", + "twoFactorLocked": "Muitos códigos errados. Tente novamente em 15 minutos.", + "twoFactorUnavailable": "Este servidor não pode verificar códigos de autenticador agora. Use um código de recuperação.", + "twoFactorAlreadyEnabled": "A autenticação de dois fatores já está ativada.", + "twoFactorNotEnabled": "A autenticação de dois fatores não está ativada.", + "twoFactorExpired": "Esta entrada demorou demais. Comece novamente.", + "passkeyIncomplete": "A etapa da chave de acesso não foi concluída. Tente novamente.", + "passkeyLimit": "Esta conta já tem tantas chaves de acesso quanto pode conter." + }, + "clipboard": { + "cut_one": "{{count}} item recortado", + "cut_other": "{{count}} itens recortados", + "cut_many": "{{count}} itens recortados", + "copied_one": "{{count}} item copiado", + "copied_other": "{{count}} itens copiados", + "copied_many": "{{count}} itens copiados", + "toMove": "{{shortcut}} para mover", + "toPaste": "{{shortcut}} para colar", + "clear": "Limpar área de transferência", + "crossVaultMoveHeading": "Mover itens para", + "crossVaultCopyHeading": "Copiar itens para", + "crossVaultMoveDescription_one": "{{count} item sairá de seu cofre atual e se moverá para {{targetVaultName}}.", + "crossVaultMoveDescription_other": "{{count} itens sairão de seu cofre atual e se moverão para {{targetVaultName}}.", + "crossVaultMoveDescription_many": "{{count} itens sairão de seu cofre atual e se moverão para {{targetVaultName}}.", + "crossVaultCopyDescription_one": "{{count} item será copiado para {{targetVaultName}}.", + "crossVaultCopyDescription_other": "{{count} itens serão copiados para {{targetVaultName}}.", + "crossVaultCopyDescription_many": "{{count} itens serão copiados para {{targetVaultName}}.", + "cascadeMoved_one": "Seus {{names}} se movem com ele.", + "cascadeMoved_other": "Seus {{names}} se movem com ele.", + "cascadeMoved_many": "Seus {{names}} se movem com ele.", + "cascadeCopied_one": "{{names}} é copiado em vez de movido, porque objetos que ficam para trás ainda o usam.", + "cascadeCopied_other": "{{names}} são copiados em vez de movidos, porque objetos que ficam para trás ainda os usam.", + "cascadeCopied_many": "{{names}} são copiados em vez de movidos, porque objetos que ficam para trás ainda os usam.", + "cascadeAlsoCopied_one": "Seus {{names}} também são copiados.", + "cascadeAlsoCopied_other": "Seus {{names}} também são copiados.", + "cascadeAlsoCopied_many": "Seus {{names}} também são copiados.", + "pasteRootCrossVault": "Colar no nível superior não pode mover itens entre cofres enquanto vários cofres estão exibidos — selecione um único cofre, ou abra uma pasta no cofre de destino.", + "pasteFailed": "Falha ao colar: {{error}}", + "pasteBlocked": "Nada foi colado: você está sem {{permissions}} em um dos cofres envolvidos.", + "permissionsMissing": "você está sem {{permissions}} em um dos cofres envolvidos", + "pasteSkipped_one": "{{count} item não existe mais e foi ignorado.", + "pasteSkipped_other": "{{count} itens não existem mais e foram ignorados.", + "pasteSkipped_many": "{{count} itens não existem mais e foram ignorados.", + "pasteWouldDangle": "Nada foi colado: os itens referenciam {{kinds}} que ficariam em outro cofre e parariam de funcionar lá. Mova-os para o cofre de destino primeiro.", + "kind": { + "connection": "hosts", + "identity": "identidades", + "key": "chaves SSH", + "snippet": "snippets", + "port_forward": "regras de encaminhamento de porta" + } + }, + "contentCounts": { + "connections_one": "{{count}} conexão", + "connections_other": "{{count}} conexões", + "connections_many": "{{count}} conexões", + "identities_one": "{{count}} identidade", + "identities_other": "{{count}} identidades", + "identities_many": "{{count}} identidades", + "keys_one": "{{count}} chave", + "keys_other": "{{count}} chaves", + "keys_many": "{{count}} chaves", + "snippets_one": "{{count}} snippet", + "snippets_other": "{{count}} snippets", + "snippets_many": "{{count}} snippets", + "portForwardingRules_one": "{{count}} regra de encaminhamento de porta", + "portForwardingRules_other": "{{count}} regras de encaminhamento de porta", + "portForwardingRules_many": "{{count}} regras de encaminhamento de porta" + }, + "serialDevice": "Dispositivo Serial", + "localShellTitle": "Shell Local › {{shell}}", + "memberFallback": "Membro", + "dragItemFallback": "Item", + "relativeTime": { + "justNow": "agora mesmo", + "secondsAgo": "{{count}}s atrás", + "minutesAgo": "{{count}}m atrás", + "hoursAgo": "{{count}}h atrás", + "daysAgo": "{{count}}d atrás" + }, + "history": { + "movedItems_one": "Movido {{count}} item", + "movedItems_other": "Movidos {{count}} itens", + "movedItems_many": "Movidos {{count}} itens", + "pastedItems_one": "Colado {{count}} item", + "pastedItems_other": "Colados {{count}} itens", + "pastedItems_many": "Colados {{count}} itens", + "movedToFolder_one": "Movido {{count}} item para a pasta", + "movedToFolder_other": "Movidos {{count}} itens para a pasta", + "movedToFolder_many": "Movidos {{count}} itens para a pasta" + } + } +} diff --git a/src/i18n/locales/pt/connections.json b/src/i18n/locales/pt/connections.json new file mode 100644 index 000000000..35455fc6e --- /dev/null +++ b/src/i18n/locales/pt/connections.json @@ -0,0 +1,239 @@ +{ + "connections": { + "common": { + "general": "Geral", + "labelField": "Rótulo", + "tags": "Tags", + "folder": "Pasta", + "port": "Porta", + "advanced": "Avançado", + "baudRate": "Taxa de Baud", + "dataBits": "Bits de Dados", + "stopBits": "Bits de Parada", + "parity": "Paridade", + "flowControl": "Controle de Fluxo", + "even": "Par", + "odd": "Ímpar", + "xonXoff": "XON/XOFF", + "rtsCts": "RTS/CTS", + "on": "Ligado", + "off": "Desligado", + "username": "Usuário", + "password": "Password", + "privateKey": "Private Key", + "sshKey": "Chave SSH", + "manageInKeychain": "Gerenciar no Keychain", + "hostsChaining": "Encadeamento de Hosts", + "environmentVariables": "Variáveis de Ambiente", + "preCommandPlaceholder": "Comando pré-sessão", + "postCommandPlaceholder": "Comando pós-sessão", + "sessionCommands": "Comandos da sessão", + "sessionCommandsHint": "Executar na sessão após ela abrir, e quando a aba fechar.", + "hostCommand": { + "useSnippet": "Usar um snippet", + "useInline": "Usar comando em linha", + "missingSnippet": "Snippet não encontrado", + "askEachTime": "Pedir variáveis cada vez", + "pickerTitle": "Escolher um snippet", + "searchPlaceholder": "Pesquisar snippets…" + } + }, + "form": { + "titleEdit": "Editar Host", + "titleNew": "Novo Host", + "changeIcon": "Alterar ícone", + "changeIconWithLabel": "Alterar ícone ({{label}})", + "changeIconAriaLabel": "Alterar ícone da conexão", + "namePlaceholder": "Meu Servidor (opcional)", + "sectionConnection": "Conexão", + "sectionCredentials": "Credenciais", + "sectionIdentity": "Identidade", + "sectionNotes": "Notas", + "protocol": "Protocolo", + "protocolSsh": "SSH / SFTP", + "protocolFtp": "FTP", + "protocolWebdav": "WebDAV", + "webdavUrl": "URL do Servidor", + "webdavUrlPlaceholder": "https://cloud.example.com/remote.php/dav/files/me/", + "webdavUrlInvalid": "Insira um endereço http:// ou https://, sem usuário, senha, ? ou #", + "webdavPlaintextWarning": "Não criptografado — sua senha é enviada em texto claro. Use https:// se o servidor suportar.", + "hostIp": "Host / IP", + "hostPlaceholder": "192.168.1.1", + "legacyAlgorithms": "Algoritmos Legados", + "legacyAlgorithmsTooltip": "Permitir algoritmos legados fracos (diffie-hellman-group1-sha1, 3des-cbc, hmac-sha1, …) para dispositivos antigos, como Cisco IOS legado. Algoritmos fortes ainda são preferidos. Habilite apenas para hosts que exigirem.", + "agentForwarding": "Encaminhamento de Agente", + "serialAutoReconnect": "Reconectar automaticamente", + "serialAutoReconnectTooltip": "Reabrir a porta automaticamente após uma queda. Desligue isso para placas que você reflasha: o loop de tentativas pegaria a porta de volta enquanto a ferramenta de gravação precisa dela.", + "shellIntegration": "Integração de Shell", + "keepalive": "Keepalive", + "inheritKeepalive": "Herdar ({{label}})", + "persistentSession": "Sessão persistente", + "inheritPersist": "Herdar ({{state}})", + "inheritShellIntegration": "Herdar ({{state}})", + "ftpsToggle": "FTPS explícito (AUTH TLS)", + "anonymousLogin": "Login anônimo", + "keychainIdentity": "Identidade do Keychain", + "passphrase": "Frase de acesso", + "optional": "(opcional)", + "keyPassphrasePlaceholder": "Frase de acesso da chave", + "proxy": { + "label": "Proxy", + "inherit": "Herdar ({{label}})", + "modes": { + "direct": "Direto", + "system": "Sistema", + "socks5": "SOCKS5", + "http": "HTTP", + "https": "HTTPS" + }, + "host": "Host do proxy", + "port": "Porta do proxy", + "hostMissing": "O proxy está definido como {{kind}} mas não tem host", + "portInvalid": "A porta deve estar entre 1 e 65535", + "username": "Usuário do proxy", + "password": "Proxy password", + "passwordSaved": "••• salvo" + }, + "connectAsHost": "Credencial do host", + "sharedWithTeam": "compartilhado com a equipe", + "youConnectAs": "Você se conecta como", + "change": "Alterar", + "connectAsYours": "{{username}} · seu, apenas seu", + "connectAsTeam": "{{username}} · identidade da equipe", + "connectAsAsk": "Você será perguntado ao conectar", + "connectAsUnavailable": "Sua identidade escolhida não está disponível" + }, + "distroIconPicker": { + "title": "Ícone", + "searchPlaceholder": "Pesquisar ícone", + "autoDetectOs": "Detectar SO automaticamente" + }, + "encodingSelector": { + "title": "Codificação", + "utf8Default": "UTF-8 (padrão)", + "groups": { + "unicode": "Unicode", + "westernEuropean": "Europa Ocidental", + "centralEuropean": "Europa Central", + "cyrillic": "Cirílico", + "greek": "Grego", + "hebrew": "Hebraico", + "arabic": "Árabe", + "turkish": "Turco", + "baltic": "Báltico", + "vietnamese": "Vietnamita", + "chineseSimplified": "Chinês Simplificado", + "chineseTraditional": "Chinês Tradicional", + "japanese": "Japonês", + "korean": "Coreano" + }, + "options": { + "utf-16le": "UTF-16 LE", + "utf-16be": "UTF-16 BE", + "iso-8859-1": "ISO-8859-1 (Latin-1)", + "iso-8859-15": "ISO-8859-15 (Latin-9)", + "windows-1252": "Windows-1252", + "iso-8859-2": "ISO-8859-2 (Latin-2)", + "windows-1250": "Windows-1250", + "iso-8859-5": "ISO-8859-5", + "koi8-r": "KOI8-R", + "koi8-u": "KOI8-U", + "windows-1251": "Windows-1251", + "ibm866": "IBM866", + "iso-8859-7": "ISO-8859-7", + "windows-1253": "Windows-1253", + "iso-8859-8": "ISO-8859-8", + "windows-1255": "Windows-1255", + "iso-8859-6": "ISO-8859-6", + "windows-1256": "Windows-1256", + "iso-8859-9": "ISO-8859-9", + "windows-1254": "Windows-1254", + "iso-8859-13": "ISO-8859-13", + "windows-1257": "Windows-1257", + "windows-1258": "Windows-1258", + "gbk": "GBK / GB2312", + "gb18030": "GB18030", + "big5": "Big5", + "shift-jis": "Shift-JIS", + "euc-jp": "EUC-JP", + "euc-kr": "EUC-KR" + } + }, + "envVarsPanel": { + "emptyTitle": "Nenhuma variável de ambiente", + "emptySubtitle": "As variáveis serão definidas ao conectar a este host", + "hint": "Variáveis definidas no ambiente da sessão remota", + "keyPlaceholder": "CHAVE", + "valuePlaceholder": "valor", + "removeAriaLabel": "Remover variável", + "addButton": "Adicionar Variável" + }, + "serialConfigOverlay": { + "title": "Conexão Serial", + "subtitle": "Configure a porta antes de conectar" + }, + "identitySelector": { + "title": "Identidade", + "noIdentityInline": "Sem identidade — credenciais em linha", + "badgeKey": "chave", + "badgePwd": "senha", + "sharedGroup": "cofre {{vault}} · compartilhado", + "ownGroup": "Suas identidades · apenas você" + }, + "jumpHostsPanel": { + "dragToReorderAriaLabel": "Arraste para reordenar", + "emptyTitle": "Nenhum host de salto configurado", + "emptySubtitle": "Adicione hosts para conectar antes do destino final", + "hint": "Segure e arraste para reordenar · Conectado em ordem antes de alcançar o host final", + "removeAriaLabel": "Remover host de salto", + "addButton": "Adicionar Host de Salto" + }, + "keySelector": { + "inlinePrivateKey": "Chave privada em linha", + "unnamedKey": "Chave Sem Nome" + }, + "serialForm": { + "titleEdit": "Editar Host Serial", + "titleNew": "Novo Host Serial", + "duplicate": "Duplicar", + "namePlaceholder": "Meu Dispositivo (opcional)", + "sectionSerialPort": "Porta Serial", + "customBaudButton": "Personalizado", + "presetBaudButton": "Predefinido" + }, + "vaultIdentity": { + "title": "Sua identidade para {{vault}}", + "subtitle": "Apenas você. Colegas de equipe nunca veem.", + "useOn": "Usar em hosts {{vault}} sem credencial compartilhada", + "none": "Sem padrão", + "noneHint": "Hosts sem uma credencial pedem a você, como hoje", + "footnote": "Hosts com uma credencial compartilhada a mantêm. Substitua um host com Conectar como." + }, + "knock": { + "title": "Port Knocking", + "enable": "Bater antes de conectar", + "hint": "Enviado deste dispositivo, através do proxy deste host, antes de toda conexão SSH, SFTP e de encaminhamento de porta.", + "viaBastion": "Este host se conecta através de {{name}}, então o Voltius bate em {{name} usando as configurações de batida daquele host.", + "sequence": "Sequência", + "reorderHint": "Segure e arraste para reordenar · Enviado nesta ordem", + "port": "Porta", + "dragToReorder": "Arrastar para reordenar", + "remove": "Remover porta", + "addPort": "Adicionar porta", + "timing": "Temporização", + "delay": "Atraso entre batidas", + "settle": "Aguardar após a última batida", + "window": "Janela de firewall", + "windowHint": "Por quanto tempo o firewall mantém o SSH aberto após uma batida. O ponto de acessibilidade apenas sondará dentro desta janela, então o cartão do host nunca bate sozinho. Deixe vazio se desconhecido.", + "issue": { + "empty": "Adicione pelo menos uma porta.", + "port": "Portas devem estar entre 1 e 65535.", + "udp-proxy": "Batidas UDP não podem passar pelo proxy deste host. Use etapas TCP ou uma conexão direta.", + "udp-system": "Falha nas batidas UDP se o proxy do sistema estiver em uso." + }, + "serverTooOld": "Este servidor Voltius é muito antigo para armazenar sequências de batida para hosts do cofre da equipe. Peça ao seu administrador para atualizar o servidor para usar port knocking aqui.", + "sequenceUnavailable": "A sequência de batida para este host não está disponível neste dispositivo.", + "sequenceInvalid": "A sequência de batida deste host é inválida. Corrija-a nas configurações de Port Knocking do host." + } + } +} diff --git a/src/i18n/locales/pt/errors.json b/src/i18n/locales/pt/errors.json new file mode 100644 index 000000000..38d924fcb --- /dev/null +++ b/src/i18n/locales/pt/errors.json @@ -0,0 +1,39 @@ +{ + "errors": { + "permission-denied": "Permissão negada", + "not-found": "Arquivo ou diretório não encontrado", + "already-exists": "Já existe um arquivo ou pasta com esse nome", + "storage-full": "Espaço em disco ou cota insuficiente", + "read-only-filesystem": "O sistema de arquivos é somente leitura", + "connection-refused": "O host recusou a conexão — verifique o endereço e a porta, e se o serviço está em execução", + "host-unreachable": "O host está inalcançável — verifique o endereço e sua conexão de rede", + "timed-out": "Tempo da operação esgotado", + "connection-lost": "A conexão foi perdida", + "connection-lost-resumable": "A conexão foi perdida — tente a transferência novamente para continuar de onde parou", + "transfer-verify-failed": "A cópia não correspondeu ao original, então foi descartada — tente copiar novamente", + "transfer-source-changed": "O arquivo continuou mudando enquanto era copiado — tente novamente depois que terminar de ser gravado", + "port-in-use": "A porta {{port}} e as portas seguintes já estão em uso ({{attempts}} tentativas)", + "bind-address-unavailable": "Este computador não tem o endereço {{address}}", + "remote-forward-denied": "O servidor recusou o encaminhamento remoto — a porta pode já estar em uso lá, ou o encaminhamento não é permitido", + "ssh-key-rejected": "Autenticação por chave pública rejeitada", + "ssh-password-rejected": "Autenticação por senha rejeitada — verifique o usuário e a senha", + "ssh-password-expired": "O servidor exige uma nova senha — faça login uma vez a partir de um terminal e altere-a lá", + "ssh-prompt-unanswerable": "O servidor perguntou \"{{prompt}}\", que não pode ser respondido automaticamente", + "ssh-no-usable-auth-method": "Nenhum método de autenticação utilizável — o servidor aceita apenas: {{methods}}", + "ssh-auth-timeout": "Tempo de autenticação esgotado após {{seconds}}s — o servidor aceitou a conexão mas nunca respondeu. Alguns servidores SSH antigos travam aqui; tente a opção \"Algoritmos Legados\" do host, ou outro método de autenticação.", + "login-rejected": "O servidor rejeitou o usuário ou a senha", + "resource-locked": "O arquivo está bloqueado no servidor — outra pessoa pode tê-lo aberto", + "vault-locked": "$t(common.error.vaultLocked)", + "vault-unreadable": "$t(common.error.vaultUnreadable)", + "vault-sign-in-required": "Cofres de equipe exigem uma conexão ativa com o servidor. Entre para continuar.", + "vault-read-only": "Você não tem acesso de gravação a este cofre. Peça a um gerente de cofre um papel que possa fazer alterações.", + "vault-role-read-only": "Você não tem acesso de gravação a este cofre (seu papel: {{role}}). Apenas proprietários, gerentes e editores podem fazer alterações.", + "vault-permissions-unavailable": "Não foi possível verificar permissões do cofre porque o keychain está indisponível. Tente novamente.", + "vault-permissions-corrupted": "Os dados de permissão do cofre estão corrompidos. Entre novamente para atualizar o acesso.", + "knock-udp-via-proxy": "Batidas UDP não podem passar por um proxy. Use etapas TCP ou uma conexão direta para este host." + }, + "errorAt": { + "proxy": "Proxy {{proxy}}: {{cause}}", + "jumpHost": "Host de salto {{jumpHost}}: {{cause}}" + } +} diff --git a/src/i18n/locales/pt/fileTransfer.json b/src/i18n/locales/pt/fileTransfer.json new file mode 100644 index 000000000..9a00dc563 --- /dev/null +++ b/src/i18n/locales/pt/fileTransfer.json @@ -0,0 +1,224 @@ +{ + "fileTransfer": { + "common": { + "localMachine": "Máquina Local", + "remoteFallback": "remoto", + "itemsCount_one": "{{count}} item", + "itemsCount_other": "{{count}} itens", + "itemsCount_many": "{{count}} itens" + }, + "acceleratedBadge": { + "title": "Aceleração Tar", + "description": "Agrupado em um único arquivo e extraído do outro lado — muito menos viagens de ida e volta do que arquivo por arquivo.", + "howItWorks": "Como funciona" + }, + "perFileBadge": { "reason": "Arquivo por arquivo: este host não pode fazer streaming tar" }, + "conflict": { + "title": "Arquivo já existe", + "conflictOf": "Conflito {{number}} de {{total}}", + "description": "Um item com este nome já existe no destino. O que você gostaria de fazer?", + "skip": "Pular", + "skipAll": "Pular Todos", + "overwrite": "Sobrescrever", + "overwriteAll": "Sobrescrever Todos" + }, + "pane": { + "toolbar": { + "parentDirectory": "Pasta pai", + "homeDirectory": "Pasta inicial", + "browse": "Procurar…", + "selectFolder": "Selecionar pasta", + "newFolder": "Nova pasta", + "newFile": "Novo arquivo", + "refresh": "Atualizar" + }, + "dropToTransfer": "Solte para transferir", + "placeholder": { + "folderName": "Nome da pasta", + "fileName": "Nome do arquivo" + }, + "emptyDirectory": "Diretório vazio", + "refreshFailed": "Não foi possível atualizar: {{reason}}", + "selection": { + "selected": "{{count}} selecionado", + "clear": "Limpar" + }, + "confirmDelete": { + "title": "Confirmar exclusão", + "messageSingle": "Excluir \"{{name}}\"?", + "messageMulti": "Excluir {{count}} itens?" + }, + "menu": { + "download_one": "Baixar", + "download_other": "Baixar {{count}} itens", + "download_many": "Baixar {{count}} itens", + "copyToTarget_one": "Copiar para o destino", + "copyToTarget_other": "Copiar {{count}} itens para o destino", + "copyToTarget_many": "Copiar {{count}} itens para o destino", + "moveToTarget_one": "Mover para o destino", + "moveToTarget_other": "Mover {{count}} itens para o destino", + "moveToTarget_many": "Mover {{count}} itens para o destino", + "delete_one": "Excluir", + "delete_other": "Excluir {{count}} itens", + "delete_many": "Excluir {{count}} itens", + "copyPath_one": "Copiar caminho", + "copyPath_other": "Copiar {{count}} caminhos", + "copyPath_many": "Copiar {{count}} caminhos", + "permissions": "Permissões…", + "compress": "Compactar para .tar.gz", + "extractHere": "Extrair aqui", + "openInTerminal": "Abrir no terminal", + "uploadFiles": "Fazer upload de arquivos", + "selectAll": "Selecionar Tudo", + "deselect": "Deselecionar", + "disconnect": "Desconectar", + "hideHiddenFiles": "Ocultar arquivos ocultos", + "showHiddenFiles": "Mostrar arquivos ocultos", + "sizeColumn": "Coluna de tamanho", + "dateColumn": "Coluna de data", + "permissionsColumn": "Coluna de permissões" + }, + "columns": { + "name": "Nome", + "size": "Tamanho", + "modified": "Modificado", + "permissions": "Permissões" + } + }, + "permissions": { + "items_one": "{{count}} item", + "items_other": "{{count}} itens", + "items_many": "{{count}} itens", + "bit": "{{who}}: {{what}}", + "read": "Ler", + "write": "Gravar", + "execute": "Executar", + "owner": "Proprietário", + "group": "Grupo", + "others": "Outros", + "octal": "Modo octal", + "uid": "uid {{id}}", + "gid": "gid {{id}}", + "mixed": "misto", + "noShell": "Alterar o proprietário ou o conteúdo de uma pasta precisa de um shell POSIX no host.", + "recurse": "Recursivo", + "scopeAll": "Todos", + "scopeFiles": "Arquivos", + "scopeDirs": "Pastas", + "apply": "Aplicar", + "applyItems_one": "Aplicar a {{count}}", + "applyItems_other": "Aplicar a {{count}}", + "applyItems_many": "Aplicar a {{count}}" + }, + "side": { + "chooseHost": "Escolher host…", + "back": "Voltar", + "forward": "Avançar", + "filterPlaceholder": "Filtrar…", + "uploadHere": "Fazer upload de arquivos aqui", + "selectFilesToDownload": "Selecionar arquivos para baixar", + "download_one": "Baixar \"{{name}}\"", + "download_other": "Baixar {{count}} itens", + "download_many": "Baixar {{count}} itens", + "viewOptions": "Opções de exibição", + "moreOptions": "Mais opções", + "tryAgain": "Tentar novamente", + "sparkline": { + "min": "mín {{value}}ms", + "avg": "méd {{value}}ms", + "max": "máx {{value}}ms" + } + }, + "page": { + "transferLeftToRight_one": "Transferir \"{{name}}\" →", + "transferLeftToRight_other": "Transferir {{count}} itens →", + "transferLeftToRight_many": "Transferir {{count}} itens →", + "transferRightToLeft_one": "Transferir \"{{name}}\" ←", + "transferRightToLeft_other": "Transferir {{count}} itens ←", + "transferRightToLeft_many": "Transferir {{count}} itens ←", + "selectFileLeft": "Selecione um arquivo à esquerda", + "selectFileRight": "Selecione um arquivo à direita", + "compareTitle": "Comparar \"{{leftName}}\" ↔ \"{{rightName}}\"", + "compareHint": "Selecione um arquivo de cada lado para comparar", + "selectFilesToUpload": "Selecionar arquivos para enviar", + "downloadToFolder": "Baixar para a pasta", + "connectionLost": "Conexão perdida", + "moveSourceNotDeleted": "Copiado, mas não foi possível remover o original de {{names}}: {{error}}" + }, + "queue": { + "title": "Transferências", + "transferCount_one": "{{count}} transferência", + "transferCount_other": "{{count}} transferências", + "transferCount_many": "{{count}} transferências", + "combinedThroughput": "Taxa combinada", + "cancelAll": "Cancelar todas as transferências", + "clearFinished": "Limpar transferências concluídas", + "cancelTransfer": "Cancelar transferência", + "retryTransfer": "Tentar transferência novamente", + "waiting": "Aguardando conexão…", + "resumedAt": "Retomado em {{size}}", + "resumedTooltip": "Retomado de onde a transferência interrompida parou", + "skipped_one": "Ignorado {{count}} nome que este sistema não pode armazenar:", + "skipped_other": "Ignorados {{count}} nomes que este sistema não pode armazenar:", + "skipped_many": "Ignorados {{count}} nomes que este sistema não pode armazenar:", + "mcpTooltip": "Iniciado por {{client}}", + "mcpTooltipUnknown": "Iniciado por um cliente MCP", + "status": { + "done": "Concluído", + "error": "Erro", + "cancelled": "Cancelado" + }, + "transferCountActive_one": "{{transfers}} · {{count}} ativo", + "transferCountActive_other": "{{transfers}} · {{count}} ativos", + "transferCountActive_many": "{{transfers}} · {{count}} ativos" + }, + "editor": { + "common": { + "saveCtrlS": "Salvar (Ctrl+S)", + "saveFailed": "Falha ao salvar", + "retrySave": "Tentar salvar novamente", + "retry": "Tentar novamente", + "dismiss": "Descartar" + }, + "diff": { + "loadError": "Falha ao carregar um ou ambos os arquivos para diff.", + "loading": "Carregando diff…", + "previousChange": "Alteração anterior", + "nextChange": "Próxima alteração", + "saveErrorLine": "{{label}}: {{msg}}", + "applyToRight": "Aplicar à direita (→)", + "applyToLeft": "Aplicar à esquerda (←)" + }, + "tab": { + "autoSave": "Salvamento automático", + "saveFailedReason": "Falha ao salvar: {{error}}", + "error": { + "default": "Falha ao abrir o arquivo.", + "tooLarge": "Arquivo muito grande ({{size}} bytes, limite {{limit}}). Baixe-o em vez disso.", + "binary": "Arquivo binário — não é possível editar. Baixe-o em vez disso." + } + }, + "image": { + "fit": "Ajustar", + "toggleFit": "Ajustar à aba ou mostrar tamanho real (0 / 1)", + "zoomIn": "Ampliar (+)", + "zoomOut": "Reduzir (−)", + "copy": "Copiar imagem", + "copied": "Imagem copiada para a área de transferência", + "copyFailed": "Não foi possível copiar a imagem: {{error}}", + "download": "Baixar", + "tooLarge": "Esta imagem tem {{size}}, acima do limite de pré-visualização {{limit}}.", + "previewAnyway": "Pré-visualizar mesmo assim" + }, + "tabStrip": { + "filesTab": "Arquivos", + "pendingNameFallback": "este arquivo", + "pendingNameDiffFallback": "este diff", + "discardTitle": "Descartar alterações não salvas?", + "discardMessage": "\"{{name}}\" tem alterações não salvas. Fechar esta aba as descartará.", + "discard": "Descartar", + "diffTitle": "diff: {{name}}" + } + } + } +} diff --git a/src/i18n/locales/pt/folders.json b/src/i18n/locales/pt/folders.json new file mode 100644 index 000000000..a396fb302 --- /dev/null +++ b/src/i18n/locales/pt/folders.json @@ -0,0 +1,36 @@ +{ + "folders": { + "card": { + "pin": "Fixar", + "unpin": "Desfixar", + "openFolder": "Abrir pasta", + "cloudSyncDisabled": "Sincronização em nuvem desativada", + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "exportFolder": "Exportar pasta", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableCloudSync": "Ativar sincronização em nuvem", + "deleteFolder": "Excluir pasta", + "itemCount_one": "{{count}} item", + "itemCount_other": "{{count}} itens", + "itemCount_many": "{{count}} itens" + }, + "editPanel": { + "title": "Editar Pasta", + "general": "Geral", + "nameLabel": "Nome", + "parentLabel": "Pasta pai" + }, + "appearance": { + "title": "Aparência da pasta", + "change": "Alterar ícone e cor", + "color": "Cor", + "icon": "Ícone", + "clear": "Limpar" + } + } +} diff --git a/src/i18n/locales/pt/home.json b/src/i18n/locales/pt/home.json new file mode 100644 index 000000000..50fc3874d --- /dev/null +++ b/src/i18n/locales/pt/home.json @@ -0,0 +1,56 @@ +{ + "home": { + "greeting": { + "morning": "Bom dia", + "afternoon": "Boa tarde", + "evening": "Boa noite" + }, + "search": { + "placeholder": "Pesquisar hosts, sessões, snippets…" + }, + "stat": { + "vaults_one": "cofre", + "vaults_other": "cofres", + "vaults_many": "cofres", + "hosts_one": "host", + "hosts_other": "hosts", + "hosts_many": "hosts", + "activeSessions_one": "sessão ativa", + "activeSessions_other": "sessões ativas", + "activeSessions_many": "sessões ativas", + "portForwards_one": "encaminhamento de porta", + "portForwards_other": "encaminhamentos de porta", + "portForwards_many": "encaminhamentos de porta" + }, + "quickActions": { + "export": "Exportar", + "import": "Importar" + }, + "recentHosts": { + "title": "Hosts Recentes", + "seeAll": "Ver todos", + "prevPage": "Página anterior", + "nextPage": "Próxima página", + "pageNumber": "Página {{number}}" + }, + "allHosts": { + "back": "Voltar", + "title": "Todos os Hosts", + "empty": "Nenhum host ainda." + }, + "hostCard": { + "pin": "Fixar", + "unpin": "Desfixar", + "serial": "serial", + "baud": "{{rate}} baud" + }, + "serialFallback": "Serial", + "vaultCard": { + "hostCount_one": "{{count}} host", + "hostCount_other": "{{count}} hosts", + "hostCount_many": "{{count}} hosts", + "empty": "Nenhum host ainda", + "more": "+{{count}} mais" + } + } +} diff --git a/src/i18n/locales/pt/hosts.json b/src/i18n/locales/pt/hosts.json new file mode 100644 index 000000000..b5940d096 --- /dev/null +++ b/src/i18n/locales/pt/hosts.json @@ -0,0 +1,176 @@ +{ + "hosts": { + "toolbar": { + "filterPlaceholder": "Filtrar hosts…", + "openSerialConsole": "Abrir console serial", + "serial": "Serial", + "terminal": "Terminal", + "importExport": "Importar/Exportar", + "import": "Importar…", + "export": "Exportar…", + "importFrom": "Importar de", + "newHost": "Novo Host", + "newSerialHost": "Novo Host Serial", + "newFolder": "Nova Pasta" + }, + "card": { + "pin": "Fixar", + "unpin": "Desfixar", + "pinned": "Fixado", + "pinnedByTeam": "Fixado por {{name}} para a equipe", + "pinnedByTeamAndPersonal": "Fixado por {{name}} para a equipe · você também fixou isto", + "hiddenPinnedByTeam": "Oculto da sua visualização · fixado por {{name}} para a equipe", + "teamMemberFallback": "um membro da equipe", + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "openInSftp": "Abrir no SFTP", + "copyHostnameIp": "Copiar Hostname/IP", + "copiedHost": "Copiado {{host}}", + "executeSnippet": "Executar Snippet", + "cloudSyncDisabled": "Sincronização em nuvem desativada", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableReachability": "Ativar verificação de acessibilidade", + "disableReachability": "Desativar verificação de acessibilidade", + "connectTitle": "Conectar (ou clique duplo)", + "openFilesTitle": "Abrir arquivos (ou clique duplo)", + "inUseBy": "Em uso por {{name}}", + "inUseByOverflow_one": "Em uso por {{name}} + {{count}} outro", + "inUseByOverflow_other": "Em uso por {{name}} + {{count}} outros", + "inUseByOverflow_many": "Em uso por {{name}} + {{count}} outros", + "filesSuffix": "arquivos", + "knockProtected": "Protegido por batida de porta. Sondado apenas após o Voltius bater.", + "knockWindowOpen": "Janela de batida aberta", + "knockProtectedShort": "protegido-por-batida" + }, + "page": { + "all": "Todos", + "folders": "Pastas", + "new": "Novo", + "pinned": "Fixados", + "folderEmpty": "Esta pasta está vazia", + "addHost": "Adicionar Host", + "noSearchResults": "Nenhum host corresponde a \"{{search}}\"", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "emptyState": { + "title": "Nenhum host ainda", + "subtitle": "Adicione seu primeiro host SSH para começar" + }, + "draft": { + "unsaved": "Não salvo" + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá os seguintes itens para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará os seguintes itens para {{targetVaultName}}:" + }, + "bulk": { + "executeSnippetOn_one": "Executar Snippet em {{count}} host", + "executeSnippetOn_other": "Executar Snippet em {{count}} hosts", + "executeSnippetOn_many": "Executar Snippet em {{count}} hosts", + "connectHosts": "Conectar {{count}} hosts", + "duplicateHosts": "Duplicar {{count}} hosts", + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_other": "Mover {{count}} itens para", + "moveItemsTo_many": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização em nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização em nuvem ({{count}})", + "enableReachability": "Ativar verificação de acessibilidade ({{count}})", + "disableReachability": "Desativar verificação de acessibilidade ({{count}})", + "exportHosts": "Exportar {{count}} hosts", + "deleteItems_one": "Excluir {{count}} item", + "deleteItems_other": "Excluir {{count}} itens", + "deleteItems_many": "Excluir {{count}} itens" + }, + "confirmDelete": { + "title_one": "Excluir {{count}} item", + "title_other": "Excluir {{count}} itens", + "title_many": "Excluir {{count}} itens", + "message_one": "Tem certeza de que deseja excluir {{count}} item? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja excluir {{count}} itens? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja excluir {{count}} itens? Isto não pode ser desfeito.", + "folderCascade_one": "{{count}} host arquivado nas pastas selecionadas também será excluído.", + "folderCascade_other": "{{count}} hosts arquivados nas pastas selecionadas também serão excluídos.", + "folderCascade_many": "{{count}} hosts arquivados nas pastas selecionadas também serão excluídos." + }, + "confirmDeleteFolder": { + "title": "Excluir pasta", + "message_one": "Isto excluirá a pasta, suas subpastas e o {{count}} host dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto excluirá a pasta, suas subpastas e os {{count}} hosts dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto excluirá a pasta, suas subpastas e os {{count}} hosts dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto excluirá a pasta e tudo dentro dela. Isto não pode ser desfeito." + } + }, + "remoteSessions": { + "title": "Ao vivo em outros dispositivos", + "kill": "Encerrar sessão", + "join": "Participar da sessão", + "killing": "Encerrando sessão…", + "undo": "Desfazer", + "killFailed": "Não foi possível encerrar remotamente — abra a sessão para encerrá-la", + "dismiss": "Descartar", + "deviceActive": "{{device}} · ativo {{age}}", + "unknownDevice": "Dispositivo desconhecido" + }, + "teamSessions": { + "title": "Sessões da Equipe", + "joinByCode": "Participar por código", + "emptyHint": "Terminais que seus colegas compartilham aparecem aqui. Tem um código de convite? Cole-o na pesquisa para participar.", + "live": "AO VIVO", + "pasteInviteCode": "Cole um link ou código de convite para participar de uma sessão privada:", + "inviteCodePlaceholder": "voltius://join?… ou sessionId:token", + "join": "Participar", + "resume": "Retomar", + "invalidCodeFormat": "Convite inválido — cole o link ou código que o host compartilhou com você", + "failedToJoinSession": "Falha ao participar da sessão", + "sharedTerminalFallback": "Terminal Compartilhado" + }, + "snippetPicker": { + "title": "Executar Snippet", + "goToSnippets": "Ir para Snippets", + "filterPlaceholder": "Filtrar snippets…", + "newSnippetTitle": "Novo snippet", + "new": "Novo", + "noSnippetsYet": "Nenhum snippet ainda", + "createSnippet": "Criar snippet", + "noSnippetsMatch": "Nenhum snippet corresponde", + "recent": "Recentes", + "allSnippets": "Todos os Snippets", + "hostsSelected_one": "{{count}} host selecionado", + "hostsSelected_other": "{{count}} hosts selecionados", + "hostsSelected_many": "{{count}} hosts selecionados", + "insert": "Inserir", + "execute": "Executar" + }, + "hostCommand": { + "labelPre": "{{host}} — Pré-comando", + "labelPost": "{{host}} — Pós-comando", + "failed": "Falha no comando do host para {{host}}: {{error}}", + "missingSnippet": "Snippet do comando do host está faltando para {{host}}", + "postPromptTimedOut": "Pós-comando para {{host}} foi ignorado: sem resposta dentro de 60s" + }, + "connectAs": { + "title": "Conectar como", + "yours": "seu", + "hostDefault": "padrão do host", + "vaultDefault": "Minha identidade para {{vault}}…", + "clearPick": "Limpar minha escolha" + }, + "managed": { + "badge": "ssh config", + "tooltip": "Gerenciado por ~/.ssh/config · alias {{alias}}", + "bannerTitle": "Gerenciado por ~/.ssh/config", + "bannerBodyBefore": "Alias ", + "bannerBodyAfter": ". Campos bloqueados seguem o arquivo.", + "detach": "Desvincular", + "detachMenu": "Desvincular do ~/.ssh/config" + } + } +} diff --git a/src/i18n/locales/pt/importExport.json b/src/i18n/locales/pt/importExport.json new file mode 100644 index 000000000..1edf3827c --- /dev/null +++ b/src/i18n/locales/pt/importExport.json @@ -0,0 +1,223 @@ +{ + "importExport": { + "modal": { + "title": "Importar / Exportar", + "sectionUserData": "Dados do Usuário", + "tabExport": "Exportar", + "tabImport": "Importar" + }, + "include": "Incluir", + "copied": "Copiado!", + "downloadExt": "Baixar .{{ext}}", + "passwordPlaceholder": "Senha", + "export": { + "format": "Formato", + "formatCsvDescription": "Apenas conexões — amigável para planilha", + "formatJsonDescription": "Dados completos incluindo conteúdo de chave", + "encryptBackup": "Criptografar backup", + "plaintextSecretsWarning": "Esta exportação contém senhas, chaves ou notas de host em texto simples. Mantenha a criptografia ativada, a menos que você deliberadamente precise de um arquivo não criptografado.", + "snippetRefMissing": "“{{name}}” executa outro snippet ({{target}}) que não faz parte desta exportação. Inclua-o na seleção, ou remova essa etapa.", + "exportFailed": "Não foi possível exportar: {{error}}", + "confirmPasswordPlaceholder": "Confirmar senha", + "passwordsDontMatch": "As senhas não coincidem", + "building": "Criando…", + "nothingToExport": "Nada para exportar", + "downloadEncrypted": "Baixar criptografado", + "hidePreview": "Ocultar pré-visualização", + "showPreview": "Mostrar pré-visualização", + "selectedItem_one": "{{count}} item selecionado", + "selectedItem_other": "{{count}} itens selecionados", + "selectedItem_many": "{{count}} itens selecionados", + "autoInclude": { + "connections_one": "{{count}} conexão", + "connections_other": "{{count}} conexões", + "connections_many": "{{count}} conexões", + "snippets_one": "{{count}} snippet", + "snippets_other": "{{count}} snippets", + "snippets_many": "{{count}} snippets" + }, + "autoIncludeHint": "Também incluído: usado pelos itens exportados, para que continuem funcionando após a importação", + "relatedCredentials": "Incluir credenciais vinculadas", + "relatedCredentialsHint": "As identidades e chaves SSH que estas conexões usam. Deixe desmarcado para exportar apenas as configurações de conexão; na importação eles se reconectam a uma identidade ou chave já existente no cofre.", + "checkboxLabel": { + "connections_one": "Conexão ({{count}})", + "connections_other": "Conexões ({{count}})", + "connections_many": "Conexões ({{count}})", + "identities_one": "Identidade ({{count}})", + "identities_other": "Identidades ({{count}})", + "identities_many": "Identidades ({{count}})", + "keys_one": "Chave SSH ({{count}})", + "keys_other": "Chaves SSH ({{count}})", + "keys_many": "Chaves SSH ({{count}})", + "snippets": "Snippets ({{count}})", + "portForwarding": "Encaminhamento de Porta ({{count}})" + } + }, + "import": { + "importFrom": "Importar de", + "importInto": "Importar para", + "autoExtractTitle": "Extração automática de {{label}}", + "autoExtractDescription": "Lê seus dados locais {{label}} — nenhuma exportação manual necessária", + "extracting": "Extraindo…", + "extractFrom": "Extrair de {{label}}", + "chooseConfigFolder": "Ou escolha uma pasta Config {{label}}…", + "orImportFromFile": "ou importar de arquivo", + "openFileLabel": "Abrir arquivo {{sub}}…", + "encryptedBackupTitle": "Backup criptografado — insira sua senha para desbloquear", + "unlock": "Desbloquear", + "configPassphraseTitle": "Esta configuração SecureCRT tem uma frase de acesso de configuração — insira-a para importar senhas salvas", + "skipPasswords": "Importar sem senhas salvas", + "reviewItems_one": "Revisar {{count}} item", + "reviewItems_other": "Revisar {{count}} itens", + "reviewItems_many": "Revisar {{count}} itens", + "back": "Voltar", + "reviewImportTitle": "Revisar importação", + "reIncludeDuplicates": "Reincluir duplicatas", + "skipAllDuplicates": "Pular todas as duplicatas", + "filterItemsPlaceholder": "Filtrar itens…", + "groupConnections": "Conexões", + "groupKeys": "Chaves SSH", + "groupIdentities": "Identidades", + "groupLinkedCredentials": "Credenciais vinculadas", + "linkedTo": "Vinculado a “{{name}}” neste cofre", + "linkedNotFound": "Não está neste cofre — atribua-o após a importação", + "groupPortForwarding": "Encaminhamento de Porta", + "selectAll": "Selecionar tudo", + "deselectAll": "Deselecionar tudo", + "advanced": "Avançado", + "tagLabel": "Tag:", + "tagPlaceholder": "opcional", + "importing": "Importando…", + "importButton_one": "Importar {{count}} item", + "importButton_other": "Importar {{count}} itens", + "importButton_many": "Importar {{count}} itens", + "importButtonMultiVault_one": "Importar {{count}} item × {{vaultCount}} cofres", + "importButtonMultiVault_other": "Importar {{count}} itens × {{vaultCount}} cofres", + "importButtonMultiVault_many": "Importar {{count}} itens × {{vaultCount}} cofres", + "nothingSelected": "Nada selecionado", + "unnamedKey": "Chave sem nome", + "sshKeyFallback": "Chave SSH", + "actionSkip": "Pular", + "actionInclude": "Importar", + "actionOverwrite": "Sobrescrever", + "resultImportedSuccess_one": "Importado com sucesso {{count}} item{{vaultNote}}.", + "resultImportedSuccess_other": "Importados com sucesso {{count}} itens{{vaultNote}}.", + "resultImportedSuccess_many": "Importados com sucesso {{count}} itens{{vaultNote}}.", + "resultVaultNote": " em {{count}} cofres", + "resultError": "Erro: {{error}}", + "resultImportedWithErrors_one": "Importado {{count}} item{{vaultNote}}, {{errors}} falhou.", + "resultImportedWithErrors_other": "Importados {{count}} itens{{vaultNote}}, {{errors}} falhou.", + "resultImportedWithErrors_many": "Importados {{count}} itens{{vaultNote}}, {{errors}} falhou.", + "groupNotImported": "Não importado", + "viaJump": "via {{hosts}}", + "teamKeysWarning": "Estas chaves privadas serão compartilhadas com todos os membros de {{team}}.", + "notice": { + "pattern": "Padrão: aplicado a hosts correspondentes, não importado por conta própria", + "match": "Bloco de correspondência: não suportado, ignorado", + "include": "Incluir não pôde ser lido", + "includeOutside": "Incluir fora de ~/.ssh: não lido", + "key": "Caminho IdentityFile usa tokens que não podem ser resolvidos", + "proxyCommand": "ProxyCommand não suportado ainda" + } + }, + "fileInput": { + "openFileDefault": "Abrir arquivo…", + "pasteFromClipboard": "Colar da Área de Transferência", + "clear": "Limpar", + "dropToLoad": "Solte para carregar" + }, + "userData": { + "import": { + "openFileLabel": "Abrir Arquivo…", + "placeholder": "Cole um JSON de configurações do usuário Voltius aqui, ou solte um arquivo…\n\n{ \"type\": \"voltius-user-data\", \"version\": 2, \"sections\": { ... } }", + "foundSections_one": "Encontrada {{count}} seção de configurações", + "foundSections_other": "Encontradas {{count}} seções de configurações", + "foundSections_many": "Encontradas {{count}} seções de configurações", + "applying": "Aplicando…", + "applyButton_one": "Aplicar {{count}} seção", + "applyButton_other": "Aplicar {{count}} seções", + "applyButton_many": "Aplicar {{count}} seções", + "applyDefault": "Aplicar", + "resultApplied_one": "Aplicado {{count}} configuração: {{list}}.", + "resultApplied_other": "Aplicadas {{count}} configurações: {{list}}.", + "resultApplied_many": "Aplicadas {{count}} configurações: {{list}}.", + "resultError": "Erro: {{error}}", + "themesReplaceWarning": "Substitui os temas personalizados deste dispositivo." + }, + "handlers": { + "themes": { "label": "Temas" }, + "uiPreferences": { "label": "Preferências da UI" }, + "shortcuts": { "label": "Atalhos" }, + "appSettings": { "label": "Configurações do App" }, + "recentPeople": { "label": "Pessoas Recentes" }, + "vaults": { "label": "Cofres" } + }, + "describe": { + "themes_one": "{{count}} tema personalizado", + "themes_other": "{{count}} temas personalizados", + "themes_many": "{{count}} temas personalizados", + "uiPreferences": "escala {{scale}}× · layout {{layout}}", + "shortcutsOverrides_one": "{{count}} sobrescrita", + "shortcutsOverrides_other": "{{count}} sobrescritas", + "shortcutsOverrides_many": "{{count}} sobrescritas", + "shortcutsDefaults": "Padrões", + "appSettingsShell": "shell: {{shell}}", + "appSettingsDefault": "Configurações padrão", + "recentPeople_one": "{{count}} pessoa recente", + "recentPeople_other": "{{count}} pessoas recentes", + "recentPeople_many": "{{count}} pessoas recentes", + "vaults_one": "{{count}} cofre", + "vaults_other": "{{count}} cofres", + "vaults_many": "{{count}} cofres" + } + }, + "importers": { + "voltius": { + "sub": "JSON", + "placeholder": "Cole o JSON do Voltius aqui, ou solte um arquivo .json…\n\n{ \"version\": 1, \"connections\": [...] }" + }, + "csv": { + "sub": "Planilha", + "placeholder": "Cole o CSV aqui, ou solte um arquivo…\n\nname,host,port,username,auth_type,tags" + }, + "openssh": { + "sub": "~/.ssh/config", + "hint": "Lê ~/.ssh/config, seus arquivos Include e as chaves nomeadas por IdentityFile. Você também pode colar um config ou abrir um arquivo.", + "hintMobile": "Cole seu ~/.ssh/config ou abra o arquivo. As chaves são correspondidas pelo nome de arquivo com as chaves já no cofre.", + "placeholder": "Host my-server\n HostName 10.0.0.5\n User alex\n IdentityFile ~/.ssh/id_ed25519", + "notFound": "Nenhum ~/.ssh/config foi encontrado neste computador.", + "unreadable": "~/.ssh/config não pôde ser lido ({{reason}})." + }, + "mobaxterm": { + "sub": "Instalação local · auto-descriptografia", + "hint": "Requer MobaXterm instalado (apenas Windows).", + "placeholder": "Solte MobaXterm.ini aqui, ou cole seu conteúdo…" + }, + "termius": { + "sub": "Instalação local · extração automática", + "hint": "Requer Termius instalado e logado.", + "placeholder": "Use a Extração Automática para o Termius. Dumps legados do Termius colados não são suportados para importação fiel." + }, + "zoc": { + "sub": "Host Directory · .zhd", + "hint": "Encontre-o em Documents\\ZOC9 Files\\Options (Windows) ou ~/Library/Application Support/ZOC9 Files/Options (macOS). Entradas SSH e serial são importadas; senhas salvas não são.", + "placeholder": "Solte HostDirectory.zhd aqui, ou cole seu conteúdo…" + }, + "putty": { + "sub": ".reg ou sessão", + "hint": "Lê sessões salvas do registro no Windows, ou de ~/.putty/sessions no Linux e macOS. Você também pode soltar uma exportação .reg ou colar arquivos de sessão. Sessões SSH e serial, proxies e túneis são importados; arquivos de chave não são.", + "placeholder": "Solte uma exportação .reg do PuTTY aqui, ou cole arquivos de sessão…" + }, + "securecrt": { + "sub": "Sessão .ini · exportação XML", + "hint": "A extração automática lê a configuração local do SecureCRT. Você também pode soltar um arquivo .ini de sessão de Config/Sessions, ou o arquivo XML de Arquivo → Exportar Configurações. Sessões SSH e serial são importadas com suas senhas salvas; Telnet, RLogin, Raw e outros protocolos são ignorados.", + "placeholder": "Solte um arquivo .ini de sessão do SecureCRT ou um arquivo .xml de Exportar Configurações aqui, ou cole seu conteúdo…" + } + }, + "menu": { + "export": "Exportar", + "importEllipsis": "Importar…", + "exportEllipsis": "Exportar…" + } + } +} diff --git a/src/i18n/locales/pt/keychain.json b/src/i18n/locales/pt/keychain.json new file mode 100644 index 000000000..ff122e486 --- /dev/null +++ b/src/i18n/locales/pt/keychain.json @@ -0,0 +1,167 @@ +{ + "keychain": { + "common": { + "general": "Geral", + "label": "Rótulo", + "tags": "Tags", + "folder": "Pasta", + "optional": "(opcional)", + "username": "Usuário", + "password": "Password", + "privateKey": "Private Key", + "publicKey": "Chave Pública", + "passphrase": "Frase de acesso", + "addToHost": "Adicionar ao host", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableCloudSync": "Ativar sincronização em nuvem", + "cloudSyncDisabledTitle": "Sincronização em nuvem desativada" + }, + "toolbar": { + "filterPlaceholder": "Filtrar…", + "newKey": "Nova Chave", + "newKeyOptionsAriaLabel": "Opções de nova chave", + "generateKeyPair": "Gerar Par de Chaves", + "newIdentity": "Nova Identidade", + "newFolder": "Nova Pasta" + }, + "page": { + "all": "Todos", + "folders": "Pastas", + "new": "Novo", + "pinned": "Fixados", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "bulk": { + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_other": "Mover {{count}} itens para", + "moveItemsTo_many": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização em nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização em nuvem ({{count}})", + "exportPublicKeys_one": "Exportar {{count}} chave pública", + "exportPublicKeys_other": "Exportar {{count}} chaves públicas", + "exportPublicKeys_many": "Exportar {{count}} chaves públicas", + "deleteItems_one": "Excluir {{count}} item", + "deleteItems_other": "Excluir {{count}} itens", + "deleteItems_many": "Excluir {{count}} itens" + }, + "confirmDeleteFolder": { + "title": "Excluir pasta", + "message_one": "Isto excluirá a pasta, suas subpastas e o {{count}} item dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto excluirá a pasta, suas subpastas e os {{count}} itens dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto excluirá a pasta, suas subpastas e os {{count}} itens dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto excluirá a pasta e tudo dentro dela. Isto não pode ser desfeito." + }, + "confirmDelete": { + "title_one": "Excluir {{count}} item", + "title_other": "Excluir {{count}} itens", + "title_many": "Excluir {{count}} itens", + "message_one": "Tem certeza de que deseja excluir {{count}} item? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja excluir {{count}} itens? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja excluir {{count}} itens? Isto não pode ser desfeito.", + "folderCascade_one": "{{count}} item arquivado nas pastas selecionadas também será excluído.", + "folderCascade_other": "{{count}} itens arquivados nas pastas selecionadas também serão excluídos.", + "folderCascade_many": "{{count}} itens arquivados nas pastas selecionadas também serão excluídos." + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá os seguintes itens para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará os seguintes itens para {{targetVaultName}}:" + } + }, + "cards": { + "addedOn": "adicionado {{date}}", + "passwordBadge": "Senha", + "sshKeysLabel": "Chaves SSH", + "identitiesLabel": "Identidades", + "keySection": { + "emptyTitle": "Ainda não há chaves SSH", + "emptyDescription": "Armazene pares de chaves SSH reutilizáveis", + "addButton": "Adicionar Chave" + }, + "identitySection": { + "emptyTitle": "Ainda não há identidades", + "emptyDescription": "Combine um nome de usuário com credenciais para reutilizar em hosts", + "addButton": "Adicionar Identidade" + }, + "pin": { + "unpinForMe": "Desfixar para mim", + "showInMyView": "Mostrar na minha visualização", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpin": "Desfixar", + "pin": "Fixar", + "unpinForTeam": "Desfixar para a equipe", + "pinForTeam": "Fixar para a equipe" + } + }, + "keyForm": { + "titleEdit": "Editar Chave", + "modeImport": "Importar", + "modeGenerate": "Gerar", + "sectionKeyMaterial": "Material da Chave", + "sectionImportFromFile": "Importar do Arquivo", + "sectionKeyExport": "Exportação de Chave", + "unknownType": "Tipo desconhecido", + "invalidKey": "Chave inválida", + "invalidPublicKey": "Não é uma chave pública SSH — esperado \"ssh-ed25519 AAAA… comentário\" em uma linha. Não será salva e não pode ser adicionada a um host.", + "keyPassphrasePlaceholder": "Frase de acesso da chave", + "incompleteKey": "Chave incompleta", + "unrecognizedKey": "Formato de chave não reconhecido" + }, + "identityForm": { + "titleEdit": "Editar Identidade", + "sectionCredentials": "Credenciais", + "sectionNewKeyMaterial": "Novo Material de Chave", + "sectionLinkedTo": "Vinculado a", + "sshKeyLabel": "Chave SSH", + "noKey": "Sem chave", + "newKeyInline": "Nova chave (em linha)...", + "unnamedKey": "Chave Sem Nome", + "namePlaceholder": "Minha Identidade (opcional)", + "keyLabel": "Rótulo da Chave", + "keyLabelPlaceholder": "Minha Chave SSH (opcional)", + "editHostTitle": "Editar host", + "unlinkTitle": "Desvincular — copiar credenciais em linha para o host" + }, + "exportPanel": { + "exportSectionLabel": "Exportar", + "destinationHost": "Host de destino", + "selectHostPlaceholder": "Selecione um host…", + "location": "Localização", + "filename": "Nome do arquivo", + "unixOnlyNotice": "A exportação de chave atualmente suporta apenas sistemas UNIX. Use a seção Avançado para personalizar o script de exportação.", + "missingPublicKeyNotice": "Esta chave não tem metade pública para enviar. Abra-a no Keychain e cole sua linha .pub — ou adicione sua frase de acesso, para que a metade pública possa ser derivada da privada.", + "advanced": "Avançado", + "exportScriptLabel": "Script de exportação", + "successMessage": "Chave exportada com sucesso", + "exportingLabel": "Exportando…", + "publicKeyNotFoundError": "Chave pública não encontrada", + "multilinePublicKeyError": "Chave pública não é válida — deve ser uma única linha", + "invalidPublicKeyError": "Chave pública não é válida — deve ser uma chave SSH pública no formato \"tipo base64 [comentário]\"", + "invalidLocationError": "Localização deve ser um caminho sob o diretório home remoto, sem segmento \"..\"", + "invalidFilenameError": "Nome do arquivo não deve conter um separador de caminho", + "remoteCommandFailedError": "Comando remoto falhou: {{detail}}", + "remoteCommandFailedUnknownError": "Comando remoto falhou (código de saída {{code}})" + }, + "dropZone": { + "loaded": "Arquivo de chave carregado", + "error": "Não foi possível ler o arquivo", + "dropToLoad": "Solte o arquivo de chave para carregar", + "dropHere": "Solte um arquivo de chave aqui", + "hint": ".pem, .key, .pub ou qualquer arquivo de chave SSH" + }, + "genFields": { + "sectionKeyType": "Tipo de Chave", + "ellipticCurve": "Curva elíptica", + "keySizeBits": "Tamanho da chave (bits)", + "passphrasePlaceholder": "Frase de acesso opcional", + "savePassphrase": "Salvar frase de acesso", + "cipher": "Cifra", + "rounds": "Rodadas", + "roundsTooltip": "Número de iterações bcrypt-pbkdf usadas para derivar a chave de criptografia da sua frase de acesso. Valores mais altos tornam ataques de força bruta mais lentos, com o custo de carregamento de chave ligeiramente mais lento. O padrão do OpenSSH é 16; 100 é um bom equilíbrio.", + "generating": "Gerando…" + } + } +} diff --git a/src/i18n/locales/pt/knownHosts.json b/src/i18n/locales/pt/knownHosts.json new file mode 100644 index 000000000..1b7626517 --- /dev/null +++ b/src/i18n/locales/pt/knownHosts.json @@ -0,0 +1,22 @@ +{ + "knownHosts": { + "tlsBadge": "TLS", + "caVerified": "Autoridade certificadora", + "toolbar": { + "deleteSelected": "Excluir selecionados", + "deleteButton": "EXCLUIR" + }, + "page": { + "noSearchResults": "Nenhum host conhecido corresponde à sua pesquisa", + "emptyState": "Nenhum host conhecido ainda — eles aparecem quando você se conecta a um servidor", + "confirmDelete": { + "title_one": "Excluir host conhecido?", + "title_other": "Excluir {{count}} hosts conhecidos?", + "title_many": "Excluir {{count}} hosts conhecidos?", + "message_one": "Isto removerá a impressão digital confiável. A próxima conexão com este host será tratada como nova.", + "message_other": "Isto removerá as impressões digitais confiáveis. A próxima conexão com estes hosts será tratada como nova.", + "message_many": "Isto removerá as impressões digitais confiáveis. A próxima conexão com estes hosts será tratada como nova." + } + } + } +} diff --git a/src/i18n/locales/pt/layout.json b/src/i18n/locales/pt/layout.json new file mode 100644 index 000000000..ad19c806a --- /dev/null +++ b/src/i18n/locales/pt/layout.json @@ -0,0 +1,327 @@ +{ + "layout": { + "nav": { + "hosts": "Hosts", + "keychain": "Keychain", + "port-forwarding": "Encaminhamento de Porta", + "snippets": "Snippets", + "known-hosts": "Hosts Conhecidos", + "members": "Membros", + "logs": "Logs" + }, + "auth": { + "unlockPrompt": "Digite sua senha mestre para desbloquear", + "masterPasswordPlaceholder": "Senha mestre", + "unlock": "Desbloquear", + "resetVault": "Redefinir cofre (exclui todos os dados locais)", + "vaultUnreadableTitle": "O cofre deste dispositivo não pode ser aberto", + "vaultUnreadableBody": "Sua senha está correta, mas o arquivo de segredos deste dispositivo foi criptografado com uma chave diferente. Nada foi excluído. Você pode deixá-lo de lado e baixar seus segredos da nuvem novamente.", + "vaultSetAside": "Deixar de lado e baixar novamente", + "vaultSetAsideSub": "Mantém uma cópia de backup neste dispositivo", + "vaultSetAsideToast": "Cofre deixado de lado como {{file}}", + "vaultUnreadableRetry": "Tente outra senha", + "chooseHowToUse": "Escolha como você quer usar o Voltius", + "getStarted": "Começar", + "getStartedSub": "Protegido pelo keychain do SO — sem senha necessária", + "or": "ou", + "cloudAccount": "Conta na nuvem", + "cloudAccountSub": "Sincronizar entre dispositivos — entre ou crie uma", + "back": "Voltar", + "signupPrompt": "Crie uma conta para sincronizar entre dispositivos", + "signinPrompt": "Entre para restaurar seus dados sincronizados", + "emailPlaceholder": "E-mail", + "masterPasswordMinPlaceholder": "Senha mestre (mínimo 8 caracteres)", + "confirmPasswordPlaceholder": "Confirmar senha", + "customServerUrl": "URL personalizada do servidor", + "serverNamed": "Servidor: {{host}}", + "errorInvalidEmail": "E-mail inválido", + "errorMinLength8": "Pelo menos 8 caracteres", + "errorPasswordMismatch": "As senhas não coincidem", + "createAccount": "Criar conta", + "signIn": "Entrar", + "alreadyHaveAccount": "Já tem uma conta? ", + "newHere": "Novo aqui? ", + "e2eeNotice": "Seus dados são criptografados ponta a ponta — o servidor não pode lê-los.", + "openSource": "Código aberto.", + "agreeToTerms": "Ao criar uma conta, você concorda com nossos Termos de Serviço e Política de Privacidade.", + "accountCreatedToast": "Conta criada! Verifique seu e-mail para confirmar.", + "vaultUnreadableBodyNoPassword": "O arquivo de segredos deste dispositivo não pode ser aberto com a chave armazenada nesta máquina. Nada foi excluído. Deixe-o de lado para começar com um cofre vazio, ou restaure um dos backups abaixo.", + "vaultSetAsideLocal": "Deixar de lado e começar do zero", + "vaultSetAsideLocalSub": "Mantém uma cópia de backup neste dispositivo" + }, + "cloudAuthModal": { + "registerTitle": "Criar conta na nuvem", + "signinTitle": "Entrar na conta na nuvem", + "registerDesc": "Crie uma conta para sincronizar este cofre e desbloquear recursos na nuvem. Seus dados permanecem criptografados ponta a ponta.", + "signinDesc": "Entre para ativar sincronização, assinaturas, recursos de equipe e cofres compartilhados.", + "addTitle": "Adicionar outra conta", + "addDesc": "Entre ou crie outra conta na nuvem. A atual permanece no menu de contas para você voltar.", + "createMasterPasswordPlaceholder": "Criar senha mestre", + "confirmMasterPasswordPlaceholder": "Confirmar senha mestre", + "errorPasswordRequired": "Senha necessária", + "errorMinLength4": "Pelo menos 4 caracteres", + "pleaseWait": "Aguarde…", + "reauthTitle": "Entrar novamente", + "reauthDesc": "Sua sessão neste dispositivo terminou. Digite sua senha mestre para se reconectar." + }, + "twoFactor": { + "prompt": "Digite o código de 6 dígitos do seu aplicativo autenticador.", + "recoveryPrompt": "Digite um de seus códigos de recuperação. Cada um funciona apenas uma vez.", + "codePlaceholder": "Código de 6 dígitos", + "recoveryPlaceholder": "Código de recuperação", + "useRecovery": "Usar um código de recuperação", + "useCode": "Usar um código do autenticador", + "verify": "Verificar", + "usePasskey": "Usar uma chave de acesso", + "passkeyOrCodePrompt": "Use sua chave de acesso, ou digite o código de 6 dígitos do seu aplicativo autenticador.", + "passkeyOrRecoveryPrompt": "Use sua chave de acesso, ou digite um de seus códigos de recuperação.", + "passkeyWaiting": "Continue no seu navegador, então volte aqui.", + "passkeyDoneTitle": "Concluído", + "passkeyDoneBody": "Volte ao Voltius. Você pode fechar esta aba." + }, + "mainPanel": { + "noVaultSelectedTitle": "Nenhum cofre selecionado", + "noVaultSelectedBody": "Por favor, selecione pelo menos um cofre no seletor de cofres.", + "teamVault": { + "offlineTitle": "Cofre da equipe off-line", + "offlineBody": "Cofres de equipe exigem uma conexão com a internet. Seu cofre pessoal está disponível off-line.", + "forbiddenTitle": "Acesso revogado", + "forbiddenBody": "Você não tem mais acesso a este cofre de equipe. Entre em contato com o proprietário da equipe.", + "planLapsedTitle": "Plano Business expirado", + "planLapsedBody": "Seu acesso veio de permissões Business. Peça ao proprietário da equipe para renovar o Business.", + "waitingForAccessTitle": "Aguardando acesso", + "waitingForAccessBody": "Um proprietário de cofre de equipe precisa conceder acesso a você. Isto acontece automaticamente na próxima vez que um proprietário estiver online.", + "waitingForAccessBodyNamed": "Aguardando {{owner}} conceder acesso — eles precisam ficar online uma vez.", + "paymentRequiredTitle": "Cofre da equipe indisponível", + "paymentRequiredBodyOwner": "Sua assinatura terminou. Cofres de equipe exigem um plano ativo.", + "paymentRequiredBodyMember": "A assinatura do proprietário terminou. Cofres de equipe exigem um plano ativo.", + "keyMismatchTitle": "Este dispositivo não pode abrir a chave do cofre", + "keyMismatchBody": "Sua chave está no servidor, mas as chaves de conta deste dispositivo não correspondem a ela. Saia desta conta e entre novamente com sua senha mestre.", + "errorTitle": "Não foi possível carregar o cofre da equipe", + "errorBody": "Algo deu errado. Tente novamente.", + "updateRequiredTitle": "Atualização necessária", + "updateRequiredBody": "Este cofre da equipe usa recursos que esta versão do Voltius não suporta. Atualize o Voltius para abri-lo." + }, + "manageSubscription": "Gerenciar assinatura →", + "tryAgain": "Tentar novamente", + "checkForUpdates": "Verificar atualizações" + }, + "newSession": { + "searchPlaceholder": "ssh user@host · serial · local …", + "sectionQuickConnect": "Conexão Rápida", + "sectionRecent": "Recentes", + "sectionLocal": "Local", + "noHostsMatch": "Nenhum host corresponde a \"{{query}}\"", + "noHostsYet": "Nenhum host ainda", + "connectTo": "Conectar a {{user}}@{{host}}", + "portSsh": "Porta {{port}} · SSH", + "serialConnection": "Conexão serial", + "configurePortBaud": "Configurar porta e baud", + "localShellFallback": "Shell local" + }, + "sidebarAccount": { + "copyHandle": "Copiar seu identificador", + "accountTitle": "Conta", + "localAccountFallback": "Conta Local", + "modeCloud": "Conta na nuvem", + "modeLocalPassword": "Local · protegido por senha", + "modeLocal": "Conta local", + "lockVault": "Bloquear agora", + "reportBug": "Relatar um bug…", + "appearance": "Aparência", + "toggleTheme": "Alternar claro / escuro", + "signInSignUp": "Entrar / Criar conta", + "switchAccount": "Trocar conta", + "removeSavedAccount": "Remover conta salva", + "savedAccountCloud": "Nuvem", + "savedAccountLocal": "Local", + "switchFailed": "Falha ao trocar conta: {{error}}", + "saveFailed": "Esta conta não pôde ser salva no alternador: {{error}}", + "leaveLocalTitle": "Sair desta conta local?", + "leaveLocalMessage": "Os hosts, chaves e snippets desta conta são armazenados apenas nesta máquina. Mudar para {{account}} os apaga e eles não podem ser recuperados.", + "leaveLocalConfirm": "Apagar e trocar", + "removeTitle": "Remover esta conta deste dispositivo?", + "removeMessage": "Os hosts, chaves e snippets de {{account}} salvos neste dispositivo são excluídos. Tudo que não foi sincronizado não pode ser recuperado.", + "removeConfirm": "Remover", + "autoLock": "Configurações de bloqueio automático…", + "autoLockOff": "Bloqueio automático desativado", + "autoLockAfter": "Bloqueia automaticamente após {{duration}}", + "addAccount": "Adicionar outra conta…", + "autoLockImmediately": "Bloqueia quando você sai do aplicativo" + }, + "splash": { + "steps": { + "init": "Inicializando aplicativo", + "vault": "Verificando cofre", + "connections": "Carregando conexões" + }, + "vaultLocked": "Cofre trancado", + "firstLaunch": "Primeira inicialização", + "vaultCheckFailed": "Falha na verificação do cofre", + "sessionRestored": "Sessão restaurada", + "vaultFound": "Cofre encontrado", + "connectionsUnavailable": "Conexões indisponíveis", + "sshClient": "Cliente SSH", + "vaultUnreadable": "Cofre ilegível", + "keychainHint": "Se o macOS pedir a senha do seu keychain, digite a senha de login do seu Mac e escolha \"Sempre Permitir\". O macOS pede uma vez após cada atualização do Voltius." + }, + "sync": { + "title": "Sincronização", + "voltiusSync": "Sincronização Voltius", + "moreProviders": "Mais provedores de sincronização", + "syncNow": "Sincronizar agora", + "signInForSync": "Entre para sincronização em nuvem", + "requiresPro": "Requer Pro", + "upgradeArrow": "Atualizar →", + "pluginDisabled": "Plugin desativado", + "enableArrow": "Ativar →", + "notConfigured": "Não configurado", + "configureArrow": "Configurar →", + "paused": "Pausado", + "resumeArrow": "Retomar →", + "pause": "Pausar sincronização", + "resume": "Retomar sincronização", + "encryptedBlob": "Blob criptografado · {{size}}", + "status": { + "syncing": "Sincronizando…", + "synced": "Sincronizado", + "syncedAt": "Sincronizado · {{time}}", + "error": "Erro de sincronização", + "errorDetail": "Erro de sincronização: {{error}}", + "errorDetailFrom": "Erro de sincronização · {{source}}: {{error}}", + "offline": "Não é possível alcançar o servidor", + "offlineDetail": "Não é possível alcançar o servidor: {{error}}", + "idle": "Ocioso", + "notConfigured": "Sincronização não configurada", + "paused": "Sincronização pausada", + "default": "Sincronização", + "unknown": "desconhecido" + } + }, + "titleBar": { + "sftp": "SFTP", + "sftpTitle": "Transferência de Arquivos (SFTP)", + "unifiedSplitTab": "Aba dividida unificada", + "splitFallback": "Dividir", + "ended": "Encerrado", + "watching": "Assistindo", + "sharingCurrently": "Compartilhando atualmente", + "signInToShare": "Entre para compartilhar seu terminal", + "sharingRequiresPro": "Compartilhamento de terminal requer Pro — clique para atualizar", + "shareTerminal": "Compartilhar terminal", + "sharing": "Compartilhando", + "share": "Compartilhar", + "terminalFallback": "Terminal", + "themesTools": "Temas e ferramentas · {{theme}}", + "minimize": "Minimizar", + "maximize": "Maximizar", + "close": "Fechar", + "newSession": "Nova sessão", + "renameTab": "Renomear aba", + "closeTab": "Fechar aba", + "stack": { + "sessions_one": "{{host}} · {{count}} sessão", + "sessions_other": "{{host}} · {{count}} sessões", + "sessions_many": "{{host}} · {{count}} sessões", + "heading_one": "{{host}} · {{count}} sessão", + "heading_other": "{{host}} · {{count}} sessões", + "heading_many": "{{host}} · {{count}} sessões", + "count_one": "{{count}} sessão", + "count_other": "{{count}} sessões", + "count_many": "{{count}} sessões", + "newSessionOn": "Nova sessão em {{host}}", + "closeAll": "Fechar todas {{count}}", + "openInSplit": "Abrir em divisão", + "inSplit": "em divisão", + "pin": "Fixar lista de sessões", + "unpin": "Desfixar lista de sessões", + "status": { + "connected": "Conectado · {{time}}", + "connecting": "Conectando…", + "disconnected": "Desconectado", + "offline": "Aguardando rede", + "reconnecting": "Reconectando…", + "error": "Erro · {{message}}" + } + }, + "splitMenu": { + "rename": "Renomear aba…", + "broadcastOn": "Transmitir entrada para todos os painéis", + "broadcastOff": "Parar de transmitir entrada", + "panes": "Painéis", + "pane": "{{index}} · {{name}}", + "splitApart": "Dividir em abas", + "closeTab_one": "Fechar aba ({{count}} sessão)", + "closeTab_other": "Fechar aba ({{count}} sessões)", + "closeTab_many": "Fechar aba ({{count}} sessões)" + }, + "plan": { + "proTrial": "Avaliação Pro — {{daysLeft}}d restantes", + "teams": "Teams", + "business": "Business", + "pro": "Pro", + "upgradeTrial": "Atualizar · Avaliação Gratuita de 14d", + "upgrade": "Atualizar" + }, + "splitLabelMore": "{{label}} + {{count}}" + }, + "vaultHeader": { + "members": "Membros", + "lastSync": "Última sincronização {{time}}", + "e2ee": "E2EE", + "noOneOnline": "ninguém online", + "onlineCount": "{{count}} online", + "inviteMember": "Convidar membro", + "jumpTo": "Pular para..." + }, + "vaultMenu": { + "share": "Compartilhar…", + "members": "Membros", + "roles": "Funções", + "security": "Política de segurança…", + "rename": "Renomear…", + "makePrivate": "Tornar privado…", + "delete": "Excluir cofre…", + "leave": "Sair do cofre…", + "openMenu": "Menu do cofre" + }, + "vaultSidebar": { + "cloudVaultLabel": "{{name}} (Cofre na nuvem)", + "unknownVaultLabel": "Cofre desconhecido {{id}} — o nome dele ainda não chegou a este dispositivo", + "vaultInviteTitle": "Convite de cofre: {{name}}", + "vaultInvitation": "Convite de cofre", + "inviterFallback": "Alguém", + "invitedYouTo": "convidou você a", + "asRole": "como", + "accepting": "Aceitando…", + "accept": "Aceitar", + "declining": "Recusando…", + "decline": "Recusar", + "multipleVaultsTitle": "Vários cofres requerem Pro", + "multipleVaultsBody": "Contas gratuitas podem criar um cofre. Atualize para Pro para organizar suas credenciais em vários cofres.", + "upgradeToPro": "Atualizar para Pro", + "signInOrCreate": "Entrar ou criar conta na nuvem", + "maybeLater": "Talvez depois", + "home": "Início", + "whatsNew": "Novidades", + "checkingForUpdates": "Verificando atualizações…", + "downloadingUpdate": "Baixando atualização v{{version}}…", + "updateReady": "Atualização v{{version}} pronta — clique para ver e reiniciar", + "updateAvailable": "Atualização v{{version}} disponível — clique para ver e baixar", + "settings": "Configurações", + "addVault": "Adicionar cofre" + }, + "appLock": { + "title": "O Voltius está trancado", + "subtitle": "Suas sessões ainda estão em execução.", + "unlockWith": "Desbloquear com {{method}}", + "tryAgain": "Tentar novamente", + "systemAuthFailed": "Autenticação falhou.", + "wrongPassword": "Senha mestre incorreta.", + "keychainEmpty": "Sua chave de cofre não está mais no keychain do sistema. Digite sua senha mestre.", + "promptReason": "Desbloquear Voltius", + "sealReason": "Confirmar para manter sua chave de cofre neste dispositivo", + "bindingLost": "Seu login no dispositivo mudou. Digite sua senha mestre." + } + } +} diff --git a/src/i18n/locales/pt/logs.json b/src/i18n/locales/pt/logs.json new file mode 100644 index 000000000..6a0333693 --- /dev/null +++ b/src/i18n/locales/pt/logs.json @@ -0,0 +1,165 @@ +{ + "logs": { + "gate": { + "noVaultSelected": { + "title": "Nenhum cofre selecionado", + "description": "Selecione um único cofre para visualizar registros de auditoria." + }, + "restricted": { + "title": "Acesso restrito", + "description": "Você precisa da permissão Visualizar Registro de Auditoria para acessar esta página." + } + }, + "filters": { + "searchPlaceholder": "Filtrar registros…", + "allActors": "Todos os atores", + "fromDate": "De data", + "toDate": "Até data", + "dateRangeSeparator": "a", + "reset": "Redefinir", + "actionOptions": { + "all": "Todas as ações", + "memberInvited": "Membro convidado", + "memberJoined": "Membro entrou", + "memberRemoved": "Membro removido", + "memberRoleChanged": "Função alterada", + "memberPermissionsChanged": "Permissões alteradas", + "connectionCreated": "Host criado", + "connectionUpdated": "Host atualizado", + "connectionDeleted": "Host excluído", + "identityCreated": "Identidade criada", + "identityUpdated": "Identidade atualizada", + "identityDeleted": "Identidade excluída", + "keyCreated": "Chave criada", + "keyUpdated": "Chave atualizada", + "keyDeleted": "Chave excluída", + "snippetCreated": "Snippet criado", + "snippetUpdated": "Snippet atualizado", + "snippetDeleted": "Snippet excluído", + "folderCreated": "Pasta criada", + "folderUpdated": "Pasta atualizada", + "folderDeleted": "Pasta excluída", + "portForwardCreated": "Encaminhamento de porta criado", + "portForwardUpdated": "Encaminhamento de porta atualizado", + "portForwardDeleted": "Encaminhamento de porta excluído", + "vaultRenamed": "Cofre renomeado", + "vaultKeyRotated": "Chave rotacionada", + "teamLockPolicySet": "Política de bloqueio definida", + "teamLockPolicyRemoved": "Política de bloqueio removida", + "roleCreated": "Função criada", + "roleUpdated": "Função atualizada", + "roleDeleted": "Função excluída", + "connectionStarted": "Conexão iniciada", + "connectionEnded": "Conexão encerrada", + "secretViewed": "Segredo revelado", + "sessionStarted": "Sessão iniciada", + "sessionEnded": "Sessão encerrada", + "sessionJoined": "Sessão participada", + "memberRenamed": "Membro renomeado", + "permissionGranted": "Permissão concedida", + "permissionRevoked": "Permissão revogada", + "sessionLeft": "Sessão deixada", + "vaultCreated": "Cofre criado", + "vaultDeleted": "Cofre excluído" + } + }, + "timeRange": { + "lastDay": "Últimas 24 horas", + "lastWeek": "Última semana", + "lastMonth": "Últimos 30 dias", + "all": "Todo o tempo", + "custom": "Intervalo personalizado" + }, + "layout": { + "timeline": "Linha do tempo", + "horizontal": "Visual", + "list": "Lista" + }, + "export": { + "button": "Exportar", + "failed": "Falha na exportação" + }, + "badges": { + "client": "cliente", + "clientTooltip": "Reportado pelo aplicativo cliente — não autoritativo", + "ownKey": "própria chave", + "ownKeyTooltip": "Conectado com a própria identidade do membro; nunca sai do dispositivo deles", + "shared": "compartilhado · {{name}}", + "sharedUnknown": "compartilhado" + }, + "eventLabels": { + "memberInvited": "convidou {{name}}", + "memberJoined": "entrou na equipe como {{role}}", + "memberRemoved": "removeu {{name}}", + "memberRenamed": "nomeou {{name}} “{{to}}”", + "memberNameRemoved": "removeu o nome de {{name}}", + "memberRoleChanged": "alterou a função de {{name}}", + "memberPermissionsChanged": "alterou as permissões de {{name}}", + "vaultCreated": "criou o cofre \"{{name}}\"", + "vaultDeleted": "excluiu o cofre \"{{name}}\"", + "vaultRenamed": "renomeou o cofre para \"{{name}}\"", + "vaultKeyRotated": "rotacionou a chave do cofre \"{{name}}\"", + "lockPolicySet": "definiu a política de bloqueio (bloqueio automático: {{timeout}})", + "lockPolicySetVault": "definiu a política de bloqueio (bloqueio automático: {{timeout}}, bloqueio de cofre necessário)", + "lockPolicyRemoved": "removeu a política de bloqueio", + "roleCreated": "criou a função \"{{name}}\"", + "roleUpdated": "atualizou a função \"{{name}}\"", + "roleDeleted": "excluiu a função \"{{name}}\"", + "permissionGranted": "concedeu permissão em {{name}}", + "permissionRevoked": "revogou permissão em {{name}}", + "connectionCreated": "criou o host \"{{name}}\"", + "connectionUpdated": "atualizou o host \"{{name}}\"", + "connectionDeleted": "excluiu o host \"{{name}}\"", + "connectionStarted": "conectou a {{name}}", + "connectionEnded": "desconectou de {{name}}", + "identityCreated": "criou a identidade \"{{name}}\"", + "identityUpdated": "atualizou a identidade \"{{name}}\"", + "identityDeleted": "excluiu a identidade \"{{name}}\"", + "keyCreated": "criou a chave \"{{name}}\"", + "keyUpdated": "atualizou a chave \"{{name}}\"", + "keyDeleted": "excluiu a chave \"{{name}}\"", + "snippetCreated": "criou o snippet \"{{name}}\"", + "snippetUpdated": "atualizou o snippet \"{{name}}\"", + "snippetDeleted": "excluiu o snippet \"{{name}}\"", + "folderCreated": "criou a pasta \"{{name}}\"", + "folderUpdated": "atualizou a pasta \"{{name}}\"", + "folderDeleted": "excluiu a pasta \"{{name}}\"", + "portForwardCreated": "criou o encaminhamento de porta \"{{name}}\"", + "portForwardUpdated": "atualizou o encaminhamento de porta \"{{name}}\"", + "portForwardDeleted": "excluiu o encaminhamento de porta \"{{name}}\"", + "secretViewed": "revelou o segredo \"{{name}}\"", + "sessionStarted": "iniciou sessão de terminal", + "sessionEnded": "encerrou sessão de terminal", + "sessionJoined": "participou da sessão de terminal", + "sessionLeft": "saiu da sessão de terminal", + "fallbackUser": "um usuário", + "fallbackMember": "um membro", + "fallbackRole": "membro", + "fallbackResource": "um recurso", + "fallbackHost": "um host", + "you": "Você" + }, + "timeline": { + "today": "Hoje", + "yesterday": "Ontem", + "weekOf": "Semana de {{date}}" + }, + "list": { + "columns": { + "actor": "Ator", + "action": "Ação", + "target": "Alvo", + "time": "Hora" + } + }, + "pagination": { + "prev": "Anterior", + "next": "Próximo", + "pageOf": "Página {{page}} / {{totalPages}}" + }, + "emptyState": "Nenhum evento corresponde aos seus filtros.", + "error": { + "retry": "Tentar novamente" + } + } +} diff --git a/src/i18n/locales/pt/members.json b/src/i18n/locales/pt/members.json new file mode 100644 index 000000000..a082d50ff --- /dev/null +++ b/src/i18n/locales/pt/members.json @@ -0,0 +1,357 @@ +{ + "members": { + "roles": "Funções", + "info": "Info", + "memberSince": "Membro desde", + "invitedBy": "Convidado por", + "dangerZone": "Zona de Perigo", + "ownership": { + "title": "Propriedade", + "primary": "Proprietário primário", + "primaryHintBilling": "Paga por esta equipe e é a única que pode excluí-la.", + "primaryHintSelfHosted": "A única que pode excluir esta equipe.", + "makePrimary": "Tornar proprietário primário", + "leaveBlocked": "Torne outro Proprietário o proprietário primário antes de sair desta equipe.", + "confirmPrimary": { + "title": "Tornar {{name}} o proprietário primário?", + "bodyBilling": "A própria assinatura Teams ou Business de {{name}} paga por esta equipe daqui em diante, e apenas eles podem excluí-la. Sua assinatura permanece como está: reduza suas vagas ou cancele você mesmo.", + "bodySelfHosted": "Apenas {{name}} poderá excluir esta equipe. Você permanece como Proprietário e pode sair depois." + }, + "grant": { + "title": "Tornar {{name}} um Proprietário?", + "body": "Proprietários têm todas as permissões, incluindo adicionar e remover outros Proprietários.", + "confirm": "Tornar Proprietário" + }, + "revoke": { + "title": "Remover Proprietário de {{name}}?", + "body": "{{name}} mantém quaisquer outras funções que detenha.", + "confirm": "Remover Proprietário" + } + }, + "confirmRemoval": "Clique novamente para confirmar remoção", + "removeFromTeam": "Remover da equipe", + "newRole": "Nova função", + "you": "Você", + "youBadge": "você", + "kick": "Expulsar", + "morePermissions": "+{{count}} mais", + "noRole": "Sem função", + "noRoleAddPrompt": "Sem função · Adicionar →", + "ownerRoleLabel": "proprietário", + "loading": "Carregando membros…", + "noMatch": "Nenhum membro corresponde a \"{{search}}\"", + "revokeInvitationTitle": "Revogar convite", + "pendingBadge": "Pendente", + "toolbar": { + "filterPlaceholder": "Filtrar membros…", + "sortByRole": "Por função", + "selectedCount": "{{count}} selecionados", + "inviteBtn": "Convidar", + "clear": "Limpar" + }, + "heading": { + "members": "Membros", + "pendingInvitations": "Convites Pendentes" + }, + "permission": { + "VIEW_SECRETS": "Ver segredos", + "COPY_SECRETS": "Copiar segredos", + "CONNECT": "Conectar", + "EDIT_CONNECTIONS": "Editar conexões", + "EDIT_IDENTITIES": "Editar identidades", + "EDIT_KEYS": "Editar chaves", + "EDIT_SNIPPETS": "Editar snippets", + "EDIT_FOLDERS": "Editar pastas", + "VIEW_AUDIT_LOG": "Ver registro de auditoria", + "INVITE_MEMBERS": "Convidar membros", + "MANAGE_MEMBERS": "Gerenciar membros", + "CREATE_CUSTOM_ROLES": "Gerenciar funções (legado)", + "MANAGE_ROLES": "Gerenciar funções", + "MANAGE_VAULT": "Gerenciar cofre", + "START_TERMINAL_SESSION": "Iniciar sessões", + "JOIN_TERMINAL_SESSION": "Participar de sessões", + "VIEW_TERMINAL_SESSIONS": "Ver sessões", + "VIEW": "Ver", + "ADMINISTRATOR": "Administrador" + }, + "permissions": { + "title": "Permissões", + "inheritedFrom": "De {{roles}}", + "notGranted": "Nenhuma função concede isto", + "effectiveAllowed": "permitido", + "effectiveDenied": "negado", + "state": { "deny": "Negar", "inherit": "Herdar", "allow": "Permitir" }, + "readOnlyNoManage": "Você precisa da permissão Gerenciar membros", + "readOnlyOwner": "As permissões de um proprietário não podem ser sobrescritas", + "readOnlySelf": "Você não pode alterar suas próprias permissões", + "readOnlyHigherRole": "Este membro detém uma função igual ou superior à sua", + "readOnlyNotHeld": "Você não pode conceder uma permissão que não detém", + "overrideMarker": "Tem sobrescritas de permissão", + "filterPlaceholder": "Filtrar permissões…", + "group": { + "administration": "Administração", + "secrets": "Segredos e Conectar", + "vaultContent": "Conteúdo do cofre", + "team": "Equipe e cofre", + "sessions": "Sessões" + } + }, + "revokeKeyAccess": { + "title": "Revogar o acesso de {{name}} à chave do cofre?", + "body": "{{name}} não poderá mais conectar ou ver segredos neste cofre. Eles mantêm uma cópia da chave atual e ainda podem ler segredos já sincronizados no dispositivo deles, então a chave do cofre será rotacionada para os membros restantes.", + "confirm": "Revogar e rotacionar chave" + }, + "convert": { + "title": "Compartilhar \"{{vault}}\" com outras pessoas?", + "body": "Isto transforma seu cofre privado em um cofre de equipe. Tudo já nele move-se para lá, então as pessoas que você adicionar veem também.", + "offlineWarning": "Abre apenas enquanto o Voltius puder alcançar o servidor de sincronização — sem acesso off-line.", + "keyCustody": "Todos que você adiciona recebem uma cópia de sua chave. Removê-los depois não tira de volta.", + "change": "Você pode torná-lo privado novamente depois — isto remove o acesso de todos, mas não as cópias que já têm.", + "cancel": "Cancelar", + "confirm": "Tornar um cofre de equipe" + }, + "share": { + "shareVerb": "Compartilhar", + "title": "Compartilhar {{vault}}", + "tabPeople": "Pessoas", + "tabInvite": "Convidar", + "manage": "Gerenciar membros e funções", + "inviteSomeone": "Convidar alguém", + "loadFailed": "Não foi carregar todos — tente novamente", + "tabLinks": "Links" + }, + "detail": { + "nameLabel": "Nome nesta equipe", + "nameHint": "Deixe vazio para mostrar o identificador deles." + }, + "invite": { + "nameLabel": "Nome nesta equipe", + "namePlaceholder": "ex. Jan Novák", + "nameHint": "Colegas de equipe veem isto em vez do identificador deles. Apenas admins podem alterá-lo.", + "title": "Convidar membro", + "seatsLabel": "Vagas", + "seatsSummary": "{{used}} usadas · {{available}} disponíveis · {{total}} total", + "seatsScope": "Contadas em todas as equipes que você possui, não apenas nesta.", + "seatsTrialClamp": "Sua avaliação limita você a {{cap}} vagas até terminar, das {{purchased}} que você comprou.", + "buySeats": "Comprar vagas", + "initialRoles": "Funções Iniciais", + "initialRole": "Função Inicial", + "searchOrInviteLabel": "Buscar identificador ou inserir e-mail", + "searchUserLabel": "Buscar por identificador ou e-mail", + "searchUserPlaceholder": "Buscar por identificador ou e-mail…", + "addWithRole": "Adicionar ({{role}})", + "addAsRole": "Adicionar como {{role}}", + "noRoleFallback": "sem função", + "sendInviteLabel": "Enviar convite para", + "inviteArrow": "Convidar →", + "handleRule": "Apenas identificadores personalizados correspondem a parte de um nome. Para um identificador gerado como rapid-violet-8884, digite-o completo ou use o e-mail deles.", + "seatsUnknown": "Contagem de vagas indisponível — verifique sua conexão com o servidor de sincronização", + "seatsUnlimited": "{{used}} usadas · ilimitado", + "inviteAction": "Convidar", + "joinsAs": "Eles entram como", + "selectRoleHint": "Selecione pelo menos uma função antes de convidar", + "expiresIn_one": "Expira amanhã", + "expiresIn_other": "Expira em {{count}} dias", + "expiresIn_many": "Expira em {{count}} dias", + "expiresToday": "Expira hoje", + "expired": "Expirado", + "resendTitle": "Enviar este convite novamente", + "expiredOn": "Expirado em {{date}}" + }, + "roleBlurb": { + "manager": "Gerentes podem convidar pessoas, alterar funções e gerenciar links.", + "editor": "Editores podem adicionar e alterar hosts, chaves e snippets neste cofre.", + "member": "Membros podem usar tudo neste cofre, mas não alterar.", + "connect-only": "Pessoas apenas-conectar podem abrir conexões, mas nunca veem as credenciais por trás delas." + }, + "toast": { + "makingPrimaryOwner": "Tornando {{name}} o proprietário primário…", + "primaryOwnerChanged": "{{name}} é agora o proprietário primário", + "removingRoleFrom": "Removendo {{role}} de {{name}}...", + "roleRemovedFrom": "{{role}} removido de {{name}}", + "assigningRoleTo": "Atribuindo {{role}} a {{name}}...", + "roleAssignedTo": "{{role}} atribuído a {{name}}", + "removingMember": "Removendo {{name}}...", + "memberRemoved": "{{name}} removido", + "revokingInvitation": "Revogando convite para {{name}}...", + "invitationRevoked": "Convite revogado para {{name}}", + "invitingUser": "Convidando {{name}}...", + "invitationSentToUser": "Convite enviado para {{name}}", + "userAdded": "{{name}} adicionado", + "invitingEmail": "Convidando {{email}}...", + "invitationSentToEmail": "Convite enviado para {{email}}", + "invitingToSession": "Convidando {{name}} para a sessão...", + "invitedToSession": "Convidado {{name}} para a sessão", + "convertingVault": "Transformando {{vault}} em um cofre de equipe...", + "vaultConverted": "{{vault}} é agora um cofre de equipe", + "grantingKey": "Concedendo acesso ao cofre para {{name}}…", + "keyGranted": "{{name}} pode agora abrir o cofre", + "leavingTeam": "Saindo da equipe...", + "leftTeam": "Você saiu da equipe" + }, + "error": { + "cannotRemoveOwnerRole": "Torne outro Proprietário o proprietário primário primeiro", + "failedToUpdateRole": "Falha ao atualizar função", + "failedToUpdatePermissions": "Falha ao atualizar permissões", + "failedToRemoveMember": "Falha ao remover membro", + "failedToAddMember": "Falha ao adicionar membro", + "inviteFailed": "Não foi convidar {{name}} — {{reason}}", + "seatLimitReached": "Não há vagas disponíveis. Peça ao administrador do servidor para aumentar o limite de vagas.", + "convertFailed": "Não foi transformar {{vault}} em um cofre de equipe — {{reason}}", + "serverUnreachable": "o servidor de sincronização não pôde ser alcançado", + "removeFailed": "Não foi remover {{name}} — {{reason}}", + "revokeFailed": "Não foi revogar o convite para {{name}} — {{reason}}", + "grantKeyFailed": "Não foi conceder acesso ao cofre para {{name}} — {{reason}}", + "memberHasNoPublicKey": "Eles não publicaram uma chave ainda — peça para eles entrarem uma vez.", + "notAKeyHolder": "Você não detém a chave deste cofre, então não pode concedê-la." + }, + "history": { + "removeRole": "Remover função: {{name}}", + "assignRole": "Atribuir função: {{name}}", + "changePermissions": "Alterar permissões de {{name}}", + "remove": "Remover: {{name}}", + "assignRoleBulk": "Atribuir função ×{{count}}", + "removeRoleBulk": "Remover função ×{{count}}", + "removeBulk": "Remover ×{{count}}" + }, + "contextMenu": { + "viewDetails": "Ver detalhes", + "inviteToSession": "Convidar para a Sessão", + "noActiveSessions": "Nenhuma sessão ativa", + "noInvitableSessions": "Nenhuma sessão pode aceitar este convite", + "assignRoleBulk": "Atribuir Função ({{count}})", + "removeRoleBulk": "Remover Função ({{count}})", + "kickBulk_one": "Expulsar {{count}} membro", + "kickBulk_other": "Expulsar {{count}} membros", + "kickBulk_many": "Expulsar {{count}} membros" + }, + "empty": { + "noVaultTitle": "Nenhum cofre selecionado", + "noVaultDesc": "Selecione um cofre na barra lateral para gerenciar seus membros.", + "signInToInvite": "Entre para convidar colegas para este cofre.", + "vaultNotFound": "Cofre não encontrado." + }, + "people": { + "pending": "Pendente", + "awaitingKey": "Aguardando uma chave — eles não podem abrir o cofre ainda", + "grantKey": "Conceder agora", + "copyInviteLink": "Copiar link de convite", + "revoke": "Revogar convite", + "remove": "Remover do cofre", + "inviteLinkCopied": "Link de convite copiado — ele abre o convite deles no Voltius." + }, + "cta": { + "signInTitle": "Entre para usar recursos de equipe", + "signInDesc": "Membros, convites e acesso a cofres compartilhados exigem uma conta na nuvem antes de você poder atualizar ou gerenciar uma equipe.", + "signInBtn": "Entrar ou criar conta na nuvem →", + "upgradeTitle": "Cofres de Equipe exigem Teams", + "upgradeDesc": "Convidar membros, atribuir funções e compartilhar credenciais com segurança com sua equipe.", + "upgradeBtn": "Experimente Teams gratuitamente por {{days}} dias →", + "trialNote": "Cartão necessário · sem cobrança durante a avaliação" + }, + "joinLinks": { + "explainer": "Qualquer pessoa com o link entra neste cofre na função que você escolhe. O link nunca carrega a chave do cofre — ela chega separadamente, assim que alguém que já a tem estiver online.", + "empty": "Nenhum link ativo.", + "loadFailed": "Não foi carregar links — {{reason}}", + "joinsAs": "Entra como", + "usesLabel": "Usos", + "expiryLabel": "Expira depois de", + "create": "Criar link", + "copy": "Copiar", + "copied": "Copiado", + "revoke": "Revogar link", + "shownOnce": "Um link é mostrado apenas uma vez, quando você o cria. Nada pode mostrá-lo novamente.", + "secretNotRecoverable": "Link não está mais visualizável — revogue-o e crie um novo.", + "usesLeft_one": "{{count}} uso restante de {{max}}", + "usesLeft_other": "{{count}} usos restantes de {{max}}", + "usesLeft_many": "{{count}} usos restantes de {{max}}", + "expiringNow": "expirando agora", + "expiresIn": { + "minutes_one": "{{count}} min restantes", + "minutes_other": "{{count}} min restantes", + "minutes_many": "{{count}} min restantes", + "hours_one": "{{count}} hora restante", + "hours_other": "{{count}} horas restantes", + "hours_many": "{{count}} horas restantes", + "days_one": "{{count}} dia restante", + "days_other": "{{count}} dias restantes", + "days_many": "{{count}} dias restantes" + }, + "ttl": { + "hour1": "1 hora", + "day1": "1 dia", + "day7": "7 dias", + "day30": "30 dias" + }, + "toast": { + "creating": "Criando link…", + "created": "Link criado", + "createFailed": "Não foi criar o link — {{reason}}", + "revoking": "Revogando link…", + "revoked": "Link revogado", + "revokeFailed": "Não foi revogar o link — {{reason}}" + }, + "error": { + "notFound": "Este link não é válido.", + "revokedOrExpired": "Este link foi revogado ou expirou.", + "exhausted": "Este link foi esgotado.", + "seatLimit": "Esta equipe não tem vaga disponível. Peça a quem enviou o link para adicionar uma.", + "noPublicKey": "Seu dispositivo não publicou uma chave ainda. Entre uma vez, então abra o link novamente.", + "generic": "O servidor recusou ({{status}})." + }, + "confirm": { + "title": "Juntar-se a {{team}}?", + "titleGeneric": "Juntar-se a um cofre de equipe?", + "loading": "Verificando o link…", + "body": "Este link o adiciona a {{team}} como {{role}}.", + "bodyNamed": "{{inviter}} está convidando você a {{team}} como {{role}}.", + "keyFollowsLater": "Você entrará imediatamente, mas o cofre permanecerá trancado até que alguém que já tenha sua chave esteja online.", + "action": "Juntar-se", + "failed": "Não foi juntar-se — o link pode ter sido revogado." + }, + "newLink": "Novo link", + "cancel": "Cancelar" + }, + "offboarding": { + "removeTitle_one": "Remover {{names}} desta equipe?", + "removeTitle_other": "Remover {{count}} pessoas desta equipe?", + "removeTitle_many": "Remover {{count}} pessoas desta equipe?", + "leaveTitle": "Sair desta equipe?", + "removeConfirm_one": "Remover", + "removeConfirm_other": "Remover {{count}}", + "removeConfirm_many": "Remover {{count}}", + "leaveConfirm": "Sair da equipe", + "pointAccessEnds": "O acesso deles aos hosts, chaves e snippets deste cofre termina imediatamente, em todos os dispositivos.", + "pointLocalWipe": "O conteúdo do cofre é excluído dos dispositivos deles, incluindo senhas salvas e chaves privadas.", + "pointAlreadySeen": "Eles mantêm qualquer coisa que já viram. Rotacione credenciais que eles tiveram acesso.", + "pointSessions": "Eles são removidos de qualquer sessão de terminal compartilhado que participaram.", + "leavePointAccessEnds": "Você perde o acesso aos hosts, chaves e snippets deste cofre em todos os dispositivos.", + "leavePointLocalWipe": "Seu conteúdo é excluído deste dispositivo, incluindo senhas salvas e chaves privadas.", + "leavePointIrreversible": "Você não pode se juntar novamente sem um novo convite." + }, + "leaveTeam": "Sair da equipe", + "roleName": { + "owner": "Proprietário", + "manager": "Gerente", + "editor": "Editor", + "member": "Membro", + "connect-only": "Apenas-conectar" + }, + "security": { + "button": "Segurança", + "title": "Política de segurança", + "enforce": "Aplicar bloqueio automático", + "enforceDesc": "Membros podem escolher um tempo menor, nunca um maior.", + "maxLabel": "Bloquear após no máximo", + "forceVault": "Exigir Bloqueio de cofre", + "forceVaultDesc": "Membros não podem escolher Bloquear tela, então o bloqueio sempre remove a chave do cofre da memória.", + "immediateVaultWarning": "Com Imediatamente e Bloqueio de cofre, as sessões abertas dos membros fecham sempre que eles saem do Voltius, mesmo que brevemente.", + "appliesToAll": "Aplica-se a todos os membros, você incluído. Versões mais antigas do Voltius não impõem isto.", + "lockBody": "Políticas de bloqueio precisam do plano Business da equipe.", + "lapsed": "Plano Business expirado: esta política permanece aplicada. Você pode removê-la.", + "remove": "Remover política", + "saving": "Salvando política de bloqueio…", + "saved": "Política de bloqueio salva" + } + } +} diff --git a/src/i18n/locales/pt/mobile.json b/src/i18n/locales/pt/mobile.json new file mode 100644 index 000000000..d6939d0b5 --- /dev/null +++ b/src/i18n/locales/pt/mobile.json @@ -0,0 +1,308 @@ +{ + "mobile": { + "tabBar": { + "terminal": "Terminal", + "sftp": "SFTP", + "more": "Mais" + }, + "filterBar": { + "placeholder": "Filtrar…" + }, + "snippets": { + "searchPlaceholder": "Buscar snippets", + "noMatches": "Sem correspondências", + "empty": "Nenhum snippet ainda", + "insertAriaLabel": "Inserir", + "executeAriaLabel": "Executar", + "moreAriaLabel": "Mais", + "newFolderTitle": "Nova pasta" + }, + "terminalGestures": { + "paste": "Colar" + }, + "terminalTopBar": { + "exitAriaLabel": "Sair do terminal", + "newSessionAriaLabel": "Nova sessão", + "panelsAriaLabel": "Painéis" + }, + "panelItems": { + "sftp": "SFTP", + "docker": "Docker", + "metrics": "Métricas", + "processes": "Processos", + "proxmox": "Proxmox" + }, + "morePages": { + "keychain": "Keychain", + "portForwarding": "Encaminhamento de Porta", + "knownHosts": "Hosts Conhecidos", + "members": "Membros", + "logs": "Logs" + }, + "account": { + "title": "Conta", + "email": "E-mail", + "notSignedIn": "Não conectado", + "plan": "Plano", + "cloudSync": "Sincronização em nuvem", + "off": "Desligado", + "proTrial": "Avaliação Pro — {{days}}d restantes", + "tier": { + "free": "Gratuito", + "pro": "Pro", + "teams": "Teams", + "business": "Business" + }, + "cancelsOn": "Cancela em {{date}}. Você mantém acesso até então.", + "periodEnd": "o fim do período", + "renewsOn": "Renova em {{date}}.", + "subscriptionActive": "Sua assinatura está ativa.", + "seats": "Vagas", + "seatsUsed": "{{used}} / {{total}} usadas", + "upgradeToPro": "Atualizar para Pro", + "upgradeToTeams": "Experimente Teams gratuitamente por {{days}} dias", + "teamsTrialNote": "Cartão necessário · sem cobrança durante a avaliação", + "manageBilling": "Gerenciar cobrança", + "viewAllPlans": "Ver todos os planos", + "signInToSync": "Entrar para sincronizar", + "signOutConfirm": "Sair? Seu cofre criptografado é removido deste dispositivo e re-sincronizado quando você entrar novamente.", + "signOut": "Sair" + }, + "more": { + "settings": "Configurações", + "planLabel": "{{tier}} plano" + }, + "host": { + "newTitle": "Novo host", + "editTitle": "Editar host" + }, + "hostsScreen": { + "searchPlaceholder": "Buscar hosts", + "clearSearchAriaLabel": "Limpar busca", + "emptyNoHosts": "Nenhum host ainda — toque em + para adicionar um" + }, + "keychainScreen": { + "filterPlaceholder": "Filtrar keychain…", + "sshKeysHeader": "CHAVES SSH", + "identitiesHeader": "IDENTIDADES", + "addedOn": "adicionado {{date}}", + "noSearchMatches": "Nada corresponde à sua busca", + "empty": "Keychain está vazio", + "generateKey": "Gerar chave SSH", + "importKey": "Importar chave SSH", + "newIdentity": "Nova identidade" + }, + "knownHostsScreen": { + "filterPlaceholder": "Filtrar hosts…", + "noSearchMatches": "Nenhum host conhecido corresponde à sua busca", + "empty": "Nenhum host conhecido ainda — eles aparecem quando você se conecta a um servidor." + }, + "logsScreen": { + "filterPlaceholder": "Filtrar logs…", + "retry": "Tentar novamente", + "prev": "Anterior", + "next": "Próximo", + "pageIndicator": "Página {{page}} / {{total}}" + }, + "portForwardingScreen": { + "filterPlaceholder": "Filtrar regras…", + "summary": "{{total}} total · {{active}} ativas", + "noSearchMatches": "Nenhuma regra corresponde à sua busca", + "empty": "Nenhuma regra de encaminhamento de porta ainda" + }, + "snippetEdit": { + "editTitle": "Editar snippet", + "newTitle": "Novo snippet", + "namePlaceholder": "Nome do snippet", + "contentPlaceholder": "echo hello", + "delete": "Excluir snippet", + "nameLabel": "Nome", + "contentLabel": "Script" + }, + "editForm": { + "required": "Obrigatório", + "incompleteTitle": "Sair sem salvar?", + "incompleteBody": "Um campo obrigatório está vazio, então suas últimas alterações não podem ser salvas ainda.", + "unsavedTitle": "Descartar alterações?", + "unsavedBody": "Suas alterações neste snippet não foram salvas.", + "keepEditing": "Continuar editando", + "discard": "Descartar" + }, + "snippetsScreen": { + "newSnippetLabel": "Novo snippet" + }, + "terminalScreen": { + "noActiveSessions": "Nenhuma sessão ativa", + "pickHost": "Escolha um host" + }, + "sftp": { + "transferFailed": "Falha na transferência", + "chooseHost": "Escolha um host", + "hidden": "Oculto", + "visible": "Visível", + "connecting": "Conectando…", + "reconnecting": "Reconectando…", + "reconnectNow": "Reconectar agora", + "permissionDenied": "Permissão negada", + "goUp": "Subir", + "emptyFolder": "Pasta vazia", + "selectedCount": "{{count}} selecionado", + "downloadSelectedAriaLabel": "Baixar selecionados", + "deleteSelectedAriaLabel": "Excluir selecionados", + "clearSelectionAriaLabel": "Limpar seleção", + "copyToOtherPane": "Copiar para outro painel", + "download": "Baixar", + "details": "Detalhes", + "copyPath": "Copiar caminho", + "renameTitle": "Renomear {{name}}", + "deleteConfirmTitle": "Excluir {{name}}?", + "detail": { + "path": "Caminho", + "type": "Tipo", + "size": "Tamanho", + "permissions": "Permissões", + "modified": "Modificado" + }, + "typeSymlink": "Link simbólico", + "typeFile": "Arquivo", + "batchDeleteTitle_one": "Excluir {{count}} item?", + "batchDeleteTitle_other": "Excluir {{count}} itens?", + "batchDeleteTitle_many": "Excluir {{count}} itens?", + "newFileOption": "Novo arquivo", + "folderNamePlaceholder": "Nome da pasta", + "fileNamePlaceholder": "Nome do arquivo", + "selectAll": "Selecionar tudo", + "onePane": "Um painel", + "twoPanes": "Dois painéis", + "moreActions": "Mais ações", + "itemActions": "Ações para {{name}}" + }, + "folders": { + "home": "Início" + }, + "sheets": { + "newSession": { + "noHosts": "Sem hosts" + }, + "shared": { + "moveToVault": "Mover para cofre", + "copyToVault": "Copiar para cofre", + "moveToFolder": "Mover para pasta", + "back": "Voltar", + "duplicate": "Duplicar", + "pin": "Fixar", + "unpin": "Desfixar", + "confirmDeleteBody": "Excluir permanentemente {{name}}? Isto não pode ser desfeito." + }, + "folderActions": { + "deleteTitle": "Excluir pasta?", + "deleteBody": "Excluir {{name}} e tudo dentro dela? Isto não pode ser desfeito." + }, + "hostActions": { + "deleteTitle": "Excluir host?", + "openFiles": "Abrir arquivos", + "copyAddress": "Copiar endereço", + "copiedAddress": "Copiado {{host}}", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "enableReachabilityCheck": "Ativar verificação de acessibilidade", + "disableReachabilityCheck": "Desativar verificação de acessibilidade" + }, + "keychainActions": { + "unnamedKey": "Chave sem nome", + "deleteKeyTitle": "Excluir chave?", + "deleteIdentityTitle": "Excluir identidade?", + "copyPublicKey": "Copiar chave pública", + "copiedPublicKey": "Chave pública copiada", + "noPublicKeyStored": "Nenhuma chave pública armazenada", + "copyUsername": "Copiar usuário", + "copiedUsername": "Usuário copiado" + }, + "knownHostActions": { + "deleteTitle": "Excluir host conhecido?", + "deleteBody": "Isto remove a impressão digital confiável. A próxima conexão com este host será tratada como nova.", + "copyFingerprint": "Copiar impressão digital", + "copiedFingerprint": "Impressão digital copiada" + }, + "logsExport": { + "title": "Exportar logs", + "exportCsv": "Exportar como CSV", + "exportJson": "Exportar como JSON" + }, + "snippetActions": { + "deleteTitle": "Excluir snippet?" + }, + "snippetTarget": { + "executeTitle": "Executar \"{{name}}\"", + "insertTitle": "Inserir \"{{name}}\"", + "confirmExecute_one": "Executar em {{count}} alvo", + "confirmExecute_other": "Executar em {{count}} alvos", + "confirmExecute_many": "Executar em {{count}} alvos", + "confirmInsert_one": "Inserir em {{count}} alvo", + "confirmInsert_other": "Inserir em {{count}} alvos", + "confirmInsert_many": "Inserir em {{count}} alvos", + "activeSessions": "Sessões Ativas", + "openNewConnection": "Abrir Nova Conexão", + "noHosts": "Sem hosts" + }, + "ruleActions": { + "deleteTitle": "Excluir regra?" + }, + "sftpHostPicker": { + "noSshHosts": "Sem hosts SSH" + }, + "vaultSwitcher": { + "newVault": "Novo cofre", + "namePlaceholder": "Nome do cofre" + } + }, + "shortcuts": { + "hostGone": "Esse host não existe mais. Seu atalho foi removido." + }, + "share": { + "action": "Compartilhar", + "publicKey": "Compartilhar chave pública", + "failed": "Não foi abrir a tela de compartilhamento", + "downloadFailed": "Não foi baixar o arquivo para compartilhar", + "largeTitle": "Compartilhar {{size}}?", + "largeBody": "Os arquivos são baixados neste telefone primeiro, então entregues ao aplicativo que você escolher.", + "tooLong": "Muito longo para compartilhar como texto" + }, + "vaultSettings": { + "title": "Configurações do cofre", + "gone": "Este cofre não existe mais neste dispositivo.", + "openFor": "Configurações para {{name}}", + "nameRequired": "Um cofre precisa de um nome.", + "nameReadOnly": "Apenas os gerentes do cofre podem renomeá-lo.", + "kindTeam": "Cofre de equipe", + "kindPrivate": "Cofre privado", + "sections": { + "general": "Geral", + "people": "Pessoas", + "danger": "Zona de perigo" + }, + "rows": { + "name": "Nome", + "share": "Compartilhar e convidar", + "members": "Membros", + "roles": "Funções", + "security": "Política de segurança", + "makePrivate": "Tornar privado", + "delete": "Excluir cofre", + "leave": "Sair do cofre" + }, + "summaries": { + "share": "Convidar pessoas e gerenciar links de participação", + "members_one": "{{count}} membro", + "members_other": "{{count}} membros", + "members_many": "{{count}} membros", + "roles": "O que cada função pode fazer", + "security": "Bloqueio e regras de sessão para membros", + "makePrivate": "Remover todos e manter uma cópia privada", + "delete": "Exclui o cofre e tudo dentro dele", + "deleteTeam": "Exclui para todos os membros", + "leave": "Remove seu acesso a este cofre" + } + } + } +} diff --git a/src/i18n/locales/pt/notes.json b/src/i18n/locales/pt/notes.json new file mode 100644 index 000000000..ff70899be --- /dev/null +++ b/src/i18n/locales/pt/notes.json @@ -0,0 +1,54 @@ +{ + "notes": { + "toolbar": { + "heading": "Título", + "h1": "Título 1", + "h2": "Título 2", + "h3": "Título 3", + "bold": "Negrito", + "italic": "Itálico", + "code": "Código em linha", + "link": "Link", + "bullet": "Lista com marcadores", + "ordered": "Lista numerada", + "task": "Lista de tarefas", + "codeBlock": "Bloco de código", + "more": "Mais formatação", + "preview": "Pré-visualizar", + "edit": "Editar" + }, + "editor": { + "placeholder": "Escreva notas em Markdown — digite / para blocos" + }, + "slash": { + "h1": "Título 1", + "h2": "Título 2", + "h3": "Título 3", + "bullet": "Lista com marcadores", + "numbered": "Lista numerada", + "todo": "Lista de tarefas", + "code": "Bloco de código", + "table": "Tabela", + "divider": "Divisor", + "link": "Link" + }, + "empty": { + "title": "Nenhuma nota ainda", + "start": "Comece a escrever" + }, + "code": { + "copy": "Copiar", + "copied": "Copiado", + "sendToTerminal": "Enviar para o terminal" + }, + "panel": { + "noHost": "Notas são anexadas a hosts salvos", + "readOnly": "Somente leitura", + "conflict": "Notas alteradas em outro lugar", + "reload": "Recarregar", + "keepMine": "Manter as minhas", + "saveFailed": "Não foi salvar notas: {{error}}", + "retry": "Tentar novamente" + } + } +} diff --git a/src/i18n/locales/pt/notifications.json b/src/i18n/locales/pt/notifications.json new file mode 100644 index 000000000..50952e1c7 --- /dev/null +++ b/src/i18n/locales/pt/notifications.json @@ -0,0 +1,116 @@ +{ + "notifications": { + "bell": { + "title": "Notificações", + "clearHistory": "Limpar histórico", + "noNotifications": "Sem notificações", + "emptyHint": "Você está em dia", + "newSection": "Novas", + "earlierSection": "Anteriores" + }, + "emailVerification": { + "banner": { + "message": "Verifique seu e-mail para desbloquear recursos na nuvem. Enviamos um link para {{email}}.", + "yourEmail": "seu e-mail", + "resend": "Reenviar e-mail", + "resending": "Enviando...", + "verified": "Já verifiquei", + "checking": "Verificando...", + "dismissAriaLabel": "Descartar banner de verificação de e-mail", + "undeliverable": "Não foi entregar e-mail para {{email}}. Verifique o endereço e altere se estiver errado.", + "changeEmail": "Alterar e-mail" + }, + "modal": { + "title": "Verifique seu e-mail primeiro", + "body": "Atualizações na nuvem exigem um endereço de e-mail verificado. Verifique sua caixa de entrada para o link de verificação, ou envie um novo.", + "resend": "Reenviar e-mail", + "resending": "Enviando..." + }, + "toast": { + "sent": "E-mail de verificação enviado.", + "sendFailed": "Não foi reenviar o e-mail de verificação.", + "refreshFailed": "Não foi atualizar a sessão.", + "verified": "E-mail verificado.", + "verifiedPending": "Não verificado ainda. Abra o link no seu e-mail, então tente novamente.", + "verifiedOther": "E-mail verificado para {{email}}.", + "verifiedSwitch": "Alternar", + "verifiedUnknown": "E-mail verificado. Entre para continuar.", + "undeliverable": "O e-mail para este endereço retorna, então não podemos enviar o link. Altere seu e-mail em Configurações → Conta." + } + }, + "progressToast": { + "timedOut": "Tempo da operação esgotado" + }, + "seededPluginsFailed": { + "message": "Plugins integrados falharam ao carregar, então o app está rodando sem eles. Isto é um bug — por favor, reporte.", + "action": "Diagnósticos" + }, + "inbox": { + "someone": "Alguém", + "invite": { + "message": "{{inviter}} convidou você para {{team}}", + "accept": "Aceitar", + "decline": "Recusar" + }, + "session": { + "message": "Um colega de equipe compartilhou {{name}}", + "join": "Participar", + "joined": "Participou" + }, + "sessionInvite": { + "message": "{{inviter}} convidou você para {{name}}" + }, + "sessionKnock": { + "message": "{{inviter}} quer compartilhar um terminal", + "join": "Participar", + "decline": "Recusar", + "blockPermanently": "Bloquear permanentemente" + }, + "control": { + "request": "{{requester}} está solicitando controle", + "grant": "Conceder", + "deny": "Negar", + "granted": "Você tem controle" + }, + "awaitingKey": { + "message": "Aguardando um proprietário de {{team}} conceder acesso ao cofre" + }, + "membershipEnded": { + "message": "Você foi removido de {{team}}. Seus hosts, chaves e snippets foram removidos deste dispositivo, e as credenciais que você usou lá devem ser rotacionadas.", + "review": "Revisar credenciais" + }, + "secretsNotWiped": { + "message": "Algumas credenciais de {{team}} não puderam ser removidas deste dispositivo. Elas permanecem legíveis aqui até que a limpeza tenha sucesso.", + "retry": "Remova-as agora" + }, + "sshConfigMigrated": { + "message": "Seus hosts de ~/.ssh/config não são mais sincronizados automaticamente. Eles são seus agora: suas alterações são mantidas.", + "turnOnSync": "Ativar sincronização contínua", + "dismiss": "OK" + } + }, + "sshConfigOffer": { + "message_one": "{{count}} host encontrado em ~/.ssh/config. Importá-lo para o Voltius? Você pode editá-lo livremente depois.", + "message_other": "{{count}} hosts encontrados em ~/.ssh/config. Importá-los para o Voltius? Você pode editá-los livremente depois.", + "message_many": "{{count}} hosts encontrados em ~/.ssh/config. Importá-los para o Voltius? Você pode editá-los livremente depois.", + "import": "Importar…", + "skip": "Não importar" + }, + "sshConfigSync": { + "unreadable": "~/.ssh/config não pôde ser lido. Hosts gerenciados são mantidos como estão.", + "failed": "Sincronização de ~/.ssh/config falhou. Veja os logs.", + "vaultGone": "O cofre escolhido para hosts de ~/.ssh/config não existe mais. Escolha outro em Configurações › Hosts.", + "detachedToTeam_one": "Um host movido para um cofre de equipe não segue mais ~/.ssh/config.", + "detachedToTeam_other": "{{count}} hosts movidos para um cofre de equipe não seguem mais ~/.ssh/config.", + "detachedToTeam_many": "{{count}} hosts movidos para um cofre de equipe não seguem mais ~/.ssh/config.", + "reviewHere": "Sincronização de ~/.ssh/config está ativada para sua conta. Revise os hosts e chaves deste computador antes de sincronizar aqui.", + "review": "Revisar…", + "detachedUnsynced_one": "Um host excluído da sincronização não segue mais ~/.ssh/config, então seus outros computadores param de esperar por ele.", + "detachedUnsynced_other": "{{count}} hosts excluídos da sincronização não seguem mais ~/.ssh/config, então seus outros computadores param de esperar por eles.", + "detachedUnsynced_many": "{{count}} hosts excluídos da sincronização não seguem mais ~/.ssh/config, então seus outros computadores param de esperar por eles.", + "detachedProxied_one": "Um host cuja entrada ~/.ssh/config agora usa ProxyCommand não segue mais o arquivo.", + "detachedProxied_other": "{{count}} hosts cujas entradas ~/.ssh/config agora usam ProxyCommand não seguem mais o arquivo.", + "detachedProxied_many": "{{count}} hosts cujas entradas ~/.ssh/config agora usam ProxyCommand não seguem mais o arquivo." + } + } +} diff --git a/src/i18n/locales/pt/omni.json b/src/i18n/locales/pt/omni.json new file mode 100644 index 000000000..fed46b608 --- /dev/null +++ b/src/i18n/locales/pt/omni.json @@ -0,0 +1,120 @@ +{ + "omni": { + "searchPlaceholder": "Buscar hosts, chaves, identidades e comandos…", + "categoryBadges": { + "all": "Todos", + "join": "participar> Sessões", + "snippets": "> Snippets", + "marketplace": "m> Marketplace", + "settings": "@ Configurações" + }, + "sections": { + "quickConnect": "Conexão Rápida", + "activeConnections": "Conexões ativas", + "teamSessions": "Sessões da Equipe", + "recent": "Recentes", + "hosts": "Hosts", + "local": "Local", + "keychain": "Keychain", + "snippets": "Snippets", + "actions": "Ações", + "quickSettings": "Configurações Rápidas", + "settings": "Configurações", + "joinByInviteCode": "Participar por código de convite", + "importExport": "Importar / Exportar" + }, + "settingsDescription": "Configurações", + "pluginSettingsDescription": "Configurações de Plugin", + "editHost": "Editar host", + "deleteHost": "Excluir host", + "resume": "Retomar", + "join": "Participar", + "participantCount_one": "{{count}} pessoa", + "participantCount_other": "{{count}} pessoas", + "participantCount_many": "{{count}} pessoas", + "joinCodePrompt": { + "title": "Participar por código de convite…", + "subtitle": "Cole seu código de convite aqui para participar de uma sessão privada" + }, + "joinCodeEntered": { + "title": "Participar por código de convite" + }, + "quickConnect": { + "connectTo": "Conectar a {{user}}@{{host}}", + "portSsh": "Porta {{port}} — SSH", + "serialConnection": "Conexão serial", + "configurePortAndBaud": "Configurar porta e baud", + "localShellNamed": "Shell local ({{shell}})", + "localShell": "Shell local", + "openLocalTerminal": "Abrir um terminal local" + }, + "localShellDefault": "Shell local", + "emptyState": { + "noSnippets": "Nenhum snippet ainda", + "marketplaceComingSoon": "Marketplace em breve", + "noSessionsMatch": "Nenhuma sessão corresponde a \"{{query}}\"", + "noActiveTeamSessions": "Nenhuma sessão ativa da equipe", + "noResultsFor": "Sem resultados para \"{{query}}\"" + }, + "theme": { + "toggle": "Alternar tema claro / escuro", + "toggleDesc": "Alternar entre seus temas claro e escuro", + "switch": "Alternar tema…", + "switchDesc": "Escolha um tema, pré-visualize ao vivo", + "automation": "Automação de tema…", + "automationDesc": "Manual, seguir o sistema, agendar, ou nascer/pôr do sol", + "backSwitch": "Alternar tema", + "backAutomation": "Automação de tema", + "searchThemes": "Buscar temas…", + "roleLight": "Claro", + "roleDark": "Escuro", + "setAsLight": "Definir como claro", + "setAsDark": "Definir como escuro", + "keyHints": "Alt+L define claro · Alt+D define escuro · Enter aplica", + "modeManual": "Manual", + "modeManualDesc": "Use o tema que você escolher, sem automação", + "modeSystem": "Seguir sistema", + "modeSystemDesc": "Corresponda à configuração claro/escuro do seu SO", + "modeSchedule": "Agendar", + "modeScheduleDesc": "Alternar em horários fixos", + "modeSunset": "Nascer / pôr do sol", + "modeSunsetDesc": "Claro durante o dia, escuro à noite, para sua localização", + "lightStarts": "Claro começa", + "darkStarts": "Escuro começa", + "useMyLocation": "Usar minha localização", + "latitude": "Latitude", + "longitude": "Longitude", + "locationNeeded": "Defina um local para usar nascer/pôr do sol", + "sunToday": "Hoje: nascer do sol {{sunrise}}, pôr do sol {{sunset}}", + "statusManual": "Manual", + "statusSystem": "Auto · seguindo o sistema", + "statusUntil": "Auto · {{phase}} até {{time}}" + }, + "commands": { + "newHost": "Novo Host", + "newKey": "Nova Chave SSH", + "newIdentity": "Nova Identidade", + "settings": "Configurações", + "checkForUpdate": "Verificar Atualização", + "whatsNew": "Novidades", + "portForwarding": "Encaminhamento de Porta", + "knownHosts": "Hosts Conhecidos", + "logs": "Logs", + "newSnippet": "Novo Snippet", + "teamMembers": "Membros da Equipe", + "disconnectAll": "Desconectar Todos", + "reportBug": "Relatar um bug", + "createTheme": "Criar Tema Personalizado", + "importFrom": "Importar de {{label}}", + "importFromEllipsis": "Importar de {{label}}…", + "exportAll": "Exportar dados do cofre…", + "exportConnections": "Exportar conexões…", + "exportIdentities": "Exportar identidades…", + "exportKeys": "Exportar chaves SSH…", + "exportSnippets": "Exportar snippets…", + "exportPortForwarding": "Exportar regras de encaminhamento de porta…", + "exportThemes": "Exportar temas personalizados…", + "importThemes": "Importar temas…" + } + } +} diff --git a/src/i18n/locales/pt/panes.json b/src/i18n/locales/pt/panes.json new file mode 100644 index 000000000..4dc53e71a --- /dev/null +++ b/src/i18n/locales/pt/panes.json @@ -0,0 +1,52 @@ +{ + "panes": { + "badge": { + "ssh": "SSH", + "serial": "SERIAL", + "multiplayer": "MPX", + "local": "LOCAL" + }, + "header": { + "copied": "Copiado!", + "loading": "carregando…", + "localSystem": "Sistema local", + "excludedFromBroadcast": "Excluído da transmissão", + "mcpBadge": "MCP", + "mcpTooltip": "Aberto por {{client}}", + "mcpTooltipUnknown": "Aberto por um cliente MCP", + "mcpTooltipDisconnected": "Aberto por {{client}} (desconectado)", + "disableBroadcast": "Desativar transmissão", + "broadcastInput": "Transmitir entrada", + "detachPane": "Desacoplar painel", + "restorePane": "Restaurar painel", + "maximizePane": "Maximizar painel", + "closePane": "Fechar painel", + "latencyTooltip": "{{ms}}ms — clique para copiar", + "reconnect": "Reconectar", + "rename": "Renomear…", + "duplicate": "Duplicar", + "duplicateSplit": "Duplicar em divisão", + "split": "Dividir", + "splitLeft": "Dividir esquerda", + "splitRight": "Dividir direita", + "splitTop": "Dividir topo", + "splitBottom": "Dividir fundo", + "noSessionToSplit": "Abra outra sessão ou arraste uma aba existente sobre um painel para dividir.", + "sparkline": { + "min": "mín {{ms}}ms", + "avg": "méd {{ms}}ms", + "max": "máx {{ms}}ms" + } + }, + "terminal": { + "emptyTitle": "Área de trabalho dividida está vazia", + "emptyHint": "Arraste uma aba de sessão aqui para começar a dividir painéis.", + "serialSubtitle": "{{port}} · {{baud}} baud" + }, + "dragToast": { + "alreadyVisible": "Essa sessão já está visível na área de trabalho dividida.", + "invalidDropTarget": "Solte no terminal ativo ou em um painel dividido para criar uma divisão.", + "cannotDuplicate": "Esta sessão não pode ser duplicada." + } + } +} diff --git a/src/i18n/locales/pt/portForwarding.json b/src/i18n/locales/pt/portForwarding.json new file mode 100644 index 000000000..846e4372d --- /dev/null +++ b/src/i18n/locales/pt/portForwarding.json @@ -0,0 +1,165 @@ +{ + "portForwarding": { + "toolbar": { + "filterPlaceholder": "Filtrar regras…", + "deleteSelected": "Excluir selecionadas", + "deleteButton": "EXCLUIR", + "newRule": "Nova Regra", + "newFolder": "Nova Pasta" + }, + "reach": { "copied": "{{address}} copiado para a área de transferência" }, + "page": { + "all": "Todas", + "folders": "Pastas", + "new": "Nova", + "noRulesMatchSearch": "Nenhuma regra corresponde à sua busca.", + "folderEmpty": "Esta pasta está vazia.", + "noRulesYet": "Nenhuma regra ainda. Crie uma para começar.", + "addRule": "Adicionar Regra", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "activeCount": "{{count}} ativas", + "errorCount": "{{count}} erro", + "confirmDelete": { + "title": "Excluir regra", + "message": "Esta regra será permanentemente excluída." + }, + "confirmDeleteBulk": { + "title_one": "Excluir {{count}} regra", + "title_other": "Excluir {{count}} regras", + "title_many": "Excluir {{count}} regras", + "message_one": "Tem certeza de que deseja excluir {{count}} regra? Isto não pode ser desfeito.", + "message_other": "Tem certeza de que deseja excluir {{count}} regras? Isto não pode ser desfeito.", + "message_many": "Tem certeza de que deseja excluir {{count}} regras? Isto não pode ser desfeito." + }, + "confirmDeleteFolder": { + "title": "Excluir pasta", + "message_one": "Isto excluirá a pasta, suas subpastas, e a {{count}} regra dentro dela. Isto não pode ser desfeito.", + "message_other": "Isto excluirá a pasta, suas subpastas, e as {{count}} regras dentro dela. Isto não pode ser desfeito.", + "message_many": "Isto excluirá a pasta, suas subpastas, e as {{count}} regras dentro dela. Isto não pode ser desfeito.", + "messageEmpty": "Isto excluirá a pasta e tudo dentro dela. Isto não pode ser desfeito." + }, + "vaultCascade": { + "moveDescription": "Mover \"{{folderName}}\" também moverá as seguintes regras para {{targetVaultName}}:", + "copyDescription": "Copiar \"{{folderName}}\" também copiará as seguintes regras para {{targetVaultName}}:" + }, + "bulk": { + "duplicateRules": "Duplicar {{count}} regras", + "exportRules": "Exportar {{count}} regras", + "deleteRules": "Excluir {{count}} regras" + } + }, + "ruleCard": { + "pause": "Pausar", + "resume": "Retomar", + "openWebLink": "Abrir link web", + "activateInSession": "Ativar na sessão", + "duplicate": "Duplicar", + "enableCloudSync": "Ativar sincronização em nuvem", + "disableCloudSync": "Desativar sincronização em nuvem", + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "active": "Ativa", + "error": "Erro", + "stopped": "Parada", + "noSshSession": "Nenhuma sessão SSH", + "openUrl": "Abrir {{url}}", + "scopedToConnections_one": "Escopo para {{count}} conexão", + "scopedToConnections_other": "Escopo para {{count}} conexões", + "scopedToConnections_many": "Escopo para {{count}} conexões", + "connectionsCount_one": "{{count}} conexão", + "connectionsCount_other": "{{count}} conexões", + "connectionsCount_many": "{{count}} conexões" + }, + "activeTunnels": { + "sectionTitle": "Encaminhamentos da sessão ativa", + "tunnelCount_one": "{{count}} túnel", + "tunnelCount_other": "{{count}} túneis", + "tunnelCount_many": "{{count}} túneis", + "forwardCount_one": "{{count}} encaminhamento", + "forwardCount_other": "{{count}} encaminhamentos", + "forwardCount_many": "{{count}} encaminhamentos", + "errorCount": "{{count}} erro", + "activeCountLabel": "{{count}} ativos", + "connected": "Conectado", + "local": "Local", + "remote": "Remoto", + "socks5": "SOCKS5", + "auto": "Auto", + "adHoc": "Ad-hoc", + "portLabel": "Porta {{port}}", + "socksPortLabel": "SOCKS5 :{{port}}", + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "openUrl": "Abrir {{url}}" + }, + "ruleForm": { + "editRule": "Editar Regra", + "newRule": "Nova Regra", + "general": "Geral", + "name": "Nome", + "namePlaceholder": "Meu túnel", + "description": "Descrição", + "descriptionPlaceholder": "Servidor de dev, proxy de banco de dados…", + "type": "Tipo", + "tunnelTypes": { + "local": { + "label": "Local", + "title": "Túnel local", + "summary": "Abra algo do servidor SSH na sua própria máquina." + }, + "remote": { + "label": "Remoto", + "title": "Túnel remoto", + "summary": "Expõe algo da sua máquina no servidor SSH." + }, + "dynamic": { + "label": "Dinâmico", + "title": "Proxy SOCKS dinâmico", + "summary": "Cria um proxy SOCKS5 local que envia o tráfego do aplicativo através do servidor SSH." + } + }, + "route": "Rota", + "yourComputer": "Seu computador", + "sshServer": "Servidor SSH", + "service": "Serviço", + "anyDestination": "Qualquer destino", + "anyDestinationHelp": "Cada aplicativo escolhe para onde ir. O tráfego sai do servidor SSH.", + "listenPort": "Ouvir na porta", + "socksPort": "Porta do proxy SOCKS", + "whoCanConnect": "Quem pode se conectar", + "audience": { + "thisComputer": "Este computador", + "serverOnly": "Apenas servidor", + "network": "Rede", + "custom": "Personalizado", + "customAddress": "Endereço para ouvir" + }, + "sharedWarning": { + "computer": "Outros dispositivos que alcançam este endereço podem usar o túnel.", + "server": "Qualquer pessoa que alcançar este endereço no servidor pode usar o túnel." + }, + "host": "Host", + "port": "Porta", + "throughTunnel": "através do túnel", + "reaches": "alcança", + "backThroughTunnel": "de volta através do túnel", + "summary": { + "incomplete": "Preencha as portas para ver para onde o tráfego vai.", + "local": "Abra {{listener}} neste computador para alcançar {{target}} como o servidor SSH vê.", + "localShared": "Dispositivos na rede abrem {{listener}} para alcançar {{target}} como o servidor SSH vê.", + "remote": "O servidor SSH ouve em {{listener}} e envia cada conexão para {{target}} neste computador.", + "dynamic": "Aplicativos usando {{listener}} como um proxy SOCKS5 navegam a partir do servidor SSH.", + "dynamicShared": "Dispositivos usando {{listener}} como um proxy SOCKS5 navegam a partir do servidor SSH.", + "anyAddress": "", + "anyHost": "", + "copyCommand": "Copiar comando" + }, + "applyTo": "Aplicar a", + "allConnections": "Todas as conexões", + "specificConnections": "Específica", + "noSavedConnections": "Nenhuma conexão salva.", + "removeHost": "Remover {{name}}" + } + } +} diff --git a/src/i18n/locales/pt/settings.json b/src/i18n/locales/pt/settings.json new file mode 100644 index 000000000..bdaece788 --- /dev/null +++ b/src/i18n/locales/pt/settings.json @@ -0,0 +1,1322 @@ +{ + "settings": { + "terminal": { + "heading": "Comportamento do terminal", + "preferredShell": { + "title": "Shell preferido" + }, + "scrollback": { + "title": "Histórico do terminal", + "desc": "Linhas mantidas por sessão de terminal. Aplica-se a novos terminais.", + "option": "{{count}} linhas" + }, + "cursorStyle": { + "title": "Estilo do cursor", + "desc": "Forma do cursor do terminal.", + "bar": "Barra", + "block": "Bloco", + "underline": "Sublinhado" + }, + "cursorBlink": { + "title": "Cursor piscante", + "desc": "Fazer o cursor do terminal piscar." + }, + "minimap": { + "title": "Minimapa de rolagem", + "desc": "Mostrar uma visão geral em miniatura do histórico ao lado dos terminais." + }, + "selectToCopy": { + "title": "Selecionar para copiar", + "desc": "Copiar o texto para a área de transferência assim que você o seleciona em um terminal." + }, + "dragSelectsText": { + "title": "Arrastar seleciona texto", + "desc": "Selecionar texto com um arrasto simples mesmo quando um programa (tmux, vim, htop) está capturando o mouse. Um clique ainda chega ao programa; segure Ctrl ao arrastar para enviar o arrasto a ele." + }, + "ignoreBracketedPaste": { + "title": "Colagem simples (sem colagem entre colchetes)", + "desc": "Colar como texto simples, sem os marcadores \\x1b[200~ / \\x1b[201~. Corrige entradas corrompidas (ex.: \"200~\") ao colar em prompts do sudo ou em aplicativos de CLI que não oferecem suporte à colagem entre colchetes." + }, + "pasteImageAsPath": { + "title": "Colar imagens como caminho de arquivo", + "desc": "Quando a área de transferência contém uma imagem, enviá-la ao host SSH (~/.cache/voltius/pastes, somente para o proprietário, removida após 7 dias) e colar o caminho dela. Permite que ferramentas no host, como o Claude Code, anexem uma captura de tela. Se você fizer SSH a partir dali, o caminho aponta para este primeiro host." + }, + "volumeDownCtrl": { + "title": "Usar Volume Down como Ctrl", + "desc": "Ao digitar em um terminal, segure o botão Volume Down para adicionar Ctrl às teclas que pressiona: Volume Down + C envia Ctrl+C. Fora de um terminal, o botão altera o volume normalmente." + }, + "keywordHighlight": { + "title": "Destaque de palavras-chave", + "desc": "Colorir palavras como “error” ou “warning” na saída de comandos. Funciona em sessões com integração de shell.", + "addRule": "Adicionar regra", + "deleteRule": "Excluir regra", + "ruleEnabled": "Ativar regra", + "color": "Cor", + "wordsPlaceholder": "Adicionar uma palavra…", + "removeWord": "Remover {{word}}" + } + }, + "appearance": { + "themeActions": "Ações do tema", + "interface": "Interface", + "language": { + "title": "Idioma" + }, + "groupTabsByHost": { + "title": "Agrupar abas por host", + "desc": "Sessões no mesmo host compartilham uma aba. Passe o mouse para alternar entre elas." + }, + "colorTheme": "Tema de cores", + "import": "Importar", + "importTitle": "Importar tema(s)", + "exportAll": "Exportar todos", + "exportAllTitle": "Exportar todos os temas personalizados", + "exportTheme": "Exportar tema", + "editTheme": "Editar tema", + "deleteTheme": "Excluir tema", + "newCustomTheme": "Novo tema personalizado", + "dynamicThemeHint": "A partir do seu papel de parede", + "uiScale": { + "clickHintMobile": "Toque para inserir um valor", + "title": "Escala da interface", + "desc": "Aumentar ou reduzir o zoom de toda a interface.", + "clickHint": "Clique para inserir um valor", + "zoomOut": "Reduzir zoom", + "zoomIn": "Aumentar zoom", + "resetTitle": "Redefinir escala", + "reset": "Redefinir" + }, + "terminalFontSize": { + "clickHintMobile": "Toque para inserir um valor", + "title": "Tamanho da fonte do terminal", + "desc": "Ajustar o texto do terminal separadamente, sem escalar o restante da interface.", + "clickHint": "Clique para inserir um valor", + "zoomOut": "Texto menor", + "zoomIn": "Texto maior", + "resetTitle": "Seguir o tamanho da fonte do tema", + "reset": "Redefinir" + }, + "automation": { + "themeMode": "Modo automático de tema", + "title": "Tema automático", + "desc": "Alternar automaticamente entre um tema claro e um escuro", + "lightTheme": "Tema claro", + "darkTheme": "Tema escuro", + "mode": "Modo", + "modeManual": "Manual", + "modeSystem": "Seguir o sistema", + "modeSchedule": "Agenda", + "modeSunset": "Nascer / pôr do sol", + "lightStarts": "Início do claro", + "darkStarts": "Início do escuro", + "useMyLocation": "Usar minha localização", + "latitude": "Latitude", + "longitude": "Longitude", + "sunToday": "Hoje: nascer {{sunrise}}, pôr do sol {{sunset}}", + "locationNeeded": "Defina uma localização para usar o nascer/pôr do sol" + } + }, + "nav": { + "appearance": { + "mobileSub": "Tema, escala, idioma", + "label": "Aparência", + "keywords": [ + "tema", + "cor", + "fonte", + "interface" + ] + }, + "account": { + "mobileSub": "Modo da conta, bloqueio do aplicativo", + "label": "Conta", + "keywords": [ + "perfil", + "login", + "autenticação" + ] + }, + "sync": { + "mobileSub": "Sincronização na nuvem e o que é sincronizado", + "label": "Sincronização", + "keywords": [ + "backup", + "nuvem", + "gist", + "sincronização", + "pro" + ] + }, + "plugins": { + "mobileSub": "Plugins instalados e o catálogo", + "label": "Plugins", + "keywords": [ + "extensões", + "complementos", + "marketplace" + ] + }, + "integrations": { + "mobileSub": "Servidor MCP para agentes de IA", + "label": "Integrações", + "keywords": [ + "mcp", + "claude", + "claude code", + "servidor", + "socket", + "agente" + ] + }, + "terminal": { + "mobileSub": "Cursor, histórico, colagem", + "label": "Terminal", + "keywords": [ + "histórico", + "cursor", + "colagem", + "colchetes", + "cópia", + "minimapa", + "buffer" + ] + }, + "sftp": { + "mobileSub": "Downloads, transferências, editor", + "label": "SFTP", + "keywords": [ + "arquivo", + "transferência", + "ftp", + "arquivos" + ] + }, + "portForwarding": { + "mobileSub": "Encaminhamento automático", + "label": "Encaminhamento de portas", + "keywords": [ + "túnel", + "encaminhar", + "portas", + "ssh", + "auto" + ] + }, + "hosts": { + "mobileSub": "Alcance, keepalive, proxy", + "label": "Hosts", + "keywords": [ + "ping", + "alcance", + "conectividade", + "status" + ] + }, + "shortcuts": { + "label": "Atalhos", + "keywords": [ + "tecla", + "atalho", + "combinação", + "remarcar", + "teclado" + ] + }, + "diagnostics": { + "mobileSub": "Logs e relatórios de bugs", + "label": "Diagnósticos", + "keywords": [ + "diagnóstico", + "bug", + "relatório", + "log", + "depuração", + "problema" + ] + }, + "about": { + "mobileSub": "Versão e links", + "label": "Sobre", + "keywords": [ + "versão", + "atualização", + "lançamento", + "changelog" + ] + } + }, + "chrome": { + "title": "Configurações", + "close": "Fechar configurações", + "back": "Voltar", + "openHint": "Ctrl+, para abrir", + "expandPluginGroup": "Expandir configurações do plugin", + "collapsePluginGroup": "Recolher configurações do plugin" + }, + "shared": { + "reset": "Redefinir", + "rowActions": "Ações da configuração", + "sync": { + "label": "Sincronizar esta configuração", + "on": "Sincronizada entre seus dispositivos", + "off": "Mantida neste dispositivo", + "deviceDefault": "Mantida neste dispositivo por padrão" + }, + "cancel": "Cancelar", + "resetToDefault": "Redefinir para o padrão", + "modifiedFromDefault": "Modificada em relação ao padrão" + }, + "account": { + "modeTitle": "Modo da conta", + "currentMode": "Modo atual", + "mode": { + "localNoPassword": "Local (chaveiro do SO)", + "local": "Local (senha mestra)", + "server": "Conta na nuvem", + "unknown": "Desconhecido" + }, + "sessionSecurity": { + "title": "Segurança da sessão", + "autoLockLabel": "Bloqueio automático após inatividade", + "autoLockDesc": "Bloqueia o Voltius após esse período de inatividade, ou assim que você sai do aplicativo.", + "timeout": { + "never": "Nunca", + "5min": "5 minutos", + "15min": "15 minutos", + "30min": "30 minutos", + "1h": "1 hora", + "4h": "4 horas", + "immediately": "Imediatamente" + }, + "lockAction": { + "label": "Ao bloquear", + "vault": "Bloquear cofre (fechar sessões)", + "screen": "Bloquear tela (manter sessões em execução)", + "vaultDesc": "Remove a chave do cofre da memória. As sessões abertas fecham e o Voltius recarrega.", + "screenDesc": "Cobre o Voltius enquanto sessões, encaminhamentos de portas e transferências continuam em execução." + }, + "systemAuth": { + "toggle": "Desbloquear com autenticação do sistema", + "desc": "Use {{method}} em vez de digitar sua senha mestra.", + "unavailable": "Não disponível neste dispositivo.", + "status": { + "bound": "Vinculada ao hardware deste dispositivo.", + "unbound": "Ainda não vinculada ao hardware deste dispositivo.", + "os-login": "Protegida pelo login do seu dispositivo.", + "no-password": "Protegida pelo login do seu dispositivo. Defina uma senha mestra para vincular a chave ao hardware deste dispositivo." + }, + "bindNow": "Vincular agora", + "confirm": "Confirmar", + "enableTitle": "Vincular a chave do cofre a este dispositivo", + "enableBody": "Digite sua senha mestra. Você precisará dela se o login deste dispositivo mudar.", + "disableTitle": "Desativar a autenticação do sistema", + "disableBody": "Digite sua senha mestra para continuar desbloqueando na inicialização sem um prompt.", + "method": { + "windows": "Windows Hello", + "macos": "Touch ID ou a senha do seu Mac", + "linux": "a senha do seu sistema", + "android": "sua impressão digital ou bloqueio de tela" + } + }, + "needsSystemAuth": "Ative a autenticação do sistema para bloquear uma conta sem senha mestra.", + "immediateVaultWarning": "Com Bloquear cofre, sair do Voltius, mesmo brevemente, fecha suas sessões abertas. Bloquear tela mantém as sessões em execução.", + "policy": { + "timeout": "Definido por {{teams}}: no máximo {{duration}}.", + "timeoutImmediately": "Definido por {{teams}}: bloquear assim que você sair do Voltius.", + "vault": "Definido por {{teams}}: Bloquear cofre é obrigatório.", + "yourTeam": "sua equipe" + } + }, + "email": "E-mail", + "editEmail": { + "title": "Alterar e-mail", + "currentLabel": "Atual:", + "newPlaceholder": "Novo endereço de e-mail", + "passwordPlaceholder": "Senha mestra atual", + "errorInvalidEmail": "Endereço de e-mail inválido", + "errorSameEmail": "O novo e-mail deve ser diferente do atual", + "errorPasswordRequired": "A senha é obrigatória para confirmar a alteração", + "pausedNote": "Até a verificação, os recursos pagos ficarão pausados.", + "done": "Concluído", + "saving": "Salvando…", + "save": "Salvar", + "toastVerification": "E-mail de verificação enviado para {{email}}.", + "updated": "E-mail atualizado para {{email}}. Verifique sua caixa de entrada para um link de verificação." + }, + "handle": { + "title": "Identificador", + "copy": "Copiar", + "copied": "Copiado", + "choose": "Escolha um identificador", + "change": "Alterar identificador", + "chooseSub": "Um identificador personalizado permite que você seja encontrado por pessoas fora das suas equipes.", + "generatedNote": "Seu identificador atual já funciona para qualquer pessoa a quem você o fornecer.", + "unverified": "Verifique seu e-mail para escolher um identificador personalizado.", + "managed": "Gerenciado pela sua organização. Peça ao administrador para alterá-lo.", + "placeholder": "seu-identificador", + "inputLabel": "Identificador", + "save": "Salvar", + "errorInvalid": "Os identificadores só podem conter letras, números e hífens.", + "errorTaken": "Esse identificador já está em uso.", + "errorEmailNotVerified": "Verifique seu e-mail primeiro e depois escolha seu identificador.", + "errorCooldown": "Você poderá alterar seu identificador novamente em breve.", + "errorGeneric": "Não foi possível atualizar seu identificador." + }, + "strangerInvites": { + "label": "Permitir convites de qualquer pessoa", + "desc": "Permitir que pessoas fora das suas equipes o convidem para um terminal compartilhado por @identificador ou e-mail." + }, + "changeMasterPassword": { + "label": "Alterar senha mestra", + "sub": "Atualize sua senha sem recriptografar seu cofre", + "title": "Alterar senha mestra", + "currentPlaceholder": "Senha atual", + "verifyWithDevice": "Esqueceu? Confirme com {{method}} em vez disso", + "verifiedWithDevice": "Confirmado neste dispositivo", + "deviceReason": "Confirme para alterar sua senha mestra", + "deviceFailed": "Este dispositivo não conseguiu confirmar sua identidade. Digite sua senha atual em vez disso.", + "deviceSignedOut": "Este dispositivo foi desconectado, provavelmente após uma alteração de senha em outro dispositivo. Entre novamente com a nova senha.", + "newPlaceholder": "Nova senha (mín. 8 caracteres)", + "confirmPlaceholder": "Confirme a nova senha", + "errorCurrentRequired": "A senha atual é obrigatória", + "errorMinLength": "A nova senha deve ter pelo menos 8 caracteres", + "errorSamePassword": "A nova senha deve ser diferente da atual", + "successMsg": "Senha alterada com sucesso.", + "successNote": "Você continua conectado. Os itens do seu cofre não foram alterados.", + "done": "Concluído", + "changing": "Alterando…", + "changeBtn": "Alterar senha" + }, + "twoFactor": { + "label": "Autenticação de dois fatores", + "subOff": "Pedir um código ou uma passkey ao entrar em um novo dispositivo", + "subOn": "Ativada. Entrar em um novo dispositivo pede uma segunda etapa", + "intro": "Depois da sua senha mestra, entrar em um novo dispositivo pedirá uma segunda etapa. Escolha uma; você pode adicionar a outra depois.", + "introDevices": "Ativar isso desconecta seus outros dispositivos. Eles precisam de uma versão recente do Voltius para entrar novamente.", + "continue": "Continuar", + "scan": "Escaneie isto com seu aplicativo autenticador, ou digite a chave abaixo nele.", + "qrLabel": "Código QR para seu aplicativo autenticador", + "copyKey": "Copiar chave", + "confirmPrompt": "Depois, digite o código de 6 dígitos que ele mostra.", + "turnOn": "Ativar", + "codesTitle": "Salve seus códigos de recuperação", + "codesBody": "Cada código permite entrar uma vez se você perder seu autenticador ou passkey. Eles não são mostrados novamente.", + "copy": "Copiar", + "copied": "Copiado", + "save": "Salvar em arquivo", + "saved": "Eu os salvei", + "manageBody": "Entrar em um novo dispositivo pede um destes após sua senha mestra.", + "newCodes": "Novos códigos de recuperação", + "newCodesSub": "Os atuais deixam de funcionar", + "turnOff": "Desativar", + "turnOffSub": "Entrar apenas com a senha mestra", + "generate": "Gerar", + "regeneratePrompt": "Confirme com um segundo fator para substituir seus códigos de recuperação.", + "disablePrompt": "Digite sua senha mestra e confirme com um segundo fator para desativar a autenticação de dois fatores.", + "authenticator": "Aplicativo autenticador", + "authenticatorSub": "Códigos de 6 dígitos de um aplicativo no seu celular", + "authenticatorOn": "Ativado", + "authenticatorIntro": "Entrar em um novo dispositivo pedirá um código de 6 dígitos de um aplicativo autenticador.", + "passkey": "Passkey", + "passkeys": "Passkeys", + "passkeySub": "Impressão digital, rosto ou uma chave de segurança, pelo seu navegador", + "passkeyIntro": "O Voltius abre seu navegador para criar a passkey e depois traz você de volta aqui.", + "passkeyName": "Nome, por exemplo Notebook", + "passkeyCreate": "Continuar no navegador", + "passkeyAdd": "Adicionar uma passkey", + "passkeyAdded": "Adicionada em {{date}}", + "passkeyUsed": "usada por último em {{date}}", + "passkeyRemove": "Remover {{name}}", + "remove": "Remover", + "removeAuthenticatorPrompt": "Digite sua senha mestra e confirme com um segundo fator para remover o aplicativo autenticador.", + "removePasskeyPrompt": "Digite sua senha mestra e confirme com um segundo fator para remover a passkey “{{name}}”.", + "lastFactor": "Este é seu único segundo fator. Removê-lo desativa a autenticação de dois fatores e desconecta seus outros dispositivos.", + "codesLeft": "Códigos não utilizados: {{count}}", + "back": "Voltar" + }, + "setMasterPassword": { + "label": "Definir uma senha mestra", + "sub": "Proteja seu cofre localmente sem sincronização na nuvem" + }, + "lockVault": { + "label": "Bloquear agora", + "sub": "Bloqueia o Voltius com a ação escolhida acima" + }, + "signOut": { + "label": "Sair da conta na nuvem", + "sub": "Limpa a senha em cache e os tokens de sincronização" + }, + "wipeData": { + "label": "Apagar todos os dados locais", + "sub": "Exclui permanentemente todas as conexões, chaves, cofre e entradas do chaveiro" + }, + "confirmWipe": { + "confirm": "Apagar tudo", + "desc": "Isso excluirá permanentemente todos os dados locais: conexões, chaves SSH, identidades, segredos do cofre e entradas do chaveiro do SO. Isso não pode ser desfeito." + }, + "setPassword": { + "desc": "Escolha uma senha mestra. Seus dados existentes serão recriptografados.", + "newPlaceholder": "Nova senha mestra", + "confirmPlaceholder": "Confirme a senha", + "submit": "Definir senha" + }, + "error": { + "minLength": "Pelo menos 4 caracteres", + "mismatch": "As senhas não coincidem", + "updateFailed": "Falha na atualização" + }, + "success": { + "passwordSet": "Senha mestra definida. Seu cofre agora está protegido por senha." + }, + "loading": "Trabalhando...", + "plan": { + "title": "Plano", + "badge": { + "business": "Business", + "teams": "Teams", + "proTrial": "Teste Pro — {{daysLeft}}d restantes", + "pro": "Pro", + "free": "Grátis" + }, + "manageBilling": "Gerenciar cobrança →", + "subscription": { + "cancelled": "Cancela em {{date}}. Você mantém o acesso até lá.", + "cancelledNoPeriod": "Cancela no fim do período. Você mantém o acesso até lá.", + "renews": "Renova em {{date}}.", + "active": "Sua assinatura está ativa." + }, + "seats": "Assentos", + "seatsUsed": "{{used}} / {{total}} usados", + "upgradeToPro": "Atualize para desbloquear a sincronização na nuvem e mais", + "upgrade": "Atualizar", + "upgradeToTeams": "Experimente o Teams grátis por {{days}} dias: cofres compartilhados e funções para sua equipe. Cartão obrigatório.", + "teamsButton": "Experimentar grátis →", + "viewAllPlans": "Ver todos os planos →", + "feature": { + "localVault": "Cofre local", + "auditLogs": "Registros de auditoria", + "gistSync": "Sincronização com GitHub Gist", + "realtimeSync": "Sincronização em nuvem em tempo real", + "unlimitedVaults": "Cofres privados ilimitados", + "terminalSharing": "Compartilhamento de terminal (1 sessão · 1 convidado)", + "teamVaults": "Cofres de equipe compartilhados", + "teamSharing": "Compartilhamento em equipe (5 sessões · 10 convidados)", + "seats": "Assentos (conforme adquiridos)", + "lockPolicy": "Política de bloqueio da equipe (limite de bloqueio automático, Bloquear cofre)", + "granularPermissions": "Funções personalizadas, permissões por membro e por objeto" + } + }, + "buySeats": { + "title": "Nenhum assento disponível", + "seatsUsed": "{{used}} / {{total}} assentos usados", + "inviting": "Convidando", + "additionalSeats": "Assentos adicionais", + "seatsTotal": "{{from}} → {{to}} no total", + "priceRow_one": "{{count}} assento × ${{price}}/mês", + "priceRow_many": "{{count}} assentos × ${{price}}/mês", + "priceRow_other": "{{count}} assentos × ${{price}}/mês", + "totalPerMonth": "${{amount}}/mês", + "proratedNote": "Cobrança proporcional aplicada imediatamente para o período de cobrança atual.", + "processing": "Processando…", + "buyAndInvite_one": "Comprar {{count}} assento e convidar", + "buyAndInvite_many": "Comprar {{count}} assentos e convidar", + "buyAndInvite_other": "Comprar {{count}} assentos e convidar", + "errorNotConnected": "Não conectado ao servidor", + "errorNoSubscription": "Nenhuma assinatura ativa encontrada", + "errorUpdateSeats": "Falha ao atualizar os assentos: {{status}}" + } + }, + "diagnostics": { + "intro": "Problemas com o Voltius? Crie um relatório e envie ao desenvolvedor — isso ajuda a rastrear bugs difíceis de reproduzir.", + "troubleshootingTitle": "Solução de problemas", + "verboseLabel": "Log detalhado (esta sessão)", + "verboseSub": "Registra detalhes extras para ajudar a diagnosticar problemas. Volta ao normal quando você reinicia o Voltius.", + "verboseHint": "O log detalhado está ativado. Para capturar o problema:\n1. Reproduza o problema agora\n2. Volte e crie um relatório de bug", + "reportTitle": "Relatório de bug", + "createButton": "Criar relatório de bug", + "creatingButton": "Coletando logs…", + "createdButton": "Relatório salvo", + "reportSub": "Inclui logs do aplicativo e informações do sistema. Nunca inclui suas senhas, chaves ou conteúdo do terminal.", + "whatsIncluded": "O que está incluído?", + "includedBody": "Incluído:\n• Logs do aplicativo (o que o Voltius estava fazendo, com valores sensíveis removidos)\n• Versão do aplicativo, sistema operacional e plugins ativos\nNÃO incluído:\n• Senhas, conteúdo do cofre ou chaves privadas\n• Saída do terminal ou qualquer coisa que você digitou\nO relatório é salvo no seu computador. Nada é enviado automaticamente — você escolhe onde compartilhá-lo.", + "toastSaved": "Relatório salvo — {{name}}", + "toastError": "Não foi possível criar o relatório: {{reason}}", + "toastGenericError": "Algo deu errado." + }, + "integrations": { + "mcp": { + "title": "MCP", + "sub": "Permite que clientes MCP locais (como o Claude Code) executem comandos, leiam, gravem e excluam arquivos em todos os hosts do seu cofre e neste computador, criem, alterem ou excluam conexões, chaves e identidades salvas, executem seus snippets salvos nesses hosts, autorizem chaves de host SSH, leiam os comandos que você digitou, vejam, cancelem ou repitam suas transferências de arquivos, vejam quais dos seus hosts salvos estão acessíveis, reorganizem suas abas de terminal e painéis divididos, gerenciem a associação e os convites da sua equipe, compartilhem suas sessões de terminal com sua equipe ou transfiram o controle delas, leiam e alterem todas as configurações deste aplicativo e leiam sua assinatura, por meio de um socket privado. A aprovação acontece nesse cliente, não no Voltius. Desativado por padrão. Também pode instalar, atualizar e remover plugins, e exportar ou importar seus objetos salvos.", + "running": "Em execução", + "quickSetup": { + "title": "Configuração rápida", + "help": "Configura todos os agentes de IA que detectar neste computador, sem tocar nas suas outras configurações. Requer Node.js." + }, + "manualSetup": { + "toggleLabel": "Configuração manual", + "toggleSub": "Node.js não instalado ou seu cliente não é compatível com o comando acima? Configure-o manualmente abaixo." + }, + "setup": { + "title": "Configuração do cliente", + "clientLabel": "Cliente MCP", + "clients": { + "claudeCode": "Claude Code", + "mcpServers": "Claude Desktop / Cursor / Cline / Windsurf", + "vscode": "VS Code / GitHub Copilot", + "opencode": "OpenCode" + }, + "help": { + "claudeCode": "Execute isto uma vez para registrar o Voltius no Claude Code. O servidor precisa estar habilitado acima para que um cliente se conecte.", + "mcpServers": "Adicione este bloco ao claude_desktop_config.json (Claude Desktop) ou .cursor/mcp.json (Cursor, Cline, Windsurf). O servidor precisa estar habilitado acima para que um cliente se conecte.", + "vscode": "Adicione este bloco ao .vscode/mcp.json. O VS Code usa \"servers\", não \"mcpServers\" — colar um bloco no estilo do Cursor aqui não carrega nada silenciosamente.", + "opencode": "Adicione este bloco ao opencode.json (projeto) ou ~/.config/opencode/opencode.json (global)." + }, + "exePathLabel": "Caminho do executável", + "socketLabel": "Caminho do socket", + "copied": "Copiado" + }, + "plugins": { + "title": "Ferramentas de plugins expostas aos clientes", + "sub": "Plugins instalados podem adicionar seus próprios comandos ao servidor MCP. Desative um para mantê-lo fora da lista de ferramentas sem desinstalá-lo.", + "empty": "Nenhum plugin instalado expõe ferramentas.", + "count_one": "{{count}} ferramenta", + "count_many": "{{count}} ferramentas", + "count_other": "{{count}} ferramentas" + } + } + }, + "mcp": { + "consequence": { + "autoUpdate": "Desativa o download automático de atualizações, então as correções de segurança deixam de chegar sozinhas.", + "pluginInstallReview": "Desativa a tela de consentimento mostrada antes de instalar um plugin. Um plugin que pede uma permissão sensível ainda a mostrará.", + "sessionTimeout": "Desativa ou aumenta o bloqueio automático.", + "lockAction": "Muda o bloqueio para um bloqueio de tela que mantém a chave do cofre na memória.", + "systemAuthUnlock": "Permite que o login do dispositivo desbloqueie o Voltius, mantendo a chave do cofre no chaveiro do sistema enquanto bloqueado." + } + }, + "about": { + "versionTitle": "Versão", + "loading": "Carregando…", + "updatesTitle": "Atualizações", + "checkForUpdate": "Verificar atualizações", + "restartToUpdate": "Reiniciar para atualizar · v{{version}}", + "downloadUpdate": "Baixar atualização · v{{version}}", + "status": { + "idle": "Ainda não verificado", + "checking": "Verificando atualizações…", + "upToDate": "Você está atualizado", + "downloading": "Baixando v{{version}} — {{progress}}%", + "ready": "v{{version}} pronta para instalar", + "available": "v{{version}} disponível" + }, + "autoDownload": { + "title": "Baixar atualizações automaticamente", + "desc": "Baixar novas versões em segundo plano. O Voltius as verifica de qualquer forma." + }, + "whatsNew": { + "title": "Mostrar novidades após atualizações", + "desc": "Abrir o changelog automaticamente em um novo lançamento" + }, + "linksTitle": "Links", + "links": { + "github": "GitHub", + "documentation": "Documentação", + "x": "X", + "kofi": "Ko-Fi", + "contact": "Contato" + }, + "reportBug": "Relatar um bug" + }, + "sync": { + "voltiusCloud": "Voltius Cloud", + "active": { + "title": "Sincronização na nuvem ativa", + "syncing": "Sincronizando…", + "error": "Erro: {{error}}", + "lastSync": "Última sincronização: {{time}}", + "offline": "Não é possível alcançar o servidor", + "offlineDetail": "Não é possível alcançar o servidor: {{error}}", + "idle": "Ainda não sincronizado", + "paused": "Pausada neste dispositivo", + "syncNow": "Sincronizar agora" + }, + "pause": { + "label": "Pausar sincronização neste dispositivo", + "sub": "Interrompe a sincronização em segundo plano com o servidor. Os cofres de equipe param de atualizar e não carregam na inicialização até você retomar. Sincronizar agora sincroniza apenas seus próprios dados." + }, + "requiresPro": { + "title": "Sincronização na nuvem", + "sub": "Requer uma assinatura Pro", + "upgrade": "Atualizar" + }, + "notConnected": { + "title": "Conta na nuvem não conectada", + "sub": "Entre ou crie uma conta na nuvem para sincronizar entre dispositivos.", + "signIn": "Entrar" + }, + "providersTitle": "Plugins de sincronização", + "prefsTitle": "Preferências de sincronização", + "prefsFooter": "Os tipos desativados nunca são enviados. Objetos individuais também podem ser excluídos do painel de edição deles.", + "quickToggleLabel": "Sincronizar {{label}}", + "objectType": { + "connection": { + "label": "Hosts", + "sub": "Conexões SSH" + }, + "identity": { + "label": "Identidades", + "sub": "Nomes de usuário e credenciais" + }, + "key": { + "label": "Chaves SSH", + "sub": "Pares de chaves armazenados no chaveiro" + }, + "folder": { + "label": "Pastas", + "sub": "Estrutura de pastas para organizar objetos" + }, + "snippet": { + "label": "Snippets", + "sub": "Comandos e scripts salvos" + }, + "port-forwarding-rule": { + "label": "Encaminhamento de portas", + "sub": "Regras de túnel salvas" + } + }, + "settingsTitle": "Configurações", + "settingsFooter": "Tudo o que estiver desativado fica neste dispositivo. Nunca é enviado, nem criptografado. Reativar a sincronização publica os valores deste dispositivo.", + "settingDomain": { + "themes": { "label": "Temas", "sub": "Tema ativo e temas personalizados" }, + "uiPreferences": { "label": "Interface", "sub": "Escala, layouts e ordem de classificação" }, + "shortcuts": { "label": "Atalhos", "sub": "Substituições de teclado" }, + "appSettings": { "label": "Configurações do aplicativo", "sub": "Terminal, SFTP, plugins, idioma" }, + "recentPeople": { "label": "Pessoas recentes", "sub": "Quem você convidou ultimamente" } + }, + "settingKey": { + "preferredShell": "Shell padrão", + "pluginOverrides": "Plugins habilitados", + "themeLocation": "Localização do nascer/pôr do sol" + }, + "keyButton": { + "hold": "Manter esta configuração neste dispositivo", + "resume": "Não sincronizada — clique para sincronizar esta configuração novamente", + "deviceDefault": "Não sincronizada: específica deste dispositivo. Clique para sincronizá-la mesmo assim.", + "domainOff": "A sincronização está desativada para todo este grupo" + }, + "heldBack": { + "summary": "Mantidas neste dispositivo: {{count}}", + "deviceDefault": "padrão do dispositivo", + "yourChoice": "sua escolha", + "resume": "Retomar sincronização" + } + }, + "vaults": { + "general": { + "renameFailedToast": "Não foi possível renomear este cofre. {{reason}}", + "vaultNameLabel": "Nome do cofre", + "save": "Salvar", + "makePrivate": { + "title": "Tornar privado", + "confirmAll": "Remover todos os membros e tornar privado?", + "confirm_one": "Remover {{count}} membro e tornar privado?", + "confirm_many": "Remover {{count}} membros e tornar privado?", + "confirm_other": "Remover {{count}} membros e tornar privado?", + "converting": "Convertendo…", + "confirmBtn": "Confirmar", + "copyFailedToast": "Não foi possível copiar tudo da equipe — nada foi excluído, e este ainda é um cofre de equipe.", + "removeMembersFailedToast": "Não foi possível remover os membros — este ainda é um cofre de equipe. {{reason}}", + "failedToast": "Não foi possível tornar este cofre privado — {{reason}}" + }, + "deleteVault": { + "title": "Excluir cofre", + "confirmDesc": "Exclui permanentemente este cofre e seus {{count}} itens. Isso não pode ser desfeito.", + "confirmDescTeam": "Exclui permanentemente este cofre e seus {{count}} itens para todos os membros. Isso não pode ser desfeito.", + "confirmBtn": "Confirmar exclusão", + "deleting": "Excluindo…", + "failedToast": "Não foi possível concluir a exclusão deste cofre — ele ainda está aqui, mas alguns de seus itens podem já ter sido removidos. {{reason}}", + "teamFailedToast": "Não foi possível excluir este cofre — nada foi excluído. {{reason}}" + }, + "madePrivateToast_one": "O cofre agora é privado. {{count}} membro perdeu o acesso.", + "madePrivateToast_many": "O cofre agora é privado. {{count}} membros perderam o acesso.", + "madePrivateToast_other": "O cofre agora é privado. {{count}} membros perderam o acesso.", + "madePrivateToastEmpty": "O cofre agora é privado." + }, + "rolesPanel": { + "permGroup": { + "administration": "Administração", + "dataAccess": "Acesso aos dados", + "connectionManagement": "Gerenciamento de conexões", + "teamAdministration": "Administração da equipe", + "terminalSessions": "Sessões de terminal" + }, + "perm": { + "VIEW": "Ver um objeto", + "ADMINISTRATOR": "Todas as permissões em todos os objetos, independentemente de suas regras", + "VIEW_SECRETS": "Ver senhas e chaves privadas em texto simples", + "COPY_SECRETS": "Copiar senhas e chaves para a área de transferência", + "CONNECT": "Iniciar conexões SSH", + "EDIT_CONNECTIONS": "Criar, modificar e excluir conexões", + "EDIT_IDENTITIES": "Criar, modificar e excluir identidades SSH", + "EDIT_KEYS": "Criar, modificar e excluir chaves SSH", + "EDIT_SNIPPETS": "Criar, modificar e excluir snippets de comando", + "EDIT_FOLDERS": "Gerenciar a estrutura de pastas", + "VIEW_AUDIT_LOG": "Ler o registro de auditoria de atividades", + "INVITE_MEMBERS": "Convidar novos membros para o cofre", + "MANAGE_MEMBERS": "Atribuir funções e remover membros", + "CREATE_CUSTOM_ROLES": "Permissão descontinuada — mantida por compatibilidade", + "MANAGE_ROLES": "Criar, editar e excluir funções", + "MANAGE_VAULT": "Renomear o cofre e gerenciar as configurações do cofre", + "START_TERMINAL_SESSION": "Iniciar sessões de terminal multijogador", + "JOIN_TERMINAL_SESSION": "Entrar em sessões de terminal existentes", + "VIEW_TERMINAL_SESSIONS": "Ver sessões de terminal ativas" + }, + "builtinBadge": "Nativa", + "dragToReorder": "Arraste para reordenar", + "deleteRoleTitle": "Excluir função", + "clickToConfirm": "Clique novamente para confirmar", + "failedToDelete": "Falha ao excluir", + "editRole": "Editar função", + "newRole": "Nova função personalizada", + "roleName": "Nome da função", + "roleNamePlaceholder": "ex.: Somente leitura, Implantação, DevOps…", + "colorLabel": "Cor", + "clearColor": "Limpar", + "preview": "Prévia", + "permissionsLabel": "Permissões", + "objectOverrideNote": "Qualquer host, chave, identidade, snippet ou pasta pode substituir estas permissões.", + "saveChanges": "Salvar alterações", + "createRole": "Criar função", + "errorNameRequired": "O nome é obrigatório", + "errorFailedToSave": "Falha ao salvar a função", + "builtinRoles": "Funções nativas", + "customRoles": "Funções personalizadas", + "newRoleBtn": "Nova função", + "noCustomRolesCanEdit": "Nenhuma função personalizada ainda. Crie uma para atribuir permissões específicas.", + "noCustomRoles": "Nenhuma função personalizada definida para esta equipe." + } + }, + "plugins": { + "categoryLabel": "Plugin", + "tabs": { + "installed": "Instalados ({{count}})", + "browse": "Explorar", + "updateCount_one": "• {{count}} atualização", + "updateCount_many": "• {{count}} atualizações", + "updateCount_other": "• {{count}} atualizações" + }, + "installed": { + "filterPlaceholder": "Filtrar plugins…", + "scanTitle": "Procurar plugins locais", + "pluginSettingsTitle": "Configurações de {{name}}", + "noConfig": "Nenhuma configuração disponível.", + "bundledBadge": "Incluído", + "settingsTitle": "Configurações do plugin", + "reloadTitle": "Recarregar plugin", + "uninstallTitle": "Desinstalar plugin", + "noMatch": "Nenhum plugin corresponde à sua pesquisa.", + "noneInstalled": "Nenhum plugin instalado.", + "sourceLocal": "Local", + "sourceUrl": "URL", + "sourceInstalled": "Instalado", + "unverified": "Não verificado", + "update": "Atualizar", + "updating": "Atualizando…", + "updateTitle": "Atualizar para v{{version}}", + "confirmUninstallSeeded": { + "title": "Desinstalar {{name}}?", + "message": "{{name}} é um plugin incluído. Desinstalá-lo o remove da sua lista — você pode reinstalá-lo a qualquer momento na aba Explorar.", + "confirm": "Desinstalar" + } + }, + "browse": { + "searchPlaceholder": "Pesquisar plugins…", + "refreshTitle": "Atualizar catálogo", + "manageSourcesTitle": "Gerenciar fontes", + "sourcesHeader": "Fontes de plugins", + "addSource": "Adicionar fonte", + "addSourcePlaceholder": "https://example.com/plugins.json", + "add": "Adicionar", + "installedBadge": "Instalado", + "byAuthor": "por {{author}} · v{{version}}", + "noCatalog": "Nenhum plugin no catálogo.", + "noResults": "Nenhum resultado.", + "removing": "Removendo…", + "uninstall": "Desinstalar", + "installing": "Instalando…", + "install": "Instalar", + "updateBadge": "atualização disponível", + "requiresVersion": "Requer v{{version}} ou superior" + }, + "install": { + "integrityFailed": "O pacote do plugin falhou na verificação de integridade — instalação bloqueada.", + "alreadyInstalling": "Este plugin já está sendo instalado — verifique Configurações › Plugins.", + "failed": "Falha ao instalar o plugin.", + "versionUnsupported": "Este plugin requer a versão {{version}} ou superior do aplicativo." + }, + "deepLinkInstall": { + "title": "Instalar este plugin?", + "body": "Este link instala um plugin. Um plugin executa código dentro do Voltius com as permissões listadas abaixo.", + "summary": "{{name}} {{version}} por {{author}}", + "source": "Do catálogo {{source}}.", + "action": "Instalar", + "failed": "Este link não indica um plugin que o Voltius possa instalar" + }, + "permissionModal": { + "installTitle": "Instalar {{name}}?", + "installBody": "Este plugin é executado com privilégios totais do aplicativo. Ele solicita estas permissões:", + "updateTitle": "Atualizar {{name}}?", + "updateBody": "Esta atualização solicita novas permissões. Revise-as antes de continuar:", + "newPermissions": "Novas permissões", + "noPermissions": "Este plugin não solicita permissões especiais.", + "installConfirm": "Instalar", + "updateConfirm": "Atualizar", + "permissions": { + "readOnlyHeading": "Acesso somente leitura", + "readOnlyWarning": "O plugin pode ver isto, mas não pode alterar ou excluir nada com isso.", + "dangerHeading": "Permissões poderosas", + "dangerWarning": "Estas concedem ao plugin acesso amplo. Conceda-as apenas a um plugin em que você confia.", + "terminalRead": { "label": "Ler a saída do terminal", "description": "Ler a saída visível e o histórico das suas sessões de terminal." }, + "terminalStream": { "label": "Observar a saída do terminal ao vivo", "description": "Observar continuamente tudo o que é impresso nas suas sessões de terminal, à medida que acontece." }, + "terminalWrite": { "label": "Digitar nos seus terminais", "description": "Enviar entrada e executar comandos nas suas sessões de terminal — como se você os digitasse." }, + "keychainRead": { "label": "Ler seus próprios segredos armazenados", "description": "Ler segredos que este plugin armazenou anteriormente no chaveiro do seu dispositivo." }, + "keychainWrite": { "label": "Armazenar segredos no seu dispositivo", "description": "Salvar segredos no chaveiro do SO do seu dispositivo." }, + "metricsRead": { "label": "Ler métricas do sistema", "description": "Ler estatísticas de CPU, memória, disco e rede dos seus hosts conectados." }, + "dockerRead": { "label": "Ler informações do Docker", "description": "Listar contêineres, imagens, volumes, redes e stacks, e ler logs de contêineres. Os logs podem conter senhas ou tokens." }, + "processesRead": { "label": "Ler informações de processos", "description": "Listar processos em execução nos seus hosts conectados." }, + "processesManage": { "label": "Gerenciar processos", "description": "Listar e encerrar processos em execução nos seus hosts conectados." }, + "dockerManage": { "label": "Gerenciar o Docker", "description": "Listar, iniciar, parar e excluir contêineres, imagens, volumes, redes e stacks. Isso pode destruir dados permanentemente." }, + "portsForward": { "label": "Encaminhar portas para este computador", "description": "Abrir túneis SSH dos seus hosts conectados para portas locais neste computador, e abrir o endereço resultante no seu navegador ou área de transferência." }, + "proxmoxRead": { "label": "Ler informações do Proxmox", "description": "Listar contêineres LXC e seus snapshots." }, + "proxmoxManage": { "label": "Gerenciar o Proxmox", "description": "Listar e controlar contêineres LXC, incluindo criar, excluir e reverter snapshots. Isso pode destruir dados permanentemente." }, + "sftpRead": { "label": "Ler arquivos", "description": "Navegar e ler arquivos nos seus hosts SSH/FTP salvos e neste computador." }, + "sftpWrite": { "label": "Gravar e mover arquivos", "description": "Criar, renomear, substituir e excluir arquivos nos seus hosts SSH/FTP salvos e neste computador, e copiar arquivos entre eles. Isso pode destruir dados permanentemente." }, + "audit": { "label": "Registrar eventos de auditoria", "description": "Adicionar entradas ao seu registro de auditoria descrevendo o que ele fez. Para um host em um cofre de equipe, essas entradas também são enviadas ao servidor dessa equipe." }, + "auditRead": { "label": "Ler o registro de atividades", "description": "Ler o registro de atividades deste dispositivo, incluindo quais hosts foram acessados, quais arquivos foram tocados e o que outros plugins fizeram. Quando uma equipe é indicada, também lê o log do lado do servidor dessa equipe — a atividade de todos os membros." }, + "mcpContribute": { "label": "Expor ferramentas a agentes de IA externos", "description": "Permite que este plugin adicione seus próprios comandos ao servidor MCP do Voltius, para que qualquer agente de IA externo que você tenha conectado possa executá-los — usando as próprias permissões deste plugin." }, + "vaultsRead": { "label": "Ver seus cofres", "description": "Ver os nomes dos seus cofres, incluindo cofres de equipe, e como estão organizados." }, + "vaultsWrite": { "label": "Criar e excluir cofres", "description": "Criar, renomear e excluir seus cofres. Excluir um cofre pode excluir tudo o que está nele." }, + "foldersRead": { "label": "Ver suas pastas", "description": "Ver as pastas em que você organiza hosts, chaves, encaminhamentos de portas e snippets." }, + "foldersWrite": { "label": "Criar e excluir pastas", "description": "Criar, renomear e excluir pastas. Excluir uma pasta pode excluir tudo o que está nela." }, + "sessionsRead": { "label": "Ver suas sessões", "description": "Ver quais sessões de terminal estão abertas e quando mudam." }, + "sessionsWrite": { "label": "Abrir e fechar sessões", "description": "Abrir novas sessões de terminal e fechar as existentes." }, + "connectionsRead": { "label": "Ler suas conexões", "description": "Ler suas conexões salvas e seus detalhes." }, + "connectionsWrite": { "label": "Gerenciar suas conexões", "description": "Criar, editar e excluir suas conexões salvas." }, + "keysRead": { "label": "Ler suas chaves SSH", "description": "Listar suas chaves SSH salvas e acrescentar uma à authorized_keys de um host salvo por SSH." }, + "keysWrite": { "label": "Gerenciar suas chaves SSH", "description": "Criar e excluir chaves SSH em seu nome." }, + "identitiesRead": { "label": "Ler suas identidades", "description": "Listar suas identidades salvas." }, + "identitiesWrite": { "label": "Gerenciar suas identidades", "description": "Criar e excluir identidades em seu nome." }, + "snippetsRead": { "label": "Ler seus snippets", "description": "Listar seus snippets salvos e os comandos que executam." }, + "snippetsWrite": { "label": "Gerenciar seus snippets", "description": "Criar, editar, mover e excluir seus snippets salvos." }, + "snippetsRun": { "label": "Executar seus snippets nos seus hosts", "description": "Executar um snippet salvo em um host, conectando-se a ele se necessário. Seus comandos são executados com o seu próprio acesso, exatamente como se você os executasse." }, + "portForwardingRead": { "label": "Ler seus encaminhamentos de portas", "description": "Listar suas regras de encaminhamento de portas salvas e os túneis abertos no momento." }, + "portForwardingWrite": { "label": "Gerenciar seus encaminhamentos de portas", "description": "Criar, editar, mover e excluir suas regras de encaminhamento de portas salvas." }, + "knownHostsRead": { "label": "Ler seus hosts conhecidos", "description": "Listar as chaves de host SSH que você confiou, com suas impressões digitais." }, + "knownHostsWrite": { "label": "Confiar e remover chaves de host", "description": "Autorizar uma chave de host SSH ou excluir uma em que você confiou. Uma chave confiável significa que as conexões com esse host são aceitas sem perguntar a você." }, + "historyRead": { "label": "Ler seu histórico de comandos", "description": "Pesquisar os comandos que você digitou nos terminais. Eles podem conter senhas ou tokens que você digitou em texto simples." }, + "transfersRead": { "label": "Ver transferências de arquivos", "description": "Ver as transferências de arquivos em andamento, incluindo nomes de arquivos, progresso e erros." }, + "transfersWrite": { "label": "Cancelar e repetir transferências", "description": "Cancelar uma transferência de arquivos em andamento ou iniciar novamente uma que falhou — incluindo transferências que você mesmo iniciou." }, + "healthRead": { "label": "Ver a acessibilidade dos hosts", "description": "Ver quais dos seus hosts salvos responderam pela última vez a uma verificação de acessibilidade, e com que rapidez." }, + "vaultRead": { "label": "Ler seu cofre", "description": "Ler dados armazenados no seu cofre." }, + "vaultWrite": { "label": "Gravar no seu cofre", "description": "Armazenar e alterar dados no seu cofre." }, + "syncRead": { "label": "Ler dados de sincronização", "description": "Ler os próprios dados deste plugin sincronizados entre seus dispositivos, e ver o status da sincronização da sua própria configuração." }, + "syncWrite": { "label": "Gravar dados de sincronização", "description": "Armazenar e alterar dados sincronizados entre seus dispositivos." }, + "panesRead": { "label": "Ler o layout do terminal", "description": "Ver suas abas abertas e painéis divididos, e qual sessão está em cada um." }, + "panesWrite": { "label": "Organizar os painéis do terminal", "description": "Dividir, mover, separar e focar painéis do terminal. As sessões permanecem abertas; nada é fechado." }, + "teamRead": { "label": "Ler suas equipes", "description": "Ver suas equipes, quem pertence a elas, suas funções e quais membros possuem a chave do cofre da equipe." }, + "teamWrite": { "label": "Gerenciar membros da equipe", "description": "Convidar pessoas para suas equipes, remover membros e alterar a função deles." }, + "sharingRead": { "label": "Ler terminais compartilhados", "description": "Ver quais das suas sessões de terminal estão compartilhadas, quem as assiste e quem tem o controle." }, + "sharingWrite": { "label": "Compartilhar terminais ao vivo", "description": "Transmitir uma sessão de terminal ao vivo para membros das suas equipes, parar o compartilhamento e passar o controle dela a um participante que o solicitou." }, + "settingsRead": { "label": "Ler as configurações do aplicativo", "description": "Ver cada configuração deste aplicativo e seu valor atual." }, + "settingsWrite": { "label": "Alterar as configurações do aplicativo", "description": "Alterar qualquer configuração deste aplicativo, incluindo as que desativam uma proteção." }, + "accountRead": { "label": "Ler sua assinatura", "description": "Ver seu plano, status do teste, assentos e estado da cobrança." }, + "pluginsManage": { "label": "Gerenciar plugins", "description": "Instalar, atualizar, remover, habilitar e desabilitar plugins, e adicionar fontes de marketplace. Um plugin instalado executa código dentro do Voltius com as permissões que declara." }, + "importExportRead": { "label": "Exportar seus dados", "description": "Exportar conexões, identidades, chaves SSH, snippets e regras de encaminhamento de portas. Pacotes contendo senhas ou chaves privadas só podem ser exportados criptografados." }, + "importExportWrite": { "label": "Importar dados", "description": "Importar conexões, identidades, chaves SSH, snippets e regras de encaminhamento de portas para um cofre. Os itens existentes nunca são substituídos." }, + "storage": { "label": "Armazenar dados do plugin", "description": "Salvar as próprias configurações e dados deste plugin no seu dispositivo." }, + "http": { "label": "Acessar a rede", "description": "Fazer solicitações de rede a serviços externos." }, + "cryptoDerive": { "label": "Derivar chaves de criptografia", "description": "Derivar uma chave de criptografia a partir de uma frase secreta que você fornece. Não concede acesso aos seus segredos armazenados." }, + "fs": { "label": "Acessar arquivos", "description": "Ler e gravar arquivos no seu dispositivo." }, + "ui": { "label": "Mostrar elementos de interface", "description": "Adicionar seus próprios painéis e controles ao aplicativo." }, + "notifications": { "label": "Mostrar notificações", "description": "Mostrar notificações e avisos a você." }, + "settingsPage": { "label": "Adicionar uma página de configurações", "description": "Adicionar sua própria página às Configurações." }, + "rightPanel": { "label": "Adicionar um painel lateral", "description": "Adicionar um painel à área lateral da sessão." }, + "globalPanel": { "label": "Adicionar um painel global", "description": "Adicionar um painel disponível em todo o aplicativo." }, + "themes": { "label": "Adicionar temas de cores", "description": "Adicionar seus próprios temas de cores que você pode selecionar no aplicativo." }, + "omniCommands": { "label": "Adicionar ações à paleta de comandos", "description": "Adicionar suas próprias ações à paleta de comandos." }, + "uiContributions": { "label": "Adicionar elementos de interface", "description": "Adicionar seus próprios elementos à interface do aplicativo." } + } + } + }, + "sftp": { + "downloads": { + "title": "Downloads", + "folderLabel": "Pasta de download", + "notSet": "Não definida — escolhida no primeiro download", + "changeFolder": "Alterar pasta" + }, + "transfers": { + "title": "Transferências", + "tarAcceleration": { + "title": "Aceleração com tar", + "desc": "Empacotar diretórios em um único tar.gz antes da transferência — muito mais rápido para muitos arquivos pequenos. Requer tar nos dois lados." + } + }, + "filePanel": { + "showHidden": { + "title": "Mostrar arquivos ocultos" + }, + "title": "Painel de arquivos", + "autoRefresh": { + "title": "Atualização automática", + "desc": "Atualiza silenciosamente o conteúdo do diretório em segundo plano" + }, + "refreshInterval": { + "title": "Intervalo de atualização", + "desc": "Mínimo de 0,5 s", + "unit": "s" + } + }, + "editor": { + "maxBytes": { + "title": "Tamanho máximo de arquivo editável" + }, + "title": "Editor", + "autoSave": { + "title": "Salvamento automático", + "desc": "Salvar alterações no arquivo automaticamente enquanto você digita" + } + } + }, + "portForwarding": { + "automationTitle": "Automação", + "autoForward": { + "title": "Encaminhamento automático de portas", + "desc": "As portas de escuta detectadas são encaminhadas automaticamente durante as sessões SSH" + }, + "notifications": { + "title": "Notificações de encaminhamento", + "desc": "Mostrar uma notificação sempre que uma porta for encaminhada automaticamente" + } + }, + "hosts": { + "connectivityTitle": "Conectividade", + "reachability": { + "title": "Verificação de acessibilidade", + "desc": "Sonda a porta SSH e mostra um ponto de status + latência em cada cartão de host. Pode ser desativada por host nas configurações do host." + }, + "pollInterval": { + "title": "Intervalo de verificação", + "desc": "Frequência de verificação em segundo plano para a página de hosts." + }, + "ms": "ms", + "activeInterval": { + "title": "Intervalo da sessão ativa", + "desc": "Frequência mais rápida usada para o indicador de latência na barra de status do terminal." + }, + "keepalive": { + "title": "Keepalive", + "desc": "Com que rapidez uma sessão é declarada perdida quando o servidor para de responder. {{detail}}. Pode ser substituído por host." + }, + "keepalivePresets": { + "fast": { + "label": "Rápido", + "detail": "Detecta uma conexão perdida em ~4s" + }, + "balanced": { + "label": "Equilibrado", + "detail": "~9s; tolera uma breve oscilação de rede" + }, + "tolerant": { + "label": "Tolerante", + "detail": "~20s; para redes instáveis" + }, + "off": { + "label": "Desativado", + "detail": "Sem sondagens de keepalive" + } + }, + "proxy": { + "title": "Proxy", + "desc": "Encaminhar SSH, SFTP e verificações de acessibilidade por um proxy. Os hosts podem substituir isto.", + "modes": { + "none": "Sem proxy", + "system": "Sistema", + "socks5": "SOCKS5", + "http": "HTTP", + "https": "HTTPS" + }, + "detected": "Detectado: {{kind}} {{host}}:{{port}}", + "detectedNone": "Detectado: nenhum (conectando diretamente)", + "passwordSaveFailed": "Não foi possível salvar a senha do proxy: {{error}}" + }, + "persistentSessions": { + "title": "Sessões persistentes", + "desc": "Mantenha seu shell e os processos em execução vivos entre desconexões envolvendo o shell remoto no tmux (recorre ao screen). Requer tmux ou screen no host. Pode ser substituído por host, em Avançado nas configurações da conexão." + }, + "terminalTitle": "Terminal", + "shellIntegration": { + "title": "Integração com o shell", + "desc": "Conecta o shell remoto/local para informar seu diretório de trabalho (OSC 7) para painéis de arquivos cientes do diretório atual. Se a mensagem de boas-vindas ou o prompt de um host parecerem errados, desative-a nele. Pode ser substituído por host, em Avançado nas configurações da conexão." + }, + "teamPresenceTitle": "Presença da equipe", + "teamPresence": { + "title": "Compartilhar quais hosts do cofre de equipe você está usando", + "desc": "Quando ativado, seu avatar aparece em um cartão de host enquanto você tem um terminal aberto para ele. Apenas colegas de equipe com acesso ao host o veem." + }, + "sshConfig": { + "switch": { + "title": "Sincronizar continuamente a partir de ~/.ssh/config", + "desc": "Os hosts do seu config são criados e mantidos atualizados no Voltius, em todos os seus computadores. Útil quando uma ferramenta escreve o config (gcloud, MDM…)." + }, + "vault": { + "title": "Cofre", + "desc": "Onde novos hosts gerenciados são criados. Apenas cofres pessoais.", + "personal": "Pessoal" + }, + "status": { + "title": "Status", + "line": "Última leitura {{when}} · {{managed}} gerenciados · {{skipped}} não sincronizados", + "never": "Ainda não lido", + "view": "Ver hosts…", + "syncNow": "Sincronizar agora" + }, + "off": { + "title": "Desativar a sincronização contínua?", + "message_one": "O host gerenciado permanece no Voltius e se torna um host normal: ele deixa de seguir ~/.ssh/config, em todos os seus computadores.", + "message_many": "Os {{count}} hosts gerenciados permanecem no Voltius e se tornam hosts normais: eles deixam de seguir ~/.ssh/config, em todos os seus computadores.", + "message_other": "Os {{count}} hosts gerenciados permanecem no Voltius e se tornam hosts normais: eles deixam de seguir ~/.ssh/config, em todos os seus computadores.", + "confirm": "Desativar" + }, + "dialog": { + "activateTitle": "Ativar a sincronização contínua", + "reviewTitle": "Hosts de ~/.ssh/config", + "intro": "Os hosts vinculados mantêm seu nome, pasta e configurações. Apenas o que o arquivo define (host, porta e usuário, chave ou hosts de salto, quando presentes) será seguido, em todos os seus computadores.", + "turnOn": "Ativar", + "cancel": "Cancelar", + "close": "Fechar", + "linkAgain": "Vincular novamente", + "recreate": "Recriar", + "counts": "{{create}} para criar · {{link}} para vincular · {{skipped}} não sincronizados · cofre {{vault}}" + }, + "row": { + "create": "Será criado", + "link": { + "legacy": "Será vinculado a “{{name}}” · sincronização anterior", + "detached": "Será vinculado a “{{name}}” · separado anteriormente", + "name": "Será vinculado a “{{name}}” · mesmo nome e endereço", + "address": "Será vinculado a “{{name}}” · mesmo endereço" + }, + "ambiguous": "Ambíguo ({{names}} correspondem) · um novo host será criado", + "managed": "Gerenciado · “{{name}}”", + "detached": "Separado · “{{name}}” não segue mais o arquivo", + "deleted": "Excluído · não recriado pela sincronização", + "ignored": "Ignorado · não será sincronizado", + "identityReplaced": "A identidade “{{name}}” será substituída pela chave do arquivo", + "skipped": { + "pattern": "Não sincronizado · padrão, não um host", + "match": "Não sincronizado · bloco Match", + "include": "Não sincronizado · não foi possível ler o Include", + "includeOutside": "Não sincronizado · Include fora de ~/.ssh", + "proxyCommand": "Não sincronizado · ProxyCommand não suportado", + "key": "Chave ilegível · host criado sem chave", + "keyNotCopied": "Chave não copiada · host criado sem chave", + "pending": "Aguardando · o host ainda não chegou do seu outro dispositivo" + } + }, + "keys": { + "title": "Chaves", + "switch": "Copiar chaves privadas para o cofre", + "warning": "As chaves copiadas vão para {{vault}} e são sincronizadas com todos os seus dispositivos, incluindo o celular (criptografadas).", + "settingDesc": "Desativado: os hosts usam uma chave já presente no cofre (mesma chave pública ou nome), ou nenhuma chave. As chaves copiadas são sincronizadas com todos os seus dispositivos.", + "copy": "Será copiada", + "notCopied": "Não copiada", + "exists": "Já está no cofre", + "unreadable": "Ilegível" + }, + "here": { + "title": "Este computador", + "desc": "A sincronização está ativada para sua conta, mas o ~/.ssh/config deste computador ainda não foi revisado. Nada é lido ou copiado aqui até você revisá-lo.", + "action": "Revisar…" + } + } + }, + "toggleDefs": { + "cursorBlink": { + "label": "Cursor piscante" + }, + "scrollMinimap": { + "label": "Minimapa de rolagem" + }, + "selectToCopy": { + "label": "Selecionar para copiar" + }, + "dragSelectsText": { + "label": "Arrastar seleciona texto" + }, + "groupTabsByHost": { + "label": "Agrupar abas por host" + }, + "ignoreBracketedPaste": { + "label": "Colagem simples (sem colagem entre colchetes)" + }, + "pasteImageAsPath": { + "label": "Colar imagens como caminho de arquivo" + }, + "volumeDownCtrl": { + "label": "Usar Volume Down como Ctrl" + }, + "keywordHighlight": { + "label": "Destaque de palavras-chave" + }, + "autoForward": { + "label": "Encaminhamento automático de portas" + }, + "forwardingNotifications": { + "label": "Notificações de encaminhamento de portas" + }, + "sftpTar": { + "label": "Aceleração com tar no SFTP" + }, + "sftpAutoRefresh": { + "label": "Atualização automática do SFTP" + }, + "reachability": { + "label": "Verificação de acessibilidade" + }, + "teamPresence": { + "label": "Presença da equipe" + }, + "shellIntegration": { + "label": "Integração com o shell" + }, + "persistentSessions": { + "label": "Sessões persistentes" + }, + "restoreWorkspace": { + "label": "Restaurar área de trabalho ao iniciar" + }, + "crossDeviceSessions": { + "label": "Sessões entre dispositivos" + }, + "changelogPopup": { + "label": "Mostrar novidades após atualizações" + }, + "pluginInstallReview": { + "label": "Revisar permissões antes de instalar plugins" + }, + "mcpServer": { + "label": "Servidor MCP" + } + }, + "shortcuts": { + "searchPlaceholder": "Pesquisar atalhos…", + "clearSearch": "Limpar pesquisa", + "resetAll": "Redefinir tudo", + "resetAllTitle": "Redefinir todos os atalhos para os padrões", + "statusRecording": "Pressione uma combinação de teclas… (Esc para cancelar)", + "statusIdle": "Clique em um atalho para remarcá-lo.", + "result_one": "{{count}} resultado", + "result_many": "{{count}} resultados", + "result_other": "{{count}} resultados", + "noMatch": "Nenhum atalho corresponde a \"{{query}}\"", + "bindingRecordingTitle": "Pressione uma combinação de teclas ou Esc para cancelar", + "bindingIdleTitle": "Clique para remarcar", + "pressKey": "Pressione a tecla…", + "conflict": "Conflito", + "aliasTitle": "Atalho fixo — sempre ativo", + "group": { + "global": "Global", + "tabs": "Abas", + "navigation": "Navegação", + "editing": "Edição", + "other": "Outros" + }, + "items": { + "omni": { + "label": "Pesquisa Omni", + "desc": "Acesse tudo a partir de um único lugar" + }, + "shortcuts": { + "label": "Atalhos de teclado", + "desc": "Abrir as configurações de atalhos" + }, + "themes": { + "label": "Configurações", + "desc": "Abrir as configurações" + }, + "newTab": { + "label": "Nova aba", + "desc": "Ir para a visualização de hosts" + }, + "duplicateSession": { + "label": "Duplicar sessão", + "desc": "Abrir um segundo terminal no mesmo host" + }, + "duplicateSessionSplit": { + "label": "Duplicar em painel dividido", + "desc": "Abrir um segundo terminal ao lado do atual" + }, + "closeTab": { + "label": "Fechar aba", + "desc": "Fechar a sessão ativa" + }, + "nextTab": { + "label": "Próxima aba", + "desc": "Alternar para a próxima aba" + }, + "prevTab": { + "label": "Aba anterior", + "desc": "Alternar para a aba anterior" + }, + "sidebar": { + "label": "Alternar barra lateral", + "desc": "Mostrar/ocultar a barra lateral" + }, + "delete": { + "label": "Excluir selecionados", + "desc": "Excluir os itens selecionados" + }, + "rename": { + "label": "Renomear selecionado", + "desc": "Renomear o item selecionado no local" + }, + "copy": { "label": "Copiar", "desc": "Copiar os itens selecionados para a área de transferência" }, + "cut": { "label": "Recortar", "desc": "Recortar os itens selecionados para a área de transferência" }, + "paste": { "label": "Colar", "desc": "Colar os itens da área de transferência na pasta atual" }, + "undo": { + "label": "Desfazer", + "desc": "Desfazer a última ação" + }, + "redo": { + "label": "Refazer", + "desc": "Refazer a última ação desfeita" + }, + "filter": { + "label": "Focar filtro", + "desc": "Focar o filtro de pesquisa" + }, + "terminalSearch": { + "label": "Localizar no terminal", + "desc": "Pesquisar no histórico do terminal" + }, + "history": { + "label": "Painel de histórico", + "desc": "Abrir o histórico de comandos no painel direito" + }, + "snippets": { + "label": "Painel de snippets", + "desc": "Abrir snippets no painel direito" + }, + "panelThemes": { + "label": "Painel de temas", + "desc": "Abrir temas no painel direito" + }, + "panelNotes": { + "label": "Painel de notas", + "desc": "Abrir notas do host no painel direito" + } + } + } + } +} diff --git a/src/i18n/locales/pt/shared.json b/src/i18n/locales/pt/shared.json new file mode 100644 index 000000000..a2298a3b5 --- /dev/null +++ b/src/i18n/locales/pt/shared.json @@ -0,0 +1,189 @@ +{ + "shared": { + "signOutConfirm": { + "title": "Sair e apagar os dados deste dispositivo?", + "noServerCopy": "Os hosts, chaves e snippets desta conta são armazenados apenas neste dispositivo. Sair irá apagá-los e eles não poderão ser recuperados.", + "unsynced": "A sincronização está pausada ou não conseguiu alcançar o servidor, então alterações recentes deste dispositivo podem não estar salvas lá. Sair apaga a cópia deste dispositivo.", + "confirm": "Apagar e sair" + }, + "errorBanner": { + "dismiss": "dispensar" + }, + "trialExpiredModal": { + "title": "Seu teste Pro terminou", + "subtitle": "Estes três recursos param de funcionar hoje:", + "freeNote": "Cofre local, registros de auditoria e sincronização com o GitHub Gist continuam gratuitos, para sempre.", + "teamsPrompt": "Trabalha em equipe? Experimente o Teams grátis por {{days}} dias (cartão obrigatório).", + "upgradeButton": "Atualizar para Pro", + "laterButton": "Talvez depois" + }, + "createVaultModal": { + "title": "Novo cofre", + "subtitle": "Cofres mantêm suas credenciais organizadas", + "nameLabel": "Nome do cofre", + "namePlaceholder": "ex.: Trabalho, Pessoal, Homologação…", + "createButton": "Criar cofre" + }, + "vaultCascadeModal": { + "headingMove": "Mover itens vinculados para", + "headingCopy": "Copiar itens vinculados para", + "fallbackDescriptionMoved": "Os itens vinculados a seguir estão em outro cofre e também serão movidos:", + "fallbackDescriptionCopied": "Os itens vinculados a seguir estão em outro cofre e também serão copiados:", + "confirmMove": "Mover tudo", + "confirmCopy": "Copiar tudo", + "typeLabel": { + "identity": "Identidade", + "key": "Chave SSH" + } + }, + "formSelect": { + "title": "Selecionar" + }, + "folderSelector": { + "noFolder": "Nenhuma pasta", + "namePlaceholder": "Nome da pasta", + "newFolder": "Nova pasta" + }, + "tagSelector": { + "placeholder": "Adicionar tags…", + "removeTag": "Remover tag {{tag}}" + }, + "portInput": { + "placeholder": "/dev/ttyUSB0 ou COM3" + }, + "avatarStack": { + "participantCount_one": "{{count}} participante", + "participantCount_many": "{{count}} participantes", + "participantCount_other": "{{count}} participantes" + }, + "presence": { + "hasControl": "Tem o controle" + }, + "panel": { + "saveState": { + "dirty": "Editando...", + "saving": "Salvando...", + "saved": "Salvo" + } + }, + "vaultPicker": { + "memberBadge": "membro" + }, + "pickers": { + "thisComputer": "Este computador", + "recent": "Recentes" + }, + "sessionPicker": { + "insertTitle": "Inserir em...", + "executeTitle": "Executar em...", + "insertConfirm_one": "Inserir em {{count}} destino", + "insertConfirm_many": "Inserir em {{count}} destinos", + "insertConfirm_other": "Inserir em {{count}} destinos", + "executeConfirm_one": "Executar em {{count}} destino", + "executeConfirm_many": "Executar em {{count}} destinos", + "executeConfirm_other": "Executar em {{count}} destinos", + "noActiveSessions": "Nenhuma sessão ativa", + "activeSessionsHeader": "Sessões ativas", + "openNewConnectionHeader": "Abrir nova conexão", + "localShellFallbackName": "Shell local", + "sshSessionSub": "Sessão SSH", + "noRemoteHostsFound": "Nenhum host remoto encontrado", + "noHostsFound": "Nenhum host encontrado" + }, + "hostPicker": { + "selectHostTitle": "Selecionar host", + "filterPlaceholder": "Filtrar hosts...", + "localMachineName": "Máquina local", + "wslSub": "WSL", + "noHostsConfigured": "Nenhum host configurado", + "noHostsMatch": "Nenhum host corresponde", + "allVaults": "Todos os cofres" + }, + "sort": { + "nameAsc": "A → Z", + "nameDesc": "Z → A", + "newest": "Mais recentes primeiro", + "oldest": "Mais antigos primeiro" + }, + "tagFilter": { + "filterByTag": "Filtrar por tag", + "emptyTitle": "Adicionar tags", + "emptyDescription": "Tags ajudam a filtrar seus hosts. Você pode adicionar uma tag ao editar um host.", + "searchPlaceholder": "Filtrar tags...", + "clearSelection": "Limpar seleção ({{count}})", + "noTagsMatch": "Nenhuma tag corresponde a \"{{search}}\"", + "deleteTagTitle": "Excluir a tag \"{{tag}}\"?", + "deleteTagBody_one": "Isso removerá a tag de {{count}} host. Os hosts em si não serão excluídos.", + "deleteTagBody_many": "Isso removerá a tag de {{count}} hosts. Os hosts em si não serão excluídos.", + "deleteTagBody_other": "Isso removerá a tag de {{count}} hosts. Os hosts em si não serão excluídos.", + "renameTagTitle": "Renomear tag", + "deleteTagButtonTitle": "Excluir tag" + }, + "vaultUnavailable": { + "note": "Não foi possível ler o cofre, então os segredos armazenados não são exibidos aqui. Deixe um campo vazio para manter o que está salvo; digitar um novo valor o substitui." + }, + "teamCredentials": { + "unavailable": "Não foi possível carregar as credenciais armazenadas deste cofre de equipe, então hosts que precisam de uma senha, chave ou frase secreta salva falharão ao conectar. Peça a um administrador do cofre para conceder acesso aos segredos do cofre à sua função." + }, + "vaultBackups": { + "title": "Backups do cofre", + "description": "Arquivos de cofre guardados quando não puderam ser abertos. Restaurar um deles o coloca de volta como seu cofre e mantém o atual como um novo backup — nada é excluído.", + "empty": "Nenhum backup de cofre neste dispositivo.", + "restore": "Restaurar", + "confirm": "Restaurar este backup", + "cancel": "Cancelar", + "warn": "Este backup se tornará seu cofre. Ele abre com a senha mestra que estava em uso quando foi criado, então você será desconectado e solicitado a desbloquear.", + "warnReadable": "Seu cofre atual pode ser lido. Restaurar irá substituí-lo — ele é mantido como um novo backup, e você será desconectado e solicitado a desbloquear com a senha que criou o arquivo restaurado.", + "restoredToast": "Backup restaurado. Seu cofre anterior foi mantido como {{file}}.", + "restoredToastNoPrevious": "Backup restaurado." + }, + "tunnelStatus": { + "noRemoteListener": "Nada está escutando na porta remota" + }, + "permissions": { + "everyone": "@todos", + "moveWarning": { + "title": "As permissões serão alteradas", + "body": "Mover para cá aplica as permissões desta pasta:", + "bodyUnknown": "Mover para cá aplica as permissões desta pasta.", + "line": "{{subject}} · {{permission}}: {{before}} → {{after}}", + "confirm": "Mover", + "cancelled": "Movimentação cancelada" + }, + "section": { + "title": "Permissões", + "titleKey": "Quem pode usar esta chave", + "titleIdentity": "Quem pode usar esta identidade", + "adminNote": "Proprietários e administradores sempre podem usar todas as chaves.", + "syncedWith": "Sincronizado com {{folder}}", + "syncedTeam": "Usa as permissões da equipe", + "notSynced": "Não sincronizado", + "syncNow": "Sincronizar agora", + "ownPermissions": "Permissões próprias", + "useTeams": "Usar as da equipe", + "addSubject": "Adicionar função ou membro", + "searchSubjects": "Pesquisar funções e membros…", + "noSubjectsLeft": "Todas as funções e membros já estão listados", + "use": "Usar", + "requiresConnect": "Requer {{connect}}", + "roleCount_one": "{{count}} função", + "roleCount_many": "{{count}} funções", + "roleCount_other": "{{count}} funções", + "loadFailed": "Não foi possível carregar as permissões" + } + }, + "businessLock": { + "title": "Recurso do plano Business", + "upgrade": "Atualizar para Business", + "ownerOnly": "Apenas o proprietário da equipe pode atualizar.", + "removeRules": "Remover regras", + "confirmClear": "Clique novamente para remover", + "rolesBody": "Funções personalizadas exigem o plano Business da equipe.", + "memberLapsed": "Plano Business expirado: as permissões concedidas a {{name}} estão desativadas; as restrições continuam valendo.", + "objectLapsed": "Plano Business expirado: as regras de permissão estão desativadas; as regras de negação continuam valendo.", + "memberLine": "Permissões por membro exigem Business.", + "objectLine": "Permissões por objeto exigem Business.", + "removeOverrides": "Remover substituições" + } + } +} diff --git a/src/i18n/locales/pt/snippets.json b/src/i18n/locales/pt/snippets.json new file mode 100644 index 000000000..b4a673584 --- /dev/null +++ b/src/i18n/locales/pt/snippets.json @@ -0,0 +1,258 @@ +{ + "snippets": { + "sequence": { + "summary": { + "partial": "{{count}} ok — {{details}}", + "failed": "falhou", + "success_one": "Snippet executado em {{count}} destino", + "success_many": "Snippet executado em {{count}} destinos", + "success_other": "Snippet executado em {{count}} destinos" + }, + "connectFailed": "não foi possível abrir uma sessão de terminal", + "flatten": { + "tooDeep": "Aninhamento de snippets profundo demais em \"{{name}}\"", + "tooManySteps": "O snippet expandiu etapas demais", + "cycle": "Ciclo de snippets detectado em \"{{name}}\"", + "missingRef": "Uma etapa do snippet faz referência a um snippet inexistente ({{id}})" + }, + "error": { + "needsTerminal": "A etapa de script requer uma sessão de terminal aberta para este destino", + "noSftp": "Nenhuma conexão SFTP para a etapa de transferência", + "destExists": "O destino já existe: {{path}}" + }, + "resumeFailed": "Falha no snippet: {{error}}" + }, + "toolbar": { + "filterPlaceholder": "Filtrar snippets...", + "gridLabel": "Grade", + "listLabel": "Lista", + "sortNameAsc": "A → Z", + "sortNameDesc": "Z → A", + "sortNewest": "Mais recentes primeiro", + "sortOldest": "Mais antigos primeiro", + "newSnippet": "Novo snippet", + "newSnippetOptions": "Opções de novo snippet", + "newFolder": "Nova pasta" + }, + "card": { + "duplicate": "Duplicar", + "unpin": "Desafixar", + "pin": "Fixar", + "unpinForMe": "Desafixar para mim", + "showInMyView": "Mostrar na minha visão", + "hideForMe": "Ocultar para mim", + "pinForMe": "Fixar para mim", + "unpinForTeam": "Desafixar para a equipe", + "pinForTeam": "Fixar para a equipe", + "enableCloudSync": "Ativar sincronização na nuvem", + "disableCloudSync": "Desativar sincronização na nuvem", + "export": "Exportar", + "insert": "Inserir", + "execute": "Executar", + "noContent": "Sem conteúdo" + }, + "form": { + "nameLabel": "Nome", + "namePlaceholder": "Meu snippet", + "contentLabel": "Conteúdo", + "variablesLabel": "Variáveis:", + "autoBadge": "auto", + "descriptionLabel": "Descrição (opcional)", + "descriptionPlaceholder": "O que este snippet faz?", + "tagsLabel": "Tags", + "folderLabel": "Pasta", + "starred": "Fixado", + "starThisSnippet": "Fixar este snippet", + "generalSection": "Geral", + "contextualFiltersSection": "Filtros contextuais", + "contextualFiltersHint": "Deixe vazio para mostrar em todas as conexões. Snippets que não correspondem ficam esmaecidos, não ocultos.", + "onlyForConnectionTags": "Apenas para tags de conexão", + "connectionTagsPlaceholder": "ex.: produção", + "onlyForDistros": "Apenas para distribuições", + "distrosPlaceholder": "ex.: ubuntu, debian", + "removeTagAriaLabel": "Remover tag {{tag}}", + "dynamicVars": { + "connectionHost": "Hostname / IP SSH ativo", + "connectionUsername": "Nome de usuário SSH ativo", + "connectionName": "Nome da conexão ativa", + "date": "Hoje — AAAA-MM-DD", + "datetime": "Data + hora — AAAA-MM-DD HH:MM:SS", + "timestamp": "Timestamp Unix", + "clipboard": "Conteúdo atual da área de transferência" + }, + "syntaxHint": "Digite {{open}} para autocompletar. Prompts personalizados: {{prompt}} — texto · número · senha · booleano · {{choice}}" + }, + "step": { + "kind": { + "script": "Script", + "transfer": "Transferência", + "snippet": "Chamar snippet" + }, + "endpoint": { + "local": "Local", + "remote": "Remoto" + }, + "from": "De", + "to": "Para", + "mode": { + "copy": "Copiar", + "move": "Mover" + }, + "conflict": { + "label": "Se existir", + "overwrite": "Substituir", + "skip": "Ignorar", + "fail": "Falhar" + }, + "remotePicker": { + "title": "Navegar pelo caminho remoto", + "pickHost": "Escolha um host para navegar", + "selectHostTitle": "Selecionar um host", + "back": "Voltar", + "connecting": "Conectando…", + "select": "Selecionar", + "selectFolder": "Usar esta pasta" + }, + "file": "Arquivo", + "folder": "Pasta", + "localPath": "Caminho local", + "remotePath": "Caminho remoto", + "browse": "Procurar", + "dragToReorder": "Arraste para reordenar", + "selectSnippet": "Selecione um snippet...", + "addScript": "+ Script", + "addTransfer": "+ Transferência", + "addSnippet": "+ Chamar snippet", + "addStep": "Adicionar etapa", + "moveUp": "Mover etapa para cima", + "moveDown": "Mover etapa para baixo", + "remove": "Remover etapa" + }, + "page": { + "emptyState": { + "title": "Nenhum snippet ainda", + "subtitle": "Salve comandos de terminal reutilizáveis com variáveis dinâmicas.", + "cta": "Crie seu primeiro snippet" + }, + "pinned": "Fixados", + "folders": "Pastas", + "snippetsSection": "Snippets", + "other": "Outros", + "allSnippets": "Todos os snippets", + "folderEmpty": "Esta pasta está vazia", + "addSnippet": "Adicionar snippet", + "noSearchResults": "Nenhum snippet corresponde a \"{{search}}\"", + "clearSearch": "Limpar pesquisa", + "ejectMoveTo": "Mover para {{name}}", + "ejectRemoveFromFolder": "Remover da pasta", + "recent": { + "title": "Recentes", + "clear": "Limpar", + "showLess": "Mostrar menos", + "showMore": "Mostrar mais {{count}}", + "deletedSnippet": "Snippet excluído", + "unknownTarget": "Desconhecido", + "targetMore": "{{name}} +{{count}} a mais", + "modeRun": "executar", + "modeInsert": "inserir", + "replay": "Repetir" + }, + "bulk": { + "duplicateSnippets": "Duplicar {{count}} snippets", + "moveItemsTo_one": "Mover {{count}} item para", + "moveItemsTo_many": "Mover {{count}} itens para", + "moveItemsTo_other": "Mover {{count}} itens para", + "copyItemsTo_one": "Copiar {{count}} item para", + "copyItemsTo_many": "Copiar {{count}} itens para", + "copyItemsTo_other": "Copiar {{count}} itens para", + "enableCloudSync": "Ativar sincronização na nuvem ({{count}})", + "disableCloudSync": "Desativar sincronização na nuvem ({{count}})", + "exportSnippets_one": "Exportar {{count}} snippet", + "exportSnippets_many": "Exportar {{count}} snippets", + "exportSnippets_other": "Exportar {{count}} snippets", + "deleteSnippets": "Excluir {{count}} snippets" + }, + "confirmDelete": { + "title_one": "Excluir {{count}} item", + "title_many": "Excluir {{count}} itens", + "title_other": "Excluir {{count}} itens", + "message_one": "Tem certeza de que deseja excluir {{count}} item? Isso não pode ser desfeito.", + "message_many": "Tem certeza de que deseja excluir {{count}} itens? Isso não pode ser desfeito.", + "message_other": "Tem certeza de que deseja excluir {{count}} itens? Isso não pode ser desfeito.", + "folderCascade_one": "{{count}} snippet arquivado nas pastas selecionadas também será excluído.", + "folderCascade_many": "{{count}} snippets arquivados nas pastas selecionadas também serão excluídos.", + "folderCascade_other": "{{count}} snippets arquivados nas pastas selecionadas também serão excluídos." + }, + "confirmDeleteFolder": { + "title": "Excluir \"{{name}}\"?", + "message_one": "Isso excluirá a pasta, suas subpastas e o {{count}} snippet dentro dela. Isso não pode ser desfeito.", + "message_many": "Isso excluirá a pasta, suas subpastas e os {{count}} snippets dentro dela. Isso não pode ser desfeito.", + "message_other": "Isso excluirá a pasta, suas subpastas e os {{count}} snippets dentro dela. Isso não pode ser desfeito.", + "messageEmpty": "Isso excluirá a pasta e tudo dentro dela. Isso não pode ser desfeito.", + "confirmLabel": "Excluir pasta" + } + }, + "community": { + "shareTitle": "Compartilhar com a comunidade", + "shareIntro": "Isto é o que seria enviado. Nada é enviado automaticamente — você abre um pull request e um mantenedor o revisa.", + "shareCopy": "Copiar JSON", + "shareCopied": "Copiado", + "shareOpenGithub": "Abrir GitHub", + "shareGuidelines": "Leia as diretrizes de contribuição", + "shareAuthor": "Seu nome ou handle", + "shareDescription": "Descrição curta", + "secretsTitle": "Verifique estes itens antes de compartilhar", + "secretsIntro": "Parece que estes podem ser seus, e não de todo mundo:", + "secretKind_privateKey": "Chave privada", + "secretKind_credential": "Senha ou chave", + "secretKind_token": "Token", + "secretKind_host": "Host ou endereço", + "secretsNone": "Nada que pareça um segredo.", + "shareFailed": "Não é possível compartilhar isto: {{error}}", + "tabMine": "Meus snippets", + "tabCommunity": "Comunidade", + "packs": "Pacotes", + "snippets": "Snippets", + "searchPlaceholder": "Pesquisar na comunidade", + "snippetCount_one": "{{count}} snippet", + "snippetCount_many": "{{count}} snippets", + "snippetCount_other": "{{count}} snippets", + "by": "por {{author}}", + "updated": "Atualizado em {{date}}", + "back": "Comunidade", + "loading": "Carregando catálogo…", + "offline": "Offline — mostrando a última cópia salva", + "empty": "Nenhum snippet da comunidade ainda.", + "noResults": "Nada corresponde a \"{{search}}\".", + "retry": "Tentar novamente", + "loadFailed": "Não foi possível carregar o catálogo da comunidade.", + "install_one": "Instalar {{count}} snippet em {{vault}}", + "install_many": "Instalar {{count}} snippets em {{vault}}", + "install_other": "Instalar {{count}} snippets em {{vault}}", + "installing": "Instalando…", + "installed_one": "{{count}} snippet instalado", + "installed_many": "{{count}} snippets instalados", + "installed_other": "{{count}} snippets instalados", + "installFailed": "Falha na instalação: {{error}}", + "autoIncluded": "Incluído porque \"{{name}}\" o chama", + "steps": "Etapas", + "stepScript": "Script", + "stepTransfer": "Transferência", + "stepSnippet": "Executa snippet", + "selectAll": "Selecionar tudo", + "selectNone": "Limpar", + "error": { + "unsupportedCatalog": "Este catálogo de snippets está em um formato que esta versão do Voltius não entende. Tente atualizar o aplicativo." + } + }, + "deepLinkInstall": { + "title": "Instalar estes snippets?", + "body": "Este link instala snippets do catálogo da comunidade Voltius. Snippets são comandos de shell que são executados nos seus hosts quando você os usa.", + "summary": "{{name}} por {{author}} — {{count}} snippets", + "unknownAuthor": "um autor sem nome", + "destination": "Eles serão adicionados ao cofre {{vault}}.", + "action": "Instalar", + "failed": "Não foi possível instalar estes snippets" + } + } +} diff --git a/src/i18n/locales/pt/terminal.json b/src/i18n/locales/pt/terminal.json new file mode 100644 index 000000000..542710d78 --- /dev/null +++ b/src/i18n/locales/pt/terminal.json @@ -0,0 +1,370 @@ +{ + "terminal": { + "shared": { + "copied": "Copiado", + "insert": "Inserir", + "insertAndExecute": "Inserir e executar", + "noActiveSession": "Nenhuma sessão ativa" + }, + "historyPanel": { + "removeFromHistory": "Remover do histórico", + "searchPlaceholder": "Pesquisar histórico…", + "showCurrentOnly": "Mostrando apenas a conexão atual", + "showAllConnections": "Mostrar todas as conexões", + "clearAllTitle": "Limpar todo o histórico", + "noCommandsMatch": "Nenhum comando corresponde", + "noHistoryForConnection": "Ainda não há histórico para esta conexão", + "noHistoryYet": "Ainda não há histórico de comandos.\nOs comandos que você digitar aparecerão aqui." + }, + "multiplayerBar": { + "ended": "Encerrada", + "sharing": "Compartilhando", + "watching": "Assistindo", + "requestControl": "Solicitar controle", + "requestPending": "Solicitado — aguardando o anfitrião", + "youHaveControl": "Você tem o controle", + "controlRequested": "Controle solicitado", + "grant": "Conceder", + "deny": "Negar", + "revoke": "Revogar", + "stopSharingTitle": "Parar de compartilhar", + "leaveSessionTitle": "Sair da sessão", + "stop": "Parar", + "leave": "Sair", + "waitingForKey": "Aguardando o anfitrião…", + "keyFailed": "O anfitrião não compartilhou a chave" + }, + "sftp": { + "hostLabel": { + "remote": "remoto", + "localMachine": "Máquina local" + }, + "uploadDialogTitle": "Selecione os arquivos para enviar", + "downloadDialogTitle": "Baixar para a pasta", + "waitingForSession": "Aguardando sessão", + "connecting": "Conectando…", + "notSupportedForSessionType": "SFTP não é compatível com este tipo de sessão", + "followPinned": "Seguindo o diretório atual do terminal · clique para desafixar", + "followWaiting": "Seguindo o diretório atual do terminal · aguardando o shell informar o diretório (requer integração com o shell)", + "followTitle": "Seguir o diretório atual do terminal", + "uploadFiles": "Enviar arquivos", + "downloadTitle_one": "Baixar \"{{name}}\"", + "downloadTitle_many": "Baixar {{count}} itens", + "downloadTitle_other": "Baixar {{count}} itens", + "selectFilesToDownload": "Selecione os arquivos para baixar", + "viewOptions": "Opções de visualização", + "moreOptions": "Mais opções" + }, + "ports": { + "badge": { + "auto": "Auto", + "adHoc": "Ad-hoc" + }, + "pauseForwarding": "Pausar encaminhamento", + "resumeForwarding": "Retomar encaminhamento", + "saveAsRule": "Salvar como regra", + "copyAddress": "Copiar localhost:{{port}}", + "openUrl": "Abrir {{url}}", + "sshRequired": "O encaminhamento de portas requer uma sessão SSH.", + "empty": "Nenhuma porta encaminhada. As portas detectadas no host remoto aparecerão aqui automaticamente.", + "sectionSaved": "SALVAS", + "sectionActive": "ATIVAS", + "sectionSuppressed": "SUPRIMIDAS", + "header": { + "title": "Portas", + "activeCount": "{{count}} ativas", + "addTitle": "Encaminhar uma porta" + }, + "quickForwardPlaceholder": "Encaminhar uma porta (ex.: 3000 ou 3000:8080)", + "quickForwardErrors": { + "emptyInput": "Informe uma porta", + "tooManyParts": "Use porta ou remota:local", + "invalidRemotePort": "A porta deve ser de 1 a 65535", + "invalidLocalPort": "A porta local deve ser de 1 a 65535" + }, + "toast": { + "viewPorts": "Ver portas →", + "forwardedOne": "Porta {{port}} → localhost:{{localPort}} encaminhada", + "forwardedMany_one": "{{count}} porta encaminhada", + "forwardedMany_many": "{{count}} portas encaminhadas", + "forwardedMany_other": "{{count}} portas encaminhadas", + "autoForwardCapped_one": "Encaminhamento automático pausado — {{count}} porta já encaminhada", + "autoForwardCapped_many": "Encaminhamento automático pausado — {{count}} portas já encaminhadas", + "autoForwardCapped_other": "Encaminhamento automático pausado — {{count}} portas já encaminhadas" + }, + "portLabel": "Porta {{port}}" + }, + "rightPanel": { + "font": "Fonte", + "themes": "Temas", + "themeActive": "ativo", + "themeBuiltin": "nativo", + "themeCustom": "personalizado", + "createNewTheme": "Criar novo tema", + "closePanelTitle": "Fechar painel", + "sections": { + "history": "Histórico", + "sftp": "SFTP", + "notes": "Notas" + }, + "pluginUnavailable": "Este painel não está mais disponível. O plugin que o fornecia foi removido ou desativado.", + "pluginUnavailableAction": "Voltar para Temas" + }, + "share": { + "signInToShare": "Entre para compartilhar", + "signInDescription": "Conecte uma conta de servidor para compartilhar seu terminal com colegas de equipe.", + "signInButton": "Entrar / Cadastrar-se", + "proRequired": "Pro necessário", + "proRequiredDescription": "O compartilhamento de terminal está disponível no Pro e superiores.", + "features": [ + "1 sessão por link de convite · 1 participante", + "Sincronização em nuvem em tempo real", + "Teams: 5 sessões · 10 participantes + cofres compartilhados" + ], + "upgradeToPro": "Atualizar para Pro", + "shareTerminal": "Compartilhar terminal", + "sessionNamePlaceholder": "Nome da sessão…", + "tabPeople": "Pessoas", + "tabTeam": "Cofre da equipe", + "tabInviteLink": "Link", + "sessionLimitReached": "Limite de sessões atingido para o seu plano.", + "failedToShare": "Falha ao compartilhar", + "failedToGenerateLink": "Falha ao gerar o link", + "noVaultsCreateTeamFirst": "Nenhum cofre — crie uma equipe primeiro", + "allRoles": "todas as funções", + "startSharingWithVault_one": "Começar a compartilhar com {{count}} cofre", + "startSharingWithVault_many": "Começar a compartilhar com {{count}} cofres", + "startSharingWithVault_other": "Começar a compartilhar com {{count}} cofres", + "selectVaultToShare": "Selecione um cofre para compartilhar", + "shareCodeDescription": "Compartilhe este código — qualquer pessoa que o tenha pode entrar:", + "generateLinkDescription": "Gere um link de uso único. Qualquer pessoa com uma conta Voltius pode entrar.", + "generateInviteLink": "Gerar link de convite", + "upToParticipants_one": "Até {{count}} participante", + "upToParticipants_many": "Até {{count}} participantes", + "upToParticipants_other": "Até {{count}} participantes", + "upgradeToTeamsForParticipants": "Atualize para Teams para 10 participantes + cofres compartilhados", + "live": "Ao vivo", + "waitingForGuests": "Aguardando alguém entrar…", + "participantsRatio_one": "{{participantCount}} / {{guestCap}} participante", + "participantsRatio_many": "{{participantCount}} / {{guestCap}} participantes", + "participantsRatio_other": "{{participantCount}} / {{guestCap}} participantes", + "guestsRatio_one": "{{participantCount}} de {{guestCap}} convidado", + "guestsRatio_many": "{{participantCount}} de {{guestCap}} convidados", + "guestsRatio_other": "{{participantCount}} de {{guestCap}} convidados", + "upgradeToTeams": "Atualizar para Teams", + "upgradeToBusiness": "Atualizar para Business", + "stopSharing": "Parar de compartilhar", + "inviteHasAccess": "Tem acesso", + "inviteSent": "Convidado", + "inviteCapReached": "Limite atingido", + "inviteFailed": "Não foi possível convidar {{name}}", + "withdrawInvite": "Retirar convite", + "uninviteFailed": "Não foi possível retirar o convite", + "inviteNoTeammates": "Nenhum colega de equipe ainda", + "inviteLoadFailed": "Não foi possível carregar os colegas de equipe", + "peopleSearchPlaceholder": "Pesquisar por @handle ou e-mail…", + "peopleNoMatch": "Ninguém nas suas equipes corresponde a \"{{query}}\".", + "peopleFindRule": "Pessoas fora das suas equipes são encontradas pelo @handle ou pelo endereço de e-mail completo.", + "recentLabel": "Recentes", + "recentEmpty": "As pessoas que você convidar aparecerão aqui.", + "yourTeamsLabel": "Suas equipes", + "elsewhereLabel": "Em outros lugares no Voltius", + "notInYourTeams": "Fora das suas equipes", + "presenceOnline": "Online", + "presenceOffline": "Offline", + "forgetPerson": "Remover dos recentes", + "deepLinkJoinTitle": "Entrar no terminal compartilhado?", + "deepLinkJoinBody": "Alguém compartilhou uma sessão de terminal ao vivo com você. Entrar conecta você a ela agora.", + "deepLinkJoinUnknownHost": "O Voltius não consegue identificar quem compartilhou até você entrar.", + "deepLinkJoinAction": "Entrar na sessão", + "deepLinkJoinFailed": "Não foi possível entrar nessa sessão — o link pode ter expirado.", + "deepLinkInviteTitle": "Convidar @{{handle}}?", + "deepLinkInviteBody": "Este link pede que você convide @{{handle}} para o terminal que você está compartilhando. Ele verá tudo naquele terminal.", + "deepLinkInviteUnknownUser": "Nenhuma conta Voltius corresponde exatamente a @{{handle}}.", + "deepLinkInviteNoActiveSession": "Você não está compartilhando um terminal agora. Comece a compartilhar um e abra este link novamente.", + "deepLinkInviteAction": "Convidar", + "deepLinkInviteFailed": "Não foi possível enviar o convite", + "getSpokenCode": "Obter um código para ler em voz alta", + "codeExpired": "Código expirado — obtenha um novo", + "newCode": "Novo código", + "readAloudHint": "Diga em voz alta", + "expiresIn": "expira em {{time}}", + "failedToMintCode": "Falha ao criar o código" + }, + "snippetVariableModal": { + "on": "Ligado", + "off": "Desligado", + "masked": "mascarado", + "preview": "Prévia", + "execute": "Executar" + }, + "snippets": { + "renameFolder": "Renomear pasta", + "newFolder": "Nova pasta", + "folderNamePlaceholder": "Nome da pasta", + "notRelevantForConnection": "Não é relevante para a conexão atual", + "removeFromFavorites": "Remover dos favoritos", + "addToFavorites": "Adicionar aos favoritos", + "duplicate": "Duplicar", + "moveToFolder": "Mover para a pasta", + "back": "Voltar", + "unfiled": "Sem pasta", + "searchPlaceholder": "Pesquisar snippets…", + "newSnippetTitle": "Novo snippet", + "favorites": "Favoritos", + "recent": "Recentes", + "noSnippetsMatch": "Nenhum snippet corresponde", + "noSnippetsYet": "Nenhum snippet ainda.\nClique em + para criar um." + }, + "search": { + "placeholder": "Localizar", + "invalid": "Inválido", + "noResults": "Nenhum resultado", + "resultCounter": "{{index}} de {{count}}", + "matchCase": "Diferenciar maiúsculas (Alt+C)", + "matchWholeWord": "Palavra inteira (Alt+W)", + "useRegex": "Usar expressão regular (Alt+R)", + "previousMatch": "Correspondência anterior (Shift+Enter)", + "nextMatch": "Próxima correspondência (Enter)", + "closeTitle": "Fechar (Escape)" + }, + "overlay": { + "continue": "Continuar", + "connectAndSave": "Conectar e salvar", + "continueAndSave": "Continuar e salvar", + "steps": { + "tcpConnection": "Conexão TCP", + "sshHandshake": "Handshake SSH", + "authenticating": "Autenticando", + "openingShell": "Abrindo shell", + "sftpSubsystem": "Subsistema SFTP", + "openingPort": "Abrindo porta", + "ready": "Pronto", + "portKnock": "Port knock" + }, + "reconnectWait": { + "offline": { + "title": "Você está offline", + "subtitle": "Reconectando quando a rede voltar" + }, + "slow": { + "title": "Host ainda inacessível", + "subtitle": "Tentando novamente a cada {{seconds}} segundos" + }, + "retryNow": "Tentar agora" + }, + "connectionError": { + "title": "Falha na conexão", + "retry": "Tentar novamente", + "dismiss": "Dispensar" + }, + "hostKeyConflict": { + "title": "CHAVE DO HOST ALTERADA", + "replace": "Substituir", + "addAsNew": "Adicionar como novo", + "abort": "Abortar", + "stored": "Armazenada", + "received": "Recebida", + "description": "A impressão digital de {{address}} mudou." + }, + "passphrasePrompt": { + "title": "FRASE SECRETA DA CHAVE OBRIGATÓRIA", + "description": "Esta chave está criptografada. Informe a frase secreta para continuar.", + "placeholder": "Frase secreta" + }, + "usernamePrompt": { + "title": "NOME DE USUÁRIO OBRIGATÓRIO", + "description": "Este host não tem nome de usuário definido. Informe um ou escolha uma identidade para continuar.", + "placeholder": "root" + }, + "authPrompt": { + "title": "AUTENTICAÇÃO OBRIGATÓRIA", + "description": "Este host não tem método de autenticação. Escolha um para continuar.", + "modePassword": "Senha", + "modeKey": "Chave", + "modeIdentity": "Identidade", + "passwordPlaceholder": "Senha", + "keyPassphrasePlaceholder": "Frase secreta da chave (opcional)" + }, + "vaultError": { + "unreadableTitle": "Não foi possível ler o cofre", + "unreadableBody": "As credenciais deste host estão armazenadas, mas o cofre local não pôde ser descriptografado com a chave atual. Nada foi excluído — desbloqueie o cofre para conectar.", + "lockedTitle": "O cofre está bloqueado", + "lockedBody": "As credenciais deste host estão armazenadas no cofre, que está bloqueado. Desbloqueie-o para conectar.", + "unlock": "Desbloquear cofre", + "retry": "Tentar novamente", + "dismiss": "Fechar aba" + }, + "identityPick": { + "title": "Sua identidade não está disponível", + "missingBody": "Você escolheu uma identidade para {{host}}, mas ela não está neste dispositivo ou foi removida. Nenhuma conexão foi tentada.", + "forbiddenBody": "Você escolheu {{identity}} para {{host}}, mas não pode mais usá-la. Nenhuma conexão foi tentada.", + "choose": "Escolher outra identidade", + "useHostNamed": "Usar {{name}} (host) desta vez", + "useHost": "Usar a credencial do host desta vez" + }, + "saveTarget": { + "rememberFor": "Lembrar para", + "saveFor": "Salvar para", + "thisHost": "Este host", + "allVaultHosts": "Todos os hosts de {{vault}}", + "everyone": "Todos", + "onlyMe": "Apenas eu", + "ownNote": "Apenas você. Os colegas de equipe mantêm as configurações do próprio host.", + "teamNote": "Todos atualizam {{host}} para toda a equipe. \"Apenas eu\" deixa o host como está." + } + }, + "statusBar": { + "badge": { + "ssh": "SSH", + "serial": "SERIAL", + "local": "LOCAL" + }, + "localSystemFallback": "Sistema local", + "serialFallback": "serial", + "pingUp": "Ativo · {{ms}}ms", + "pingDown": "Inativo", + "pingUnknown": "Desconhecido", + "copyLabel": "Copiar {{text}}", + "openPortsPanel": "Abrir painel de portas", + "reconnectTitle": "Reconectar", + "serialClose": "Fechar a porta serial (mantém a aba)", + "serialReopen": "Reabrir a porta serial", + "serialAutoReconnectOn": "Reconexão automática ativada — clique para parar de reivindicar a porta", + "serialAutoReconnectOff": "Reconexão automática desativada — a porta fica livre após uma queda", + "serialLineOn": "{{line}} ativado — clique para desativar", + "serialLineOff": "{{line}} desativado — clique para ativar", + "serialRtsFlowControlled": "RTS é controlado pelo fluxo RTS/CTS", + "serialBreak": "Enviar sinal de break", + "systemMetricsTitle": "Métricas do sistema", + "activeTunnels_one": "{{count}} túnel ativo", + "activeTunnels_many": "{{count}} túneis ativos", + "activeTunnels_other": "{{count}} túneis ativos", + "cpu": "CPU {{pct}}%", + "copiedBang": "Copiado!", + "loadingEllipsis": "carregando…", + "sparklineMin": "mín. {{value}}ms", + "sparklineAvg": "méd. {{value}}ms", + "sparklineMax": "máx. {{value}}ms" + }, + "xterm": { + "linkTooltip": "Alt+clique para abrir", + "sessionClosed": "Sessão encerrada", + "serialClosed": "Conexão serial encerrada" + }, + "pasteImage": { + "uploading": "Enviando captura de tela", + "uploadingDetail": "para {{host}} · {{size}} · {{width}}×{{height}}", + "pasted": "Captura de tela colada", + "pastedDetail": "{{host}} · {{name}}", + "firstUse": "No host por 7 dias, apenas você pode lê-la", + "settings": "Configurações de colagem de imagem", + "deleteFromHost": "Excluir do host", + "deleted": "Captura de tela excluída do host", + "deleteFailed": "Não foi possível excluir a captura de tela", + "failed": "Não foi possível enviar a captura de tela", + "retry": "Tentar novamente", + "broadcast": "A colagem de imagem fica desativada enquanto você digita em vários painéis ao mesmo tempo." + } + } +} diff --git a/src/i18n/locales/pt/themeCreator.json b/src/i18n/locales/pt/themeCreator.json new file mode 100644 index 000000000..3881634a8 --- /dev/null +++ b/src/i18n/locales/pt/themeCreator.json @@ -0,0 +1,107 @@ +{ + "themeCreator": { + "header": { + "editTheme": "Editar tema", + "newTheme": "Novo tema", + "pickTooltip": "Escolha um elemento para inspecionar suas variáveis CSS" + }, + "font": { + "customLabel": "Fonte personalizada…", + "customPlaceholder": "'Minha Fonte', monospace", + "customHint": "Pressione Enter para aplicar", + "searchPlaceholder": "Pesquisar fontes instaladas…", + "loading": "Lendo fontes instaladas…", + "noneInstalled": "Nenhuma fonte instalada encontrada", + "noMatches": "Nenhuma fonte correspondente", + "showAll": "Mostrar todas as fontes", + "showMonospaceOnly": "Mostrar apenas fontes monoespaçadas", + "notInstalled": "\"{{family}}\" não está instalada — o terminal usará outra fonte como alternativa" + }, + "varSearch": { + "hint_one": "{{count}} elemento usa {{name}} — Esc ou clique para fechar", + "hint_many": "{{count}} elementos usam {{name}} — Esc ou clique para fechar", + "hint_other": "{{count}} elementos usam {{name}} — Esc ou clique para fechar" + }, + "pickOverlay": { + "hint": "Clique em qualquer elemento — Esc para cancelar" + }, + "editor": { + "general": "Geral", + "name": "Nome", + "appFont": "Fonte do aplicativo", + "family": "Família", + "sizePx": "Tamanho (px)", + "lineHeight": "Altura da linha", + "terminalFont": "Fonte do terminal", + "highlightUsing": "Destacar elementos que usam {{varName}}", + "resetColor": "Redefinir para o padrão" + }, + "groups": { + "backgrounds": "Planos de fundo", + "borders": "Bordas", + "text": "Texto", + "accentAndTabs": "Destaque e abas", + "vaultTabs": "Abas do cofre", + "status": "Status", + "other": "Outros", + "terminalBase": "Base do terminal", + "ansiColors": "Cores ANSI", + "brightAnsiColors": "Cores ANSI brilhantes" + }, + "fields": { + "bgTerminal": "Terminal / Barra de título", + "bgStatusBar": "Barra de status", + "bgBase": "Fundo base", + "bgToolbar": "Barra de ferramentas", + "bgCard": "Cartões", + "bgCardHover": "Cartões em foco", + "bgCardAvatar": "Avatar do cartão", + "bgInput": "Campos de entrada", + "bgInputHover": "Campos de entrada em foco", + "bgElevated": "Elevado / Foco", + "bgModal": "Modal / Painel", + "border": "Borda", + "borderHover": "Borda em foco", + "textDim": "Texto esmaecido", + "textMuted": "Texto suave", + "textSecondary": "Texto secundário", + "textPrimary": "Texto principal", + "textBright": "Texto brilhante", + "accent": "Destaque", + "accentHover": "Destaque em foco", + "tabBg": "Fundo da aba", + "tabActiveBg": "Fundo da aba ativa", + "tabActiveText": "Texto da aba ativa", + "tabActiveBorder": "Borda da aba ativa", + "vaultTabBg": "Fundo da aba do cofre", + "vaultTabActiveBg": "Fundo da aba ativa do cofre", + "statusConnected": "Conectado", + "statusError": "Erro", + "statusConnecting": "Conectando", + "statusWarning": "Aviso", + "textNotice": "Texto de aviso", + "background": "Fundo", + "foreground": "Primeiro plano", + "cursor": "Cursor", + "selectionBackground": "Seleção", + "selectionForeground": "Texto selecionado", + "black": "Preto", + "red": "Vermelho", + "green": "Verde", + "yellow": "Amarelo", + "blue": "Azul", + "magenta": "Magenta", + "cyan": "Ciano", + "white": "Branco", + "brightBlack": "Preto brilhante", + "brightRed": "Vermelho brilhante", + "brightGreen": "Verde brilhante", + "brightYellow": "Amarelo brilhante", + "brightBlue": "Azul brilhante", + "brightMagenta": "Magenta brilhante", + "brightCyan": "Ciano brilhante", + "brightWhite": "Branco brilhante" + }, + "defaultName": "Meu tema" + } +} diff --git a/src/plugins/docker/i18n.ts b/src/plugins/docker/i18n.ts index 5d29ae81d..04592521d 100644 --- a/src/plugins/docker/i18n.ts +++ b/src/plugins/docker/i18n.ts @@ -3,6 +3,240 @@ import type { PluginLocale } from "@/plugins/api"; // Moved from src/i18n/locales/*/mobile.json's mobile.panelItems.docker / mobile.docker.* / // mobile.dockerLogs.* / mobile.hostActions.* / mobile.panelCommon.* and mobile.json's // common.action.{remove,cancel} — values carried over verbatim. +const pt: Record = { + "title": "Docker", + "filterAll": "Todos", + "filterRunning": "Em execução", + "needsSshTitle": "O Docker precisa de uma sessão SSH", + "needsSshSub": "Abra o Docker a partir de um host conectado via SSH.", + "sessionNotConnected": "Sessão não conectada", + "sessionNotConnectedSub": "Reconecte-se para gerenciar o Docker deste host.", + "unreachableTitle": "O Docker não está acessível", + "unreachableSub": "Inicie o Docker no host e atualize.", + "refresh": "Atualizar", + "noContainers": "Nenhum contêiner", + "noRunningContainers": "Nenhum contêiner em execução", + "tapRunningToShowAll": "Toque em Em execução para mostrar todos.", + "logs": "Logs", + "execShell": "Abrir shell", + "removeConfirmTitle": "Remover contêiner?", + "removeConfirmBody": "{{name}} será removido. Isso não pode ser desfeito.", + "remove": "Remover", + "cancel": "Cancelar", + "hostStop": "Parar", + "hostRestart": "Reiniciar", + "hostPause": "Pausar", + "hostResume": "Retomar", + "hostStart": "Iniciar", + "dockerLogsWaiting": "Aguardando logs.", + "dockerLogsSessionNotConnected": "Sessão não conectada.", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "androidLocalTitle": "O Docker local não está disponível no Android", + "androidLocalSub": "Conecte-se a um host via SSH para gerenciar seu Docker.", + "unreachableLocalSub": "Inicie o Docker neste ambiente e atualize.", + "tabContainers": "Contêineres", + "tabImages": "Imagens", + "tabVolumes": "Volumes", + "tabNetworks": "Redes", + "tabStacks": "Stacks", + "search": "Pesquisar", + "closeSearch": "Fechar pesquisa", + "filterPlaceholder": "Filtrar.", + "systemPrune": "Limpeza do sistema (docker system prune -a)", + "runningCount": "{{count}} em execução", + "checkContainerUpdates": "Verificar atualizações de imagem dos contêineres", + "checkStackUpdates": "Verificar atualizações de imagem dos serviços da stack expandida", + "checkImageUpdates": "Verificar atualizações de registro de todas as imagens", + "checking": "verificando.", + "updates": "atualizações", + "checkUpdates": "verificar atualizações", + "showStopped": "todos", + "copyRunCommand": "Copiar comando docker run", + "pullAndRecreateContainer": "Baixar atualização e recriar este contêiner", + "pullNewerImage": "Baixar imagem mais recente", + "pullAndRecreateImage": "Baixar {{image}} e recriar seus contêineres", + "pullNewerImageFor": "Baixar imagem mais recente de {{image}}", + "openTerminal": "Abrir terminal", + "pullFailed": "Falha ao baixar: {{error}}", + "update": "atualizar", + "pull": "baixar", + "updating": "atualizando.", + "pulling": "baixando.", + "prune": "limpar", + "pruning": "limpando.", + "imagesCount_one": "{{count}} imagem", + "imagesCount_many": "{{count}} imagens", + "imagesCount_other": "{{count}} imagens", + "volumesCount_one": "{{count}} volume", + "volumesCount_many": "{{count}} volumes", + "volumesCount_other": "{{count}} volumes", + "networksCount_one": "{{count}} rede", + "networksCount_many": "{{count}} redes", + "networksCount_other": "{{count}} redes", + "stacksCount_one": "{{count}} stack", + "stacksCount_many": "{{count}} stacks", + "stacksCount_other": "{{count}} stacks", + "outdatedCount_one": "{{count}} desatualizado", + "outdatedCount_many": "{{count}} desatualizados", + "outdatedCount_other": "{{count}} desatualizados", + "noImages": "Nenhuma imagem", + "noVolumes": "Nenhum volume", + "noNetworks": "Nenhuma rede", + "noStacks": "Nenhuma stack do Compose", + "noServices": "Nenhum serviço", + "removeImage": "Remover imagem", + "removeVolume": "Remover volume", + "removeNetwork": "Remover rede", + "stackRunning": "{{running}}/{{total}} em execução", + "stackUp": "Ativa", + "stackDown": "Inativa", + "stackUpdate": "Atualizar stack (compose pull + up -d)", + "composeLogs": "Logs do Compose", + "stackUpdated": "Stack {{name}} atualizada", + "stackUpdateFailed": "Falha ao atualizar a stack: {{error}}", + "updateAvailable": "Uma imagem mais recente está disponível no registro", + "upToDate": "Atualizado", + "updateCheckFailed": "Não foi possível verificar: {{error}}", + "updateStatusUnknown": "Status de atualização desconhecido", + "enableAutoScroll": "Ativar rolagem automática", + "disableAutoScroll": "Desativar rolagem automática", + "portOpenInBrowser": "{{port}} — abrir no navegador", + "portForwardAndCopy": "{{port}} — encaminhar e copiar endereço", + "portInertUdp": "Portas UDP não podem ser abertas daqui", + "portInertUnpublished": "A porta não está publicada para o host", + "showAllPorts": "Mostrar todas as portas", + "portFailed": "Porta {{port}}: {{error}}", + "pulledImage": "{{image}} baixada", + "recreatedCount_one": "{{count}} recriado", + "recreatedCount_many": "{{count}} recriados", + "recreatedCount_other": "{{count}} recriados", + "manualRecreateCount_one": "{{count}} precisa ser recriado manualmente", + "manualRecreateCount_many": "{{count}} precisam ser recriados manualmente", + "manualRecreateCount_other": "{{count}} precisam ser recriados manualmente", + "summaryNoRunning": "nenhum contêiner em execução", + "alreadyUpToDate": "{{image}} já está atualizada", + "noNewImage": "{{image}}: nenhuma imagem nova baixada", + "noNewImageDocker": "{{image}}: nenhuma imagem nova baixada — docker: {{output}}", +}; + +const ptPt: Record = { + "title": "Docker", + "filterAll": "Todos", + "filterRunning": "Em execução", + "needsSshTitle": "O Docker precisa de uma sessão SSH", + "needsSshSub": "Abra o Docker a partir de um host conectado via SSH.", + "sessionNotConnected": "Sessão não conectada", + "sessionNotConnectedSub": "Reconecte-se para gerenciar o Docker deste host.", + "unreachableTitle": "O Docker não está acessível", + "unreachableSub": "Inicie o Docker no host e atualize.", + "refresh": "Atualizar", + "noContainers": "Nenhum contêiner", + "noRunningContainers": "Nenhum contêiner em execução", + "tapRunningToShowAll": "Toque em Em execução para mostrar todos.", + "logs": "Logs", + "execShell": "Abrir shell", + "removeConfirmTitle": "Remover contêiner?", + "removeConfirmBody": "{{name}} será removido. Isso não pode ser desfeito.", + "remove": "Remover", + "cancel": "Cancelar", + "hostStop": "Parar", + "hostRestart": "Reiniciar", + "hostPause": "Pausar", + "hostResume": "Retomar", + "hostStart": "Iniciar", + "dockerLogsWaiting": "A aguardar logs.", + "dockerLogsSessionNotConnected": "Sessão não conectada.", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "androidLocalTitle": "O Docker local não está disponível no Android", + "androidLocalSub": "Conecte-se a um host via SSH para gerenciar seu Docker.", + "unreachableLocalSub": "Inicie o Docker neste ambiente e atualize.", + "tabContainers": "Contêineres", + "tabImages": "Imagens", + "tabVolumes": "Volumes", + "tabNetworks": "Redes", + "tabStacks": "Stacks", + "search": "Pesquisar", + "closeSearch": "Fechar pesquisa", + "filterPlaceholder": "Filtrar.", + "systemPrune": "Limpeza do sistema (docker system prune -a)", + "runningCount": "{{count}} em execução", + "checkContainerUpdates": "Verificar atualizações de imagem dos contêineres", + "checkStackUpdates": "Verificar atualizações de imagem dos serviços da stack expandida", + "checkImageUpdates": "Verificar atualizações de registro de todas as imagens", + "checking": "a verificar.", + "updates": "atualizações", + "checkUpdates": "verificar atualizações", + "showStopped": "todos", + "copyRunCommand": "Copiar comando docker run", + "pullAndRecreateContainer": "Baixar atualização e recriar este contêiner", + "pullNewerImage": "Baixar imagem mais recente", + "pullAndRecreateImage": "Baixar {{image}} e recriar seus contêineres", + "pullNewerImageFor": "Baixar imagem mais recente de {{image}}", + "openTerminal": "Abrir terminal", + "pullFailed": "Falha ao baixar: {{error}}", + "update": "atualizar", + "pull": "baixar", + "updating": "a atualizar.", + "pulling": "a transferir.", + "prune": "limpar", + "pruning": "a limpar.", + "imagesCount_one": "{{count}} imagem", + "imagesCount_many": "{{count}} imagens", + "imagesCount_other": "{{count}} imagens", + "volumesCount_one": "{{count}} volume", + "volumesCount_many": "{{count}} volumes", + "volumesCount_other": "{{count}} volumes", + "networksCount_one": "{{count}} rede", + "networksCount_many": "{{count}} redes", + "networksCount_other": "{{count}} redes", + "stacksCount_one": "{{count}} stack", + "stacksCount_many": "{{count}} stacks", + "stacksCount_other": "{{count}} stacks", + "outdatedCount_one": "{{count}} desatualizado", + "outdatedCount_many": "{{count}} desatualizados", + "outdatedCount_other": "{{count}} desatualizados", + "noImages": "Nenhuma imagem", + "noVolumes": "Nenhum volume", + "noNetworks": "Nenhuma rede", + "noStacks": "Nenhuma stack do Compose", + "noServices": "Nenhum serviço", + "removeImage": "Remover imagem", + "removeVolume": "Remover volume", + "removeNetwork": "Remover rede", + "stackRunning": "{{running}}/{{total}} em execução", + "stackUp": "Ativa", + "stackDown": "Inativa", + "stackUpdate": "Atualizar stack (compose pull + up -d)", + "composeLogs": "Logs do Compose", + "stackUpdated": "Stack {{name}} atualizada", + "stackUpdateFailed": "Falha ao atualizar a stack: {{error}}", + "updateAvailable": "Uma imagem mais recente está disponível no registro", + "upToDate": "Atualizado", + "updateCheckFailed": "Não foi possível verificar: {{error}}", + "updateStatusUnknown": "Status de atualização desconhecido", + "enableAutoScroll": "Ativar rolagem automática", + "disableAutoScroll": "Desativar rolagem automática", + "portOpenInBrowser": "{{port}} — abrir no navegador", + "portForwardAndCopy": "{{port}} — encaminhar e copiar endereço", + "portInertUdp": "Portas UDP não podem ser abertas daqui", + "portInertUnpublished": "A porta não está publicada para o host", + "showAllPorts": "Mostrar todas as portas", + "portFailed": "Porta {{port}}: {{error}}", + "pulledImage": "{{image}} baixada", + "recreatedCount_one": "{{count}} recriado", + "recreatedCount_many": "{{count}} recriados", + "recreatedCount_other": "{{count}} recriados", + "manualRecreateCount_one": "{{count}} precisa ser recriado manualmente", + "manualRecreateCount_many": "{{count}} precisam ser recriados manualmente", + "manualRecreateCount_other": "{{count}} precisam ser recriados manualmente", + "summaryNoRunning": "nenhum contêiner em execução", + "alreadyUpToDate": "{{image}} já está atualizada", + "noNewImage": "{{image}}: nenhuma imagem nova baixada", + "noNewImageDocker": "{{image}}: nenhuma imagem nova baixada — docker: {{output}}", +}; + export const messages: Record> = { en: { "title": "Docker", @@ -681,4 +915,7 @@ export const messages: Record> = { "noNewImage": "{{image}}: nestažen žádný nový obraz", "noNewImageDocker": "{{image}}: nestažen žádný nový obraz — docker: {{output}}", }, + pt, + "pt-BR": pt, + "pt-PT": ptPt, }; diff --git a/src/plugins/gist-sync/i18n.ts b/src/plugins/gist-sync/i18n.ts index 4f44260c1..8cd9f9550 100644 --- a/src/plugins/gist-sync/i18n.ts +++ b/src/plugins/gist-sync/i18n.ts @@ -3,6 +3,134 @@ import type { PluginLocale } from "@/plugins/api"; // ⚠️ fr/ru/zh/tr/cs are machine-authored and awaiting native review, like the consent copy. // {{placeholders}} rendered as styled elements (see Rich in SettingsPage.tsx) keep // their names in every locale: {{id}}, {{scope}}, {{import}}, {{export}}. +const pt: Record = { + "settingsLabel": "Sincronização com GitHub Gist", + "intro": "Sincronize seus dados entre dispositivos por meio de um GitHub Gist criptografado — sem precisar de conta Voltius. Os dados são criptografados no cliente com XChaCha20-Poly1305 antes do envio.", + "credentials": "Credenciais", + "patLabel": "Token de acesso pessoal do GitHub", + "patScope": "Requer o escopo {{scope}}.", + "passphraseLabel": "Frase secreta de sincronização", + "optional": "- opcional", + "passphraseTooltip": "Sem uma frase secreta, os dados são criptografados usando seu PAT como chave. Se seu PAT for comprometido, seus dados sincronizados (incluindo chaves privadas SSH) também ficarão expostos.", + "passphrasePlaceholder": "Deixe vazio para usar a criptografia derivada do PAT.", + "passphraseHint": "Adiciona uma camada de criptografia independente. Recomendado se você sincronizar chaves privadas SSH.", + "gists": "Gists", + "rolesHint": "Alterne as funções {{import}} / {{export}} por gist", + "noGists": "Nenhum gist registrado ainda.", + "noGistsSub": "Crie um novo gist ou vincule um existente abaixo.", + "creating": "Criando.", + "newGist": "Novo gist", + "detecting": "Detectando.", + "autoDetect": "Detectar automaticamente", + "enterIdManually": "Inserir ID manualmente", + "foundGists_one": "{{count}} gist do Voltius encontrado — selecione para vincular:", + "foundGists_many": "{{count}} gists do Voltius encontrados — selecione para vincular:", + "foundGists_other": "{{count}} gists do Voltius encontrados — selecione para vincular:", + "linked": "vinculado", + "link": "Vincular", + "linkPlaceholder": "ID ou URL do gist (ex.: a1b2c3d4e5f6.)", + "openOnGitHub": "Abrir no GitHub", + "roleImport": "Importar", + "roleExport": "Exportar", + "roleImportTitle": "Ler deste gist (origem de importação)", + "roleExportTitle": "Gravar neste gist (destino de exportação)", + "roleExportLastTitle": "É necessário pelo menos um destino de exportação", + "copyGistUrl": "Copiar URL do gist", + "unlink": "Desvincular (manter o gist no GitHub)", + "deleteFromGitHub": "Excluir gist do GitHub", + "confirmDelete": "Excluir permanentemente {{id}} do GitHub?", + "cancel": "Cancelar", + "delete": "Excluir", + "deleting": "Excluindo.", + "sync": "Sincronizar", + "status": "Status", + "syncedAgo": "Sincronizado {{time}}", + "notYetSynced": "Ainda não sincronizado", + "pollInterval": "Intervalo de verificação", + "seconds": "segundos", + "syncing": "Sincronizando.", + "syncNow": "Sincronizar agora", + "devicesTitle": "Dispositivos — origem de importação ({{count}})", + "thisDevice": "(este dispositivo)", + "lastPush": "último envio: {{time}}", + "remove": "Remover", + "errPatFirst": "Informe primeiro seu PAT do GitHub.", + "errImportSourceMissing": "Gist de origem da importação não encontrado — ele pode ter sido excluído.", + "errNoGistsFound": "Nenhum gist do Voltius encontrado nesta conta.", + "gistCreated": "Gist criado e registrado", + "gistLinked": "Gist vinculado", + "gistDeleted": "Gist excluído", + "deleteFailed": "Falha ao excluir: {{error}}", + "deviceRemoved": "Dispositivo removido: {{name}}", + "removeDeviceFailed": "Falha ao remover o dispositivo: {{error}}", + "fatalPatInvalid": "O PAT do GitHub é inválido ou expirou", + "fatalGistNotFound": "Gist não encontrado — reconfigure nas Configurações", +}; + +const ptPt: Record = { + "settingsLabel": "Sincronização com GitHub Gist", + "intro": "Sincronize seus dados entre dispositivos por meio de um GitHub Gist encriptado — sem precisar de conta Voltius. Os dados são encriptados no cliente com XChaCha20-Poly1305 antes do envio.", + "credentials": "Credenciais", + "patLabel": "Token de acesso pessoal do GitHub", + "patScope": "Requer o escopo {{scope}}.", + "passphraseLabel": "Frase secreta de sincronização", + "optional": "- opcional", + "passphraseTooltip": "Sem uma frase secreta, os dados são encriptados usando seu PAT como chave. Se seu PAT for comprometido, seus dados sincronizados (incluindo chaves privadas SSH) também ficarão expostos.", + "passphrasePlaceholder": "Deixe vazio para usar a criptografia derivada do PAT.", + "passphraseHint": "Adiciona uma camada de criptografia independente. Recomendado se você sincronizar chaves privadas SSH.", + "gists": "Gists", + "rolesHint": "Alterne as funções {{import}} / {{export}} por gist", + "noGists": "Nenhum gist registrado ainda.", + "noGistsSub": "Crie um novo gist ou vincule um existente abaixo.", + "creating": "A criar.", + "newGist": "Novo gist", + "detecting": "A detetar.", + "autoDetect": "Detectar automaticamente", + "enterIdManually": "Inserir ID manualmente", + "foundGists_one": "{{count}} gist do Voltius encontrado — selecione para vincular:", + "foundGists_many": "{{count}} gists do Voltius encontrados — selecione para vincular:", + "foundGists_other": "{{count}} gists do Voltius encontrados — selecione para vincular:", + "linked": "vinculado", + "link": "Vincular", + "linkPlaceholder": "ID ou URL do gist (ex.: a1b2c3d4e5f6.)", + "openOnGitHub": "Abrir no GitHub", + "roleImport": "Importar", + "roleExport": "Exportar", + "roleImportTitle": "Ler deste gist (origem de importação)", + "roleExportTitle": "Gravar neste gist (destino de exportação)", + "roleExportLastTitle": "É necessário pelo menos um destino de exportação", + "copyGistUrl": "Copiar URL do gist", + "unlink": "Desvincular (manter o gist no GitHub)", + "deleteFromGitHub": "Eliminar gist do GitHub", + "confirmDelete": "Eliminar permanentemente {{id}} do GitHub?", + "cancel": "Cancelar", + "delete": "Eliminar", + "deleting": "A eliminar.", + "sync": "Sincronizar", + "status": "Status", + "syncedAgo": "Sincronizado {{time}}", + "notYetSynced": "Ainda não sincronizado", + "pollInterval": "Intervalo de verificação", + "seconds": "segundos", + "syncing": "A sincronizar.", + "syncNow": "Sincronizar agora", + "devicesTitle": "Dispositivos — origem de importação ({{count}})", + "thisDevice": "(este dispositivo)", + "lastPush": "último envio: {{time}}", + "remove": "Remover", + "errPatFirst": "Informe primeiro seu PAT do GitHub.", + "errImportSourceMissing": "Gist de origem da importação não encontrado — ele pode ter sido eliminado.", + "errNoGistsFound": "Nenhum gist do Voltius encontrado nesta conta.", + "gistCreated": "Gist criado e registrado", + "gistLinked": "Gist vinculado", + "gistDeleted": "Gist eliminado", + "deleteFailed": "Falha ao eliminar: {{error}}", + "deviceRemoved": "Dispositivo removido: {{name}}", + "removeDeviceFailed": "Falha ao remover o dispositivo: {{error}}", + "fatalPatInvalid": "O PAT do GitHub é inválido ou expirou", + "fatalGistNotFound": "Gist não encontrado — reconfigure nas Configurações", +}; + export const messages: Record> = { en: { "settingsLabel": "GitHub Gist Sync", @@ -380,4 +508,7 @@ export const messages: Record> = { "fatalPatInvalid": "GitHub PAT je neplatný nebo vypršel", "fatalGistNotFound": "Gist nebyl nalezen — nastavte ho znovu v Nastavení", }, -}; \ No newline at end of file + pt, + "pt-BR": pt, + "pt-PT": ptPt, +}; diff --git a/src/plugins/monitoring/i18n.ts b/src/plugins/monitoring/i18n.ts index c724e69b1..0104a5848 100644 --- a/src/plugins/monitoring/i18n.ts +++ b/src/plugins/monitoring/i18n.ts @@ -2,6 +2,52 @@ import type { PluginLocale } from "@/plugins/api"; // Moved from src/i18n/locales/*/mobile.json's mobile.panelItems.metrics / mobile.metrics.* — // values carried over verbatim, keys shortened now that this catalog is plugin-scoped. +const pt: Record = { + "title": "Métricas", + "sshOnly": "As métricas ao vivo só estão disponíveis para sessões SSH. Conecte-se a um host via SSH para ver suas métricas.", + "cpu": "CPU", + "memory": "Memória", + "netRx": "Rede RX", + "netTx": "Rede TX", + // Desktop panel and the shared disk / system-info sections. + "noActiveSession": "Nenhuma sessão ativa", + "androidUnavailable": "As métricas ao vivo deste dispositivo não estão disponíveis no Android. Conecte-se a um host via SSH para ver suas métricas.", + "serialUnavailable": "As métricas ao vivo não estão disponíveis para sessões seriais.", + "disk": "Disco", + "systemInfo": "Informações do sistema", + "loading": "Carregando.", + "cores": "Núcleos", + "arch": "Arq.", + "gpu": "GPU", + "gpus": "GPUs", + "host": "Host", + "os": "SO", + "kernel": "Kernel", +}; + +const ptPt: Record = { + "title": "Métricas", + "sshOnly": "As métricas ao vivo só estão disponíveis para sessões SSH. Conecte-se a um host via SSH para ver suas métricas.", + "cpu": "CPU", + "memory": "Memória", + "netRx": "Rede RX", + "netTx": "Rede TX", + // Desktop panel and the shared disk / system-info sections. + "noActiveSession": "Nenhuma sessão ativa", + "androidUnavailable": "As métricas ao vivo deste dispositivo não estão disponíveis no Android. Conecte-se a um host via SSH para ver suas métricas.", + "serialUnavailable": "As métricas ao vivo não estão disponíveis para sessões seriais.", + "disk": "Disco", + "systemInfo": "Informações do sistema", + "loading": "A carregar.", + "cores": "Núcleos", + "arch": "Arq.", + "gpu": "GPU", + "gpus": "GPUs", + "host": "Host", + "os": "SO", + "kernel": "Kernel", +}; + export const messages: Record> = { en: { "title": "Metrics", @@ -130,4 +176,7 @@ export const messages: Record> = { "os": "OS", "kernel": "Jádro OS", }, + pt, + "pt-BR": pt, + "pt-PT": ptPt, }; diff --git a/src/plugins/process-manager/i18n.ts b/src/plugins/process-manager/i18n.ts index 0ceee1e61..bd3d17cae 100644 --- a/src/plugins/process-manager/i18n.ts +++ b/src/plugins/process-manager/i18n.ts @@ -2,6 +2,56 @@ import type { PluginLocale } from "@/plugins/api"; // Moved from src/i18n/locales/*/mobile.json's mobile.panelItems.processes / mobile.processes.* and // mobile.json's common.action.cancel — values carried over verbatim. +const pt: Record = { + "title": "Processos", + "sshOnly": "A lista de processos só está disponível para sessões SSH. Conecte-se a um host via SSH para ver seus processos.", + "filterPlaceholder": "Filtrar processos.", + "sortCpu": "CPU%", + "sortMem": "MEM", + "sortPid": "PID", + "sortName": "Nome", + "noProcessesFound": "Nenhum processo encontrado", + "loadingProcesses": "Carregando processos.", + "sheetKillTerm": "Encerrar (SIGTERM)", + "sheetForceKill": "Forçar encerramento (SIGKILL)", + "killConfirmTitle": "Encerrar processo?", + "forceKillConfirmTitle": "Forçar o encerramento do processo?", + "killConfirmBody": "{{signal}} será enviado a {{name}} (pid {{pid}}).", + "confirmKill": "Encerrar", + "confirmForceKill": "Forçar encerramento", + "cancel": "Cancelar", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "androidUnavailable": "A lista de processos deste dispositivo não está disponível no Android. Conecte-se a um host via SSH para ver seus processos.", + "colUser": "Usuário", + "killProcessTitle": "Encerrar processo {{pid}}", +}; + +const ptPt: Record = { + "title": "Processos", + "sshOnly": "A lista de processos só está disponível para sessões SSH. Conecte-se a um host via SSH para ver seus processos.", + "filterPlaceholder": "Filtrar processos.", + "sortCpu": "CPU%", + "sortMem": "MEM", + "sortPid": "PID", + "sortName": "Nome", + "noProcessesFound": "Nenhum processo encontrado", + "loadingProcesses": "A carregar processos.", + "sheetKillTerm": "Encerrar (SIGTERM)", + "sheetForceKill": "Forçar encerramento (SIGKILL)", + "killConfirmTitle": "Encerrar processo?", + "forceKillConfirmTitle": "Forçar o encerramento do processo?", + "killConfirmBody": "{{signal}} será enviado a {{name}} (pid {{pid}}).", + "confirmKill": "Encerrar", + "confirmForceKill": "Forçar encerramento", + "cancel": "Cancelar", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "androidUnavailable": "A lista de processos deste dispositivo não está disponível no Android. Conecte-se a um host via SSH para ver seus processos.", + "colUser": "Utilizador", + "killProcessTitle": "Encerrar processo {{pid}}", +}; + export const messages: Record> = { en: { "title": "Processes", @@ -142,4 +192,7 @@ export const messages: Record> = { "colUser": "Uživatel", "killProcessTitle": "Ukončit proces {{pid}}", }, + pt, + "pt-BR": pt, + "pt-PT": ptPt, }; diff --git a/src/plugins/proxmox/i18n.ts b/src/plugins/proxmox/i18n.ts index 055d50fd4..610942b03 100644 --- a/src/plugins/proxmox/i18n.ts +++ b/src/plugins/proxmox/i18n.ts @@ -3,6 +3,92 @@ import type { PluginLocale } from "@/plugins/api"; // Moved from src/i18n/locales/*/mobile.json's mobile.panelItems.proxmox / mobile.proxmox.* / // mobile.hostActions.* / mobile.panelCommon.* and mobile.json's common.action.{delete,cancel} — // values carried over verbatim. +const pt: Record = { + "title": "Proxmox", + "needsSshTitle": "O Proxmox precisa de uma sessão SSH", + "needsSshSub": "Abra o Proxmox a partir de um host conectado via SSH.", + "sessionNotConnected": "Sessão não conectada", + "sessionNotConnectedSub": "Reconecte-se para gerenciar este host.", + "notDetectedTitle": "Proxmox VE não detectado", + "notDetectedSub": "Este painel requer uma conexão SSH com um host Proxmox VE.", + "noContainers": "Nenhum contêiner", + "snapshotsTitle": "Snapshots — {{name}}", + "newSnapshotPlaceholder": "Nome do novo snapshot", + "descriptionPlaceholder": "Descrição (opcional)", + "createSnapshot": "Criar snapshot", + "noSnapshots": "Nenhum snapshot", + "current": "(atual)", + "rollbackConfirmTitle": "Reverter?", + "deleteSnapshotConfirmTitle": "Excluir snapshot?", + "rollbackConfirmBody": "Restaurar {{name}} para o snapshot \"{{snap}}\"? O estado atual será perdido.", + "deleteSnapshotConfirmBody": "Excluir o snapshot \"{{snap}}\"? Isso não pode ser desfeito.", + "rollbackButton": "Reverter", + "delete": "Excluir", + "cancel": "Cancelar", + "snapshotsAction": "Snapshots", + "openShell": "Abrir shell", + "ctSummary": "CT {{vmid}} — {{status}}", + "sheetTitleWithId": "{{name}} (CT {{vmid}})", + "hostStop": "Parar", + "hostRestart": "Reiniciar", + "hostStart": "Iniciar", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "refresh": "Atualizar", + "runningCount": "{{count}} em execução", + "hereBadge": "aqui", + "rollbackToSnapshot": "Reverter para este snapshot", + "deleteSnapshot": "Excluir snapshot", + "shellFailed": "Falha no shell: {{error}}", + "snapshotFailed": "Falha no snapshot: {{error}}", + "rollbackFailed": "Falha na reversão: {{error}}", + "deleteFailed": "Falha na exclusão: {{error}}", + "actionFailed": "Falha na ação: {{error}}", +}; + +const ptPt: Record = { + "title": "Proxmox", + "needsSshTitle": "O Proxmox precisa de uma sessão SSH", + "needsSshSub": "Abra o Proxmox a partir de um host conectado via SSH.", + "sessionNotConnected": "Sessão não conectada", + "sessionNotConnectedSub": "Reconecte-se para gerenciar este host.", + "notDetectedTitle": "Proxmox VE não detectado", + "notDetectedSub": "Este painel requer uma conexão SSH com um host Proxmox VE.", + "noContainers": "Nenhum contêiner", + "snapshotsTitle": "Snapshots — {{name}}", + "newSnapshotPlaceholder": "Nome do novo snapshot", + "descriptionPlaceholder": "Descrição (opcional)", + "createSnapshot": "Criar snapshot", + "noSnapshots": "Nenhum snapshot", + "current": "(atual)", + "rollbackConfirmTitle": "Reverter?", + "deleteSnapshotConfirmTitle": "Eliminar snapshot?", + "rollbackConfirmBody": "Restaurar {{name}} para o snapshot \"{{snap}}\"? O estado atual será perdido.", + "deleteSnapshotConfirmBody": "Eliminar o snapshot \"{{snap}}\"? Isso não pode ser desfeito.", + "rollbackButton": "Reverter", + "delete": "Eliminar", + "cancel": "Cancelar", + "snapshotsAction": "Snapshots", + "openShell": "Abrir shell", + "ctSummary": "CT {{vmid}} — {{status}}", + "sheetTitleWithId": "{{name}} (CT {{vmid}})", + "hostStop": "Parar", + "hostRestart": "Reiniciar", + "hostStart": "Iniciar", + // Desktop panel. + "noActiveSession": "Nenhuma sessão ativa", + "refresh": "Atualizar", + "runningCount": "{{count}} em execução", + "hereBadge": "aqui", + "rollbackToSnapshot": "Reverter para este snapshot", + "deleteSnapshot": "Eliminar snapshot", + "shellFailed": "Falha no shell: {{error}}", + "snapshotFailed": "Falha no snapshot: {{error}}", + "rollbackFailed": "Falha na reversão: {{error}}", + "deleteFailed": "Falha na exclusão: {{error}}", + "actionFailed": "Falha na ação: {{error}}", +}; + export const messages: Record> = { en: { "title": "Proxmox", @@ -251,4 +337,7 @@ export const messages: Record> = { "deleteFailed": "Smazání selhalo: {{error}}", "actionFailed": "Akce selhala: {{error}}", }, + pt, + "pt-BR": pt, + "pt-PT": ptPt, }; diff --git a/src/stores/localeStore.test.ts b/src/stores/localeStore.test.ts index 312b52e54..579ee188b 100644 --- a/src/stores/localeStore.test.ts +++ b/src/stores/localeStore.test.ts @@ -1,53 +1,55 @@ -import { describe, it, expect, beforeEach } from "vitest"; -import { useLocaleStore, SUPPORTED_LOCALES, systemLocale } from "./localeStore"; -import { useAppSettingsTimestampStore } from "./appSettingsTimestampStore"; -import { useSyncPrefsStore } from "./syncPrefsStore"; - -describe("localeStore", () => { - beforeEach(() => { - useLocaleStore.setState({ locale: "en" }); - }); - - it("starts a fresh install in the first supported system language", () => { - expect(systemLocale(["de-DE", "cs-CZ", "fr-FR"])).toBe("cs"); - expect(systemLocale(["zh-CN"])).toBe("zh"); - expect(systemLocale(["TR"])).toBe("tr"); - }); - - it("falls back to English when no system language is supported", () => { - expect(systemLocale(["de-DE", "ja"])).toBe("en"); - expect(systemLocale([])).toBe("en"); - }); - - it("setLocale updates the locale", () => { - useLocaleStore.getState().setLocale("fr"); - expect(useLocaleStore.getState().locale).toBe("fr"); - }); - - it("setLocale leaves the sync timestamp alone while the language stays on the device", () => { - useSyncPrefsStore.setState({ syncSettingDomains: {}, settingSyncOverrides: {} }); - useAppSettingsTimestampStore.setState({ updatedAt: new Date(0).toISOString() }); - useLocaleStore.getState().setLocale("fr"); - expect(useAppSettingsTimestampStore.getState().updatedAt).toBe(new Date(0).toISOString()); - }); - - it("setLocale bumps the sync timestamp once the language is synced", () => { - useSyncPrefsStore.setState({ syncSettingDomains: {}, settingSyncOverrides: { "appSettings.locale": true } }); - useAppSettingsTimestampStore.setState({ updatedAt: new Date(0).toISOString() }); - useLocaleStore.getState().setLocale("fr"); - expect(useAppSettingsTimestampStore.getState().updatedAt).not.toBe(new Date(0).toISOString()); - }); - - it("exposes every shipped locale, English first", () => { - const values = SUPPORTED_LOCALES.map((l) => l.value); - expect(values).toEqual(["en", "fr", "ru", "zh", "tr", "cs"]); - }); - - it("every supported locale is settable and carries a native label", () => { - for (const { value, label } of SUPPORTED_LOCALES) { - useLocaleStore.getState().setLocale(value); - expect(useLocaleStore.getState().locale).toBe(value); - expect(label.trim()).not.toBe(""); - } - }); -}); +import { describe, it, expect, beforeEach } from "vitest"; +import { useLocaleStore, SUPPORTED_LOCALES, systemLocale } from "./localeStore"; +import { useAppSettingsTimestampStore } from "./appSettingsTimestampStore"; +import { useSyncPrefsStore } from "./syncPrefsStore"; + +describe("localeStore", () => { + beforeEach(() => { + useLocaleStore.setState({ locale: "en" }); + }); + + it("starts a fresh install in the first supported system language", () => { + expect(systemLocale(["de-DE", "cs-CZ", "fr-FR"])).toBe("cs"); + expect(systemLocale(["zh-CN"])).toBe("zh"); + expect(systemLocale(["TR"])).toBe("tr"); + expect(systemLocale(["pt-BR"])).toBe("pt-BR"); + expect(systemLocale(["pt-PT"])).toBe("pt-PT"); + }); + + it("falls back to English when no system language is supported", () => { + expect(systemLocale(["de-DE", "ja"])).toBe("en"); + expect(systemLocale([])).toBe("en"); + }); + + it("setLocale updates the locale", () => { + useLocaleStore.getState().setLocale("fr"); + expect(useLocaleStore.getState().locale).toBe("fr"); + }); + + it("setLocale leaves the sync timestamp alone while the language stays on the device", () => { + useSyncPrefsStore.setState({ syncSettingDomains: {}, settingSyncOverrides: {} }); + useAppSettingsTimestampStore.setState({ updatedAt: new Date(0).toISOString() }); + useLocaleStore.getState().setLocale("fr"); + expect(useAppSettingsTimestampStore.getState().updatedAt).toBe(new Date(0).toISOString()); + }); + + it("setLocale bumps the sync timestamp once the language is synced", () => { + useSyncPrefsStore.setState({ syncSettingDomains: {}, settingSyncOverrides: { "appSettings.locale": true } }); + useAppSettingsTimestampStore.setState({ updatedAt: new Date(0).toISOString() }); + useLocaleStore.getState().setLocale("fr"); + expect(useAppSettingsTimestampStore.getState().updatedAt).not.toBe(new Date(0).toISOString()); + }); + + it("exposes every shipped locale, English first", () => { + const values = SUPPORTED_LOCALES.map((l) => l.value); + expect(values).toEqual(["en", "fr", "ru", "zh", "tr", "cs", "pt", "pt-BR", "pt-PT"]); + }); + + it("every supported locale is settable and carries a native label", () => { + for (const { value, label } of SUPPORTED_LOCALES) { + useLocaleStore.getState().setLocale(value); + expect(useLocaleStore.getState().locale).toBe(value); + expect(label.trim()).not.toBe(""); + } + }); +}); diff --git a/src/stores/localeStore.ts b/src/stores/localeStore.ts index c2a54c0f0..ff11dc270 100644 --- a/src/stores/localeStore.ts +++ b/src/stores/localeStore.ts @@ -1,42 +1,48 @@ -import { create } from "zustand"; -import { persist } from "zustand/middleware"; -import { touchAppSetting } from "./appSettingsTimestampStore"; - -export type Locale = "en" | "fr" | "ru" | "zh" | "tr" | "cs"; - -export const SUPPORTED_LOCALES: { value: Locale; label: string }[] = [ - { value: "en", label: "English" }, - { value: "fr", label: "Français" }, - { value: "ru", label: "Русский" }, - { value: "zh", label: "简体中文" }, - { value: "tr", label: "Türkçe" }, - { value: "cs", label: "Čeština" }, -]; - -// Seeds a fresh install only; a saved choice always wins on rehydrate. -export function systemLocale(languages: readonly string[] = globalThis.navigator?.languages ?? []): Locale { - for (const tag of languages) { - const primary = tag.toLowerCase().split("-")[0]; - const match = SUPPORTED_LOCALES.find((l) => l.value === primary); - if (match) return match.value; - } - return "en"; -} - -interface LocaleStore { - locale: Locale; - setLocale: (locale: Locale) => void; -} - -export const useLocaleStore = create()( - persist( - (set) => ({ - locale: systemLocale(), - setLocale: (locale) => { - set({ locale }); - touchAppSetting("appSettings.locale"); - }, - }), - { name: "voltius-locale" }, - ), -); +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { touchAppSetting } from "./appSettingsTimestampStore"; + +export type Locale = "en" | "fr" | "ru" | "zh" | "tr" | "cs" | "pt" | "pt-BR" | "pt-PT"; + +export const SUPPORTED_LOCALES: { value: Locale; label: string }[] = [ + { value: "en", label: "English" }, + { value: "fr", label: "Français" }, + { value: "ru", label: "Русский" }, + { value: "zh", label: "简体中文" }, + { value: "tr", label: "Türkçe" }, + { value: "cs", label: "Čeština" }, + { value: "pt", label: "Português" }, + { value: "pt-BR", label: "Português (Brasil)" }, + { value: "pt-PT", label: "Português (Portugal)" }, +]; + +// Seeds a fresh install only; a saved choice always wins on rehydrate. +export function systemLocale(languages: readonly string[] = globalThis.navigator?.languages ?? []): Locale { + for (const tag of languages) { + const lower = tag.toLowerCase(); + const exact = SUPPORTED_LOCALES.find((l) => l.value.toLowerCase() === lower); + if (exact) return exact.value; + const primary = lower.split("-")[0]; + const match = SUPPORTED_LOCALES.find((l) => l.value === primary); + if (match) return match.value; + } + return "en"; +} + +interface LocaleStore { + locale: Locale; + setLocale: (locale: Locale) => void; +} + +export const useLocaleStore = create()( + persist( + (set) => ({ + locale: systemLocale(), + setLocale: (locale) => { + set({ locale }); + touchAppSetting("appSettings.locale"); + }, + }), + { name: "voltius-locale" }, + ), +); From 7087296e0dba3f3f0d8b3df4ea4ff08b8a88df2c Mon Sep 17 00:00:00 2001 From: kipavy Date: Fri, 23 Oct 2026 15:38:35 +0000 Subject: [PATCH 2/2] chore(plugins): bump patch versions for the i18n locale update --- src/plugins/docker/manifest.json | 2 +- src/plugins/gist-sync/manifest.json | 2 +- src/plugins/monitoring/manifest.json | 2 +- src/plugins/process-manager/manifest.json | 2 +- src/plugins/proxmox/manifest.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/plugins/docker/manifest.json b/src/plugins/docker/manifest.json index f3305001f..274a9ee6a 100644 --- a/src/plugins/docker/manifest.json +++ b/src/plugins/docker/manifest.json @@ -1,7 +1,7 @@ { "id": "plugin-docker", "name": "Docker", - "version": "1.5.3", + "version": "1.5.4", "minAppVersion": "0.43.1", "description": "Manage Docker containers, images, volumes, and networks for local and SSH sessions.", "icon": "custom:docker", diff --git a/src/plugins/gist-sync/manifest.json b/src/plugins/gist-sync/manifest.json index 45ab963ab..b6d29de2e 100644 --- a/src/plugins/gist-sync/manifest.json +++ b/src/plugins/gist-sync/manifest.json @@ -1,7 +1,7 @@ { "id": "plugin-gist-sync", "name": "GitHub Gist Sync", - "version": "1.3.3", + "version": "1.3.4", "minAppVersion": "0.43.1", "description": "Sync your data across devices via encrypted GitHub Gist — no Voltius account required.", "icon": "custom:github", diff --git a/src/plugins/monitoring/manifest.json b/src/plugins/monitoring/manifest.json index 1ed7d44c8..e39aaa22e 100644 --- a/src/plugins/monitoring/manifest.json +++ b/src/plugins/monitoring/manifest.json @@ -1,7 +1,7 @@ { "id": "plugin-monitoring", "name": "System Metrics", - "version": "1.3.4", + "version": "1.3.5", "minAppVersion": "0.35.2", "description": "Real-time CPU, RAM, network, and disk metrics for local and SSH sessions.", "icon": "lucide:activity", diff --git a/src/plugins/process-manager/manifest.json b/src/plugins/process-manager/manifest.json index 9a0fd45c0..0466668b4 100644 --- a/src/plugins/process-manager/manifest.json +++ b/src/plugins/process-manager/manifest.json @@ -1,7 +1,7 @@ { "id": "plugin-process-manager", "name": "Process Manager", - "version": "1.3.4", + "version": "1.3.5", "minAppVersion": "0.20.0", "description": "Monitor and manage running processes for local and SSH sessions.", "icon": "lucide:cpu", diff --git a/src/plugins/proxmox/manifest.json b/src/plugins/proxmox/manifest.json index 0d11ed43b..30595d3fd 100644 --- a/src/plugins/proxmox/manifest.json +++ b/src/plugins/proxmox/manifest.json @@ -1,7 +1,7 @@ { "id": "plugin-proxmox", "name": "Proxmox LXC", - "version": "1.3.4", + "version": "1.3.5", "minAppVersion": "0.35.2", "description": "Manage Proxmox VE LXC containers and snapshots over SSH.", "icon": "devicon:proxmox-plain",