From 20d783239447139fef559e679c5e5d3a686edb9d Mon Sep 17 00:00:00 2001 From: zacharyyyyyyy <63769232+multipletwigs@users.noreply.github.com> Date: Sat, 1 Aug 2026 14:04:45 +0800 Subject: [PATCH 1/2] feat(sdp-web): PART 1 stepped tokenization-engine chooser in the deploy modal (#1039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(sdp-web): stepped tokenization-engine chooser in the deploy modal Deploying a token now opens a two-step modal behind the alphaledger-tokenization-engine flag: step 1 offers Vulcan Forge (coming soon, disabled) and SDP with Mosaic as engine cards, step 2 is the signer/fee panel with Back navigation, animated transitions, and grid-stacked steps so the card height never shifts. The Kora button and hint copy leave the deploy panel; wallet deploy becomes the primary CTA. Local dev flag evaluations kept falling back to defaultValue because the Vercel flags stream misses its 3s init timeout off-Vercel, so dev now uses a polling client (30s interval) via @vercel/flags-core while deploys keep the default streaming adapter. * chore(sdp-web): drop localized catalog edits per catalog policy * feat(sdp-web): Vulcan Forge onboarding toggle in the deploy step Behind the same flag, the deploy step shows an AlphaLedger banner with a switch: a Mosaic deploy can opt into onboarding the token to Vulcan Forge as a registered twin. UI only for now — the registration call lands with the backend integration. * refactor(sdp-web): Vulcan Forge onboarding as a one-liner below the signer * refactor(sdp-web): card-style onboarding banner and full-height engine cards * copy(sdp-web): shorten Vulcan Forge onboarding description to one line * feat(sdp-web): concentric ring pattern behind engine card logos --- .../messages/en/dashboard-issuance.json | 14 +- apps/sdp-web/package.json | 1 + .../public/provider-logos/alphaledger.svg | 5 + .../asset-management-workspace.tsx | 245 ++++++++++++++---- .../app/dashboard/issuance/[tokenId]/page.tsx | 17 +- pnpm-lock.yaml | 165 ++++++------ 6 files changed, 313 insertions(+), 134 deletions(-) create mode 100644 apps/sdp-web/public/provider-logos/alphaledger.svg diff --git a/apps/sdp-web/messages/en/dashboard-issuance.json b/apps/sdp-web/messages/en/dashboard-issuance.json index bfa2c2516..a5ee9a639 100644 --- a/apps/sdp-web/messages/en/dashboard-issuance.json +++ b/apps/sdp-web/messages/en/dashboard-issuance.json @@ -476,10 +476,22 @@ "tokenIdCopied": "Token ID copied", "loadingAuthorityWalletAccess": "Loading authority wallet access…", "loadingComplianceControls": "Loading compliance controls…", - "deploySignerHint": "Pay the transaction and account fees from the signer wallet, or with Kora sponsorship.", + "deploySignerHint": "Transaction and account fees are paid from the signer wallet.", "deployWithWallet": "Deploy with Wallet", "koraUnavailable": "Kora sponsorship is unavailable right now.", "deployWithKora": "Deploy with Kora", + "tokenizationEngineTitle": "Tokenization engine", + "tokenizationEngineHint": "Choose which engine deploys and manages this token onchain.", + "engineVulcanForgeName": "Vulcan Forge", + "engineVulcanForgeDescription": "Deploy onchain and tokenize on Vulcan Forge with built-in registry and indexing.", + "engineMosaicName": "SDP with Mosaic", + "engineMosaicDescription": "Deploy with SDP's built-in Mosaic engine on Token-2022.", + "comingSoon": "Coming soon", + "stepProgress": "Step {current} of {total}", + "vulcanForgeOnboardTitle": "Onboard token to Vulcan Forge", + "vulcanForgeOnboardDescription": "AlphaLedger keeps a registered offline twin for indexing and reporting.", + "engineStepLabel": "Engine", + "deployStepLabel": "Deploy", "destinationNotAllowlisted": "Destination is not on this token's allowlist.", "destinationDenylisted": "Destination is on this token's denylist.", "actionPaused": "Token is paused. Unpause it to {action}.", diff --git a/apps/sdp-web/package.json b/apps/sdp-web/package.json index ca2adde95..0d02f5c22 100644 --- a/apps/sdp-web/package.json +++ b/apps/sdp-web/package.json @@ -30,6 +30,7 @@ "@solana/design-system": "1.0.1", "@solana/fixed-points": "7.0.0", "@solana/qr-code-styling": "1.6.0", + "@vercel/flags-core": "1.7.0", "clsx": "2.1.1", "flags": "4.2.0", "lucide-react": "1.17.0", diff --git a/apps/sdp-web/public/provider-logos/alphaledger.svg b/apps/sdp-web/public/provider-logos/alphaledger.svg new file mode 100644 index 000000000..0b9643fff --- /dev/null +++ b/apps/sdp-web/public/provider-logos/alphaledger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/sdp-web/src/app/dashboard/issuance/[tokenId]/asset-profile/asset-management-workspace.tsx b/apps/sdp-web/src/app/dashboard/issuance/[tokenId]/asset-profile/asset-management-workspace.tsx index 34d3d05b0..43d40e820 100644 --- a/apps/sdp-web/src/app/dashboard/issuance/[tokenId]/asset-profile/asset-management-workspace.tsx +++ b/apps/sdp-web/src/app/dashboard/issuance/[tokenId]/asset-profile/asset-management-workspace.tsx @@ -2,11 +2,14 @@ import type { AssetProfile, Token } from "@sdp/types"; import { Tab, TabList, Tabs } from "@solana/design-system/tabs"; -import { Loader2, Play, SparklesIcon, WalletIcon } from "lucide-react"; +import { Loader2, Play, WalletIcon } from "lucide-react"; import { motion } from "motion/react"; +import Image from "next/image"; import { useSearchParams } from "next/navigation"; -import { useCallback, useEffect, useState } from "react"; +import { type ReactNode, useCallback, useEffect, useState } from "react"; import { Button } from "@/components/ui/button"; +import { ToggleSwitch } from "@/components/ui/toggle-switch"; +import { WizardStepProgress } from "@/components/ui/wizard-step-progress"; import { useDashboardWorkspace } from "@/contexts/dashboard-workspace-context"; import { useTranslations } from "@/i18n/provider"; import { useDashboardUrlState } from "@/lib/dashboard-url-state"; @@ -68,6 +71,147 @@ function resolveTab(value: string | null): AssetManagementTab { return "overview"; } +/** + * The deploy modal's card, stepped when the AlphaLedger engine flag is on: + * step 1 is a tokenization-engine chooser with Vulcan Forge (coming soon, + * disabled) and SDP with Mosaic, step 2 is the signer/fee deploy panel passed + * as children, with wizard step pills and a Back affordance between them. + * When the flag is off the card renders the deploy panel directly with no + * step chrome. Mounted only while the deploy modal is open, so closing the + * modal discards the choice and a reopen starts back at the chooser. + * + * @param enabled - Whether the chooser step and step chrome are shown. + * @param children - Renders the signer/fee deploy panel content below the deploy title; receives a go-back handler for returning to the engine step, or null when the flow is not stepped. + * @returns The stepped deploy modal card. + */ +function TokenizationEngineGate({ + enabled, + children, +}: { + enabled: boolean; + children: (goBack: (() => void) | null) => ReactNode; +}) { + const t = useTranslations(); + const [engineChosen, setEngineChosen] = useState(!enabled); + + const deployStepContent = ( + <> +

+ {t("DashboardIssuance.workspace.deployToken")} +

+

+ {t("DashboardIssuance.workspace.deployHint")} +

+ {children(enabled ? () => setEngineChosen(false) : null)} + + ); + + const engineStepContent = ( +
+

+ {t("DashboardIssuance.management.tokenizationEngineTitle")} +

+

+ {t("DashboardIssuance.management.tokenizationEngineHint")} +

+
+
+
+ + + +
+
+
+

+ {t("DashboardIssuance.management.engineVulcanForgeName")} + + {t("DashboardIssuance.management.comingSoon")} + +

+

+ {t("DashboardIssuance.management.engineVulcanForgeDescription")} +

+
+
+ +
+
+ ); + + if (!enabled) { + return ( +
+ {deployStepContent} +
+ ); + } + + return ( +
+
+ +
+ {/* Both steps stay mounted in the same grid cell so the card keeps the + taller step's height across transitions — no layout shift. */} +
+ + {engineChosen ? deployStepContent : engineStepContent} + + +
+
+ ); +} + export function shouldOpenPendingFundManagementModal({ activeTab, pendingFundManagementModalAction, @@ -82,10 +226,12 @@ export function AssetManagementWorkspace({ token, assetProfile, tokenError, + alphaledgerEngineEnabled, }: { token: Token; assetProfile: AssetProfile; tokenError: string | null; + alphaledgerEngineEnabled: boolean; }) { const t = useTranslations(); const { dashboardAccess } = useDashboardWorkspace(); @@ -107,6 +253,7 @@ export function AssetManagementWorkspace({ const [pendingFundManagementModalAction, setPendingFundManagementModalAction] = useState< "deploy" | "mint" | "burn" | null >(null); + const [onboardToVulcanForge, setOnboardToVulcanForge] = useState(false); const ops = useTokenOperations({ token, @@ -329,59 +476,67 @@ export function AssetManagementWorkspace({ onClose={ops.closeFundManagementModal} > {ops.fundManagementModalAction === "deploy" ? ( -
-

- {t("DashboardIssuance.workspace.deployToken")} -

-

- {t("DashboardIssuance.workspace.deployHint")} -

-
- - {/* Two signers, two buttons: the selected wallet pays the fees, or - Kora sponsors them. Kora stays disabled until sponsorship is - wired up, so the tooltip explains the gap. */} -
- -
+ + {(goBack) => ( +
+ + {alphaledgerEngineEnabled ? ( +
+
+ + + +
+

+ {t("DashboardIssuance.management.vulcanForgeOnboardTitle")} +

+

+ {t("DashboardIssuance.management.vulcanForgeOnboardDescription")} +

+
+
+ +
+ ) : null} +
+ - - -
-
-
+ )} + ) : ops.fundManagementModalAction ? ( Date: Sat, 1 Aug 2026 02:28:04 -0300 Subject: [PATCH 2/2] feat(i18n): add complete Brazilian Portuguese (pt) UI translation catalogs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds full pt catalogs for all 3,639 UI strings across the 8 message files, including dashboard-private-channels (not yet covered by fr). Registers the locale in supportedLocales/messagesByLocale, extends the i18n unit tests, and adds the locales.pt terminology block (voice, glossary-driven terminology, forbiddenTerms) to translation-guidance.json so catalog validation enforces the conventions from day one. Terminology follows solanabr/solana-glossary and the established fr precedent: Token, Wallet, mint/burn, allowlist/blocklist, endpoint, API Playground and friends stay in English; generic finance/CS vocabulary uses standard Brazilian Portuguese (ativo, contraparte, transferência, cotação, provedor). Register: você. --- .github/translation-guidance.json | 157 ++ apps/sdp-web/messages/pt.json | 33 + .../messages/pt/dashboard-approvals.json | 113 ++ .../messages/pt/dashboard-custody.json | 795 ++++++++++ .../messages/pt/dashboard-issuance.json | 1276 +++++++++++++++++ .../messages/pt/dashboard-payments.json | 1043 ++++++++++++++ .../messages/pt/dashboard-policies.json | 49 + .../pt/dashboard-private-channels.json | 298 ++++ apps/sdp-web/messages/pt/shared.json | 262 ++++ .../src/components/language-picker.tsx | 3 +- apps/sdp-web/src/i18n/README.md | 6 +- apps/sdp-web/src/i18n/config.ts | 2 +- apps/sdp-web/src/i18n/messages.ts | 22 + apps/sdp-web/src/i18n/messages.unit.test.ts | 2 + 14 files changed, 4056 insertions(+), 5 deletions(-) create mode 100644 apps/sdp-web/messages/pt.json create mode 100644 apps/sdp-web/messages/pt/dashboard-approvals.json create mode 100644 apps/sdp-web/messages/pt/dashboard-custody.json create mode 100644 apps/sdp-web/messages/pt/dashboard-issuance.json create mode 100644 apps/sdp-web/messages/pt/dashboard-payments.json create mode 100644 apps/sdp-web/messages/pt/dashboard-policies.json create mode 100644 apps/sdp-web/messages/pt/dashboard-private-channels.json create mode 100644 apps/sdp-web/messages/pt/shared.json diff --git a/.github/translation-guidance.json b/.github/translation-guidance.json index 3d08df1ed..5d11425b8 100644 --- a/.github/translation-guidance.json +++ b/.github/translation-guidance.json @@ -120,6 +120,163 @@ "preferred": "allowlist" } ] + }, + "pt": { + "localeName": "português (Brasil)", + "voice": [ + "Use natural professional Brazilian Portuguese and address the user with você.", + "Keep established Web3 terms in English when Brazilian practitioners normally use the English term.", + "Use Brazilian financial vocabulary when it is genuinely standard, such as ativo and contraparte." + ], + "terminology": [ + { + "source": "token / tokens", + "preferred": "Token / Tokens", + "avoid": "ficha / fichas", + "note": "Token is the established Web3 product noun. Use Portuguese grammar around it." + }, + { + "source": "wallet / wallets", + "preferred": "Wallet / Wallets", + "avoid": "carteira / carteiras", + "note": "Wallet is the established product noun in this dashboard." + }, + { + "source": "mint / burn", + "preferred": "mint / burn", + "avoid": "cunhar / cunhagem", + "note": "Keep protocol action names recognizable; write natural Portuguese around them, for example fazer mint de Tokens." + }, + { + "source": "allowlist / blocklist", + "preferred": "allowlist / blocklist", + "avoid": "lista branca / lista negra / lista de permissões / lista de bloqueio", + "note": "Keep the neutral technical terms used by the product." + }, + { + "source": "on-chain / off-chain", + "preferred": "on-chain / off-chain" + }, + { + "source": "stablecoin, API, RPC, webhook, blockchain, staking, airdrop", + "preferred": "Keep these established technical terms unchanged." + }, + { + "source": "endpoint / API Playground", + "preferred": "endpoint / API Playground", + "avoid": "ponto de extremidade / área de testes da API", + "note": "Use the established developer-facing product terms." + }, + { + "source": "dashboard", + "preferred": "Dashboard", + "avoid": "painel / painel de controle", + "note": "Dashboard is the product surface name." + }, + { + "source": "asset / counterparty", + "preferred": "ativo / contraparte", + "note": "These have natural, standard Brazilian financial equivalents." + }, + { + "source": "transfer / provider / quote", + "preferred": "transferência / provedor / cotação", + "note": "Use the standard Brazilian product and financial terms, including in API error copy." + }, + { + "source": "draft / deploy", + "preferred": "rascunho / deploy", + "note": "Deploy is an established loanword in Brazilian developer Portuguese, for example fazer o deploy; draft has a natural equivalent." + }, + { + "source": "custody", + "preferred": "Custody for the product category; custódia in explanatory prose", + "note": "Choose from context instead of forcing one translation everywhere." + }, + { + "source": "validator / account / transaction / signature / keypair / epoch", + "preferred": "validador / conta / transação / assinatura / par de chaves / época", + "note": "Follow the solanabr/solana-glossary conventions for protocol vocabulary with standard Portuguese equivalents." + }, + { + "source": "decimals", + "preferred": "decimais / casas decimais", + "note": "Generic noun in this product; always translate." + }, + { + "source": "custodian", + "preferred": "custodiante", + "note": "Standard CVM/B3 vocabulary for the regulated financial role." + }, + { + "source": "Mint Authority / Freeze Authority / Update Authority / Metadata Authority / Permanent Delegate", + "preferred": "Keep the whole SPL authority family in English as noun labels; verbs describing the action are written in Portuguese.", + "note": "SDP is grammatically feminine: a SDP, da SDP, pela SDP." + }, + { + "source": "block explorer / rent / rails / ramp / on-ramp / off-ramp", + "preferred": "explorer / rent / rails / ramp / on-ramp / off-ramp", + "note": "Established loanwords in Brazilian crypto usage; Solana Explorer stays as the brand name." + }, + { + "source": "Token-2022 extension names (Transfer Fee, Interest Bearing, Scaled UI Amount, Transfer Hook, Non-transferable, Default Account State)", + "preferred": "Keep extension names in English as labels; translate their descriptions and helper text." + }, + { + "source": "enable / disable / enabled / disabled", + "preferred": "ativar / desativar / ativado / desativado", + "note": "Match the English form per string: infinitive action versus participle state. Never mix in the habilitar family." + }, + { + "source": "funding account / compliance", + "preferred": "conta de fundos / Compliance", + "note": "Compliance is the established department name in Brazilian finance; keep it in English." + } + ], + "forbiddenTerms": [ + { + "label": "carteira / carteiras", + "pattern": "\\bcarteiras?\\b", + "flags": "iu", + "preferred": "Wallet / Wallets" + }, + { + "label": "ficha / fichas", + "pattern": "\\bfichas?\\b", + "flags": "iu", + "preferred": "Token / Tokens" + }, + { + "label": "ponto de extremidade", + "pattern": "\\bpontos? de extremidade\\b", + "flags": "iu", + "preferred": "endpoint / endpoints" + }, + { + "label": "lista branca / lista negra", + "pattern": "\\blistas? (?:brancas?|negras?)\\b", + "flags": "iu", + "preferred": "allowlist / blocklist" + }, + { + "label": "lista de permissões / lista de bloqueio", + "pattern": "\\blistas? de (?:permiss(?:ão|ões)|bloqueios?)\\b", + "flags": "iu", + "preferred": "allowlist / blocklist" + }, + { + "label": "allow list", + "pattern": "\\ballow list\\b", + "flags": "iu", + "preferred": "allowlist" + }, + { + "label": "cunhar / cunhagem", + "pattern": "\\bcunh(?:ar|agem)\\b", + "flags": "iu", + "preferred": "mint" + } + ] } } } diff --git a/apps/sdp-web/messages/pt.json b/apps/sdp-web/messages/pt.json new file mode 100644 index 000000000..71b6524a0 --- /dev/null +++ b/apps/sdp-web/messages/pt.json @@ -0,0 +1,33 @@ +{ + "Metadata": { + "title": "Solana Developer Platform", + "description": "Dashboard SDP" + }, + "Home": { + "solanaLogo": "Solana", + "docs": "Docs", + "dashboard": "Dashboard", + "title": "Crie qualquer produto financeiro sem se preocupar com a infraestrutura", + "description": "Seja emitindo uma stablecoin, orquestrando pagamentos transfronteiriços ou tokenizando ativos do mundo real, a SDP oferece as APIs e a infraestrutura mais confiáveis para tornar isso possível.", + "trySdp": "Experimente a SDP", + "contactUs": "Fale conosco", + "joinWaitlist": "Entre na lista de espera" + }, + "NotFound": { + "solanaLogo": "Solana", + "title": "Página não encontrada", + "description": "A página que você está procurando não existe ou pode ter sido movida.", + "backToDashboard": "Voltar ao dashboard", + "goHome": "Ir para o início" + }, + "Feedback": { + "label": "Feedback" + }, + "Error": { + "tryAgain": "Tentar novamente", + "reportIssue": "Relatar este problema", + "viewTitle": "Não foi possível carregar esta visualização", + "viewDescription": "Algo deu errado ao carregar esta página. O restante do dashboard continua funcionando, então você pode tentar novamente ou continuar.", + "reference": "Referência {digest}" + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-approvals.json b/apps/sdp-web/messages/pt/dashboard-approvals.json new file mode 100644 index 000000000..cd39fe2bf --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-approvals.json @@ -0,0 +1,113 @@ +{ + "DashboardApprovals": { + "pendingCount": "Pendentes: {count}", + "pendingTab": "Pendentes", + "historyTab": "Histórico", + "walletFilter": "Wallet", + "allWallets": "Todas as Wallets", + "statusFilter": "Status", + "allStatuses": "Todos os status", + "operationFilter": "Operação", + "allOperations": "Todas as operações", + "apiKeyFilter": "Chave de API", + "allApiKeys": "Todas as chaves de API", + "fromFilter": "De", + "toFilter": "Até", + "dateRangeLabel": "Data", + "dateAllTime": "Todo o período", + "dateLast7": "7 dias", + "dateLast30": "30 dias", + "dateLast90": "90 dias", + "dateCustom": "Personalizado", + "statusColumn": "Status", + "walletColumn": "Wallet", + "operationColumn": "Operação", + "amountAssetColumn": "Valor / ativo", + "destinationColumn": "Destino", + "requestedByColumn": "Solicitado por", + "policyReasonColumn": "Motivo da política", + "submittedColumn": "Enviado", + "openRequest": "Abrir solicitação de aprovação", + "emptyPending": "Nenhuma solicitação está aguardando aprovação", + "emptyPendingDescription": "Novas operações sujeitas a políticas aparecerão aqui assim que forem enviadas.", + "emptyHistory": "Ainda não há histórico de aprovações", + "emptyHistoryDescription": "Solicitações aprovadas, rejeitadas, canceladas, expiradas e com falha aparecerão aqui.", + "emptyFiltered": "Nenhuma solicitação corresponde a estes filtros", + "emptyFilteredDescription": "Remova um ou mais filtros para ver mais solicitações de aprovação.", + "range": "{from}-{to} de {total} solicitações", + "unableToLoad": "Não foi possível carregar as solicitações de aprovação", + "unableToLoadDescription": "Não foi possível obter a lista de solicitações. Tente carregá-la novamente.", + "reload": "Recarregar", + "autoRefresh": "Atualizando a cada 5 segundos", + "refreshFailed": "Não foi possível atualizar as solicitações de aprovação. Exibindo os últimos resultados carregados.", + "viewOnly": "Você pode revisar solicitações de aprovação, mas sua função não tem permissão para decidir sobre elas.", + "noAccess": "Solicitações de aprovação não estão disponíveis para sua função.", + "noAccessDescription": "Peça a um administrador da organização acesso de leitura à Wallet.", + "backToApprovals": "Voltar para Aprovações", + "reviewTitle": "Revisar {operation}", + "reviewDescription": "Confirme o contexto da política e os detalhes da operação antes de tomar uma decisão.", + "approve": "Aprovar", + "reject": "Rejeitar", + "cancel": "Cancelar", + "approveTitle": "Aprovar esta solicitação?", + "approveDescription": "A operação será liberada para execução. Esta decisão não pode ser desfeita.", + "approveConfirm": "Aprovar solicitação", + "rejectTitle": "Rejeitar esta solicitação?", + "rejectDescription": "A operação será cancelada e não poderá ser retomada a partir desta solicitação.", + "rejectConfirm": "Rejeitar solicitação", + "cancelTitle": "Cancelar esta solicitação?", + "cancelDescription": "A operação pendente será cancelada sem uma decisão de aprovação.", + "cancelConfirm": "Cancelar solicitação", + "notNow": "Agora não", + "decisionInProgress": "Atualizando solicitação...", + "approvedToast": "Solicitação aprovada", + "rejectedToast": "Solicitação rejeitada", + "canceledToast": "Solicitação cancelada", + "alreadyDecided": "Esta solicitação já foi decidida. O status mais recente agora é exibido.", + "forbiddenDecision": "Sua função não tem permissão para decidir sobre solicitações de aprovação.", + "decisionFailed": "Não foi possível atualizar a solicitação. Tente novamente.", + "requestSection": "Solicitação", + "policyDecisionSection": "Decisão da política", + "operationDetailsSection": "Detalhes da operação", + "matchedControlsSection": "Controles correspondentes", + "timelineSection": "Linha do tempo", + "submittedBy": "Enviado por", + "submittedAt": "Enviado em", + "expiresAt": "Expira em", + "policyDecision": "Decisão", + "policyReason": "Motivo", + "reasonCode": "Código do motivo", + "operationFamily": "Família da operação", + "operationType": "Tipo de operação", + "amount": "Valor", + "asset": "Ativo", + "destination": "Destino", + "source": "Origem", + "noMatchedControls": "Nenhum controle correspondente foi reportado para esta avaliação.", + "matchedControl": "Controle correspondente {number}", + "submittedEvent": "Solicitação enviada", + "submittedEventDescription": "A operação foi pausada para aprovação.", + "resolvedEvent": "Solicitação {status}", + "resolvedEventDescription": "Decisão registrada por {actor}.", + "metadata": "Contexto da solicitação", + "wallet": "Wallet", + "walletAddress": "Endereço da Wallet", + "requester": "Solicitante", + "apiKey": "Chave de API", + "walletRevision": "Revisão da Wallet", + "apiKeyRevision": "Revisão da chave de API", + "provider": "Provedor", + "providerStatus": "Status do provedor", + "requestId": "ID da solicitação", + "submitted": "Enviado", + "currentStatus": "Status atual", + "resolvedBy": "Resolvido por", + "resolvedAt": "Resolvido em", + "notReported": "Não reportado", + "directRequest": "Solicitação direta", + "approvalRequiredByPolicy": "Aprovação exigida pela política", + "copyRequestId": "Copiar ID da solicitação", + "requestIdCopied": "ID da solicitação copiado", + "loading": "Carregando aprovações..." + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-custody.json b/apps/sdp-web/messages/pt/dashboard-custody.json new file mode 100644 index 000000000..103f1dde8 --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-custody.json @@ -0,0 +1,795 @@ +{ + "DashboardCustody": { + "actions": "Ações", + "rotateKey": "Rotacionar chave ({hours}h de carência)", + "deleteKey": "Excluir chave", + "editApiKey": "Editar chave de API", + "actionFailed": "Falha na ação", + "notice": "Aviso", + "existingApiKeys": "Chaves de API existentes", + "apiKeysDescription": "Chaves ativas e históricas deste espaço de trabalho.", + "newApiKey": "Nova chave de API", + "noApiKeysFound": "Nenhuma chave de API encontrada.", + "name": "Nome", + "prefix": "Prefixo", + "access": "Acesso", + "status": "Status", + "lastUsed": "Último uso", + "expires": "Expira em", + "created": "Criado em", + "never": "Nunca", + "admin": "Administrador", + "developer": "Desenvolvedor", + "readOnly": "Somente leitura", + "allWallets": "Todas as Wallets", + "selectedWallets": "Wallets selecionadas", + "selected": "Selecionadas: {count}", + "selectedWallet": "Wallet selecionada", + "selectedLabel": "Selecionado", + "noApiKeyPolicy": "Nenhuma política de chave de API", + "noAdditionalApiKeyPolicy": "Nenhuma política adicional de chave de API está anexada.", + "policyBinding": "Vinculação de política", + "policyBindingCount": "{count} vinculação de política", + "policyBindingsCount": "{count} vinculações de política", + "apiProfile": "Perfil de API {id}{revision}", + "walletProfile": "Perfil de Wallet {id}{revision}", + "revision": " rev {id}", + "roleAccess": "Acesso de {role}", + "createApiKey": "Criar chave de API", + "reviewApiKey": "Revisar chave de API", + "walletAccess": "Acesso à Wallet", + "walletAccessDescription": "Escolha se esta chave pode usar todas as Wallets no escopo ou apenas Wallets selecionadas.", + "allWalletsDescription": "Esta chave pode usar todas as Wallets disponíveis no escopo da organização ou do projeto.", + "selectedWalletsDescription": "Restrinja esta chave a um conjunto específico de Wallets e escolha sua Wallet de assinatura padrão.", + "operationPolicy": "Política de operação", + "noActiveWallets": "Nenhuma Wallet ativa está disponível para vinculação ainda.", + "defaultSigningWallet": "Wallet de assinatura padrão", + "nameLabel": "Nome", + "namePlaceholder": "Chave de deploy do CI", + "role": "Função", + "environment": "Ambiente", + "expirationOptional": "Expiração (opcional)", + "production": "Produção", + "sandbox": "Sandbox", + "none": "Nenhum", + "invalidDate": "Data inválida", + "endpointPermissions": "Permissões de endpoint", + "policy": "Política", + "securityNote": "Nota de segurança", + "creating": "Criando...", + "createKey": "Criar chave", + "createApiKeyDescription": "Defina os detalhes da chave e o acesso à Wallet e, em seguida, confirme.", + "reviewApiKeyDescription": "Revise a solicitação antes de criar a chave.", + "deleteApiKey": "Excluir chave de API", + "deleteApiKeyPlaceholder": "Digite o nome exato da chave", + "deleting": "Excluindo...", + "deleteKeyConfirm": "Excluir chave", + "apiKeyGenerated": "Chave de API gerada", + "keyPrefix": "Prefixo da chave", + "fullKeyShownOnce": "Sua chave completa (exibida uma vez)", + "apiKeyPlaygroundSession": "Esta sessão do navegador agora pode usar esta chave no API Playground sem colá-la novamente.", + "dismiss": "Dispensar", + "copyValue": "Copiar", + "copied": "Copiado", + "closeGeneratedKeyModal": "Fechar modal de chave gerada", + "closeConfirmationModal": "Fechar modal de confirmação", + "delete": "Excluir", + "deleteApiKeyDescription": "Isso remove a chave sem excluir a linha.", + "typeKeyNameToConfirm": "Digite {name} para confirmar.", + "confirmKeyName": "Confirmar nome da chave", + "cancel": "Cancelar", + "organizationName": "Nome da organização", + "organizationSlug": "Slug da organização", + "clerkOrganizationId": "ID da organização no Clerk", + "unavailable": "Indisponível", + "unableToLoadWalletProviders": "Não foi possível carregar os provedores de Wallet", + "unableToLoadWallets": "Não foi possível carregar as Wallets", + "trackedBalancesUnavailable": "Os saldos rastreados estão indisponíveis no momento. Exibindo o saldo informado pela Wallet.", + "walletControlsUnavailable": "Os controles da Wallet estão indisponíveis no momento.", + "createWallet": "Criar Wallet", + "walletSearchPlaceholder": "Buscar por nome, ID da Wallet, endereço, provedor ou finalidade", + "clearWalletSearch": "Limpar busca de Wallet", + "clearWalletSearchAction": "Limpar busca", + "walletSearchResults": "Exibindo {count} de {total} Wallets", + "noWalletSearchResults": "Nenhuma Wallet corresponde a esta busca", + "noWalletSearchResultsDescription": "Tente outro nome, ID da Wallet, endereço, provedor ou finalidade.", + "wallet": "Wallet", + "balance": "Saldo", + "purpose": "Finalidade", + "issuance": "Emissão", + "compliance": "Compliance", + "mintAuthority": "Mint Authority", + "freezeAuthority": "Freeze Authority", + "feePayer": "Pagador de taxa", + "transfers": "Transferências", + "address": "Endereço", + "walletId": "ID da Wallet", + "manage": "Gerenciar", + "createFirstWallet": "Crie sua primeira Wallet", + "noWalletsAvailable": "Nenhuma Wallet disponível", + "createWalletDescription": "Escolha o provedor que criará e assinará pela Wallet.", + "walletCreationLimited": "A criação de Wallet é limitada a administradores. Depois que uma Wallet é criada, você ainda pode usá-la em todo o dashboard.", + "noWalletProvidersEnabled": "Nenhum provedor de Wallet ativado", + "noWalletProvidersEnabledDescription": "Ative um provedor para esta organização antes de criar uma Wallet.", + "backToWallets": "Voltar para Wallets", + "chooseProvider": "Escolher provedor", + "walletDetails": "Detalhes da Wallet", + "walletLabel": "Rótulo da Wallet", + "walletLabelPlaceholder": "Tesouraria", + "project": "Projeto", + "projectValue": "Projeto atual", + "environmentValue": "Ambiente atual", + "connectedProviderDescription": "{provider} usa sua Wallet já configurada neste fluxo.", + "chooseEnabledProvider": "Escolha um provedor ativado para continuar.", + "back": "Voltar", + "next": "Próximo", + "continue": "Continuar", + "createWalletPending": "Criando...", + "saveWalletLabel": "Salvar rótulo da Wallet", + "cancelWalletLabelEdit": "Cancelar edição do rótulo da Wallet", + "editWalletLabel": "Editar rótulo da Wallet", + "untitled": "Sem título", + "updatingWalletLabel": "Atualizando rótulo da Wallet.", + "walletLabelUpdated": "Rótulo da Wallet atualizado.", + "unableToUpdateWalletLabel": "Não foi possível atualizar o rótulo da Wallet.", + "unknownError": "Erro desconhecido", + "requestFailed": "Falha na solicitação", + "httpRequestFailed": "{error} (HTTP {status})", + "walletIdRequired": "O ID da Wallet é obrigatório.", + "validWalletAddressRequired": "É necessário um endereço de Wallet válido.", + "signInToRequestDevnetSol": "Entre para solicitar SOL da Devnet.", + "devnetFaucetHttpError": "O provedor RPC do faucet da Devnet {provider} retornou HTTP {status}.", + "devnetFaucetEmptyResponse": "O faucet da Devnet retornou uma resposta RPC vazia.", + "devnetFaucetProviderError": "O provedor RPC do faucet da Devnet {provider} retornou: {error}", + "devnetFaucetProviderGenericError": "O provedor RPC do faucet da Devnet {provider} retornou um erro.", + "devnetFaucetNoSignature": "O faucet da Devnet não retornou assinatura de transação.", + "walletAddress": "Endereço da Wallet", + "walletMetadataCopied": "Copiado: {label}.", + "unableToCopy": "Não foi possível copiar {label}.", + "copy": "Copiar {label}", + "recentActivity": "Atividade recente", + "recentActivityDescription": "Atividade de transferências e operações de Token desta Wallet.", + "refreshing": "Atualizando...", + "refresh": "Atualizar", + "noWalletActivity": "Nenhuma atividade da Wallet encontrada ainda.", + "activity": "Atividade", + "asset": "Ativo", + "direction": "Direção", + "counterparty": "Contraparte", + "signature": "Assinatura", + "unknownAsset": "Ativo desconhecido", + "unknown": "Desconhecido", + "pending": "Pendente", + "incoming": "Entrada", + "outgoing": "Saída", + "transfer": "Transferência", + "unableToLoadIssuanceActivity": "Não foi possível carregar a atividade de Emissão", + "paymentsActivityUnavailable": "A atividade de Pagamentos está indisponível no momento.", + "issuanceActivityUnavailable": "A atividade de Emissão está indisponível no momento.", + "noActivitySources": "Nenhuma fonte de atividade está disponível para esta Wallet.", + "walletActivityUnavailable": "A atividade da Wallet está indisponível no momento.", + "unableToVerifyWalletVisibility": "Não foi possível verificar a visibilidade da Wallet.", + "invalidWalletId": "ID da Wallet inválido.", + "walletActivityRequestFailed": "Falha na solicitação de atividade da Wallet.", + "previous": "Anterior", + "active": "Ativo", + "noWalletProvidersTier": "Nenhum provedor de Wallet está ativado para o nível desta organização no momento.", + "newWallet": "Nova Wallet", + "providerAdditionalWalletUnavailable": "{provider} já está conectado, mas Wallets adicionais ainda não estão disponíveis.", + "walletCreationAvailable": "A criação de Wallet fica disponível depois que um provedor de custódia é ativado para esta organização.", + "stale": "(desatualizado)", + "organizationSettings": "Configurações da organização", + "organizationSettingsDescription": "Configure o provedor RPC usado em toda esta organização.", + "appearance": "Aparência", + "appearanceDescription": "Escolha a aparência do dashboard. Esta preferência é salva somente neste dispositivo.", + "themeSystem": "Sistema", + "themeLight": "Claro", + "themeDark": "Escuro", + "themeSystemHint": "O dashboard segue as configurações de aparência do seu dispositivo.", + "themeLightHint": "O dashboard sempre usa o tema claro neste dispositivo.", + "themeDarkHint": "O dashboard sempre usa o tema escuro neste dispositivo.", + "failedToLoadOrganizationSettings": "Falha ao carregar as configurações da organização.", + "organizationNotFound": "Organização não encontrada.", + "organizationNotLinked": "Esta organização do Clerk ainda não está vinculada a uma organização da SDP.", + "editingOrganization": "Editando organização: {name}", + "viewOnlyRpcSettings": "Você pode visualizar as configurações de RPC da organização, mas somente administradores podem alterá-las.", + "noRpcProviders": "Nenhum provedor RPC está ativado para esta organização no ambiente atual.", + "rpcFallback": "O provedor RPC salvo para esta organização não está mais disponível no nível atual. O formulário recorreu a {provider} até que você salve um provedor ativado.", + "saving": "Salvando...", + "saveFallback": "Salvar alternativa", + "rpcProvider": "Provedor RPC", + "testing": "Testando...", + "testRpc": "Testar RPC", + "rpcDetailTitle": "Último teste", + "rpcDetailReachable": "Acessível", + "rpcDetailUnreachable": "Inacessível", + "rpcDetailResolvedProvider": "Provedor resolvido", + "rpcDetailSelectionMode": "Modo de seleção", + "rpcDetailEndpoint": "Endpoint", + "rpcDetailUpstream": "Status do upstream", + "rpcDetailLatency": "Latência", + "rpcDetailLatencyValue": "{ms} ms", + "saveInProgress": "Salvamento em andamento.", + "tryAgainSoon": "Tente novamente em instantes.", + "checkingRpcProvider": "Verificando provedor RPC.", + "rpcCheckPassed": "Verificação de RPC aprovada.", + "providerMismatch": "Divergência de provedor.", + "rpcCheckFailed": "Falha na verificação de RPC.", + "anotherProvider": "outro provedor", + "failedToSaveRpcSettings": "Falha ao salvar as configurações de RPC.", + "missingOrganizationId": "ID da organização ausente.", + "rpcProviderSaveMismatch": "Divergência ao salvar o provedor RPC (solicitado {requested}, persistido {persisted}).", + "rpcSettingsSaved": "Configurações de RPC salvas.", + "failedToTestRpcProvider": "Falha ao testar o provedor RPC.", + "rpcTestFailed": "Falha no teste de RPC.", + "rpcTestFailedStatus": "Falha no teste de RPC ({status}).", + "rpcTestMismatch": "Divergência no teste de RPC (solicitado {requested}, resolvido {resolved}).", + "rpcUpstreamReturned": "O upstream do RPC retornou {status} {statusText}.", + "rpcTestPassed": "Teste de RPC aprovado ({status} {statusText}) em {latency}ms.", + "missingApiKeyIdForDeletion": "ID da chave de API ausente para exclusão.", + "missingApiKeyNameForDeletion": "Nome da chave de API ausente para confirmação de exclusão.", + "confirmApiKeyDeletion": "Digite o nome da chave para confirmar a exclusão da chave de API.", + "apiKeyConfirmationMismatch": "A confirmação não corresponde ao nome da chave.", + "apiKeyDeactivated": "A chave de API \"{name}\" foi desativada.", + "apiKeyDeleteFailed": "Falha na exclusão: {error}", + "apiKeyNameRequired": "O nome da chave de API é obrigatório.", + "apiKeyWalletScopeRequired": "Escolha se esta chave pode acessar todas as Wallets ou Wallets selecionadas.", + "apiKeyWalletRequired": "Selecione ao menos uma Wallet para uma chave de API com escopo de Wallet.", + "invalidExpirationDate": "Data de expiração inválida.", + "apiKeyCreated": "Chave de API \"{name}\" criada. Salve-a agora; ela não será exibida novamente.", + "apiKeyCreateFailed": "Falha na criação: {error}", + "missingApiKeyIdForRotation": "ID da chave de API ausente para rotação.", + "apiKeyRotated": "Chave de API rotacionada. A chave anterior permanece válida até {deadline}.", + "apiKeyRotateFailed": "Falha na rotação: {error}", + "providerLocalDescription": "Signatário de par de chaves Ed25519 auto-hospedado a partir de CUSTODY_PRIVATE_KEY.", + "providerPrivyDescription": "Infraestrutura de Wallet hospedada para assinatura via API.", + "providerFireblocksDescription": "Custódia MPC com controles de Wallet baseados em cofre.", + "providerCoinbaseCdpDescription": "Provisionamento programático de Wallet através do Coinbase CDP.", + "providerParaDescription": "Custódia de Wallet incorporada para operações em nível de organização.", + "providerTurnkeyDescription": "Custódia de chaves baseada em políticas para cargas de assinatura em produção.", + "providerDfnsDescription": "Orquestração de Wallet MPC com assinatura segura via API.", + "providerIbmHavenDescription": "Custódia institucional no IBM Digital Asset Haven.", + "providerAnchorageDescription": "Custódia institucional com gerenciamento do ciclo de vida da Wallet.", + "providerUtilaDescription": "Assinatura de Wallet Solana apoiada por cofre através de contas de serviço da Utila.", + "providerCredentialLabel": "Rótulo da credencial", + "providerCredentialLabelDescription": "Escolha um nome editável para esta credencial de provedor.", + "providerCredentialScope": "Escopo da credencial", + "providerCredentialScopeDescription": "Credenciais de organização podem ser compartilhadas por referência; credenciais de projeto permanecem isoladas ao projeto selecionado.", + "providerCredentialScopeOrganization": "Organização", + "providerCredentialScopeProject": "Projeto", + "providerPrivyAppId": "ID do app da Privy", + "providerPrivyAppIdDescription": "Informe o ID do app do seu dashboard da Privy. A SDP exibe apenas metadados com dados ocultados após o envio.", + "providerPrivyAppSecret": "Segredo do app da Privy", + "providerPrivyAppSecretDescription": "Informe o segredo do app do seu dashboard da Privy. Este valor é somente para gravação e nunca é exibido novamente.", + "providerInitialWalletLabel": "Rótulo inicial da Wallet", + "providerInitialWalletLabelDescription": "Opcionalmente, nomeie a Wallet padrão criada quando a verificação de conexão for bem-sucedida.", + "apiKeyAdminDescription": "Administrador inclui privilégios de custódia e de nível de plataforma. Desenvolvedor exclui ações de custódia.", + "apiKeyEnvironmentDescription": "Alterne o ambiente do espaço de trabalho na barra lateral para criar uma chave no outro ambiente.", + "expiresOn": "Expira em {date}", + "default": "Padrão:", + "fullKeyOnlyShownOnce": "A chave completa só será exibida uma vez após a criação.", + "closeApiKeyCreationModal": "Fechar modal de criação de chave de API", + "policyDraftSaveFailed": "O rascunho não pôde ser salvo.", + "policyDraftSaveFailedDescription": "Você pode continuar configurando, mas as alterações podem ser perdidas se você sair.", + "policyDraftSaved": "Rascunho salvo.", + "policyDraftSavedDescription": "O perfil ainda não está ativo.", + "policyChooseRestriction": "Escolha ao menos uma categoria de restrição.", + "policyCheckDestinations": "Verifique os endereços de destino.", + "policyCheckDestinationsDescription": "Use endereços Solana válidos antes da revisão.", + "policyChooseOperations": "Escolha os controles de acesso a operações.", + "policyChooseOperationsDescription": "Selecione ao menos uma família de operações para bloquear.", + "policyCheckLimits": "Verifique os limites de transferência.", + "policyCheckLimitsDescription": "Informe um número positivo para cada limite configurado.", + "policyChooseApprovals": "Escolha as verificações de aprovação.", + "policyChooseApprovalsDescription": "Selecione ao menos uma família de operações que deve exigir aprovação.", + "policyChooseAdvanced": "Escolha os controles avançados de assinatura.", + "policyChooseAdvancedDescription": "Selecione assinatura bruta, interações com programas ou ambos.", + "policyActivating": "Ativando os controles da Wallet.", + "policyActive": "Controles da Wallet ativos.", + "policyActiveDescription": "As restrições selecionadas agora estão ativas.", + "policyActivationFailed": "Falha na ativação.", + "policySaveFailed": "Os controles da Wallet não puderam ser salvos.", + "policyDisabling": "Desativando os controles da Wallet.", + "policyDisabled": "Controles da Wallet desativados.", + "policyDisabledDescription": "A Wallet voltou a permitir por padrão.", + "policyDisableFailed": "Falha ao desativar.", + "policyAuthoringIntentTitle": "O que esta Wallet deve controlar?", + "policyAuthoringIntentDescription": "Defina a decisão padrão e, em seguida, escolha as áreas que precisam de controles explícitos.", + "policyAuthoringLimitsTitle": "Limites e ativos", + "policyAuthoringLimitsDescription": "Defina limites genéricos de transferência e escolha os ativos cobertos por este perfil.", + "policyAuthoringDestinationsTitle": "Destinos e operações", + "policyAuthoringDestinationsDescription": "Controle onde esta Wallet pode atuar e quais operações precisam de uma decisão específica.", + "policyAuthoringReviewTitle": "Revisar e ativar", + "policyAuthoringReviewDescription": "Confirme o perfil completo antes que ele altere as regras em vigor.", + "policyDefaultAction": "Decisão padrão", + "policyDefaultActionDescription": "Aplica-se apenas quando nenhuma regra corresponde.", + "policyDefaultAllow": "Permitir por padrão", + "policyDefaultApproval": "Exigir aprovação por padrão", + "policyDefaultDeny": "Negar por padrão", + "policyRestrictionCategories": "Categorias de restrição", + "policyRestrictionCategoriesDescription": "Escolha as áreas de controle a configurar neste perfil.", + "policyRestrictionRequired": "Com Permitir por padrão, a política não altera nada até que você adicione uma restrição.", + "policyCategoryLimitsDescription": "Defina um máximo por transação ou por dia.", + "policyAllowedAssets": "Ativos permitidos", + "policyAllowedAssetsDescription": "Limite este perfil a ativos selecionados da Wallet ou a qualquer endereço de mint Solana.", + "policyDestinationControls": "Controles de destino", + "policyDestinationControlsDescription": "Mantenha uma allowlist ou blocklist ordenada de endereços Solana.", + "policyOperationControls": "Controles de operação", + "policyOperationControlsDescription": "Escolha uma decisão para famílias de operações da Wallet e tipos de operação exatos.", + "policyPerTransaction": "Por transação", + "policyAssetBadgeIssued": "Emitido", + "policyAssetBadgeCustom": "Personalizado", + "policySummarySelectedCount": "Selecionados: {count}", + "policyDailyTotal": "Total diário", + "policyTransferLimitsHint": "Limite o valor por transação ou por dia. Os limites se aplicam ao valor enviado, independentemente do ativo usado.", + "policyInvalidDecimal": "Informe um valor decimal positivo.", + "policyDailyBelowTransaction": "O total diário não pode ser menor que o valor por transação.", + "policySearchAssets": "Buscar ativos da Wallet ou inserir qualquer endereço de mint", + "policyWalletAssets": "Ativos da Wallet", + "policySelectedAssets": "Ativos selecionados", + "policyCustomMint": "Mint personalizado", + "policyNoMatchingAssets": "Nenhum ativo correspondente.", + "policyAddCustomMint": "Adicionar mint personalizado", + "policyInvalidMint": "Informe um endereço de mint Solana válido.", + "policyDuplicateAsset": "Este ativo já está selecionado.", + "policyRemoveAsset": "Remover {asset}", + "policyNoStepControls": "Nenhum controle desta etapa foi selecionado. Você pode continuar ou voltar para Intenção para adicioná-los.", + "policyAllowList": "Allowlist", + "policyBlockList": "Blocklist", + "policyWalletAddresses": "Endereços de Wallet", + "policyDuplicateDestination": "Este endereço já está na lista.", + "policyDestinationInvalid": "Informe um endereço Solana válido.", + "policyDestinationSearchPlaceholder": "Buscar contrapartes ou colar endereços separados por vírgula", + "policyDestinationCounterparties": "Contrapartes", + "policyDestinationExternal": "Endereço externo", + "policyDestinationAddExternal": "Adicionar endereço", + "policyNoMatchingDestinations": "Nenhuma contraparte correspondente.", + "policyDestinationAllowlistDescription": "Somente os endereços abaixo podem receber desta Wallet.", + "policyDestinationBlocklistDescription": "Os endereços abaixo nunca podem receber desta Wallet.", + "policyBulkAddSummary": "{added} adicionados · {flagged} sinalizados para revisão", + "policyBulkNothingToAdd": "Nenhum novo endereço válido foi encontrado no texto colado.", + "policyRemoveDestination": "Remover {address}", + "policyTransfers": "Transferências", + "policyProgramOperations": "Operações de programa", + "policyProviderAdministration": "Administração do provedor", + "policyTransfersDescription": "Transferências de Wallet para Wallet assinadas diretamente por esta Wallet.", + "policyPaymentsDescription": "Envios de pagamento únicos, em lote e recorrentes.", + "policyRampsDescription": "Operações de on-ramp e off-ramp, incluindo cotações de provedor.", + "policyIssuanceDescription": "Ações de Emissão de Token, como mint e atualizações de autoridade.", + "policyRawSigningDescription": "Solicitações de assinatura de baixo nível, incluindo verificações do signatário de custódia.", + "policyProgramOperationsDescription": "Interações diretas com programas Solana fora de fluxos gerenciados.", + "policyProviderAdministrationDescription": "Alterações administrativas no provedor de custódia desta Wallet.", + "policyActionAllow": "Permitir", + "policyActionDeny": "Negar", + "policyActionApproval": "Exigir aprovação", + "policyAdvancedOperationTypes": "Tipos de operação avançados", + "policyAdvancedOperationDescription": "Adicione strings exatas de tipo de operação quando uma decisão em nível de família não for específica o suficiente.", + "policyViewOperationPermissions": "Ver todas as permissões de operação disponíveis", + "policyOperationTypePlaceholder": "ex.: payment_transfer_execute", + "policyOperationTypeTooLong": "Os tipos de operação devem ter 120 caracteres ou menos.", + "policySummary": "Resumo da política", + "policySummaryWallet": "Wallet", + "policySummaryAddress": "Endereço", + "policySummaryStatus": "Status", + "policySummaryDefaultAction": "Decisão padrão", + "policySummaryControlAreas": "Áreas de controle", + "policySummaryAllowedAssets": "Ativos permitidos", + "policySummaryDestinations": "Entradas de destino", + "policySummaryApprovals": "Verificações de aprovação", + "policySummaryProvider": "Mapeamento do provedor", + "policyCopyAddress": "Copiar endereço da Wallet", + "policyAddressCopied": "Endereço da Wallet copiado.", + "policyStatusDefaultAllow": "Permitir por padrão", + "policyStatusNotActivated": "Não ativado", + "policyStatusActive": "Ativo", + "policyStatusDraft": "Rascunho", + "policyStatusDisabled": "Desativado", + "policyStatusArchived": "Arquivado", + "policyNotConfigured": "Não configurado", + "policyEdit": "Editar", + "policyReviewTransferLimits": "Limites de transferência", + "policyReviewAllowedAssets": "Ativos permitidos", + "policyReviewDestinationControls": "Controles de destino", + "policyReviewOperationControls": "Controles de operação", + "policyReviewPerTransaction": "Por transação {amount}", + "policyReviewDailyTotal": "Total diário {amount}", + "policyReviewPreservedRules": "Regras avançadas existentes incluídas: {count}.", + "policyReviewNoRestrictions": "Nada está restrito ainda — ativar não mudaria nada.", + "policySaveDraft": "Salvar rascunho", + "policyActivateControls": "Ativar controles", + "policyControlsActive": "Controles ativos", + "policyMoreActions": "Mais ações de política", + "policyDisableControls": "Desativar controles", + "policyDisableTitle": "Desativar os controles da Wallet?", + "policyDisableConfirmation": "Desativar os controles de {wallet}? Isso retorna a Wallet para permitir por padrão.", + "policyCancel": "Cancelar", + "policyConfirmDisable": "Desativar controles", + "policyDraftStoredLocally": "Salvo neste dispositivo em {date}", + "policyActivationValidation": "Revise os campos de política destacados antes da ativação.", + "policyProviderWarning": "Alguns controles não estão totalmente mapeados para o provedor de custódia e permanecem aplicados pela SDP.", + "wallets": "Wallets", + "playgroundListWallets": "Listar Wallets", + "playgroundListWalletConfigs": "Listar configurações de Wallet", + "playgroundGetWallet": "Obter Wallet", + "playgroundGetWalletPublicKey": "Obter chave pública da Wallet", + "playgroundAggregateBalances": "Agregar saldos das Wallets", + "playgroundCreateWallet": "Criar Wallet", + "playgroundSignerCheck": "Verificação de signatário", + "rootWallet": "Wallet raiz", + "mainWallet": "Wallet principal", + "mainSettlementWallet": "Wallet principal de liquidação", + "selectWalletPurpose": "Selecione a finalidade da Wallet", + "ownershipProof": "Comprovante de titularidade do playground de Wallets", + "untitledWallet": "Wallet sem título", + "publicKey": "Chave pública", + "provider": "Provedor", + "totalBalance": "Saldo total", + "balances": "Saldos", + "noTrackedBalances": "Nenhum saldo rastreado encontrado ainda para esta Wallet.", + "walletControls": "Controles da Wallet", + "walletRestrictionsActive": "Esta Wallet tem restrições de pagamento de saída ativas.", + "walletDefaultAllow": "Esta Wallet começa no modo permitir por padrão. Adicione restrições apenas onde o controle for necessário.", + "destinations": "Destinos", + "open": "Abrir", + "perTransfer": "Por transferência", + "daily": "Diário", + "noCap": "Sem limite", + "reviewControls": "Revisar controles", + "startProfile": "Iniciar perfil", + "policyIntent": "Intenção", + "policySetWalletPolicies": "Definir políticas da Wallet", + "policyIntentDescription": "Escolha para onde os fundos podem ir e quanto esta Wallet pode transferir.", + "policyRules": "Regras", + "policyStartingRules": "Regras iniciais", + "policyRulesDescription": "Configure as áreas de regras selecionadas antes da revisão.", + "policyReview": "Revisão", + "policyFinalReview": "Revisão final", + "policyReviewDescription": "Revise as alterações antes de aplicar os controles da Wallet.", + "policyOperationAccess": "Acesso a operações", + "policyOperationAccessDescription": "Bloqueie famílias de operações de alto risco, mantendo o uso normal disponível.", + "policyAllowedDestinations": "Destinos permitidos", + "policyAllowedDestinationsDescription": "Use quando esta Wallet só deve pagar endereços conhecidos.", + "policyTransferLimits": "Limites de transferência", + "policyAdvancedSigning": "Assinatura avançada", + "policyAdvancedSigningDescription": "Restrinja a assinatura bruta e os caminhos de interação direta com programas.", + "policyPayments": "Pagamentos", + "policyRamps": "Ramps", + "policyIssuance": "Emissão", + "policyProviderAdmin": "Administração do provedor", + "policyRawSigning": "Assinatura bruta", + "policyProgramInteractions": "Interações com programas", + "policyAllowed": "Permitido", + "policyDenied": "Negado", + "policyApprovalRequired": "Aprovação necessária", + "policyProviderApprovalRequired": "Aprovação do provedor necessária", + "policyNotEvaluated": "Não avaliado", + "policyFailed": "Falhou", + "recentPolicyDecisions": "Decisões de política recentes", + "policyEvaluationsShown": "Avaliações exibidas para esta Wallet: {count}", + "needsApproval": "Precisa de aprovação", + "stepOf": "Etapa {current} de {total}", + "onboardingEyebrow": "Configuração da organização", + "onboardingTitle": "Configure seu espaço de trabalho", + "onboardingDescription": "Escolha a infraestrutura que sua organização usará.", + "onboardingChooseRpc": "Escolha seu provedor de RPC", + "onboardingChooseCustody": "Escolha seu provedor de custódia", + "onboardingProvidersChangeLater": "Você pode alterar os provedores a qualquer momento em Configurações.", + "onboardingNoRpcProviders": "Nenhum provedor de RPC está disponível para esta organização no ambiente atual. Entre em contato com o administrador da SDP antes de continuar.", + "onboardingNoCustodyProviders": "Nenhum provedor de custódia está disponível para esta organização no ambiente atual. Entre em contato com o administrador da SDP antes de continuar.", + "onboardingFinish": "Concluir configuração", + "onboardingDefaultWalletLabel": "Wallet padrão", + "onboardingFinishError": "Não foi possível concluir a configuração da organização.", + "onboardingSaving": "Salvando...", + "onboardingPreparingTitle": "Seu espaço de trabalho está amarrando os cadarços", + "onboardingPreparingDescription": "Aguarde enquanto o símbolo da Solana se alonga. Você entrará automaticamente assim que seu espaço de trabalho estiver pronto.", + "onboardingAdminTitle": "Um administrador está configurando este espaço de trabalho", + "onboardingAdminDescription": "Você poderá usar o dashboard assim que um administrador da organização escolher os provedores de RPC e custódia.", + "onboardingRpcDefaultDescription": "Use a infraestrutura de RPC gerenciada pela SDP, sem credenciais para configurar.", + "onboardingRpcAlchemyDescription": "Roteie as solicitações da Solana pela sua conexão Alchemy configurada.", + "onboardingRpcHeliusDescription": "Use a infraestrutura da Helius para solicitações de RPC da Solana.", + "onboardingRpcNoditDescription": "Use a Nodit para o tráfego de RPC da Solana.", + "onboardingRpcQuickNodeDescription": "Use seu endpoint da QuickNode configurado para RPC da Solana.", + "onboardingRpcTritonDescription": "Roteie as solicitações da Solana pela infraestrutura da Triton.", + "onboardingRpcValidationCloudDescription": "Use a Validation Cloud para o tráfego de RPC da Solana.", + "collapse": "Recolher", + "expand": "Expandir", + "policyActivationOutcome": "Resultado da ativação", + "policyDefault": "Padrão", + "policyAllowUnmatched": "Permitir operações não correspondentes", + "policyRevision": "Revisão", + "policyProviderMapping": "Mapeamento do provedor", + "policySdpEnforced": "Aplicado pela SDP", + "policyNoRestrictionCategory": "Nenhuma categoria de restrição selecionada.", + "policyNoOperationsBlocked": "Nenhuma família de operações bloqueada", + "policyNoAddresses": "Nenhum endereço", + "policyNoApprovalChecks": "Nenhuma verificação de aprovação", + "policyNoAdvancedControls": "Nenhum controle de assinatura avançada", + "savedDraft": "Rascunho salvo", + "policyApplyControls": "Aplicar controles", + "policyChooseOperationFamilies": "Escolha as famílias de operações a bloquear.", + "policyPasteAddresses": "Cole os endereços da Solana aprovados ou uma coluna de endereços em CSV.", + "policySetCaps": "Defina um limite por transferência, um limite diário ou ambos.", + "policyChooseApprovalFamilies": "Escolha as famílias de operações que devem pausar para aprovação.", + "policyBlockAdvanced": "Bloqueie a assinatura bruta, as interações com programas ou ambas.", + "new": "Novo", + "policyProviderMappingPending": "Mapeamento do provedor pendente", + "policyProviderMapped": "Mapeado para o provedor", + "policyProviderPartiallyMapped": "Parcialmente mapeado para o provedor", + "policyProviderMappingFailed": "Falha no mapeamento do provedor", + "policyBlockFamilies": "Bloquear {families}", + "policyDenyFamilies": "Negar {families}", + "policyDestinationCount": "Endereços: {count}", + "policyInvalidCount": "Inválidos: {count}", + "policyAllowedCount": "Permitidos: {count}", + "policyPerTransferValue": "Por transferência {value}", + "policyDailyValue": "Diário {value}", + "policyAuditTitle": "Auditoria de política", + "policyAuditBreadcrumb": "Navegação da auditoria de política", + "policyAuditEvaluation": "Avaliação", + "policyAuditBackToWalletControls": "Voltar para os controles da Wallet", + "policyAuditBackToAudit": "Voltar para a auditoria", + "policyAuditRevisionHistory": "Histórico de revisões", + "policyAuditWalletHistory": "Histórico de política de {wallet}", + "policyAuditWalletHistoryDescription": "Revise as decisões de política usando a revisão que foi aplicada quando cada operação foi avaliada.", + "policyAuditDecision": "Decisão", + "policyAuditAllowed": "Permitido", + "policyAuditBlocked": "Bloqueado", + "policyAuditApprovalRequired": "Aprovação necessária", + "policyAuditReview": "Revisão", + "policyAuditNotEvaluated": "Não avaliado", + "policyAuditAllDecisions": "Todas as decisões", + "policyAuditOperationStatus": "Status da operação", + "policyAuditAllStatuses": "Todos os status", + "policyAuditOperationFamily": "Família da operação", + "policyAuditAllFamilies": "Todas as famílias", + "policyAuditReasonCode": "Código do motivo", + "policyAuditAllReasons": "Todos os motivos", + "policyAuditFromDate": "Data inicial", + "policyAuditToDate": "Data final", + "policyAuditApplyFilters": "Aplicar filtros", + "policyAuditClearFilters": "Limpar filtros", + "policyAuditMoreFilters": "Mais filtros", + "policyAuditOperation": "Operação", + "policyAuditAssetAmount": "Ativo / valor", + "policyAuditDestination": "Destino", + "policyAuditApiKeyActor": "Chave de API / ator", + "policyAuditAppliedRevision": "Revisão aplicada", + "policyAuditActiveRevision": "Revisão ativa", + "policyAuditEvaluated": "Avaliado", + "policyAuditOpenEvaluation": "Abrir avaliação", + "policyAuditEmpty": "Ainda não há avaliações de política", + "policyAuditEmptyDescription": "As decisões de política aparecerão aqui após a avaliação das operações da Wallet.", + "policyAuditEmptyFiltered": "Nenhuma avaliação corresponde aos filtros ativos.", + "policyAuditDefaultAllow": "Permitir por padrão", + "policyAuditNoActiveRevision": "Nenhuma revisão ativa", + "policyAuditUnavailable": "Indisponível", + "policyAuditUnavailableApiKey": "Chave de API indisponível", + "policyAuditRange": "{from}-{to} de {total}", + "policyAuditPreviousPage": "Página anterior", + "policyAuditNextPage": "Próxima página", + "policyAuditPageOf": "Página {page} de {pageCount}", + "policyAuditTransferAllowed": "Transferência permitida", + "policyAuditTransferBlocked": "Transferência bloqueada", + "policyAuditSentToReview": "Enviado para revisão", + "policyAuditPrevious": "Anterior", + "policyAuditNext": "Próximo", + "policyAuditRequest": "Solicitação", + "policyAuditRevisions": "Revisões", + "policyAuditDetailTabs": "Detalhe da auditoria de política", + "policyAuditEvaluationSequence": "Sequência de avaliação", + "policyAuditWalletPolicyEvaluation": "Avaliação de política da Wallet", + "policyAuditApiKeyPolicyEvaluation": "Avaliação de política da chave de API", + "policyAuditMatchedRule": "Regra correspondente", + "policyAuditObservedValueContext": "Valor observado / contexto", + "policyAuditEffectiveLimitExpectation": "Limite efetivo / expectativa", + "policyAuditFinalDecision": "Decisão final", + "policyAuditRecorded": "Registrado", + "policyAuditApplied": "Aplicado", + "policyAuditRawDetails": "Ver detalhes brutos", + "policyAuditNoRecordedValues": "Nenhum valor foi registrado.", + "policyAuditYes": "Sim", + "policyAuditNo": "Não", + "policyAuditNone": "Nenhum", + "policyAuditAppliedRevisionAtEvaluation": "Revisão aplicada na avaliação", + "policyAuditCurrentlyActiveRevision": "Revisão atualmente ativa", + "policyAuditHistoricalRevisionNotice": "Esta decisão histórica usou uma revisão diferente da que está ativa agora.", + "policyAuditApiKeyAppliedRevision": "Revisão da chave de API na avaliação", + "policyAuditApiKeyActiveRevision": "Revisão da chave de API atualmente ativa", + "policyAuditNoAdditionalRestriction": "Nenhuma restrição adicional", + "policyAuditEvaluatedAt": "Avaliado em {date}", + "policyAuditRevisionId": "ID da revisão", + "policyAuditEvaluationId": "ID da avaliação", + "policyAuditOperationId": "ID da operação", + "policyAuditRequestId": "ID da solicitação", + "policyAuditApiKeyId": "ID da chave de API", + "policyAuditRequestContext": "Contexto da solicitação", + "policyAuditRedactedContext": "Contexto com dados ocultados registrado com esta avaliação.", + "policyAuditLegacyContextEmpty": "Nenhum contexto estruturado de solicitação foi registrado para esta avaliação.", + "policyAuditEvaluationContext": "Contexto da avaliação", + "policyAuditApiKey": "Chave de API", + "policyAuditActor": "Ator", + "policyAuditProviderMapping": "Mapeamento do provedor", + "policyAuditApprovalRequest": "Solicitação de aprovação", + "policyAuditProviderPending": "Mapeamento do provedor pendente", + "policyAuditProviderPartial": "Parcialmente mapeado", + "policyAuditProviderFailed": "Falha no mapeamento do provedor", + "policyAuditProviderApproval": "Aprovação do provedor necessária", + "policyAuditSdpEnforced": "Aplicado pela SDP", + "policyAuditViewWalletControls": "Ver controles da Wallet", + "policyAuditViewApiKey": "Ver chave de API", + "policyAuditViewApprovalRequest": "Ver solicitação de aprovação", + "policyAuditUnavailableTitle": "Histórico de política indisponível", + "policyAuditUnavailableDescription": "Não foi possível carregar o histórico de política da Wallet agora.", + "policyRevisionsTitle": "Revisões de política", + "policyRevisionsWalletHistory": "Histórico de revisões de {wallet}", + "policyRevisionsDescription": "Inspecione os snapshots imutáveis de regras sem alterar os controles ativos da Wallet.", + "policyRevisionsEmpty": "Ainda não há revisões de política", + "policyRevisionsEmptyDescription": "Uma revisão aparecerá depois que os controles da Wallet forem salvos.", + "policyRevisionsNewestFirst": "Revisão mais recente primeiro", + "policyRevisionNumber": "Revisão v{number}", + "policyRevisionsCreated": "Criada", + "policyRevisionsActivated": "Ativada", + "policyRevisionsRules": "Regras", + "policyRevisionsCreator": "Criador", + "policyRevisionsSystem": "Sistema", + "policyRevisionsActive": "Ativa", + "policyRevisionsHistorical": "Histórica", + "policyRevisionsDraft": "Rascunho", + "policyRevisionsRuleSnapshot": "Snapshot de regras somente leitura", + "policyRevisionsSnapshotDescription": "Este snapshot imutável é exibido exatamente como foi armazenado para esta revisão.", + "policyRevisionsDefaultAction": "Ação padrão", + "policyRevisionsNoRules": "Nenhuma regra explícita foi armazenada nesta revisão.", + "policyRevisionsRuleNumber": "Regra {number}", + "policyRevisionsRawRule": "Ver dados brutos da regra", + "sandboxProjectUnavailable": "Projeto do Sandbox indisponível. Recarregue o dashboard e tente novamente.", + "sendingSignerCheck": "Enviando verificação de signatário.", + "signerCheckFailed": "Falha na verificação de signatário.", + "signerCheckSent": "Verificação de signatário enviada.", + "memoTransactionSubmitted": "Transação de memo enviada.", + "viewOnSolanaExplorer": "Ver no Solana Explorer", + "requestingDevnetSol": "Solicitando SOL da Devnet.", + "devnetFaucetFailed": "Falha no faucet da Devnet.", + "devnetSolRequested": "{amount} SOL da Devnet solicitados.", + "faucetTransactionSubmitted": "Transação do faucet enviada.", + "walletActionsFor": "Ações da Wallet para {wallet}", + "proving": "Comprovando...", + "proveOwnershipUnsupported": "Comprovar titularidade (não disponível)", + "proveOwnership": "Comprovar titularidade", + "proveOwnershipAdminOnly": "Comprovar titularidade (somente administrador)", + "requesting": "Solicitando...", + "requestDevnetSol": "Solicitar SOL da Devnet", + "policyRuleAllowedDestinations": "Destinos permitidos", + "policyRulePerTransferLimit": "Limite por transferência", + "policyRuleApprovalChecks": "Verificações de aprovação", + "policyRevisionNew": "Nova", + "policyPerTransferCap": "Limite por transferência", + "policyDailyCap": "Limite diário", + "policyPositiveNumber": "Informe um número positivo.", + "policyAddressPlaceholder": "endereço 9xQeWvG816bUx9EPfuxEzHh9VY5k...", + "policyDisable": "Desativar", + "policyApprovalRequest": " / Aprovação {id}", + "playgroundProviderField": "Provedor", + "playgroundLabelField": "Rótulo", + "playgroundPurposeField": "Finalidade", + "playgroundMemoField": "Memo", + "policyOperationEditorDescription": "As famílias selecionadas são negadas antes da assinatura ou execução. As famílias não selecionadas continuam usando permitir por padrão, a menos que outra regra se aplique.", + "policyDestinationEditorDescription": "Cole endereços da Solana separados por quebras de linha, vírgulas, ponto e vírgula, tabulações ou uma coluna CSV.", + "policyInvalidAddress": "Endereço inválido: {addresses}", + "policyInvalidAddresses": "Endereços inválidos: {addresses}", + "policyApprovalEditorDescription": "As famílias selecionadas pausam com uma decisão de política de aprovação necessária. O roteamento da caixa de entrada de aprovações é tratado pelo fluxo de aprovação subsequente.", + "policyAdvancedEditorDescription": "Esses controles são intencionalmente rígidos porque podem contornar a intenção de pagamento de alto nível.", + "providerCategoryApi": "API", + "providerCategoryApiDescription": "Infraestrutura de Wallet para produtos, operações e fluxos automatizados orientados por API.", + "providerCategoryInstitutional": "Institucional", + "providerCategoryInstitutionalDescription": "Custódia baseada em políticas para tesouraria, liquidação e fluxos de aprovação multipartes.", + "existingApiKeysDescription": "Chaves ativas e históricas deste espaço de trabalho.", + "apiKeysViewOnly": "Você pode visualizar chaves de API, mas somente administradores podem criá-las, rotacioná-las ou excluí-las.", + "apiKeyRotationHint": "Dica de rotação: rotacione apenas chaves ativas. O dashboard usa um período de carência de 24 horas; use a API para valores de carência personalizados (0-168h). Os segredos de novas chaves são exibidos uma única vez.", + "apiKeyStepDetails": "Detalhes", + "apiKeyStepPermissions": "Permissões", + "apiKeyStepWalletAccess": "Acesso à Wallet", + "apiKeyStepReview": "Revisão", + "apiKeyAuthoringProgress": "Progresso da criação da chave de API", + "apiKeyDetailsTitle": "Detalhes da chave", + "apiKeyDetailsDescription": "Nomeie a chave e escolha quando ela deve expirar.", + "apiKeyIdentity": "Identidade da chave", + "apiKeyPermissionsTitle": "Permissões de endpoint", + "apiKeyPermissionsDescription": "Escolha quais endpoints da SDP esta chave pode acessar.", + "apiKeyRoleFixedOnEdit": "A função permanece fixa após a criação. O escopo de Wallet e de política ainda pode ser atualizado.", + "apiKeyRoleDescription": { + "api_admin": "Acesso completo aos endpoints, incluindo operações administrativas.", + "api_developer": "Acesso padrão a Token, pagamento, contraparte, Wallet, compliance e webhook.", + "api_readonly": "Acesso somente leitura a recursos operacionais e dados de auditoria." + }, + "apiKeyFullEndpointAccess": "Acesso completo aos endpoints", + "apiKeyPermissionCount": "Permissões de endpoint: {count}", + "apiKeyPermissionsSeparateFromPolicy": "As permissões de endpoint determinam o alcance. Os controles de Wallet e as restrições da chave de API são avaliados separadamente para cada operação.", + "apiKeyWalletPolicyTitle": "Acesso de Wallet e política", + "apiKeyWalletPolicyDescription": "Escolha onde esta chave pode assinar e quais controles adicionais se aplicam.", + "apiKeyAllWalletsHelper": "Esta chave pode alcançar as Wallets permitidas por suas permissões de endpoint.", + "apiKeySelectedWalletCount": "Wallets selecionadas ({count})", + "apiKeySearchWallets": "Buscar Wallets", + "apiKeyNoWalletSearchResults": "Nenhuma Wallet corresponde a esta busca.", + "apiKeySelectWallet": "Selecionar {wallet}", + "apiKeyMakeDefaultWallet": "Tornar {wallet} a Wallet de assinatura padrão", + "apiKeyMakeDefaultSigningWallet": "Tornar a Wallet de assinatura padrão", + "apiKeyWalletControlsEnforced": "Os controles de Wallet são sempre aplicados.", + "apiKeyWalletControlsDescription": "As restrições da chave de API podem restringir ainda mais esses controles, mas não podem contorná-los nem substituí-los.", + "apiKeyNoWalletBaseline": "Nenhuma linha de base de controle de Wallet está disponível até que uma Wallet seja selecionada.", + "apiKeyPolicyStatusDefaultAllow": "Permitir por padrão", + "apiKeyPolicyStatusDraft": "Rascunho", + "apiKeyPolicyStatusDisabled": "Desativado", + "apiKeyActiveRevision": "Revisão {revision}", + "apiKeyRestrictionsTitle": "Restrições da chave de API", + "apiKeyAddRestrictions": "Adicionar restrições da chave de API", + "apiKeyNoAdditionalRestrictions": "Nenhuma restrição adicional da chave de API", + "apiKeyRestrictionsNarrowCopy": "Essas restrições restringem ainda mais o acesso, além dos controles de Wallet.", + "apiKeyExistingRestrictionsActive": "Restrições ativas da chave de API", + "apiKeyExistingRestrictionsPreserved": "O perfil ativo permanece inalterado até que você substitua explicitamente os detalhes de suas restrições.", + "apiKeyExistingRestrictionsPreservedShort": "Restrições existentes preservadas", + "apiKeyReplaceRestrictionDetails": "Substituir detalhes das restrições", + "apiKeyAdditionalDefaultAction": "Restrição adicional: ação padrão", + "apiKeyAdditionalOperationFamilies": "Restrição adicional: famílias de operações", + "apiKeyAdditionalOperationTypes": "Restrição adicional: tipos de operação", + "apiKeyAdditionalAssets": "Restrição adicional: ativos", + "apiKeyAdditionalAmounts": "Restrição adicional: limites de valor", + "apiKeyAdditionalDestinations": "Restrição adicional: destinos", + "apiKeyAdditionalApprovals": "Restrição adicional: requisitos de aprovação", + "apiKeyFamilyTransfer": "Transferências", + "apiKeyFamilyPayment": "Pagamentos", + "apiKeyFamilyRamp": "Ramps", + "apiKeyFamilyIssuance": "Emissão", + "apiKeyFamilyRawSign": "Assinatura bruta", + "apiKeyFamilyProgram": "Interações com programas", + "apiKeyFamilyProviderAdmin": "Administração do provedor", + "apiKeyOperationTypesPlaceholder": "payment_transfer_execute, token_mint", + "apiKeyAssetsPlaceholder": "USDC, SOL", + "apiKeyMaximumAmount": "Valor máximo da operação", + "apiKeyMaximumAmountPlaceholder": "2500", + "apiKeyDestinationsPlaceholder": "Cole os endereços da Solana permitidos", + "apiKeyRequireApproval": "Exigir aprovação para operações alcançáveis", + "apiKeyRequireApprovalDescription": "As operações correspondentes pausam até que uma decisão de aprovação seja registrada.", + "apiKeyRestrictionAmountInvalid": "Informe um valor decimal positivo.", + "apiKeyReviewTitle": "Revisar chave de API", + "apiKeyReviewDescription": "Confirme a identidade, o alcance de endpoints, os controles de Wallet e as restrições adicionais.", + "apiKeyReviewIdentity": "Identidade da chave", + "apiKeyReviewPermissions": "Permissões de endpoint", + "apiKeyReviewWalletAccess": "Acesso à Wallet", + "apiKeyReviewWalletBaseline": "Linha de base do controle de Wallet", + "apiKeyReviewRestrictions": "Restrições adicionais da chave de API", + "apiKeyReviewBindingChanges": "Alterações de vinculação", + "apiKeyRestrictionRuleCount": "Regras de restrição adicionais: {count}", + "apiKeyDefaultAllowWarning": "Os controles de Wallet usam permitir por padrão para: {wallets}.", + "apiKeyRestrictionNoReachableWalletWarning": "As restrições da chave de API estão configuradas, mas nenhuma Wallet selecionada está alcançável.", + "apiKeySummaryTitle": "Resumo da chave", + "apiKeySummaryPermissions": "Permissões", + "apiKeySummarySelectedWallets": "Wallets selecionadas", + "apiKeySummaryWalletBaseline": "Linha de base do controle de Wallet", + "apiKeySummaryRestrictions": "Restrições da chave de API", + "apiKeySummaryBindingScope": "Escopo de vinculação", + "apiKeyAllReachableWallets": "Todas as Wallets alcançáveis", + "apiKeyWalletControlsAlwaysApply": "Os controles de Wallet sempre se aplicam. As restrições da chave de API apenas restringem ainda mais o acesso resultante.", + "apiKeyNoPolicyBindings": "Nenhuma vinculação de política será criada", + "apiKeyBindingsUnchanged": "As vinculações existentes permanecem inalteradas", + "apiKeyBindingsWillClear": "As vinculações existentes serão removidas após a confirmação", + "apiKeyBindingsWillCreate": "As restrições serão vinculadas a este escopo de Wallet", + "apiKeyBindingsWillReplace": "As vinculações existentes serão substituídas após a confirmação", + "apiKeyRestrictionReplacementRequired": "Substitua os detalhes das restrições existentes antes de alterar o escopo de Wallet desta chave.", + "apiKeyAffectedWallets": "Wallets afetadas", + "apiKeyReplaceBindings": "Substituir vinculações", + "apiKeyClearBindings": "Remover vinculações", + "apiKeyReplaceBindingsTitle": "Substituir vinculações de política?", + "apiKeyClearBindingsTitle": "Remover vinculações de política?", + "apiKeyReplaceBindingsDescription": "As vinculações atuais dessas Wallets serão removidas e substituídas pelo escopo proposto.", + "apiKeyClearBindingsDescription": "As vinculações atuais dessas Wallets serão removidas. Os controles de Wallet continuarão a se aplicar.", + "apiKeySaveChanges": "Salvar alterações", + "apiKeyUpdated": "Chave de API \"{name}\" atualizada.", + "apiKeySaveFailed": "Não foi possível salvar a chave de API: {error}", + "apiKeyEditMissingId": "O ID da chave de API é necessário para salvar as alterações.", + "apiKeyReplaceBindingsConfirmationRequired": "Confirme Substituir vinculações antes de salvar esta alteração de vinculação.", + "apiKeyClearBindingsConfirmationRequired": "Confirme Remover vinculações antes de salvar esta alteração de vinculação.", + "policyAssetsInWallet": "Nesta Wallet", + "policyAssetsCommon": "Tokens comuns", + "policyAssetsIssued": "Seus Tokens" + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-issuance.json b/apps/sdp-web/messages/pt/dashboard-issuance.json new file mode 100644 index 000000000..9f5206289 --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-issuance.json @@ -0,0 +1,1276 @@ +{ + "DashboardIssuance": { + "transactions": { + "title": "Transações", + "description": "Operações recentes do Token", + "loading": "Carregando histórico de operações…", + "empty": "Nenhuma transação ainda.", + "type": "Tipo", + "status": "Status", + "signature": "Assinatura", + "created": "Criado", + "showing": "Mostrando as primeiras {count} transações{total}. Use a paginação para ver registros mais antigos.", + "loadError": "Não foi possível carregar as transações.", + "noMatches": "Nenhuma transação corresponde a esses filtros.", + "filterByType": "Filtrar por tipo", + "filterAllTypes": "Todos os tipos", + "filterByStatus": "Filtrar por status", + "filterAllStatuses": "Todos os status" + }, + "pagination": { + "range": "{start}–{end} de {total}", + "rangeAssets": "Ativos · {start}–{end} de {total}" + }, + "errors": { + "unknown": "Erro desconhecido", + "requestFailed": "Falha na solicitação", + "unavailable": "indisponível", + "apiRequestFailed": "API de {resource} {status}: {error}", + "tokenResource": "Token", + "templateResource": "Modelo", + "walletResource": "Wallet", + "tokenListRetry": "Não conseguimos carregar a lista de Tokens agora. Atualize a página para tentar novamente.", + "tokenListCreateOrRetry": "Não conseguimos carregar a lista de Tokens agora. Você ainda pode criar um Token ou tentar novamente em instantes.", + "unableToLoadTemplates": "Não foi possível carregar os modelos", + "unableToLoadTokens": "Não foi possível carregar os Tokens", + "unableToLoadSignerWallets": "Não foi possível carregar as Wallets signatárias.", + "mintUnavailable": "Mint indisponível — {reason}", + "burnUnavailable": "Burn indisponível — {reason}", + "assetProfileNotFound": "Perfil do ativo não encontrado.", + "assetProfileLoadFailed": "Não foi possível carregar o perfil do ativo ({status}): {error}", + "tokenDetailsSaveFailed": "Não foi possível salvar os detalhes do Token ({status}): {error}", + "assetProfileUpdateFailed": "Os detalhes do Token foram salvos, mas a atualização do perfil do ativo falhou ({status}): {error}. Tente novamente.", + "changesSaved": "Alterações salvas.", + "unableToSaveChanges": "Não foi possível salvar as alterações.", + "assetProfilesDisabled": "Os perfis de ativo não estão ativados para este ambiente.", + "assetDraftCreateFailed": "Não foi possível criar o rascunho do ativo ({status}): {error}", + "assetDraftCreated": "Rascunho do ativo criado.", + "unableToCreateAssetDraft": "Não foi possível criar o rascunho do ativo.", + "metadataUriHttp": "O URI de metadados deve usar http ou https.", + "metadataUriValid": "O URI de metadados deve ser uma URL válida.", + "tokenNameRequired": "O nome do Token é obrigatório.", + "symbolFormat": "O símbolo deve ter de 1 a 10 caracteres, usando letras, números ou pontos.", + "invalidTemplate": "Seleção de modelo inválida.", + "decimalsRange": "Os decimais devem estar entre 0 e 18.", + "createFailed": "Falha ao criar ({status}): {error}", + "draftCreated": "Rascunho {name} criado. Faça o deploy on-chain a partir da página do Token.", + "unexpected": "Erro inesperado", + "symbolRequired": "O símbolo é obrigatório.", + "symbolCharacters": "Use de 1 a 10 letras, números ou pontos.", + "decimalsWholeNumber": "Informe um número inteiro entre 0 e 18.", + "maxSupplyPositive": "Informe um valor maior que zero ou deixe em branco para ilimitado.", + "maxSupplyPrecision": "Use no máximo {decimals} casas decimais, para corresponder aos decimais deste Token.", + "descriptionRequired": "A descrição é obrigatória.", + "descriptionTooLong": "A descrição deve ter no máximo {max} caracteres.", + "validUrl": "Informe uma URL válida (https://…).", + "fieldRequired": "{field} é obrigatório.", + "field": "Campo", + "classificationRequired": "Escolha uma classificação e um subtipo de ativo.", + "assetNameRequired": "O nome do ativo é obrigatório.", + "settingValuesRequired": "Informe os valores obrigatórios para as configurações selecionadas.", + "settingValueRequired": "Obrigatório", + "settingConflict": "Algumas configurações selecionadas não podem ser combinadas. Remova uma para continuar.", + "signerRequiredForSettings": "Selecione uma Wallet signatária — ela é obrigatória para as configurações avançadas escolhidas." + }, + "controlLists": { + "title": "Listas de controle", + "controlList": "Lista de controle", + "entriesTitle": "Entradas de {label}", + "descriptionWithList": "Entradas de {label} e status de conta congelada", + "descriptionWithoutList": "Status de conta congelada", + "entriesCount": "Entradas: {count}", + "showingEntries": "Mostrando as primeiras {count} entradas.", + "frozenAccounts": "Contas congeladas", + "accountsCount": "Contas: {count}", + "showingAccounts": "Mostrando as primeiras {count} contas.", + "searchPlaceholder": "Buscar {label}…", + "allLabels": "Todos os rótulos", + "noMatches": "Nenhuma entrada corresponde à sua busca.", + "filterByLabel": "Filtrar por rótulo", + "loading": "Carregando entradas…", + "loadError": "Não foi possível carregar as entradas." + }, + "wallet": { + "none": "Nenhuma", + "unlabeled": "Wallet sem rótulo", + "walletId": "ID da Wallet", + "publicKey": "Chave pública", + "copy": "Copiar {label}", + "copied": "Copiado: {label}", + "unableToCopy": "Não foi possível copiar {label}", + "customAddress": "Endereço personalizado", + "chooseOrPaste": "Escolha uma Wallet ou cole um endereço Solana", + "clear": "Limpar {label}", + "selectExisting": "Selecione uma Wallet existente", + "filterHint": "Digite para filtrar as Wallets existentes, use o menu suspenso ou cole qualquer endereço Solana." + }, + "saveBar": { + "unsaved": "Você tem alterações não salvas", + "unsavedWithErrors": "Alterações não salvas — {count} campo{suffix} para revisar", + "discard": "Descartar", + "save": "Salvar alterações", + "saving": "Salvando…" + }, + "confirmation": { + "notNow": "Agora não" + }, + "modal": { + "close": "Fechar modal", + "closeConfirmation": "Fechar modal de confirmação", + "tokenManagementAction": "Ação de gerenciamento de Token" + }, + "signer": { + "label": "Signatário", + "select": "Selecione uma Wallet signatária", + "requiredAuthorityHint": "A SDP assinará esta ação com a Wallet de autoridade necessária.", + "selectedWalletHint": "A SDP assinará esta transação com a Wallet selecionada.", + "defaultSignerHint": "Nenhuma Wallet signatária disponível — a SDP usará o signatário padrão do projeto.", + "noneAvailable": "Nenhuma Wallet signatária disponível." + }, + "header": { + "tokenLogo": "Logo do Token {name}", + "notDeployed": "Sem deploy", + "copyTokenAddress": "Copiar endereço do Token", + "tokenId": "ID do Token", + "copyTokenId": "Copiar ID do Token", + "explorer": "Explorer", + "deploy": "Deploy", + "unpause": "Retomar" + }, + "create": { + "title": "Criar novo rascunho de Token", + "closeModal": "Fechar modal de criação de Token", + "createDraft": "Criar rascunho", + "requiredFields": "Os campos marcados com * são obrigatórios.", + "required": "(obrigatório)", + "tokenName": "Nome do Token", + "tokenNamePlaceholder": "ex.: USD Coin", + "symbol": "Símbolo", + "symbolPlaceholder": "ex.: USDC", + "decimals": "Decimais", + "decimalsPlaceholder": "ex.: 6", + "decimalsError": "Informe um número inteiro entre 0 e 18.", + "stablecoinDecimalsHelper": "Stablecoin usa 6 casas decimais por padrão, mas você pode escolher qualquer valor de 0 a 18.", + "customDecimalsHelper": "Tokens personalizados usam 9 casas decimais por padrão. Escolha qualquer valor de 0 a 18.", + "tokenizedSecurityDecimalsHelper": "Valor Mobiliário Tokenizado usa 8 casas decimais por padrão, mas você pode escolher qualquer valor de 0 a 18.", + "decimalsHelper": "Escolha qualquer valor de 0 a 18.", + "back": "Voltar", + "continue": "Continuar", + "mainSigner": "Signatário principal", + "selectSignerWallet": "Selecionar Wallet signatária", + "mainSignerHint": "Essa Wallet será usada como o signatário principal do Token para o deploy e para futuras ações do Token.", + "loadingSignerWallets": "Carregando Wallets signatárias…", + "noControlledWallets": "Nenhuma Wallet controlada está disponível ainda. O Token usará o signatário padrão atual.", + "transferControls": "Controles de transferência", + "transferControlsHint": "Escolha como este Token deve tratar endereços de destino aprovados ou bloqueados.", + "creating": "Criando...", + "creatingDraft": "Criando rascunho de Token.", + "unableToLoadSignerWallets": "Não foi possível carregar as Wallets signatárias.", + "unableToCreateDraft": "Não foi possível criar o rascunho de Token.", + "draftCreated": "Rascunho criado. Faça o deploy on-chain a partir da página do Token.", + "configureDraft": "Configure o rascunho agora e depois faça o deploy on-chain a partir da página do Token.", + "chooseTemplate": "Escolha um modelo para criar um rascunho primeiro e depois faça o deploy on-chain.", + "stablecoinTemplateName": "Stablecoin", + "tokenizedSecurityTemplateName": "Valor Mobiliário Tokenizado", + "customTemplateName": "Token Personalizado", + "stablecoinTemplateDescription": "Crie uma stablecoin em conformidade regulatória com restrições de transferência.", + "tokenizedSecurityTemplateDescription": "Crie um Token de valor mobiliário em conformidade, com valores de UI escalonados e controles principais.", + "customTemplateDescription": "Crie seu próprio Token com controle total sobre extensões e parâmetros.", + "createStablecoinDraft": "Criar rascunho de Stablecoin", + "createTokenizedSecurityDraft": "Criar rascunho de Valor Mobiliário Tokenizado", + "createCustomTokenDraft": "Criar rascunho de Token Personalizado", + "createTokenDraft": "Criar rascunho de Token", + "denylist": "Denylist", + "allowlist": "Allowlist", + "disabled": "Desativado", + "denylistDescription": "Os destinos listados são bloqueados antes de poderem receber ações controladas.", + "allowlistDescription": "Somente destinos aprovados podem receber ações controladas do Token.", + "disabledDescription": "Este Token não usará uma lista de controle de transferência.", + "stablecoinDenylistNote": "Padrão recomendado para stablecoins.", + "stablecoinAllowlistNote": "Use quando as transferências precisarem ficar restritas a um conjunto conhecido de Wallets.", + "securityAllowlistNote": "Padrão para valores mobiliários tokenizados.", + "securityDenylistNote": "Use quando o Token deve permanecer aberto, exceto para Wallets bloqueadas.", + "customDisabledNote": "Ideal para Tokens personalizados sem restrições.", + "customAllowlistNote": "Ative isso quando o Token precisar de acesso restrito de transferência." + }, + "status": { + "draft": "Rascunho", + "active": "Ativo", + "paused": "Pausado", + "revoked": "Revogado" + }, + "tabs": { + "overview": "Visão geral", + "details": "Detalhes", + "publicInformation": "Informações públicas", + "compliance": "Compliance", + "operations": "Operações", + "permissions": "Permissões", + "activity": "Atividade" + }, + "activity": { + "title": "Histórico de auditoria", + "description": "Todas as ações de gerenciamento registradas para este ativo.", + "filterLabel": "Ação", + "filterAll": "Todas as ações", + "filterAllStatuses": "Todos os status", + "filterAllTypes": "Todos os tipos", + "columnAction": "Ação", + "columnActor": "Ator", + "columnActorType": "Tipo", + "columnStatus": "Status", + "columnTime": "Hora", + "actorWorkflow": "Fluxo de trabalho", + "actorApiKey": "Chave de API", + "actorUser": "Membro da equipe", + "statusSuccess": "Sucesso", + "statusFailure": "Falhou", + "empty": "Nenhuma atividade registrada ainda.", + "loading": "Carregando atividade…", + "error": "Não foi possível carregar a atividade.", + "recentTitle": "Atividade recente", + "viewAll": "Ver tudo" + }, + "permissions": { + "managedBadge": "Gerenciado pela SDP", + "externalBadge": "Externo", + "externalWarningTitle": "Autoridades externas detectadas para", + "externalWarningBody": "A SDP não pode assinar por autoridades mantidas fora da custódia, portanto as ações relacionadas ficam indisponíveis até que sejam transferidas para uma Wallet de custódia da SDP.", + "externalRemediationTarget": "Transfira essas autoridades para sua Wallet de custódia da SDP:", + "externalRemediationNoWallet": "Crie uma Wallet de custódia da SDP e depois transfira essas autoridades para ela.", + "externalRemediationNote": "O detentor atual da autoridade deve assinar a transferência a partir da própria Wallet — a SDP não pode fazer isso.", + "createWallet": "Criar Wallet de custódia" + }, + "workspace": { + "tokenLoadWarning": "Aviso de carregamento do Token", + "tokenPaused": "O Token está pausado", + "pausedHint": "As ações de mint, burn e transferência administrativa ficam desativadas até que o Token seja retomado.", + "unpauseToken": "Retomar Token", + "deployToken": "Fazer deploy do Token", + "deployHint": "Isso fará o deploy do Token on-chain para que as operações possam ser executadas.", + "cancel": "Cancelar", + "deployNow": "Fazer deploy agora", + "runningAction": "Executando ação...", + "tokenListUnavailable": "Lista de Tokens indisponível", + "search": "Buscar", + "createDraft": "Criar rascunho", + "addNewToken": "Adicionar novo Token", + "noTokensMatch": "Nenhum ativo corresponde à sua busca ou filtros atuais.", + "tokenLogo": "Logo de {name}", + "type": "Tipo", + "supply": "Fornecimento", + "created": "Criado", + "manage": "Gerenciar", + "viewSwitchToList": "Alternar para visualização em lista", + "viewSwitchToGrid": "Alternar para visualização em grade", + "collapseAll": "Recolher tudo", + "expandAll": "Expandir tudo", + "manageAsset": "Gerenciar {name}", + "active": "Ativo", + "draft": "Rascunho", + "filters": "Filtros", + "filtersTitle": "Filtrar e ordenar", + "filterStatus": "Status", + "filterTemplate": "Modelo", + "filterDate": "Criado", + "filterSort": "Ordenar por", + "statusAll": "Todos os status", + "templateAll": "Todos os modelos", + "dateAll": "Todo o período", + "date7d": "Últimos 7 dias", + "date30d": "Últimos 30 dias", + "date12m": "Últimos 12 meses", + "sortNewest": "Mais recentes primeiro", + "sortOldest": "Mais antigos primeiro", + "sortNameAsc": "Nome A–Z", + "sortNameDesc": "Nome Z–A", + "clearFilters": "Limpar tudo", + "noTokensOnPage": "Nenhum ativo nesta página.", + "loadingAssets": "Carregando ativos…" + }, + "list": { + "toggleDetails": "Alternar detalhes de {name}", + "closeDetails": "Fechar detalhes de {name}", + "close": "Fechar", + "assetsCount": "Ativos · {count}", + "manageThisAsset": "Gerenciar este ativo", + "viewOnExplorer": "Ver no explorer", + "copyMintAddress": "Copiar endereço do mint", + "copied": "Copiado", + "unableToCopy": "Não foi possível copiar o endereço", + "type": "Tipo", + "decimals": "Decimais", + "supply": "Fornecimento", + "maxSupply": "Fornecimento máximo", + "unlimited": "Ilimitado", + "transfers": "Transferências", + "restricted": "Restrito", + "unrestricted": "Irrestrito", + "website": "Site", + "mintAddress": "Endereço do mint", + "created": "Criado em", + "yes": "Sim", + "no": "Não" + }, + "management": { + "tokenAmountDescription": "Unidades de Token (ex.: 1 ou 1,5). Será convertido para unidades brutas usando os decimais deste Token.", + "untitledToken": "Token sem título", + "allowlist": "Allowlist", + "denylist": "Denylist", + "allowlistDescription": "Gerencie os endereços de destino aprovados para este Token.", + "denylistDescription": "Gerencie os endereços de destino bloqueados para este Token.", + "allowlistSummaryDescription": "Entradas da allowlist e status de conta congelada", + "denylistSummaryDescription": "Entradas da denylist e status de conta congelada", + "allowlistEntries": "Entradas da allowlist", + "denylistEntries": "Entradas da denylist", + "addAllowlistEntry": "Adicionar entrada à allowlist", + "addDenylistEntry": "Adicionar entrada à denylist", + "removeEntry": "Remover entrada", + "noAllowlistEntries": "Ainda não há entradas na allowlist.", + "noDenylistEntries": "Ainda não há entradas na denylist.", + "allowlistAddressRequired": "O endereço da allowlist é obrigatório.", + "denylistAddressRequired": "O endereço da denylist é obrigatório.", + "allowlistExtensionHelper": "Os destinos de mint e de transferência controlada devem estar na allowlist do Token.", + "denylistExtensionHelper": "Os destinos listados ficam bloqueados para operações de mint e transferência controlada.", + "denylistFreezeHint": "Precisa restringir uma Wallet antes que ela tenha uma conta de Token? Adicione-a à denylist primeiro.", + "defaultAccountState": "Default Account State", + "defaultAccountStateHelper": "Estado padrão para contas de Token recém-criadas.", + "transferFee": "Transfer Fee", + "transferFeeHelper": "Configuração de taxas para transferências de Token.", + "scaledUiAmount": "Scaled UI Amount", + "scaledUiAmountHelper": "Controles do multiplicador de fornecimento exibido na UI.", + "transferHook": "Transfer Hook", + "transferHookHelper": "Hook de programa com lógica de transferência personalizada.", + "interestBearing": "Interest Bearing", + "interestBearingHelper": "Atualizações de saldo baseadas em taxa de juros.", + "nonTransferable": "Non-transferable", + "nonTransferableHelper": "Desativa transferências padrão entre contas.", + "template": "Modelo", + "templateHelper": "Modelo base aplicado a este Token.", + "mintable": "Pode fazer mint", + "mintableHelper": "Permite operações de mint após o deploy.", + "freezable": "Congelável", + "freezableHelper": "Permite controles de congelamento e descongelamento de conta.", + "configured": "Configurado", + "enabled": "Ativado", + "disabled": "Desativado", + "overview": "Visão geral", + "permissions": "Permissões", + "permissionsDescription": "Chaves on-chain que controlam mint, congelamento e metadados deste Token.", + "extensions": "Extensões", + "extensionsDescription": "Configuradas na criação e somente leitura após o deploy.", + "edit": "Editar", + "compliance": "Compliance", + "metadata": "Metadados", + "operations": "Operações", + "mintTokens": "Mint de Tokens", + "mintHelper": "Cria novo fornecimento em uma Wallet de destino ou conta de Token.", + "mint": "Mint", + "burnTokens": "Burn de Tokens", + "burnHelper": "Remove fornecimento de uma Wallet de origem ou conta de Token.", + "burn": "Burn", + "lockSupplyTitle": "Bloquear fornecimento on-chain", + "lockSupplyHelper": "Faça mint do restante até o fornecimento máximo e, em seguida, revogue permanentemente a Mint Authority.", + "lockSupplyAction": "Bloquear", + "lockSupplyDescription": "Isso faz mint do fornecimento restante e depois revoga a Mint Authority, transformando seu fornecimento máximo em um limite real on-chain, em vez de um limite de política da SDP.", + "lockSupplyDescriptionRevokeOnly": "O fornecimento já atingiu o máximo. Isso revoga a Mint Authority, tornando o total atual permanente on-chain.", + "lockSupplyCurrentSupply": "Fornecimento atual", + "lockSupplyMaxSupply": "Fornecimento máximo", + "lockSupplyWillMint": "Mint a ser feito agora", + "lockSupplyDestination": "Destino", + "lockSupplyDestinationHint": "Wallet ou conta de Token que recebe o fornecimento recém-criado pelo mint.", + "lockSupplyImpact": "Nenhum {symbol} adicional poderá ser criado, nem mesmo pela SDP. Essa ação não pode ser desfeita.", + "lockSupplyConfirm": "Bloquear fornecimento", + "lockSupplyRetryRevoke": "Revogar novamente", + "lockSupplyPartialTitle": "Parcialmente concluído", + "lockSupplyPartialBody": "O mint do fornecimento foi concluído, mas a Mint Authority não foi revogada, portanto ela ainda está ativa. Tente novamente para concluir — não será feito um novo mint do restante.", + "lockSupplyMintLabel": "Fazer mint do fornecimento restante", + "lockSupplyRevokeLabel": "Revogar a Mint Authority", + "lockSupplyMinting": "Fazendo mint de {amount}…", + "lockSupplyMinted": "Mint de {amount} concluído. Revogando a Mint Authority em seguida…", + "lockSupplyRevoking": "Revogando a Mint Authority…", + "lockSupplyLocked": "O fornecimento agora está bloqueado on-chain.", + "lockSupplyNoMaxSupply": "Defina um fornecimento máximo antes de bloquear o fornecimento on-chain.", + "lockSupplyAlreadyLocked": "O fornecimento já está bloqueado — a Mint Authority foi revogada.", + "lockSupplyAmountUnavailable": "Não foi possível calcular o fornecimento restante deste Token.", + "lockSupplyDestinationRequired": "Informe um destino para o fornecimento recém-criado pelo mint.", + "unableToLoadData": "Não foi possível carregar os dados de gerenciamento do Token.", + "supportingDataRequestFailed": "A solicitação de dados de suporte do Token falhou ({status}).", + "supportingDataEmpty": "A resposta de dados de suporte do Token estava vazia.", + "authorityWalletRequestFailed": "A solicitação da Wallet de autoridade falhou ({status}).", + "unableToLoadSignerWallets": "Não foi possível carregar as Wallets signatárias.", + "loadingSignerWallets": "Carregando Wallets signatárias…", + "onlyAdminsCanEditAuthorities": "Somente administradores podem editar as autoridades do Token.", + "deployToken": "Fazer deploy do Token", + "deployHelper": "Faça o deploy deste Token on-chain antes de executar outras operações de fundos.", + "deployConfirmationTitle": "Fazer deploy do Token?", + "deployConfirmationDescription": "Isso enviará a transação de deploy on-chain.", + "deployNow": "Fazer deploy agora", + "copied": "Copiado", + "unableToCopy": "Não foi possível copiar", + "tokenNameRequired": "O nome do Token é obrigatório.", + "updateToken": "Atualizar Token", + "submittingDeploy": "Enviando transação de deploy...", + "deployFinalized": "Transação de deploy finalizada.", + "refreshSupply": "Atualizar fornecimento", + "mintDetailsRequired": "O destino do mint e o valor são obrigatórios.", + "amountPositive": "O valor deve ser um número positivo.", + "mintConfirmationTitle": "Fazer mint de Tokens?", + "mintConfirmationDescription": "Isso enviará uma transação de mint on-chain.", + "mintNow": "Fazer mint agora", + "submittingMint": "Enviando transação de mint...", + "mintFinalized": "Transação de mint finalizada.", + "burnDetailsRequired": "A origem do burn e o valor são obrigatórios.", + "burnConfirmationTitle": "Fazer burn de Tokens?", + "burnConfirmationDescription": "Isso enviará uma transação de burn on-chain.", + "burnNow": "Fazer burn agora", + "submittingBurn": "Enviando transação de burn...", + "burnFinalized": "Transação de burn finalizada.", + "seizeDetailsRequired": "A origem, o destino e o valor da transferência forçada são obrigatórios.", + "seizeConfirmationTitle": "Forçar transferência?", + "seizeConfirmationDescription": "Isso enviará uma transação de transferência forçada (seize) on-chain.", + "transferNow": "Forçar transferência agora", + "submittingForceTransfer": "Enviando transação de transferência forçada...", + "forceTransferFinalized": "Transação de transferência forçada finalizada.", + "forceBurnDetailsRequired": "A origem e o valor do burn forçado são obrigatórios.", + "forceBurnConfirmationTitle": "Forçar burn de Tokens?", + "forceBurnConfirmationDescription": "Isso enviará uma transação de burn forçado on-chain.", + "forceBurnNow": "Forçar burn agora", + "submittingForceBurn": "Enviando transação de burn forçado...", + "forceBurnFinalized": "Transação de burn forçado finalizada.", + "updateAuthority": "Atualizar autoridade", + "updateAuthorityLabel": "Atualizar {authority}", + "updatingAuthority": "Atualizando {authority}...", + "authorityUpdated": "{authority} atualizada.", + "authorityConfirmationTitle": "Atualizar autoridade?", + "authorityConfirmationDescription": "Isso enviará uma transação de atualização de autoridade on-chain.", + "updateNow": "Atualizar agora", + "submittingAuthority": "Enviando transação de atualização de autoridade...", + "authorityFinalized": "Atualização de autoridade finalizada.", + "pauseToken": "Pausar Token", + "unpauseToken": "Retomar Token", + "pauseConfirmationTitle": "Pausar Token?", + "unpauseConfirmationTitle": "Retomar Token?", + "pauseConfirmationDescription": "Isso enviará uma transação de pausa on-chain.", + "unpauseConfirmationDescription": "Isso enviará uma transação de retomada on-chain.", + "pauseNow": "Pausar agora", + "unpauseNow": "Retomar agora", + "submittingPause": "Enviando transação de pausa...", + "submittingUnpause": "Enviando transação de retomada...", + "pauseFinalized": "Transação de pausa finalizada.", + "unpauseFinalized": "Transação de retomada finalizada.", + "accountAddressRequired": "O endereço da conta é obrigatório.", + "unfreezeAccount": "Descongelar conta", + "unfreezeConfirmationTitle": "Descongelar conta?", + "unfreezeConfirmationDescription": "Isso enviará uma transação de descongelamento on-chain.", + "unfreezeNow": "Descongelar agora", + "submittingUnfreeze": "Enviando transação de descongelamento...", + "unfreezeFinalized": "Transação de descongelamento finalizada.", + "freezeAccount": "Congelar conta", + "freezeConfirmationTitle": "Congelar conta?", + "freezeConfirmationDescription": "Isso enviará uma transação de congelamento on-chain.", + "freezeNow": "Congelar agora", + "submittingFreeze": "Enviando transação de congelamento...", + "freezeFinalized": "Transação de congelamento finalizada.", + "removeAllowlistEntry": "Remover entrada da allowlist", + "tokenIdCopied": "ID do Token copiado", + "loadingAuthorityWalletAccess": "Carregando acesso da Wallet de autoridade…", + "loadingComplianceControls": "Carregando controles de Compliance…", + "deploySignerHint": "As taxas de transação e de conta são pagas pela Wallet signatária.", + "deployWithWallet": "Fazer deploy com Wallet", + "koraUnavailable": "O patrocínio da Kora não está disponível no momento.", + "deployWithKora": "Fazer deploy com Kora", + "tokenizationEngineTitle": "Motor de tokenização", + "tokenizationEngineHint": "Escolha qual motor faz o deploy e gerencia este Token on-chain.", + "engineVulcanForgeName": "Vulcan Forge", + "engineVulcanForgeDescription": "Faça o deploy on-chain e tokenize na Vulcan Forge, com registro e indexação integrados.", + "engineMosaicName": "SDP com Mosaic", + "engineMosaicDescription": "Faça o deploy com o motor Mosaic integrado da SDP em Token-2022.", + "comingSoon": "Em breve", + "stepProgress": "Etapa {current} de {total}", + "vulcanForgeOnboardTitle": "Integrar o Token à Vulcan Forge", + "vulcanForgeOnboardDescription": "A AlphaLedger mantém uma réplica offline registrada para indexação e relatórios.", + "engineStepLabel": "Motor", + "deployStepLabel": "Deploy", + "destinationNotAllowlisted": "O destino não está na allowlist deste Token.", + "destinationDenylisted": "O destino está na denylist deste Token.", + "actionPaused": "O Token está pausado. Retome-o para {action}.", + "actionRequiresActive": "O Token precisa estar ativo para {action}.", + "actionRevoked": "O Token foi revogado e não pode mais {action}.", + "forceTransfer": "transferência forçada", + "forceBurn": "burn forçado", + "mintingDisabled": "O mint está desativado para este Token.", + "noMintAuthorityConfigured": "Nenhuma Mint Authority está configurada.", + "maximumSupplyReached": "O fornecimento máximo já foi atingido.", + "supplyZero": "O fornecimento é zero.", + "noPermanentDelegateAuthority": "O Permanent Delegate não está configurado.", + "noSupplyHeld": "Nenhum fornecimento é mantido atualmente.", + "revokedTokensCannotPause": "Tokens revogados não podem ser pausados ou retomados.", + "pauseRequiresActiveToken": "O Token precisa ter o deploy feito e estar ativo antes que os controles de pausa fiquem disponíveis.", + "noPauseAuthorityConfigured": "Nenhuma Pause Authority está configurada. Defina uma Pause Authority ou a Mint Authority primeiro.", + "freezingDisabled": "O congelamento está desativado para este Token.", + "noFreezeAuthorityConfigured": "Nenhuma Freeze Authority está configurada.", + "unknownError": "Erro desconhecido", + "unknown": "desconhecido", + "ok": "ok", + "executionRouteFailed": "A rota de execução falhou ({status})", + "actionFailed": "{action} falhou ({status}): {error}", + "actionSucceeded": "{action} concluída com sucesso ({status})", + "requestFailed": "Falha na solicitação", + "mintAuthorityHelper": "Pode fazer mint de novos Tokens.", + "freezeAuthorityHelper": "Pode congelar e descongelar contas de Token.", + "metadataAuthorityHelper": "Pode atualizar os metadados do Token.", + "permanentDelegateHelper": "Pode realizar operações delegadas de transferência/burn.", + "noControlledWalletsAvailable": "Nenhuma Wallet controlada está disponível para assinar esta ação.", + "noSignerConfigured": "Nenhum signatário está configurado para esta ação.", + "requiredSignerNotControlled": "O signatário exigido não é uma das suas Wallets controladas.", + "mintAuthorityNotControlled": "A Mint Authority não é uma das suas Wallets controladas.", + "permanentDelegateNotControlled": "O Permanent Delegate não é uma das suas Wallets controladas.", + "authority": "autoridade", + "noAuthorityConfigured": "Nenhuma {authority} está configurada.", + "authorityNotControlled": "{authority} não é uma das suas Wallets controladas.", + "freezeAuthorityNotControlled": "A Freeze Authority não é uma das suas Wallets controladas.", + "pauseAuthorityNotControlled": "A Pause Authority não é uma das suas Wallets controladas.", + "validMintAmount": "Informe um valor de mint válido para este Token.", + "mintAmountPositive": "O valor do mint deve ser maior que zero.", + "mintAmountExceedsSupplyCap": "O valor do mint excede o limite de fornecimento restante de {amount} {symbol}.", + "validBurnAmount": "Informe um valor de burn válido para este Token.", + "burnAmountPositive": "O valor do burn deve ser maior que zero.", + "burnAmountExceedsSupply": "O valor do burn excede o fornecimento atual de {amount} {symbol}.", + "standardBurnSignerOnly": "O burn padrão só funciona a partir da Wallet signatária selecionada. Use Forçar burn para uma Wallet diferente.", + "selectedSignerDoesNotHoldToken": "A Wallet signatária selecionada não possui este Token no momento.", + "selectedWalletOnlyShows": "A Wallet selecionada mostra apenas {amount} {symbol}.", + "destinationMustDiffer": "O destino deve ser diferente da origem.", + "validTransferAmount": "Informe um valor de transferência válido para este Token.", + "transferAmountPositive": "O valor da transferência deve ser maior que zero.", + "selectedSourceDoesNotHoldToken": "A Wallet de origem selecionada não possui este Token no momento.", + "forceBurnAmountPositive": "O valor do burn forçado deve ser maior que zero.", + "forceBurnAmountExceedsSupply": "O valor do burn forçado excede o fornecimento atual de {amount} {symbol}.", + "submittingAction": "Enviando {action}...", + "transactionFinalized": "Transação finalizada com sucesso.", + "transactionFailed": "A transação falhou.", + "sendTransaction": "Enviar transação?", + "sendTransactionDescription": "Isso enviará uma transação on-chain. Deseja continuar?", + "goAhead": "Continuar", + "token": "Token" + }, + "forms": { + "saveMetadata": "Salvar metadados", + "updateMetadata": "Atualizar metadados", + "updateMetadataDescription": "Edite os metadados do Token.", + "name": "Nome", + "enterTokenName": "Informe um nome para o Token.", + "description": "Descrição", + "uri": "URI", + "imageUrl": "URL da imagem", + "mintDescription": "Faça mint para a Wallet de destino ou conta de Token.", + "destination": "Destino", + "enterSolanaAddress": "Informe um endereço Solana válido.", + "destinationPlaceholder": "Wallet de destino ou conta de Token", + "amount": "Valor", + "memo": "Memo", + "burnDescription": "Faça burn a partir da Wallet de origem ou conta de Token.", + "source": "Origem", + "sourcePlaceholder": "Wallet signatária ou sua conta de Token", + "sourceWalletPlaceholder": "Wallet de origem ou conta de Token", + "forceTransferDescription": "Transferência administrativa por confisco entre contas.", + "forceBurnDescription": "Burn forçado administrativo a partir da conta de origem.", + "mintAuthority": "Mint Authority", + "freezeAuthority": "Freeze Authority", + "permanentDelegate": "Permanent delegate", + "metadataAuthority": "Metadata Authority", + "updateAuthority": "Atualizar autoridade", + "updateAuthorityDescription": "Rotacione ou remova autoridades do Token.", + "role": "Função", + "currentAuthorityOptional": "Autoridade atual (opcional)", + "newAuthorityEmptyToRemove": "Nova autoridade (vazio para remover)", + "pauseControls": "Controles de pausa", + "pauseControlsDescription": "Pause ou retome as transferências em todo o Token.", + "alreadyPaused": "O Token já está pausado.", + "notPaused": "O Token não está pausado.", + "freezeControls": "Controles de congelamento", + "freezeControlsDescription": "Congele ou descongele as posições de Token de uma Wallet para este Mint.", + "walletAddress": "Endereço da Wallet", + "enterWalletAddress": "Informe o endereço da Wallet. A SDP derivará automaticamente a conta de Token associada (ATA) para este Mint.", + "walletAddressPlaceholder": "Endereço da Wallet que possui este Token", + "walletAddressInstruction": "Informe o endereço da Wallet que possui este Token. A SDP deriva automaticamente a conta de Token associada (ATA) para este Mint.", + "freezeReason": "Motivo (somente para congelamento)", + "controlListDescription": "Gerencie os endereços de destino aprovados para este Token.", + "address": "Endereço", + "label": "Rótulo", + "enterLabel": "Informe um rótulo ou deixe em branco.", + "noLabel": "Sem rótulo", + "removeEntry": "Remover entrada" + }, + "authority": { + "resolvedAutomatically": "Resolvido automaticamente a partir do estado do Token", + "closeModal": "Fechar modal de autoridade", + "save": "Salvar autoridade", + "current": "Autoridade atual", + "whatThisMeans": "O que isso significa", + "confirmNone": "Sim, definir como Nenhuma", + "new": "Nova autoridade", + "selectWallet": "Selecione uma Wallet controlada", + "custom": "Autoridade personalizada", + "solanaAddress": "Endereço Solana", + "noneWalletWarning": "Escolher Nenhuma vai limpar esta autoridade. Você confirmará essa alteração antes de ela ser enviada.", + "noneDescription": "Esta autoridade será limpa se você salvar esta alteração.", + "controlledWalletHint": "Wallets controladas são os destinos recomendados para autoridades.", + "useCustom": "Usar endereço personalizado", + "chooseWallet": "Escolher Wallet controlada", + "solanaAddressOrNone": "Endereço Solana ou deixe em branco para definir como Nenhuma", + "enterAddressOrNone": "Informe um endereço Solana válido ou deixe em branco para definir a autoridade como Nenhuma.", + "noWalletsHint": "Ainda não há Wallets controladas disponíveis. Informe um endereço manualmente ou deixe em branco para definir a autoridade como Nenhuma.", + "noneFieldWarning": "Definir este campo como Nenhuma vai limpar a autoridade. Você confirmará essa alteração antes de ela ser enviada.", + "mintNoneTitle": "Definir a Mint Authority como Nenhuma?", + "mintNoneDescription": "Isso vai limpar a Mint Authority do Token.", + "mintNoneImpact": "Nenhuma Wallet poderá fazer mint de fornecimento adicional após esta alteração.", + "freezeNoneTitle": "Definir a Freeze Authority como Nenhuma?", + "freezeNoneDescription": "Isso vai limpar a Freeze Authority do Token.", + "freezeNoneImpact": "As contas de Token não poderão mais ser congeladas ou descongeladas após esta alteração.", + "delegateNoneTitle": "Definir a Permanent Delegate Authority como Nenhuma?", + "delegateNoneDescription": "Isso vai limpar o Permanent Delegate do Token.", + "delegateNoneImpact": "As ações administrativas delegadas de transferência e burn não estarão mais disponíveis após esta alteração.", + "metadataNoneTitle": "Definir a Metadata Authority como Nenhuma?", + "metadataNoneDescription": "Isso vai limpar a Metadata Authority do Token.", + "metadataNoneImpact": "As atualizações de metadados não estarão mais disponíveis por meio desta autoridade após esta alteração." + }, + "wizard": { + "stepOf": "Etapa {current} de {total}", + "creatingDraft": "Criando rascunho do ativo…", + "draftCreated": "Rascunho do ativo criado.", + "failedToCreate": "Falha ao criar o rascunho.", + "creating": "Criando…", + "reviewAndFinish": "Revisar e concluir", + "reviewDescription": "Revise todos os detalhes abaixo. Você pode editar qualquer seção antes de criar seu rascunho." + }, + "confirmDraft": { + "ariaLabel": "Criar rascunho do ativo", + "title": "Criar este rascunho de ativo?", + "descriptionStart": "Isso cria um rascunho", + "of": "de", + "descriptionEnd": ". Você pode continuar editando e publicar quando quiser." + }, + "summary": { + "title": "Resumo", + "assetCategory": "Categoria do ativo", + "assetType": "Tipo de ativo", + "peggedTo": "Atrelado a", + "accessControl": "Controle de acesso", + "transferRestrictions": "Restrições de transferência", + "investorReporting": "Relatórios para investidores", + "enabled": "Ativado", + "lastUpdated": "Última atualização", + "resolveBeforeCreating": "Resolver antes de criar", + "readyToCreate": "Tudo pronto para criar um rascunho", + "readyDescription": "Você pode revisar, editar e publicar quando quiser.", + "privateByDefault": "Privado por padrão", + "privateDescription": "Os detalhes fornecidos são privados e usados apenas para configurar seu ativo." + }, + "classificationRail": { + "title": "Como funciona", + "assetProfile": "Perfil do ativo", + "assetProfileDescription": "Você seleciona a categoria e o tipo. A SDP armazena seus metadados canônicos de emissão.", + "issuanceMetadata": "Metadados de Emissão", + "issuanceMetadataDescription": "Inclui campos de ativo, compliance, blockchain e personalizados (cliente/integração).", + "publicProjection": "Projeção pública", + "publicProjectionDescription": "A SDP projeta um subconjunto público seguro para os metadados do Token.", + "tokenMetadataUri": "URI de metadados do Token", + "tokenMetadataUriDescription": "A SDP hospeda a URI padrão que retorna somente os metadados públicos.", + "privateDescription": "Os metadados de compliance e personalizados permanecem privados, a menos que sejam explicitamente incluídos na projeção pública de metadados." + }, + "assetProfileForm": { + "fixHighlightedFields": "Corrija os campos destacados antes de salvar." + }, + "templates": { + "stablecoinName": "Stablecoin", + "stablecoinDescription": "Stablecoins lastreadas em USD com controles de compliance.", + "stablecoinHelper": "Ideal para ativos atrelados a moeda fiduciária, com controles de transferência e suporte a congelamento administrativo.", + "tokenizedSecurityName": "Valor Mobiliário Tokenizado", + "tokenizedSecurityDescription": "Ativos regulados com allowlist ativada por padrão.", + "tokenizedSecurityHelper": "Projetado para instrumentos regulados nos quais os controles de participantes são obrigatórios.", + "customName": "Personalizado", + "customDescription": "Configuração totalmente personalizável do Token-2022.", + "customHelper": "Comece com um perfil em branco e ajuste as configurações de emissão para requisitos avançados." + }, + "overview": { + "title": "Visão geral do Token", + "tokenAddress": "Endereço do Token", + "mintAuthority": "Mint Authority", + "supply": "Fornecimento", + "template": "Modelo", + "totalSupply": "Fornecimento total", + "readyForDeploy": "Pronto para o deploy", + "readyForDeployDescription": "Este ativo está pronto para o deploy — continue na aba Operações.", + "mintAddress": "Endereço do mint", + "notDeployedYet": "Deploy ainda não realizado", + "noDescription": "Ainda sem descrição — adicione uma na aba Detalhes.", + "authoritiesControlled": "Autoridades gerenciadas", + "authoritiesIncompleteTooltip": "Nem todas as autoridades são gerenciadas pela SDP, portanto algumas ações não podem ser assinadas pelo dashboard.", + "authoritiesIncompleteLink": "Revisar em Permissões", + "authorities": "Autoridades", + "control": "Controle", + "signerWallet": "Wallet signatária", + "signerDefault": "Padrão do projeto", + "signerDefaultHint": "Escolhida no momento da assinatura", + "signerUnavailable": "Wallet indisponível", + "deployed": "Deploy realizado", + "draftCreated": "Rascunho criado", + "createdTooltip": "Quando o rascunho foi criado", + "deployedTooltip": "Quando o deploy do Token foi realizado on-chain", + "sdpManaged": "Gerenciado pela SDP", + "accessAllowlist": "Allowlist", + "accessBlocklist": "Blocklist", + "authorityExternal": "Mantida externamente", + "authorityExternalHint": "A SDP não pode assinar por ela, então as ações relacionadas permanecem indisponíveis.", + "authorityNotSet": "Não definida" + }, + "operations": { + "deployHelper": "Faça o deploy deste Token on-chain antes de executar outras operações de fundos.", + "subtitle": "Faça alterações no fornecimento do Token e revise a atividade recente." + }, + "taxonomy": { + "stablecoin": "Stablecoin", + "stablecoinDescription": "Ativos projetados para manter um valor estável, geralmente lastreados por moeda fiduciária ou outros ativos líquidos.", + "fiatBacked": "Lastreado em fiat", + "fiatBackedDescription": "Lastreado 1:1 por reservas em moeda fiduciária mantidas em instituições financeiras regulamentadas.", + "cryptoBacked": "Lastreado em cripto", + "cryptoBackedDescription": "Colateralizado por ativos cripto mantidos em custódia para manter a paridade.", + "tokenizedSecurity": "Valor Mobiliário Tokenizado", + "tokenizedSecurityDescription": "Instrumentos financeiros regulamentados ou representações digitais de valores mobiliários.", + "equity": "Ações", + "equityDescription": "Ações tokenizadas ou participações societárias equivalentes em uma empresa.", + "debt": "Dívida / Título", + "debtDescription": "Títulos, notas ou outros instrumentos de dívida.", + "fund": "Fundo / ETF", + "fundDescription": "Cotas de fundos ou cotas de fundos negociados em bolsa (ETF).", + "generic": "Ativo digital não mobiliário", + "genericDescription": "Outros ativos tokenizados que não se enquadram nas categorias acima.", + "commodities": "Commodities", + "commoditiesDescription": "Direitos sobre commodities físicas ou recursos naturais.", + "realEstate": "Imóveis", + "realEstateDescription": "Participações imobiliárias tokenizadas ou propriedades.", + "collectibles": "Colecionáveis", + "collectiblesDescription": "Ativos colecionáveis únicos ou de edição limitada." + }, + "config": { + "advanced": "Avançado", + "advancedCapacitiesDescription": "As capacidades recomendadas são pré-selecionadas com base no perfil do ativo.", + "usd": "USD", + "eur": "EUR", + "gbp": "GBP", + "jpy": "JPY", + "sgd": "SGD", + "unitedStates": "Estados Unidos", + "europeanUnion": "União Europeia", + "unitedKingdom": "Reino Unido", + "singapore": "Singapura", + "other": "Outro", + "regD": "Reg D", + "regS": "Reg S", + "regA": "Reg A+", + "publicOffering": "Oferta pública", + "commodityBacked": "Lastreado em commodities", + "algorithmic": "Algorítmico", + "financialDetails": "Detalhes financeiros", + "financialDetailsDescription": "Principais atributos financeiros do ativo.", + "collateralOracleDetails": "Colateral e oráculo", + "collateralOracleDetailsDescription": "O colateral on-chain que respalda este Token e o feed de preço usado para avaliá-lo.", + "issuerName": "Nome do emissor", + "issuerNamePlaceholder": "ex.: Acme Financial Inc.", + "backingType": "Tipo de lastro", + "currency": "Moeda", + "selectField": "Selecionar {field}", + "searchCurrencies": "Buscar moedas", + "pegTarget": "Paridade ou alvo", + "pegTargetPlaceholder": "1,00 USD", + "reserveAsset": "Ativo de reserva", + "reserveAssetPlaceholder": "ex.: Caixa e títulos do Tesouro dos EUA", + "reserveAssetPlaceholderCrypto": "ex.: SOL, wBTC, ETH, SOL em staking", + "reserveCustodian": "Custodiante da reserva", + "reserveCustodianPlaceholder": "ex.: banco ou custodiante regulado", + "reserveCustodianPlaceholderCrypto": "ex.: Vault on-chain ou endereço do programa", + "collateralizationRatio": "Índice de colateralização", + "collateralizationRatioPlaceholder": "ex.: 150", + "collateralizationRatioHelp": "Valor-alvo de colateral em relação aos Tokens emitidos, em percentual.", + "oracleProvider": "Oráculo de preço", + "oracleProviderPlaceholder": "ex.: Pyth, Switchboard", + "minCollateralRatio": "Índice mínimo de colateralização", + "minCollateralRatioPlaceholder": "ex.: 120", + "minCollateralRatioHelp": "Menor índice de colateralização que uma posição pode atingir antes de ser liquidada, em percentual.", + "redemption": "Resgate", + "redemptionHelp": "Os detentores podem resgatar Tokens pelas reservas subjacentes.", + "securityDetails": "Detalhes do valor mobiliário", + "securityDetailsDescription": "Informações sobre o emissor e a oferta.", + "equityDetails": "Termos de ações", + "equityDetailsDescription": "Classe de ações e direitos dos detentores.", + "debtDetails": "Termos da dívida", + "debtDetailsDescription": "Termos do instrumento de dívida.", + "fundDetails": "Termos do fundo", + "fundDetailsDescription": "Estratégia e estrutura de taxas.", + "shareClass": "Classe de ações", + "shareClassPlaceholder": "ex.: Ações ordinárias Classe A", + "votingRights": "Direitos de voto", + "votingRightsHelp": "Os detentores desta classe têm direitos de voto.", + "couponRate": "Taxa de cupom", + "couponRatePlaceholder": "ex.: 5,25% ao ano", + "maturityDate": "Data de vencimento", + "maturityDatePlaceholder": "AAAA-MM-DD", + "seniority": "Senioridade", + "seniorSecured": "Sênior com garantia", + "seniorUnsecured": "Sênior sem garantia", + "subordinated": "Subordinada", + "mezzanine": "Mezanino", + "unsecured": "Sem garantia", + "fundStrategy": "Estratégia", + "strategyMoneyMarket": "Mercado monetário", + "strategyFixedIncome": "Renda fixa", + "strategyEquity": "Ações", + "strategyMultiAsset": "Multiativos", + "managementFee": "Taxa de administração", + "managementFeePlaceholder": "ex.: 0,75% ao ano", + "netAssetValue": "Valor patrimonial líquido (NAV)", + "netAssetValuePlaceholder": "ex.: 100,00 USD por cota", + "jurisdiction": "Jurisdição", + "offeringType": "Tipo de oferta", + "categoryAssetDetails": "Detalhes do ativo", + "categoryAssetDetailsDescription": "O que respalda ou representa este ativo.", + "realEstateDetails": "Detalhes do imóvel", + "realEstateDetailsDescription": "Tipo e localização do imóvel.", + "propertyType": "Tipo de imóvel", + "propertyResidential": "Residencial", + "propertyCommercial": "Comercial", + "propertyIndustrial": "Industrial", + "propertyLand": "Terreno", + "propertyMixedUse": "Uso misto", + "propertyLocation": "Localização", + "propertyLocationPlaceholder": "ex.: Nova York, NY, EUA", + "underlyingAsset": "Ativo subjacente", + "underlyingAssetPlaceholder": "ex.: Ouro, prata, petróleo bruto", + "underlyingAssetPlaceholderCollectible": "ex.: Cartas colecionáveis, obras de arte, relógios", + "custodian": "Custodiante", + "custodianPlaceholder": "ex.: Acme Custody", + "custodianPlaceholderCollectible": "ex.: Vault ou parceiro de autenticação", + "custodianPlaceholderRealEstate": "ex.: SPV ou titular do imóvel", + "allowList": "Allowlist", + "blockList": "Blocklist", + "kyc": "Detentores verificados", + "kycExpert": "KYC", + "kycDescription": "Exigir verificação de identidade antes que um investidor possa deter ou transferir este ativo.", + "kycDescriptionExpert": "Exigir verificação de identidade antes que uma Wallet possa deter ou transferir Tokens.", + "restrictTradingHours": "Restringir horário de negociação", + "restrictTradingHoursDescription": "Permitir transferências somente em dias e horários definidos.", + "restrictTradingHoursDescriptionExpert": "Limitar transferências de Tokens a dias e janelas de horário específicos.", + "freezeTransfers": "Congelar transferências", + "freezeTransfersDescription": "Congelar Tokens em resposta a eventos de compliance ou investigações.", + "pauseTransfers": "Pausar todas as transferências", + "pauseTransfersDescription": "Interromper todas as transferências deste Token de uma vez, retomando depois. Afeta todos os detentores.", + "freezeAccounts": "Freeze Authority", + "freezeAccountsDescription": "Congelar e descongelar a conta de Token de um detentor por vez.", + "issueRetireControls": "Controles de fornecimento", + "issueRetireControlsExpert": "Controles de mint e burn", + "issueRetireControlsDescription": "Controlar quem pode emitir novas unidades ou retirar unidades existentes.", + "issueRetireControlsDescriptionExpert": "Controlar quem pode fazer mint de novos Tokens ou fazer burn do fornecimento existente.", + "redemptionApprovals": "Aprovações de resgate", + "redemptionApprovalsDescription": "Exigir aprovação antes que um investidor possa resgatar suas participações.", + "redemptionApprovalsDescriptionExpert": "Exigir aprovação antes que os Tokens sejam resgatados pelas reservas.", + "investorReporting": "Relatórios para investidores", + "investorReportingDescription": "Compartilhar relatórios periódicos de posições e atividades com os investidores.", + "transferApprovals": "Aprovações de transferência", + "transferApprovalsDescription": "Exigir aprovação antes que uma transferência seja concluída.", + "capacityConfig": { + "configure": "Configurar", + "notConfigured": "Ainda não configurado", + "editTitle": "Configurar {policy}", + "cancel": "Cancelar", + "save": "Salvar", + "tradingHours": { + "scheduleLabel": "Horário de negociação", + "scheduleAlways": "24/7", + "scheduleMarket": "Horário de mercado", + "scheduleCustom": "Personalizado", + "daysLabel": "Dias de funcionamento", + "opensLabel": "Abre", + "closesLabel": "Fecha", + "hoursColumnLabel": "Horas", + "minutesColumnLabel": "Minutos", + "timezoneLabel": "Fuso horário", + "summaryAlways": "Aberto 24/7", + "summaryMarket": "Horário de mercado", + "summaryCustom": "{days} · {open}–{close}", + "summaryCustomDaysOnly": "{days}", + "summaryUnset": "Horário não definido" + }, + "transferApprovals": { + "ruleLabel": "Exigir aprovação para", + "ruleAll": "Todas", + "ruleAbove": "Acima de um valor", + "ruleNewCounterparty": "Para novas contrapartes", + "amountLabel": "Limite", + "amountSuffix": "Tokens", + "amountPlaceholder": "ex.: 10000", + "approversLabel": "Aprovadores", + "approversHint": "Endereços de Wallet ou nomes de função. Podem ser adicionados após o lançamento.", + "addApprover": "Adicionar aprovador", + "approverPlaceholder": "Endereço de Wallet ou função", + "removeApprover": "Remover aprovador", + "summaryAll": "Todas as transferências", + "summaryAbove": "Acima de {amount} Tokens", + "summaryAboveUnset": "Acima de um limite", + "summaryNewCounterparty": "Novas contrapartes" + }, + "redemptionApprovals": { + "ruleLabel": "Exigir aprovação para", + "ruleAll": "Todos os resgates", + "ruleAbove": "Resgates acima de um valor", + "amountLabel": "Limite", + "amountSuffix": "Tokens", + "amountPlaceholder": "ex.: 10000", + "approversLabel": "Aprovadores", + "approversHint": "Endereços de Wallet ou nomes de função. Podem ser adicionados após o lançamento.", + "addApprover": "Adicionar aprovador", + "approverPlaceholder": "Endereço de Wallet ou função", + "removeApprover": "Remover aprovador", + "summaryAll": "Todos os resgates", + "summaryAbove": "Acima de {amount} Tokens", + "summaryAboveUnset": "Acima de um limite" + }, + "investorReporting": { + "cadenceLabel": "Frequência de relatórios", + "cadenceMonthly": "Mensal", + "cadenceQuarterly": "Trimestral", + "cadenceAnnual": "Anual", + "formatLabel": "Formato do relatório", + "formatPdf": "PDF", + "formatCsv": "CSV", + "formatXlsx": "Excel", + "recipientsLabel": "Destinatários", + "recipientsHint": "Endereços de e-mail ou grupos de investidores. Podem ser adicionados após o lançamento.", + "addRecipient": "Adicionar destinatário", + "recipientPlaceholder": "E-mail ou grupo de investidores", + "removeRecipient": "Remover destinatário", + "summaryWithFormat": "{cadence} · {format}" + }, + "weekdays": { + "mon": "Seg", + "tue": "Ter", + "wed": "Qua", + "thu": "Qui", + "fri": "Sex", + "sat": "Sáb", + "sun": "Dom" + }, + "timezones": { + "utc": "UTC", + "newYork": "Nova York (ET)", + "losAngeles": "Los Angeles (PT)", + "london": "Londres (GMT/BST)", + "zurich": "Zurique (CET)", + "singapore": "Singapura (SGT)", + "tokyo": "Tóquio (JST)" + } + }, + "permanentDelegate": "Recuperar Tokens", + "permanentDelegateDescription": "Permitir que uma autoridade controladora apreenda ou recupere Tokens em resposta a eventos de compliance.", + "transferFee": "Transfer fee", + "transferFeeDescription": "Reter uma taxa percentual em cada transferência de Token.", + "transferFeeBasisPoints": "Taxa (pontos-base)", + "transferFeeBasisPointsHint": "Em pontos-base: 100 bp = 1% (ex.: 50 = 0,5%).", + "transferFeeMaxFee": "Taxa máxima", + "interestBearing": "Interest-bearing", + "interestBearingDescription": "Acumular juros sobre os saldos de Token a uma taxa fixa.", + "interestBearingRate": "Taxa de juros", + "interestBearingRateHint": "Taxa anual em pontos-base: 100 bp = 1%.", + "scaledUiAmount": "Valor de exibição escalado", + "scaledUiAmountDescription": "Ajustar os saldos exibidos por um fator definido, por exemplo, para desdobramentos de ações ou mudanças de classe de ações.", + "scaledUiAmountMultiplier": "Multiplicador", + "nonTransferable": "Non-transferable", + "nonTransferableDescription": "Impedir que os Tokens sejam transferidos após serem detidos.", + "transferHook": "Regras de transferência personalizadas", + "transferHookDescription": "Encaminhar transferências por um programa de regras fornecido por você para verificações adicionais.", + "transferHookProgramId": "ID do programa", + "advancedSettingsTitle": "Configurações avançadas", + "showTechnicalDetail": "Ver", + "deployPreview": "Prévia do deploy", + "quickFillLabel": "Começar a partir de um cenário", + "quickFillHint": "Escolha uma configuração para pré-preencher os controles abaixo — ajuste o que quiser depois.", + "accessPolicyPrompt": "Escolha quem pode deter e transferir este Token.", + "accessPolicyAllowlistEffect": "Somente Wallets aprovadas podem receber ou deter este Token.", + "accessPolicyBlocklistEffect": "Qualquer pessoa pode deter, exceto as Wallets que você bloquear.", + "accessPolicyDisabledEffect": "Qualquer pessoa pode deter e transferir este Token livremente.", + "accessPolicyTechnical": "A allowlist congela novas contas no momento do deploy e é permanente após o lançamento. Já blocklist e desativado são aplicados apenas por política.", + "settingGroupEconomics": "Economia", + "settingGroupCompliance": "Compliance", + "settingGroupControls": "Controles", + "settingLockedHint": "Bloqueado — esta configuração é fixa e não pode ser alterada", + "settingRecommended": "Recomendado", + "settingRequired": "Obrigatório", + "settingAdvancedOptions": "Opções avançadas", + "settingsModeBasic": "Básico", + "settingsModeDetailed": "Detalhado", + "settingsModeExpert": "Especialista", + "settingsModeAria": "Nível de detalhe das configurações", + "settingsPermanentTitle": "Permanente", + "settingsPermanentSubtitle": "Definido na criação do Token — não pode ser alterado após o lançamento.", + "settingsPermanentLockedSubtitle": "Permanente após o deploy — não pode ser alterado.", + "settingsOngoingTitle": "Contínuo", + "settingsOngoingSubtitle": "Cada política pode ser ajustada ou configurada a qualquer momento.", + "settingsOngoingSubtitleDraft": "Um conjunto inicial. Cada política é configurada depois na aba de compliance e pode ser alterada a qualquer momento.", + "settingsOnchainTitle": "On-chain", + "settingsOffchainTitle": "Off-chain", + "settingConfigureInExpert": "Mude para a visualização Especialista para configurar suas opções.", + "settingExpertExtensionsLabel": "Extensões", + "settingExpertActionsLabel": "Desbloqueios", + "settingExpertActionsNone": "Nenhum (somente configuração)", + "settingExpertMechanismLabel": "Mecanismo", + "settingExpertUnlocks": "Desbloqueios", + "settingConflictsWith": "Não pode ser combinado com", + "comboCustomSelection": "Você personalizou as configurações individuais — abra o modo Detalhado para revisá-las. Nenhum predefinido corresponde exatamente a essa combinação.", + "comboConflictReasonBalanceDisplay": "um Token pode aplicar apenas uma regra de exibição de saldo.", + "comboConflictReasonNonTransferableFee": "um Token intransferível nunca é transferido, então uma taxa de transferência nunca seria aplicada.", + "comboConflictReasonNonTransferableHook": "um Token intransferível nunca é transferido, então regras de transferência personalizadas nunca seriam executadas.", + "comboRegulatedStablecoin": "Stablecoin regulada", + "comboRegulatedStablecoinDescription": "Uma moeda pública lastreada em moeda fiduciária, aberta a todos, exceto Wallets sancionadas: blocklist, KYC, fornecimento controlado, revisão de resgate e relatórios de reserva.", + "comboPermissionedStablecoin": "Stablecoin permissionada", + "comboPermissionedStablecoinDescription": "Uma moeda de rede fechada apenas para instituições aprovadas: allowlist on-chain, KYC, fornecimento controlado e revisão de transferência.", + "comboRegulatedSecurity": "Valor mobiliário regulado", + "comboRegulatedSecurityDescription": "A base de compliance para uma ação ou título de dívida tokenizado: investidores verificados, transferências revisadas, negociação em horário de mercado e relatórios contínuos.", + "comboFundOperations": "Operações de fundo", + "comboFundOperationsDescription": "Adicione subscrições e resgates com fornecimento gerenciado pelo emissor — combine com um valor mobiliário regulado para operar um fundo.", + "comboVerifiedHolders": "Exigir detentores verificados", + "comboVerifiedHoldersDescription": "Somente Wallets aprovadas podem deter ou transferir este ativo — detentores verificados (KYC) mais uma allowlist on-chain.", + "comboControlledAsset": "Ativo controlado", + "comboControlledAssetDescription": "O emissor mantém o controle de compliance — congelamento de contas e recuperação de Tokens — limitado a detentores verificados.", + "comboLoyaltyRewards": "Fidelidade e recompensas", + "comboLoyaltyRewardsDescription": "Pontos ou recompensas intransferíveis, com mint controlado pelo emissor.", + "comboYieldNote": "Nota com rendimento", + "comboYieldNoteDescription": "Um instrumento que acumula juros para detentores verificados, com fornecimento controlado.", + "comboRevenueShare": "Token de participação na receita", + "comboRevenueShareDescription": "Captura uma pequena taxa em cada transferência, com fornecimento controlado.", + "comboGatedAccess": "Token de acesso restrito", + "comboGatedAccessDescription": "Token permissionado: novas contas começam congeladas até que você as aprove, limitado a detentores verificados e horários de negociação definidos." + }, + "playground": { + "viewApiContext": "API Playground", + "openInPlayground": "Abrir no API Playground", + "tokenNameExample": "Acme Dollar", + "tokenSymbolExample": "ACME", + "selectTemplate": "Selecionar modelo", + "settlementAssetExample": "Ativo de liquidação lastreado em USD", + "metadataUriExample": "https://example.com/metadata/acme-usd.json", + "optionalHostedUri": "uri (opcional — a SDP hospeda se omitido)", + "updatedTokenName": "Nome do Token atualizado", + "updatedTokenDescription": "Descrição do Token atualizada", + "updatedMetadataUri": "https://example.com/updated-metadata.json", + "tokenImageUrl": "https://example.com/token.png", + "selectStatus": "Selecionar status", + "active": "Ativo", + "paused": "Pausado", + "productName": "Emissão", + "none": "Nenhum", + "low": "Baixa", + "medium": "Média", + "high": "Alta", + "true": "Verdadeiro", + "false": "Falso", + "selectPriorityFee": "Selecionar options priorityFee", + "selectSimulate": "Selecionar options simulate", + "amountPlaceholder": "ex.: 1000", + "listTemplates": "Listar modelos", + "getTemplate": "Obter modelo", + "createToken": "Criar Token", + "listTokens": "Listar Tokens", + "getToken": "Obter Token", + "updateToken": "Atualizar Token", + "listTokenTransactions": "Listar transações do Token", + "refreshTotalSupply": "Atualizar fornecimento total", + "deployToken": "Deploy do Token", + "mintTokens": "Mint de Tokens", + "burnTokens": "Burn de Tokens", + "seizeTokens": "Apreender Tokens", + "forceBurn": "Forçar Burn", + "updateAuthority": "Atualizar autoridade", + "pauseToken": "Pausar Token", + "unpauseToken": "Retomar Token", + "freezeAccount": "Congelar conta", + "unfreezeAccount": "Descongelar conta", + "listFrozenAccounts": "Listar contas congeladas", + "listAllowlist": "Listar Allowlist", + "listAllowlistLabels": "Listar rótulos da Allowlist", + "addAllowlistEntry": "Adicionar entrada à allowlist", + "removeAllowlistEntry": "Remover entrada da allowlist", + "tokenIdPlaceholder": "ID do Token (ex.: tok_abc123)", + "templateIdPlaceholder": "ID do modelo (ex.: stablecoin)", + "authorityRoleMint": "Mint", + "authorityRoleFreeze": "Freeze", + "authorityRolePermanentDelegate": "Permanent Delegate", + "authorityRoleMetadata": "Metadata", + "solanaAddressPlaceholder": "Endereço Solana (32–44 caracteres)", + "optionalMemo": "Memo opcional", + "tokenAccountAddressPlaceholder": "Endereço da conta de Token (32–44 caracteres)", + "sourceTokenAccountAddress": "Endereço da conta de Token de origem", + "destinationTokenAccountAddress": "Endereço da conta de Token de destino", + "delegateAuthorityAddress": "Endereço da autoridade delegada", + "tokenAccountAddress": "Endereço da conta de Token", + "selectAuthorityRole": "Selecionar tipo de autoridade", + "currentAuthorityAddress": "Endereço da autoridade atual", + "newAuthorityAddress": "Endereço da nova autoridade", + "walletAddressToFreeze": "Endereço da Wallet para congelar", + "optionalFreezeReason": "Motivo do congelamento (opcional)", + "walletAddressToUnfreeze": "Endereço da Wallet para descongelar", + "treasuryExample": "Tesouraria", + "addressToAllowlist": "Endereço para adicionar à allowlist", + "optionalLabel": "Rótulo opcional", + "allowlistEntryIdPlaceholder": "ID da entrada da allowlist (ex.: allow_123)" + }, + "compliance": { + "forceTransfer": "Forçar transferência", + "forceBurn": "Forçar burn", + "freeze": "Congelar", + "pause": "Pausar", + "accessPolicy": "Política de acesso", + "accessPolicyDescription": "Documenta a política de acesso pretendida para este ativo.", + "accessControl": "Controle de acesso", + "notSet": "Não definido", + "lockReason": "Bloqueado após o deploy — as regras aplicadas on-chain não podem ser alteradas.", + "selectAccessControl": "Selecionar controle de acesso", + "appliedOnDeploy": "Aplicado on-chain no deploy do Token.", + "controls": "Controles", + "controlsDescription": "Ações on-chain que entram em vigor imediatamente." + }, + "classification": { + "title": "O que é este ativo?", + "description": "Comece nos contando o que este ativo representa e como ele deve ser classificado.", + "name": "Nome", + "namePlaceholder": "ex.: USD Workshop Money Market Fund", + "nameHint": "Um nome claro para identificar este ativo.", + "chooseClassification": "Escolher uma classificação", + "notSure": "Não tenho certeza do que escolher", + "chooseAssetType": "Escolher tipo de ativo" + }, + "review": { + "assetTitle": "Ativo", + "assetDescription": "O ativo e como ele será representado.", + "assetCategory": "Categoria do ativo", + "assetType": "Tipo de ativo", + "name": "Nome", + "symbol": "Símbolo", + "assetDetailsTitle": "Detalhes do ativo", + "assetDetailsDescription": "Principais informações sobre o ativo.", + "description": "Descrição", + "issuerName": "Nome do emissor", + "decimals": "Decimais", + "website": "Site", + "complianceAccessTitle": "Compliance e acesso", + "complianceAccessDescription": "Como o ativo será controlado e quem pode interagir com ele.", + "accessControl": "Controle de acesso", + "allowlist": "Allowlist", + "blocklist": "Blocklist", + "none": "Nenhum", + "allowlistHint": "Somente endereços aprovados podem deter ou transferir.", + "blocklistHint": "Endereços bloqueados não podem deter ou transferir.", + "transferRestrictions": "Restrições de transferência", + "enabled": "Ativado", + "disabled": "Desativado", + "transferRestrictionsHint": "Transferências limitadas a participantes aprovados.", + "investorReporting": "Relatórios para investidores", + "investorReportingHint": "Relatórios de atividade disponíveis para investidores e partes interessadas.", + "publicInformationTitle": "Informações públicas", + "publicInformationDescription": "As informações seguras que ficarão visíveis para qualquer pessoa.", + "publicName": "Nome público", + "publicSymbol": "Símbolo público", + "logo": "Logo", + "publicDescription": "Descrição (pública)", + "edit": "Editar", + "notProvided": "—" + }, + "publicInfo": { + "name": "Nome", + "symbol": "Símbolo", + "description": "Descrição", + "decimals": "Decimais", + "category": "Categoria", + "assetType": "Tipo de ativo", + "logo": "Logo", + "untitledAsset": "Ativo sem título", + "notProvided": "—", + "publicTokenInformation": "Informações públicas do Token", + "publicTokenInfoHelp": "É assim que seu ativo aparecerá para Wallets, explorers e o público.", + "includedInPublicView": "Incluído na visualização pública", + "publicCount": "Públicos: {count}", + "publicCoverage": "{publicCount} de {totalCount} campos públicos", + "notIncludedByDefault": "Não incluído por padrão", + "notIncludedHelp": "Esses campos permanecem privados, a menos que você opte por incluí-los.", + "preview": "Prévia", + "token": "Token", + "explorer": "Explorer", + "wallet": "Wallet", + "assetLogo": "Logo de {name}", + "asset": "Ativo", + "mintAddress": "Endereço do mint", + "copyMintAddress": "Copiar endereço do mint", + "viewOnExplorer": "Ver no explorer", + "copied": "Copiado", + "noPublicDescription": "Sem descrição pública", + "decimalsValue": "Decimais: {count}", + "alwaysPublic": "Sempre público — não pode ser ocultado", + "hidePublicField": "Público — ocultar este campo", + "showPublicField": "Oculto — exibir este campo publicamente" + }, + "assetDetails": { + "title": "Detalhes do ativo", + "description": "Adicione as principais informações sobre este ativo. Você pode atualizar esses detalhes a qualquer momento.", + "tabs": { + "overview": "Visão geral", + "compliance": "Compliance e acesso", + "operational": "Operacional", + "custom": "Campos personalizados" + }, + "about": "Sobre este ativo", + "namePlaceholder": "ex.: Verde Dollar", + "lockedAfterDeploy": "Bloqueado após o deploy", + "aboutDescription": "Informações básicas que descrevem o que é este ativo.", + "symbolPlaceholder": "ex.: vUSD", + "descriptionLabel": "Descrição", + "descriptionPlaceholder": "Descreva o que este ativo representa.", + "website": "Site", + "websitePlaceholder": "https://…", + "logoImageUrl": "URL da imagem do logo", + "logoPlaceholder": "https://…/logo.png", + "logoHint": "Exibido ao lado do seu Token em Wallets e explorers.", + "supplyControls": "Fornecimento", + "supplyControlsDescription": "Quanto deste ativo pode existir no total.", + "maxSupply": "Fornecimento máximo", + "maxSupplyPlaceholder": "Ilimitado", + "maxSupplyHint": "Em branco = ilimitado. Aplicado pela SDP enquanto ela mantiver a Mint Authority, podendo ser bloqueado permanentemente on-chain.", + "documents": "Documentos e referências", + "documentsDescription": "Documentos e referências importantes relacionados a este ativo.", + "accessControlDescription": "Escolha como este Token trata endereços de destino aprovados ou bloqueados.", + "learnLists": "Saiba como allowlist e blocklist se diferem", + "operational": "Operacional", + "operationalDescription": "Configurações operacionais opcionais.", + "signingWallet": "Wallet de assinatura", + "optionalSignerHint": "Opcional — deixe sem seleção para usar o signatário padrão do projeto.", + "customFields": "Campos personalizados", + "customFieldsDescription": "Adicione seus próprios campos privados, armazenados em custom.customer.", + "projectDefaultSigner": "Signatário padrão do projeto", + "signingWalletLockReason": "Definido na criação — operações individuais podem usar um signatário diferente.", + "documentTypePlaceholder": "Tipo de documento", + "documentNamePlaceholder": "Nome", + "removeDocument": "Remover documento", + "addDocument": "Adicionar documento", + "hideJson": "Ocultar JSON", + "viewJson": "Ver JSON", + "copied": "Copiado!", + "customFieldKey": "Chave", + "customFieldValue": "Valor", + "removeCustomField": "Remover campo", + "addCustomField": "Adicionar campo", + "copyJson": "Copiar JSON", + "deployConfigAuthorityNote": "As autoridades (mint, freeze, delegate) são atribuídas no deploy a partir da custódia da sua Wallet de assinatura." + }, + "assetProfileDetails": { + "privateByDefault": "Esta informação é privada por padrão e não ficará visível ao público, a menos que você opte por incluí-la." + } + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-payments.json b/apps/sdp-web/messages/pt/dashboard-payments.json new file mode 100644 index 000000000..ad9684737 --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-payments.json @@ -0,0 +1,1043 @@ +{ + "DashboardPayments": { + "page": { + "unavailableStatus": "indisponível", + "unknownError": "Erro desconhecido", + "walletApiError": "API da Wallet {status}: {error}", + "walletAggregateApiError": "API de agregação da Wallet {status}: {error}", + "transferApiError": "API de transferência {status}: {error}" + }, + "workspace": { + "walletListRequestFailed": "Falha na solicitação da lista de Wallets ({status}).", + "walletAggregateRequestFailed": "Falha na solicitação de agregação da Wallet ({status}).", + "walletAggregateMissing": "A resposta de agregação da Wallet está sem os detalhes agregados.", + "walletPolicyRequestFailed": "Falha na solicitação da política da Wallet ({status}).", + "transferListRequestFailed": "Falha na solicitação da lista de transferências ({status}).", + "transferListMissing": "A resposta da lista de transferências está sem os dados da transferência.", + "transferLookupFailed": "Falha na busca da transferência ({status}).", + "transferLookupMissing": "A resposta da busca da transferência está sem os dados da transferência.", + "transferLookupMultiple": "A busca da transferência retornou múltiplas transferências.", + "transferCancellationFailed": "Falha no cancelamento da transferência ({status}).", + "rampEstimateRequestFailed": "Falha na solicitação de estimativa de ramp ({status}).", + "rampEstimateMissing": "A resposta de estimativa de ramp está sem as estimativas.", + "walletBalancesRequestFailed": "Falha na solicitação de saldos da Wallet ({status}).", + "walletBalancesMissing": "A resposta de saldos da Wallet está sem os detalhes do saldo.", + "walletPolicyUpdateFailed": "Falha na atualização da política da Wallet ({status}).", + "walletPolicyUpdateEmpty": "A atualização da política da Wallet retornou uma resposta vazia.", + "transferRequestFailed": "Falha na solicitação de transferência ({status}).", + "transferMissing": "A resposta da transferência está sem os detalhes da transferência.", + "recipientListRequestFailed": "Falha na solicitação da lista de destinatários ({status}).", + "recipientListMissing": "A resposta da lista de destinatários está sem os destinatários.", + "batchEstimateRequestFailed": "Falha na solicitação de estimativa em lote ({status}).", + "batchEstimateMissing": "A resposta de estimativa em lote está sem os detalhes da estimativa.", + "batchTransferRequestFailed": "Falha na solicitação de transferência em lote ({status}).", + "batchTransferMissing": "A resposta de transferência em lote está sem os detalhes do lote.", + "rampEventRequestFailed": "Falha na solicitação de evento do {provider} ({status}).", + "rampEventMissing": "A resposta de evento do {provider} está sem os detalhes da transferência.", + "counterpartyAccountsRequestFailed": "Falha ao carregar contas ({status}).", + "sandboxSimulationRequestFailed": "Falha na simulação do Sandbox ({status}).", + "requirementsRequestFailed": "Falha na solicitação de requisitos ({status}).", + "requirementsAdvanceFailed": "Falha ao avançar os requisitos ({status}).", + "requirementsContextMissing": "Não é possível avançar os requisitos sem um provedor e uma contraparte.", + "complianceCheckFailed": "Falha na verificação de compliance.", + "complianceNotEnabled": "A triagem de compliance com Range, Elliptic, TRM e Chainalysis está disponível no plano Enterprise. Entre em contato conosco para ativá-la para sua organização.", + "destinationRequired": "O endereço de destino é obrigatório.", + "transferBlocked": "Transferência bloqueada.", + "transferBlockedDescription": "Execute a verificação de compliance ou use um destino que já esteja na allowlist da Wallet de origem.", + "transactionSent": "Transação enviada.", + "viewOnSolanaExplorer": "Ver no Solana Explorer", + "walletsLoadFailed": "Falha ao carregar as Wallets.", + "walletPolicyLoadFailed": "Falha ao carregar a política da Wallet.", + "addressRequired": "O endereço é obrigatório.", + "complianceCheckRequired": "Execute a verificação de compliance antes de adicionar o endereço.", + "addressAlreadyAllowlisted": "O endereço já está na allowlist de destino.", + "addressAddedToAllowlist": "Endereço adicionado à allowlist de destino da Wallet.", + "destinationAddressAddFailed": "Falha ao adicionar o endereço de destino.", + "sourceWalletRequired": "Selecione uma Wallet de origem primeiro.", + "destinationAllowlistLoadFailed": "Falha ao carregar a allowlist de destino." + }, + "paymentMethods": { + "onchainTransfer": "Transferência on-chain", + "onchainTransferDescription": "Envie criptomoedas de uma Wallet da SDP para o endereço Solana de uma contraparte.", + "payWithFiat": "Pagar em fiat", + "payWithFiatDescription": "Converta criptomoedas em fiat e faça o pagamento por meio de um provedor.", + "onchainDeposit": "Depósito on-chain", + "onchainDepositDescription": "Receba criptomoedas diretamente no endereço de uma Wallet da SDP.", + "depositWithFiat": "Depositar com fiat", + "depositWithFiatDescription": "Compre criptomoedas com fiat por meio de um provedor e deposite em uma Wallet." + }, + "cancelTransaction": { + "ariaLabel": "Cancelar transação", + "title": "Cancelar esta transação?", + "description": "Esta transação já foi iniciada. Se você cancelar agora, sairá do fluxo.", + "keepGoing": "Continuar transação", + "cancel": "Cancelar transação" + }, + "sendMode": { + "single": "Único", + "batch": "Lote", + "onchain": "On-chain" + }, + "ramps": { + "max": "MÁX", + "recentTransfersRequestFailed": "Falha na solicitação de transferências recentes.", + "recentTransfers": "Transferências recentes", + "noRecentTransactions": "Nenhuma transação recente.", + "chooseProvider": "Escolha um provedor", + "unavailableCount": "Indisponíveis: {count}", + "noProvidersAvailable": "Nenhum provedor está disponível para esta seleção.", + "unavailableProviders": "Provedores indisponíveis", + "walletAddressQrCode": "Código QR do endereço da Wallet", + "walletReceiveDescription": "Escaneie este código QR ou copie o endereço para receber USDC ou qualquer Token SPL na rede Solana, na Wallet selecionada.", + "addressCopied": "Endereço copiado.", + "copyAddress": "Copiar endereço", + "convertTo": "Converter para", + "currency": "Moeda", + "selectCurrency": "Selecione uma moeda", + "searchCurrencies": "Buscar moedas", + "searchAssets": "Buscar ativos", + "balanceAvailable": "{amount} disponível", + "amount": "Valor", + "destinationWallet": "Wallet de destino", + "sourceWallet": "Wallet de origem", + "memoViewJson": "Ver JSON", + "memoJsonTitle": "JSON do memo", + "memoJsonDescription": "Os campos do memo como serão incluídos na solicitação.", + "memoDescription": "Adicione campos de chave-valor para conciliação off-chain. Cole linhas separadas por tabulação ou vírgula em qualquer lugar.", + "memoKey": "Chave", + "memoValue": "Valor", + "memoKeyPlaceholder": "fatura", + "memoValuePlaceholder": "FAT-123", + "removeMemoRow": "Remover linha do memo {row}", + "addMemoRow": "Adicionar linha", + "memoErrorKeyRequired": "A chave é obrigatória.", + "memoErrorKeyTooLong": "A chave deve ter {limit} caracteres ou menos.", + "memoErrorKeyDuplicate": "As chaves devem ser únicas.", + "memoErrorValueRequired": "O valor é obrigatório.", + "memoErrorValueTooLong": "O valor deve ter {limit} caracteres ou menos.", + "memoErrorTooManyFields": "O memo pode conter no máximo {limit} campos.", + "rampMemoStep": "Memo", + "rampMemoStepTitle": "Adicione um memo (opcional)", + "detailsStep": "Detalhes", + "onrampDepositStep": "Depósito", + "onrampDepositTitle": "Quanto você gostaria de depositar?", + "onrampProviderTitle": "Conclua seu depósito", + "onrampRequirementsTitle": "Alguns detalhes para continuar", + "offrampWalletStep": "Wallet", + "offrampWalletTitle": "De qual Wallet você está sacando?", + "offrampWithdrawStep": "Saque", + "offrampWithdrawTitle": "Quanto você gostaria de sacar?", + "offrampCompleteStep": "Conclusão", + "offrampCompleteTitle": "Conclua seu pagamento de saída", + "payoutDetailsStep": "Detalhes do pagamento de saída", + "payoutDetailsTitle": "Para onde devemos enviar o pagamento de saída?", + "selectDestinationWallet": "Selecione uma Wallet de destino", + "selectSourceWallet": "Selecione uma Wallet de origem", + "searchWallets": "Buscar Wallets", + "fees": "Taxas {providerFee} {providerCurrency} + {networkFee} {networkCurrency}", + "noFees": "Sem taxas", + "fee": "Taxa {amount} {currency}", + "estimatedReceived": "Recebimento estimado", + "rateKnownAtQuote": "Taxa de câmbio definida na cotação", + "unavailable": "Indisponível", + "acceptTerms": "Aceitar termos", + "completeVerification": "Concluir verificação", + "tryAgain": "Tentar novamente", + "quoteMissingInstructions": "A cotação de ramp está sem as instruções de pagamento.", + "sendCrypto": "Enviar {amount} {token}", + "quoteExpired": "Cotação expirada", + "sending": "Enviando...", + "transferSubmitted": "Transferência enviada", + "transferFailed": "Falha na transferência.", + "transactionSentSuccessfully": "Transação enviada com sucesso.", + "transferStatus": "Status: {status}", + "submittingOnchainTransfer": "Enviando transferência on-chain.", + "simulatingQuoteFunding": "Simulando o depósito da cotação.", + "quoteFundingSimulated": "Depósito da cotação simulado.", + "quoteSimulationFailed": "Falha na simulação da cotação.", + "sandboxSimulationFailed": "Falha na simulação do Sandbox.", + "muralSandboxCurrencyUnsupported": "O depósito no Sandbox da Mural não é compatível com {currency}.", + "transferSignatureMissing": "A transferência não retornou uma assinatura (status: {status}).", + "offrampManualDescription": "Envie {amount} {token} para o endereço de depósito abaixo antes que a cotação expire. O provedor converte o valor pela taxa de câmbio travada e realiza o pagamento automaticamente na conta bancária salva.", + "noPayoutProviders": "Nenhum provedor de pagamentos de saída está ativado para esta organização.", + "providerPayout": "Pagamento de saída via {provider}", + "noDepositProviders": "Nenhum provedor de depósito está ativado para esta organização.", + "providerDeposit": "Depósito via {provider}", + "quoteRequestFailedStatus": "Falha na solicitação de cotação de ramp ({status}).", + "quoteResponseMissingDetails": "A resposta da cotação de ramp está sem os detalhes da cotação.", + "creatingQuote": "Criando cotação.", + "widgetReady": "Widget pronto.", + "quoteReady": "Cotação pronta.", + "unableToCreateQuote": "Não foi possível criar a cotação.", + "quoteRequestFailed": "Falha na solicitação de cotação de ramp.", + "settingUpAccount": "Configurando sua conta.", + "moreDetailsNeeded": "Precisamos de mais alguns detalhes antes de continuar.", + "unableToStartOnboarding": "Não foi possível iniciar o onboarding.", + "requirementsRequestFailed": "Falha na solicitação de requisitos.", + "nextStepSoon": "Próxima etapa em breve.", + "cannotCancelWithoutQuote": "Não é possível cancelar sem uma cotação ativa.", + "cancelingTransaction": "Cancelando transação.", + "transactionCanceled": "Transação cancelada.", + "unableToCancelTransaction": "Não foi possível cancelar a transação.", + "cancellationFailed": "Falha no cancelamento.", + "funded": "Depositado", + "sent": "Enviado", + "provider": "Provedor", + "finalFundedAmount": "Valor final depositado", + "finalSentAmount": "Valor final enviado", + "finalReceivedAmount": "Valor final recebido", + "finalPayoutAmount": "Valor final do pagamento de saída", + "completed": "Concluído", + "transferId": "ID da transferência", + "quoteId": "ID da cotação", + "depositComplete": "Depósito concluído", + "payoutComplete": "Pagamento de saída concluído", + "depositCompleteDescription": "Os fundos foram liquidados na Wallet de destino.", + "payoutCompleteDescription": "O pagamento de saída foi liquidado na conta bancária do destinatário.", + "fundedWith": "depositado com", + "from": "de", + "newPayeeHint": "Crie um novo beneficiário se ele ainda não estiver na lista.", + "newBuyerHint": "Crie um novo comprador se ele ainda não estiver na lista.", + "destinationAccount": "Conta de destino", + "selectCounterpartyFirst": "Selecione uma contraparte primeiro", + "noSolanaAccounts": "Nenhuma conta Solana registrada", + "selectDestinationAccount": "Selecione uma conta de destino", + "searchAccounts": "Buscar contas", + "assetBreakdown": "Detalhamento de ativos", + "total": "{amount} no total", + "selectCounterparty": "Selecione uma contraparte", + "searchCounterparties": "Buscar contrapartes", + "counterpartiesLoadFailed": "Falha ao carregar as contrapartes.", + "openFullScreen": "Abrir em tela cheia", + "selectField": "Selecionar {field}", + "search": "Buscar…", + "stripeLoadError": "Não foi possível carregar o checkout da Stripe", + "stripeLoadHelp": "O checkout da Stripe falhou ao carregar. Verifique sua conexão e tente novamente.", + "moneygramEventFailed": "Falha ao registrar o evento do MoneyGram.", + "eventRequestFailed": "Falha na solicitação do evento.", + "moneygramCompletionBeforeTransfer": "O MoneyGram reportou a conclusão antes que a transferência de criptomoedas fosse registrada.", + "moneygramWidgetLoadFailed": "Falha ao carregar o widget do MoneyGram.", + "unsupportedMoneygramTransaction": "Transação não compatível: {asset} em {chain}.", + "sourceWalletNoUsdc": "A Wallet de origem não tem saldo em USDC para enviar.", + "coinbaseEventFailed": "Falha ao registrar o evento da Coinbase.", + "coinbaseOnramp": "On-ramp da Coinbase", + "status": { + "waitingForFunding": "Aguardando depósito", + "waitingToSend": "Aguardando envio", + "waitingForFundingDescription": "Envie os fundos seguindo as instruções acima. Atualizaremos este depósito automaticamente assim que o provedor receber o pagamento.", + "waitingToSendDescription": "Conclua o pagamento de saída seguindo as instruções acima. Atualizaremos esta transferência de saída automaticamente assim que o provedor receber suas criptomoedas.", + "depositReceived": "Depósito recebido", + "sendingPayout": "Enviando pagamento de saída", + "depositReceivedDescription": "O provedor recebeu os fundos e está liquidando o depósito na Wallet de destino.", + "sendingPayoutDescription": "O provedor recebeu suas criptomoedas e está liquidando o pagamento de saída para o destinatário.", + "transferComplete": "Transferência concluída", + "payoutSent": "Pagamento de saída enviado", + "transferCompleteDescription": "O depósito está concluído. Você pode revisar a transferência no registro da contraparte.", + "payoutSentDescription": "O pagamento de saída foi liquidado. Você pode revisar esta transferência no registro da contraparte.", + "transferFailed": "Falha na transferência", + "payoutFailed": "Falha no pagamento de saída", + "transferFailedDescription": "O provedor reportou que este depósito falhou. Revise o registro da contraparte para ver o status mais recente da transferência.", + "payoutFailedDescription": "O provedor reportou que este pagamento de saída falhou. Revise o registro da contraparte para ver o status mais recente da transferência.", + "quoteExpired": "Cotação expirada", + "quoteExpiredFundingDescription": "Esta cotação expirou antes que a transferência fosse concluída. Crie uma nova cotação para continuar o depósito.", + "quoteExpiredPayoutDescription": "Esta cotação expirou antes que o pagamento de saída fosse concluído. Crie uma nova cotação para continuar o saque.", + "updated": "Status da transferência atualizado", + "currentProviderStatus": "Status atual do provedor: {status}.", + "preparing": "Preparando o status da transferência", + "preparingDescription": "Estamos aguardando o registro da transferência vinculado a esta cotação." + } + }, + "onchainSend": { + "noAssets": "Esta Wallet não tem ativos disponíveis para enviar.", + "addSolanaAddress": "Adicionar endereço Solana", + "counterpartyNoAddress": "{counterparty} ainda não tem um endereço Solana registrado.", + "thisCounterparty": "Esta contraparte", + "attachDestination": "Anexe outro endereço de destino para esta contraparte.", + "sourceWallet": "Wallet de origem", + "selectSourceWallet": "Selecione uma Wallet de origem", + "searchWallets": "Buscar Wallets", + "amount": "Valor", + "asset": "Ativo", + "selectAsset": "Selecionar", + "memoOptional": "Memo (opcional)", + "memoPlaceholder": "Adicione uma observação para esta transferência", + "to": "Para", + "destination": "Destino", + "destinationTitle": "Para onde devem ir os fundos?", + "details": "Detalhes", + "detailsTitle": "O que você gostaria de enviar?", + "review": "Revisão", + "reviewTitle": "Revisar transferência", + "submittingTransfer": "Enviando transferência.", + "memo": "Memo", + "counterparty": "contraparte", + "toCounterparty": "para {counterparty}", + "transferSubmitted": "Transferência enviada", + "transactionSent": "Transação enviada com sucesso.", + "transferFailed": "Falha na transferência.", + "transferSuccess": "Sua transferência foi enviada com sucesso.", + "transferStatus": "Status: {status}", + "viewOnExplorer": "Ver no explorer" + }, + "onchainReceive": { + "wallet": "Wallet", + "walletTitle": "Qual Wallet deve receber os fundos?", + "receive": "Receber", + "receiveTitle": "Receber fundos on-chain" + }, + "bvnk": { + "verificationRequiredTitle": "Verifique sua identidade", + "verificationRequiredDescription": "A BVNK trabalha em parceria com a Sumsub para confirmar sua identidade antes de ativar sua conta de fundos. Clique em “Concluir verificação” para começar — esta página é atualizada automaticamente assim que a aprovação for concluída, e suas instruções aparecerão bem aqui.", + "verificationInReviewTitle": "Verificação em análise", + "verificationInReviewDescription": "A Sumsub está analisando seus dados — isso costuma levar apenas alguns minutos. Fique à vontade para voltar mais tarde; suas instruções aparecerão aqui assim que a aprovação for concluída.", + "verificationFailedTitle": "A verificação de identidade não foi aprovada", + "verificationFailedDescription": "A BVNK não conseguiu verificar sua identidade, então esta conta de fundos não pode ser ativada. Entre em contato com o suporte se você acredita que isso é um engano.", + "fundingAccountProvisioningTitle": "Configurando sua conta de fundos", + "fundingAccountProvisioningDescription": "Quase lá — estamos provisionando sua conta virtual agora. Suas instruções aparecerão aqui em instantes.", + "provisioningFailedTitle": "Não conseguimos concluir a configuração da sua conta", + "provisioningFailedDescription": "Algo deu errado ao provisionar sua conta de fundos. Tente novamente.", + "readyTitle": "Preparando suas instruções", + "readyDescription": "Sua conta de fundos está pronta — buscando seus dados agora.", + "onrampProvisioningDetail": "Provisionando uma Wallet da BVNK e uma regra de pagamento fiat→cripto para esta cotação.", + "offrampProvisioningDetail": "Provisionando uma Wallet de pagamentos de saída dedicada da BVNK para esta moeda.", + "simulateDeposit": "Simular depósito", + "simulating": "Simulando...", + "depositSimulated": "Depósito simulado" + }, + "lightspark": { + "verificationRequiredTitle": "Verifique sua identidade", + "verificationRequiredDescription": "Precisamos confirmar sua identidade antes de ativar sua conta de fundos. Esta página é atualizada automaticamente assim que a aprovação for concluída.", + "verificationInReviewTitle": "Verificação em análise", + "verificationInReviewDescription": "Seus dados estão em análise — isso costuma levar apenas alguns minutos. Suas instruções aparecerão aqui assim que a aprovação for concluída.", + "verificationFailedTitle": "A verificação de identidade não foi aprovada", + "verificationFailedDescription": "Não conseguimos verificar sua identidade, então esta conta de fundos não pode ser ativada. Entre em contato com o suporte se você acredita que isso é um engano.", + "fundingAccountProvisioningTitle": "Configurando sua conta", + "fundingAccountProvisioningDescription": "Quase lá — estamos preparando sua conta de fundos. Suas instruções aparecerão aqui em instantes.", + "provisioningFailedTitle": "Não conseguimos concluir a configuração da sua conta", + "provisioningFailedDescription": "Algo deu errado ao preparar sua conta de fundos. Tente novamente.", + "readyTitle": "Preparando suas instruções", + "readyDescription": "Sua conta está pronta — buscando seus dados agora.", + "onrampProvisioningDetail": "Provisionando seu cliente Lightspark e os dados de depósito para esta cotação.", + "offrampProvisioningDetail": "Provisionando uma conta de pagamentos de saída sob demanda da Lightspark para este saque.", + "simulateQuote": "Simular cotação", + "simulating": "Simulando...", + "quoteSimulated": "Cotação simulada" + }, + "mural": { + "termsTitle": "Aceite os termos da Mural Pay", + "termsDescription": "A Mural Pay exige que a contraparte aceite os termos hospedados antes que a verificação de identidade possa começar.", + "verificationRequiredTitle": "Verifique sua identidade", + "verificationRequiredDescription": "A Mural Pay precisa que a contraparte conclua a verificação hospedada antes de ativar uma conta de fundos.", + "verificationInReviewTitle": "Verificação em análise", + "verificationInReviewDescription": "A Mural Pay está analisando a contraparte. As instruções de depósito aparecerão assim que a verificação for aprovada.", + "verificationFailedTitle": "A verificação de identidade não foi aprovada", + "verificationFailedDescription": "A Mural Pay não conseguiu aprovar esta contraparte, então uma conta de fundos não pode ser ativada.", + "fundingAccountProvisioningTitle": "Configurando sua conta de fundos", + "fundingAccountProvisioningDescription": "A Mural Pay está ativando uma conta de fundos. Os dados bancários aparecerão aqui quando estiver pronta.", + "readyTitle": "Preparando suas instruções", + "readyDescription": "Sua conta de fundos da Mural Pay está pronta. Buscando os dados mais recentes agora.", + "onrampProvisioningDetail": "Provisionando uma conta de fundos da Mural Pay para esta contraparte.", + "offrampProvisioningDetail": "Verificando o status de verificação da organização na Mural Pay antes do saque.", + "simulateDeposit": "Simular depósito", + "simulating": "Simulando...", + "depositSimulated": "Depósito simulado" + }, + "batchSend": { + "recipientStatusPending": "Pendente", + "recipientStatusProcessing": "Processando", + "recipientStatusConfirmed": "Concluído", + "recipientStatusFailed": "Falhou", + "recipientStatusArchived": "Arquivado", + "resultConfirmed": "Lote enviado", + "resultPartiallyFailed": "Lote falhou parcialmente", + "resultFailed": "Lote falhou", + "resultSubmitted": "Lote registrado", + "recipientsStep": "Destinatários", + "recipientsTitle": "Pagar vários destinatários", + "reviewStep": "Revisão", + "reviewTitle": "Revisar lote", + "customToken": "Token personalizado", + "tokenUnavailableOnNetwork": "{currency} não está disponível nesta rede.", + "importExceedsMaximumRecipients": "Um lote pode ter no máximo {max} destinatários. Esta importação levaria o total a {total}.", + "submitting": "Enviando lote.", + "someRecipientsDidNotReceiveFunds": "Alguns destinatários não receberam os fundos.", + "status": "Status: {status}", + "estimateFailed": "Falha na estimativa.", + "recipientSingular": "{count} destinatário", + "recipientPlural": "{count} destinatários", + "yourWallet": "sua Wallet", + "maximumRecipients": "Um lote pode ter no máximo {count} destinatários.", + "insufficientBalance": "Saldo insuficiente", + "walletsSelectedSingular": "{count} Wallet selecionada", + "walletsSelectedPlural": "{count} Wallets selecionadas", + "from": "De", + "reference": "Referência", + "referenceOptional": "Opcional", + "selectSourceWallet": "Selecione uma Wallet de origem", + "searchWallets": "Buscar Wallets", + "asset": "Ativo", + "selectAsset": "Selecione um ativo", + "noAssets": "Esta Wallet não tem ativos disponíveis para enviar.", + "selectRecipientWallets": "Selecione as Wallets dos destinatários", + "bulkImport": "Ou importar em massa", + "searchCounterparty": "Buscar contraparte", + "paginationSummary": "{page} / {pageCount}", + "noCounterpartiesWithSolanaAddress": "Nenhuma contraparte com endereço Solana.", + "noMatches": "Nenhuma correspondência.", + "addRecipient": "Adicionar {name}", + "totalAmount": "Total {total} {asset}", + "totalOfAmount": " de {available} {asset}", + "reviewSummary": "{total} {asset} → {recipients}", + "transactionCountSingular": "{count} transação", + "transactionCountPlural": "{count} transações", + "source": "Origem", + "transactionFees": "Taxas de transação", + "rentFees": "Taxas de rent", + "total": "Total", + "sponsoredFee": "0 SOL", + "sponsoredBy": "Patrocinado pela SDP via Kora", + "estimating": "Estimando…", + "resultSummary": "{recipients} destinatários · {transactions} transações", + "viewOnExplorer": "Ver no explorer", + "bulkImportAriaLabel": "Importar destinatários em massa", + "bulkImportTitle": "Importar destinatários em massa", + "bulkImportDescriptionBefore": "Cole linhas de ", + "bulkImportFields": "counterparty_wallet_id, moeda reconhecida (well-known) ou endereço de mint, valor", + "bulkImportDescriptionAfter": " em qualquer campo, ou adicione um de cada vez.", + "counterpartyWalletIdPlaceholder": "counterparty_wallet_id", + "currencyOrMintPlaceholder": "moeda ou mint", + "amountPlaceholder": "valor", + "removeRow": "Remover linha {row}", + "addRecipientRow": "Adicionar destinatário", + "rowError": "Linha {row}: {message}", + "addAtLeastOneRecipient": "Adicione ao menos um destinatário.", + "oneCurrencyRequired": "Todas as linhas devem usar uma única moeda ou endereço de mint (encontrado {currencies}).", + "walletNotFound": "Wallet não encontrada: {id}", + "importFailed": "Falha na importação.", + "cancel": "Cancelar", + "importing": "Importando…", + "import": "Importar" + }, + "manualInstructions": { + "copied": "Copiado: {label}.", + "copyFailed": "Falha ao copiar {label}.", + "copy": "Copiar", + "instructions": "Instruções", + "quoteSummary": "Resumo da cotação", + "quoteSummaryDescription": "Preço travado para esta instrução de depósito.", + "finalAmount": "Valor final", + "depositAmount": "Valor do depósito", + "feesIncluded": "Taxas incluídas", + "exchangeRate": "Taxa de câmbio", + "expires": "Expira", + "bankName": "Nome do banco", + "routingNumber": "Número de roteamento", + "accountNumber": "Número da conta", + "walletAddress": "Endereço da Wallet", + "reference": "Referência", + "supportedRails": "Rails aceitos", + "notes": "Notas", + "depositAddress": "Endereço de depósito", + "bankCode": "Código do banco", + "paymentReference": "Referência do pagamento", + "identityVerificationRequired": "Verificação de identidade necessária", + "completeVerification": "Concluir verificação", + "provisioningAccount": "A BVNK está provisionando sua conta bancária virtual", + "verificationInReview": "Verificação em análise", + "provisioningFundingAccount": "Provisionando conta de fundos", + "checkingVerificationStatus": "Verificando status da verificação", + "manualFundingInstructions": "Instruções de depósito manual", + "defaultDescription": "Envie {amount} usando um dos rails aceitos. Inclua a referência exatamente para que o provedor consiga associar o depósito a esta cotação.", + "quotedAmount": "o valor cotado", + "cryptoDeposit": "Depósito em {currency}", + "virtualAccount": "Conta virtual em {currency}", + "payin": "Payin em {currency}" + }, + "providerRisk": { + "close": "Fechar {title}", + "description": "Esta triagem verifica os principais fatores de risco, como exposição a sanções e outros sinais de compliance dos provedores conectados.", + "provider": "Provedor", + "analysis": "Análise", + "noTrmAttribution": "Sem atribuição da TRM", + "unavailable": "Indisponível", + "error": "Erro", + "notAvailable": "N/D", + "dismiss": "Dispensar" + }, + "counterparty": { + "loadFailed": "Não foi possível carregar as contrapartes", + "metadataMissing": "A resposta de metadados da contraparte estava vazia.", + "validation": { + "required": "Obrigatório", + "invalidEmail": "E-mail inválido", + "invalidDate": "Informe uma data no formato AAAA-MM-DD.", + "dateMustBePast": "Deve ser uma data no passado.", + "invalidPhone": "Informe um número de telefone no formato E.164 (por exemplo, +14155551234).", + "selectCountry": "Selecione um país.", + "selectState": "Selecione um estado." + }, + "addExternalAccount": "Adicionar conta externa", + "addExternalAccountDescription": "Anexe uma Wallet de cripto para esta contraparte. O endereço passa por triagem de risco antes de ser adicionado.", + "addCounterparty": "Adicionar contraparte", + "created": "Contraparte {name} criada", + "createdSuccess": "Contraparte criada", + "transferType": "Tipo", + "transferProvider": "Provedor", + "transferWallet": "Wallet", + "transferAmount": "Valor", + "transferStatus": "Status", + "transferDate": "Data", + "allProviders": "Todos os provedores", + "noFilteredTransactions": "Nenhuma transação corresponde aos filtros selecionados.", + "fullName": "Nome completo", + "createdLabel": "Criado", + "youDeposit": "Você deposita", + "youSend": "Você envia", + "recipientGets": "Destinatário recebe", + "viewOnExplorer": "Ver no explorer", + "deleted": "Contraparte {name} excluída", + "createdButUnavailable": "A contraparte foi criada, mas não pôde ser carregada.", + "somethingWentWrong": "Algo deu errado", + "addCryptoAccount": "Adicionar uma conta cripto", + "addCryptoAccountDescription": "Opcionalmente, adicione uma Wallet de cripto para esta contraparte. Você pode pular esta etapa e adicionar contas depois.", + "cryptoWallet": "Wallet de cripto", + "done": "Concluído", + "skip": "Pular", + "displayName": "Nome de exibição", + "individualNamePlaceholder": "Joana Silva", + "businessNamePlaceholder": "Acme Corp", + "email": "E-mail", + "emailPlaceholder": "contato@exemplo.com", + "externalId": "ID externo", + "optional": "(opcional)", + "externalIdPlaceholder": "seu-id-interno", + "firstName": "Nome", + "firstNamePlaceholder": "Joana", + "lastName": "Sobrenome", + "lastNamePlaceholder": "Silva", + "dateOfBirth": "Data de nascimento", + "phone": "Telefone", + "phonePlaceholder": "+55 11 90000-0000", + "line1": "Linha 1", + "line1Placeholder": "Rua Principal, 123", + "line2": "Linha 2", + "line2Placeholder": "Conjunto 400", + "city": "Cidade", + "cityPlaceholder": "São Paulo", + "postalCode": "Código postal", + "country": "País", + "selectCountry": "Selecionar país", + "searchCountries": "Buscar países…", + "state": "Estado", + "selectState": "Selecionar estado", + "searchStates": "Buscar estados…", + "stateProvince": "Estado / Província", + "statePlaceholder": "SP", + "basics": "Básico", + "entityType": "Tipo de entidade", + "individual": "Pessoa física", + "business": "Pessoa jurídica", + "personalInfo": "Informações pessoais", + "address": "Endereço", + "back": "Voltar", + "creating": "Criando", + "create": "Criar", + "next": "Próximo", + "stepProgress": "Etapa {current} de {total}", + "deleteCounterparty": "Excluir contraparte", + "deleteNamedCounterparty": "Tem certeza de que deseja excluir {name}? Isso arquivará a contraparte e suas contas.", + "deleteThisCounterparty": "Tem certeza de que deseja excluir esta contraparte?", + "cancel": "Cancelar", + "deleting": "Excluindo", + "delete": "Excluir", + "basicInfo": "Informações básicas", + "basicInfoDescription": "Informe o nome e os dados de contato da contraparte.", + "personal": "Pessoal", + "personalDetails": "Detalhes pessoais", + "personalDetailsDescription": "Informações de identidade desta pessoa física.", + "location": "Localização", + "locationDescription": "Ajuda a verificar a identidade e a localização da contraparte.", + "review": "Revisão", + "reviewCreate": "Revisar e criar", + "reviewCreateDescription": "Confirme se está tudo certo antes de criar.", + "adding": "Adicionando", + "screening": "Triagem", + "addAccount": "Adicionar conta", + "cryptoAccountAttached": "Conta cripto anexada", + "label": "Rótulo", + "accountLabelPlaceholder": "ex.: Wallet Solana da Alice", + "network": "Rede", + "selectNetwork": "Selecionar rede", + "walletAddress": "Endereço da Wallet", + "destinationWalletAddress": "Endereço da Wallet de destino", + "screeningUnavailable": "Não foi possível fazer a triagem deste endereço — a triagem de compliance está indisponível. Adicionar mesmo assim?", + "screeningWarning": "Uma ou mais verificações sinalizaram esta Wallet ou não puderam ser concluídas. Adicionar mesmo assim?", + "holdToAddAnyway": "Mantenha pressionado para adicionar mesmo assim", + "searchAddress": "Buscar endereço", + "searchAddressPlaceholder": "Buscar endereço ou empresa…", + "failedToLoadPlaceDetails": "Falha ao carregar detalhes do local", + "searchFailed": "Falha na busca", + "searching": "Buscando…", + "noMatches": "Nenhuma correspondência encontrada.", + "updating": "Atualizando…", + "searchToPreviewAddress": "Busque para pré-visualizar o endereço", + "complianceScreening": "Triagem de compliance", + "checking": "Verificando…", + "directory": "Diretório", + "directoryDescription": "Pessoas físicas e jurídicas cadastradas em seu espaço de trabalho.", + "noCounterparties": "Nenhuma contraparte ainda", + "noCounterpartiesDescription": "Adicione sua primeira pessoa física ou jurídica para começar.", + "type": "Tipo", + "manageCounterparty": "Gerenciar contraparte", + "counterpartyActions": "Ações da contraparte", + "transactionDetails": "Detalhes da transação", + "playgroundProductName": "Contraparte", + "playgroundCounterpartyIdPlaceholder": "ID da contraparte (ex.: cpty_abc123)", + "listCounterparties": "Listar contrapartes", + "getCounterparty": "Obter contraparte", + "createCounterparty": "Criar contraparte", + "playgroundEmailPlaceholder": "contact@acme.com", + "playgroundIndividualOnly": "Obrigatório quando entityType for individual; deixe em branco para business.", + "playgroundAddressRequired": "Obrigatório para todos os tipos de entidade.", + "playgroundDateOfBirthPlaceholder": "1990-01-15", + "playgroundPhonePlaceholder": "+14155551234", + "selectEntityType": "Selecionar tipo de entidade", + "updateCounterparty": "Atualizar contraparte", + "updatedDisplayNamePlaceholder": "Nome de exibição atualizado", + "updatedEmailPlaceholder": "atualizado@exemplo.com", + "noTransactions": "Nenhuma transação vinculada a esta contraparte ainda.", + "allTypes": "Todos os tipos", + "identity": "Identidade", + "personalInformation": "Informações pessoais", + "noPersonalInformation": "Nenhuma informação pessoal registrada.", + "externalAccounts": "Contas externas", + "noExternalAccounts": "Nenhuma conta externa ainda.", + "addExternalAccountTitle": "Adicionar conta externa", + "manage": "Gerenciar", + "details": "Detalhes", + "transactions": "Transações", + "copyAddress": "Copiar endereço", + "addressCopied": "Endereço copiado" + }, + "playground": { + "moonPay": "MoonPay", + "lightspark": "Lightspark", + "bvnk": "BVNK", + "walletIdPlaceholder": "ID da Wallet (ex.: wal_ops_123)", + "transferIdPlaceholder": "ID da transferência (ex.: xfr_123)", + "custodyWalletIdPlaceholder": "ID da Wallet de custódia (ex.: wal_ops_123)", + "destinationWalletIdPlaceholder": "ID da Wallet de destino", + "sourceWalletIdPlaceholder": "ID da Wallet de origem", + "getWalletBalances": "Obter saldos da Wallet", + "getWalletPolicy": "Obter política da Wallet", + "updateWalletPolicy": "Atualizar política da Wallet", + "destinationAllowlistPlaceholder": "Endereços de destino separados por vírgula", + "executeTransfer": "Executar transferência", + "solanaAddressPlaceholder": "Endereço Solana (32–44 caracteres)", + "usdc": "USDC", + "optionalMemo": "Memo opcional", + "listTransfers": "Listar transferências", + "getTransfer": "Obter transferência", + "createOnrampQuote": "Criar cotação de onramp", + "selectProvider": "Selecionar provedor", + "counterpartyIdPlaceholder": "ID da contraparte (ex.: cpty_abc123)", + "selectFiatCurrency": "Selecionar moeda fiat", + "onrampRedirectUrlPlaceholder": "https://app.example.com/payments/onramp/complete", + "createOfframpQuote": "Criar cotação de offramp", + "offrampRedirectUrlPlaceholder": "https://app.example.com/payments/offramp/complete" + }, + "commandCenter": { + "moveMoney": "Movimentar dinheiro", + "moveMoneyDescription": "Inicie o fluxo de pagamento que corresponde ao que você precisa fazer.", + "payDescription": "On-chain ou fiat", + "depositDescription": "Receba cripto ou fiat", + "requestPayment": "Solicitar pagamento", + "requestPaymentDescription": "Compartilhe um QR ou link patrocinado", + "schedule": "Agendar", + "scheduleDescription": "Crie um pagamento recorrente", + "availableBalance": "Saldo disponível", + "availableBalanceDescription": "Em {count} {walletLabel}", + "balanceUnavailable": "O saldo está temporariamente indisponível.", + "activity": "Atividade", + "activityDescription": "Últimas transferências, lotes, depósitos e pagamentos de saída.", + "activityUnavailable": "A atividade está temporariamente indisponível.", + "transfers": "Transferências", + "batches": "Lotes", + "typeDirection": "Tipo", + "amount": "Valor", + "upcomingOpen": "Próximos e em aberto", + "upcomingOpenDescription": "Itens que podem precisar de atenção.", + "activeSchedules": "Agendamentos ativos", + "openRequests": "Solicitações de pagamento em aberto", + "upcomingUnavailable": "Os próximos pagamentos estão temporariamente indisponíveis.", + "paymentNetwork": "Rede de pagamento", + "paymentNetworkDescription": "Contrapartes salvas e destinos de pagamentos de saída.", + "counterpartiesReady": "Contrapartes prontas: {count}", + "counterparties": "contrapartes", + "providersEnabled": "provedores ativados", + "networkUnavailable": "A rede de pagamento está temporariamente indisponível.", + "manageCounterparties": "Gerenciar contrapartes", + "viewRecurring": "Ver pagamentos recorrentes", + "viewRequests": "Ver solicitações de pagamento" + }, + "totalSdpBalance": "Saldo total na SDP", + "aggregatedAcrossWallets": "Agregado em {count} {walletLabel}.", + "wallet": "Wallet", + "wallets": "Wallets", + "noUsdValuedAssets": "Ainda não há linhas de ativos avaliados em USD disponíveis.", + "recentTransactions": "Transações recentes", + "recentTransactionsDescription": "Atividade recente de transferências em todas as Wallets da organização.", + "viewAllTransactions": "Ver todas as transações", + "refreshing": "Atualizando...", + "refresh": "Atualizar", + "noTransactions": "Nenhuma transação encontrada ainda.", + "status": "Status", + "transfer": "Transferência", + "asset": "Ativo", + "direction": "Direção", + "counterpartyLabel": "Contraparte", + "signature": "Assinatura", + "createdLabel": "Criado", + "pending": "Pendente", + "expired": "Expirado", + "unknown": "Desconhecido", + "unavailable": "Indisponível", + "deposit": "Depositar", + "pay": "Pagar", + "transferDetails": { + "providerFee": "Taxa do provedor", + "networkFee": "Taxa de rede", + "exchangeRate": "Taxa de câmbio", + "fees": "Taxas", + "provider": "Provedor", + "transactionId": "ID da transação", + "providerReference": "Referência do provedor", + "memo": "Memo", + "cashPickupCode": "Código de retirada em espécie", + "moneygramTransactionId": "ID da transação MoneyGram", + "payoutStatus": "Status do pagamento de saída", + "payoutAmount": "Valor do pagamento de saída", + "cryptoTransferId": "ID da transferência cripto", + "solanaSignature": "Assinatura Solana", + "moneygramError": "Erro do MoneyGram", + "lastUpdated": "Última atualização", + "copy": "Copiar {label}" + }, + "requestFailed": "Falha na solicitação.", + "submitting": "Enviando...", + "sendTransfer": "Enviar transferência", + "sendBatch": "Enviar lote", + "reviewAction": "Revisar", + "processing": "Processando", + "verificationPending": "Verificação pendente", + "completeVerification": "Concluir verificação", + "previous": "Anterior", + "goToTransaction": "Ir para a transação", + "method": "Método", + "wizardSummaryTitle": "Suas seleções", + "viewSummary": "Ver resumo", + "payoutCurrency": "Moeda do pagamento de saída", + "whoAreYouPaying": "Quem você está pagando?", + "whoIsThisDepositFrom": "De quem é este depósito?", + "howWouldYouLikeToPay": "Como você gostaria de pagar?", + "howWouldYouLikeToDeposit": "Como você gostaria de depositar?", + "playgroundProductName": "Pagamentos", + "recurring": { + "emptyResponse": "{request} retornou uma resposta vazia.", + "counterpartyStepTitle": "Para quem é este pagamento recorrente?", + "destination": "Destino", + "destinationStepTitle": "Para onde os pagamentos devem ir?", + "details": "Detalhes", + "detailsStepTitle": "Definir detalhes do pagamento", + "reviewStepTitle": "Revisar pagamento recorrente", + "everyDay": "Todos os dias", + "collectDaily": "Pagar uma vez por dia.", + "everyWeek": "Toda semana", + "collectWeekly": "Pagar uma vez por semana.", + "everyThirtyDays": "A cada 30 dias", + "collectMonthly": "Pagar aproximadamente uma vez por mês.", + "custom": "Personalizado", + "customScheduleDescription": "Informe um intervalo em horas.", + "notSet": "Não definido", + "customInterval": "Intervalo personalizado", + "everyHour": "A cada hora", + "everyHours": "A cada {count} horas", + "notSelected": "Não selecionado", + "destinationAccount": "Conta de destino", + "fundingWallet": "Wallet de origem", + "amount": "Valor", + "billingInterval": "Intervalo de pagamento", + "firstPayment": "Primeiro pagamento", + "afterActivation": "Após a ativação", + "metadata": "Metadados", + "creatingPayment": "Criando pagamento recorrente.", + "paymentCreated": "Pagamento recorrente criado.", + "pendingActivationDescription": "Está pendente de ativação.", + "unableToCreate": "Não foi possível criar o pagamento recorrente.", + "paymentNotCreated": "O pagamento recorrente não foi criado.", + "createPayment": "Criar pagamento recorrente", + "loadingAccounts": "Carregando contas", + "noSolanaAccounts": "Nenhuma conta Solana registrada", + "selectDestinationAccount": "Selecione uma conta de destino", + "searchAccounts": "Buscar contas", + "needsCryptoAccount": "Esta contraparte precisa de uma conta de Wallet cripto Solana ativa antes que você possa criar um pagamento recorrente.", + "addSolanaAddress": "Adicionar endereço Solana", + "noDestinationWallet": "{name} ainda não possui Wallet de destino registrada.", + "attachDestinationWallet": "Anexe outra Wallet de destino para esta contraparte.", + "selectFundingWallet": "Selecione uma Wallet de origem", + "searchWallets": "Buscar Wallets", + "asset": "Ativo", + "noTokenBalances": "Nenhum saldo de Token compatível", + "selectAsset": "Selecione um ativo", + "selectWalletFirst": "Selecione uma Wallet primeiro", + "searchAssets": "Buscar ativos", + "unresolvedTokenBalances": "Esta Wallet possui saldos de Token, mas os símbolos ainda não puderam ser resolvidos.", + "nativeSolUnsupported": "Pagamentos recorrentes exigem um saldo de Token. SOL nativo não é compatível.", + "invalidAmount": "Informe um valor maior que zero.", + "intervalHours": "Intervalo em horas", + "invalidInterval": "Informe um número inteiro de horas entre 1 e 8760.", + "invalidFirstPayment": "Escolha uma data e hora futuras.", + "startAfterActivation": "Deixe em branco para começar após a ativação.", + "metadataUrl": "URL de metadados", + "metadataUrlPlaceholder": "https://example.com/metadata.json", + "invalidMetadataUrl": "Informe uma URL válida com menos de 128 caracteres.", + "optional": "Opcional.", + "pendingRecordDescription": "Isso cria um registro de pagamento recorrente pendente. A ativação é uma etapa separada.", + "pendingActivation": "Ativação pendente", + "activating": "Ativando", + "active": "Ativo", + "updating": "Atualizando", + "canceling": "Cancelando", + "resuming": "Retomando", + "paused": "Pausado", + "canceled": "Cancelado", + "expired": "Expirado", + "pending": "Pendente", + "processing": "Processando", + "collected": "Pago", + "failed": "Falhou", + "skipped": "Ignorado", + "recurringPayments": "Agendamentos de pagamento", + "recurringPaymentCount": "Pagamentos recorrentes: {count}", + "oneRecurringPayment": "1 pagamento recorrente", + "unableToLoad": "Não foi possível carregar os pagamentos recorrentes", + "noPayments": "Nenhum pagamento recorrente ainda.", + "paymentsAppearHere": "Os registros de pagamentos recorrentes criados aparecerão aqui.", + "interval": "Intervalo", + "nextPayment": "Próximo pagamento", + "counterpartyUnavailable": "Contraparte indisponível", + "payment": "Pagamento recorrente", + "receivingWallet": "Wallet de recebimento", + "starts": "Início", + "currency": "Moeda", + "paymentReference": "Referência do pagamento", + "openMetadata": "Abrir metadados", + "created": "Criado", + "updated": "Atualizado", + "edit": "Editar", + "copyValue": "Copiar valor", + "copied": "Copiado", + "openSignature": "Abrir assinatura", + "collectionHistory": "Histórico de pagamentos", + "showingAttempts": "Mostrando {shown} de {total} tentativas", + "oneAttempt": "1 tentativa", + "attempts": "Tentativas: {count}", + "unableToLoadCollectionHistory": "Não foi possível carregar o histórico de pagamentos: {error}", + "noCollectionAttempts": "Nenhuma tentativa de pagamento ainda. O próximo pagamento agendado é exibido acima.", + "due": "Vencimento", + "attempted": "Tentativa", + "transfer": "Transferência", + "explorer": "Explorer", + "everyWeeks": "A cada {count} semanas", + "everyDays": "A cada {count} dias", + "paymentActivated": "Pagamento recorrente ativado.", + "collectionSubmitted": "Pagamento recorrente enviado.", + "paymentCanceled": "Pagamento recorrente cancelado.", + "paymentResumed": "Pagamento recorrente retomado.", + "activationFailed": "Falha na ativação", + "collectionFailed": "Falha no pagamento", + "cancellationFailed": "Falha no cancelamento", + "resumeFailed": "Falha ao retomar", + "retryActivation": "Tentar ativação novamente", + "activate": "Ativar", + "retryCollection": "Tentar pagamento novamente", + "collectNow": "Pagar agora", + "retryResume": "Retomar novamente", + "resume": "Retomar", + "retryCancellation": "Tentar cancelamento novamente", + "cancel": "Cancelar", + "actions": "Ações", + "editPayment": "Editar pagamento", + "stopFutureCollections": "Interromper pagamentos futuros", + "copyError": "Copiar erro", + "readyToActivate": "Pronto para ativar", + "readyToActivateDescription": "Cria a assinatura e agenda o primeiro pagamento.", + "lifecycleActionUnavailable": "Ação de ciclo de vida indisponível", + "lifecycleActionUnavailableDescription": "Este pagamento recorrente não pode ser alterado a partir do status atual.", + "updatingPayment": "Atualizando pagamento recorrente.", + "actionFailed": "Falha na ação do pagamento recorrente.", + "alreadyFundingWallet": "{wallet} já é a Wallet de origem.", + "updatingFundingWallet": "Atualizando a Wallet de origem.", + "fundingWalletUpdated": "Wallet de origem atualizada.", + "fundingWalletUpdateFailed": "Falha ao atualizar a Wallet de origem", + "paymentUpdateFailed": "Falha ao atualizar o pagamento recorrente.", + "selectReceivingWallet": "Selecione uma Wallet de recebimento.", + "alreadyReceivingWallet": "{wallet} já é a Wallet de recebimento.", + "updatingReceivingWallet": "Atualizando a Wallet de recebimento.", + "receivingWalletUpdated": "Wallet de recebimento atualizada.", + "receivingWalletUpdateFailed": "Falha ao atualizar a Wallet de recebimento", + "alreadySet": "{value} já está definido.", + "updatingBillingInterval": "Atualizando o intervalo de pagamento.", + "billingIntervalUpdated": "Intervalo de pagamento atualizado.", + "billingIntervalUpdateFailed": "Falha ao atualizar o intervalo de pagamento", + "selectCurrency": "Selecione uma moeda.", + "alreadyCurrency": "{currency} já é a moeda.", + "updatingCurrency": "Atualizando a moeda.", + "currencyUpdated": "Moeda atualizada.", + "currencyUpdateFailed": "Falha ao atualizar a moeda", + "updatingAmount": "Atualizando o valor.", + "amountUpdated": "Valor atualizado.", + "amountUpdateFailed": "Falha ao atualizar o valor", + "editFundingWallet": "Editar Wallet de origem", + "editFundingWalletDescription": "Escolha a Wallet usada para financiar este pagamento recorrente.", + "editReceivingWallet": "Editar Wallet de recebimento", + "editReceivingWalletDescription": "Escolha para onde este pagamento recorrente envia os fundos.", + "editAmount": "Editar valor", + "editAmountDescription": "Defina o valor pago em cada ciclo de pagamento.", + "editBillingInterval": "Editar intervalo de pagamento", + "editBillingIntervalDescription": "Escolha com que frequência este pagamento recorrente deve ser executado.", + "editCurrency": "Editar moeda", + "editCurrencyDescription": "Escolha um saldo de Token da Wallet de origem.", + "cancelPaymentTitle": "Cancelar pagamento recorrente?", + "cancelPaymentDescription": "Isso interrompe os pagamentos futuros para {counterparty}. Você pode retomar o pagamento mais tarde no menu Ações.", + "keepPayment": "Manter pagamento", + "cancelPayment": "Cancelar pagamento", + "save": "Salvar" + }, + "transactions": { + "searchPlaceholder": "Buscar ID, assinatura, endereço, referência ou contraparte (3+ caracteres)", + "clearSearch": "Limpar busca de transações", + "filters": "Filtros", + "activeFilters": "Filtros ativos: {count}", + "clearFilters": "Limpar filtros", + "allStatuses": "Todos os status", + "allDirections": "Todas as direções", + "allTypes": "Todos os tipos", + "allWallets": "Todas as Wallets", + "allCounterparties": "Todas as contrapartes", + "allProviders": "Todos os provedores", + "assetPlaceholder": "Ativo ou mint", + "fromDate": "Data inicial", + "toDate": "Data final", + "sort": "Ordenar", + "newest": "Mais recentes primeiro", + "oldest": "Mais antigos primeiro", + "amountHigh": "Valor: do maior para o menor", + "amountLow": "Valor: do menor para o maior", + "statusAscending": "Status: A a Z", + "inbound": "Entrada", + "outbound": "Saída", + "transfer": "Transferência", + "confidentialTransfer": "Transferência confidencial", + "batchTransfer": "Transferência em lote", + "onramp": "On-ramp", + "offramp": "Off-ramp", + "pending": "Pendente", + "processing": "Processando", + "confirmed": "Confirmado", + "finalized": "Finalizado", + "failed": "Falhou", + "awaitingPayment": "Aguardando pagamento", + "settling": "Liquidando", + "completed": "Concluído", + "canceled": "Cancelado", + "expired": "Expirado", + "transaction": "Transação", + "status": "Status", + "amount": "Valor", + "direction": "Direção", + "counterparty": "Contraparte", + "counterpartyId": "ID da contraparte", + "wallet": "Wallet", + "provider": "Provedor", + "created": "Criado", + "range": "{start}–{end} de {total}", + "noMatches": "Nenhuma transação corresponde a esses filtros.", + "emptyProject": "Nenhuma transação ainda.", + "loadError": "Não foi possível carregar as transações.", + "retry": "Tentar novamente", + "viewDetails": "Ver transação {id}", + "details": "Detalhes da transação", + "loadingDetails": "Carregando detalhes da transação", + "detailLoadError": "Não foi possível carregar os detalhes da transação.", + "transactionId": "ID da transação", + "type": "Tipo", + "source": "Origem", + "destination": "Destino", + "signature": "Assinatura", + "providerReference": "Referência do provedor", + "memo": "Memo", + "updated": "Atualizado", + "viewOnExplorer": "Ver no Solana Explorer", + "unavailable": "Indisponível", + "loadingOptions": "Carregando opções…", + "includeObserved": "Incluir depósitos on-chain", + "filterType": "Tipo", + "filterDirection": "Direção", + "filterWallet": "Wallet", + "filterCounterparty": "Contraparte", + "filterProvider": "Provedor", + "filterAsset": "Ativo" + }, + "requests": { + "loadFailed": "Não foi possível carregar as solicitações de pagamento", + "awaitingPayment": "Aguardando pagamento", + "paid": "Pago", + "canceled": "Cancelado", + "expired": "Expirado", + "paymentLinkCreated": "Link de pagamento criado", + "createPaymentRequest": "Criar solicitação de pagamento", + "createPaymentLink": "Criar link de pagamento", + "createPaymentLinkDescription": "Solicite um pagamento fixo para uma de suas Wallets.", + "amount": "Valor", + "token": "Token", + "selectToken": "Selecionar Token", + "destinationWallet": "Wallet de destino", + "selectWallet": "Selecionar Wallet", + "fromCounterparty": "De (contraparte)", + "anyoneWithLink": "Qualquer pessoa com o link", + "loadingCryptoAccount": "Carregando conta cripto…", + "paysFrom": "Paga a partir de", + "noCryptoAccount": "Nenhuma conta cripto registrada.", + "add": "Adicionar", + "linkExpires": "O link expira", + "noExpiry": "Sem expiração", + "oneHour": "1 hora", + "twentyFourHours": "24 horas", + "sevenDays": "7 dias", + "thirtyDays": "30 dias", + "cancel": "Cancelar", + "creating": "Criando…", + "createLink": "Criar link", + "paymentRequests": "Solicitações de pagamento", + "paymentRequestsDescription": "Links compartilháveis que solicitam um pagamento fixo.", + "create": "Criar", + "noPaymentRequests": "Nenhuma solicitação de pagamento ainda", + "noPaymentRequestsDescription": "Crie um link de pagamento para solicitar um pagamento fixo.", + "from": "De", + "to": "Para", + "paymentRequestDetails": "Detalhes da solicitação de pagamento", + "paymentRequest": "Solicitação de pagamento", + "amountRequested": "Valor solicitado", + "paymentLinkCopied": "Link de pagamento copiado", + "copy": "Copiar", + "reference": "Referência", + "expires": "Expira em", + "destinationWalletId": "ID da Wallet de destino", + "splMintAddress": "Endereço de mint SPL", + "listRequests": "Listar solicitações de pagamento", + "createRequest": "Criar solicitação de pagamento", + "playgroundProductName": "Solicitações de pagamento" + } + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-policies.json b/apps/sdp-web/messages/pt/dashboard-policies.json new file mode 100644 index 000000000..6e16eb484 --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-policies.json @@ -0,0 +1,49 @@ +{ + "DashboardPolicies": { + "all": "Todos", + "wallets": "Wallets", + "apiKeys": "Chaves de API", + "searchPlaceholder": "Buscar Wallets ou chaves de API", + "clearSearch": "Limpar busca", + "allStatuses": "Todos os status", + "defaultAllow": "Permitir por padrão", + "draft": "Rascunho", + "active": "Ativo", + "disabled": "Desativado", + "configureControls": "Configurar controles", + "walletControls": "Controles da Wallet", + "apiKeyControls": "Controles da chave de API", + "target": "Alvo", + "status": "Status", + "defaultAction": "Ação padrão", + "rules": "Regras", + "bindings": "Vinculações", + "lastUpdated": "Última atualização", + "actions": "Ações", + "wallet": "Wallet", + "apiKey": "Chave de API", + "allow": "Permitir", + "deny": "Negar", + "approvalRequired": "Aprovação necessária", + "review": "Revisar", + "noRestrictions": "Sem restrições", + "ruleCount": "Regras: {count}", + "singleRule": "1 regra", + "allWallets": "Todas as Wallets", + "selectedWalletCount": "Wallets selecionadas: {count}", + "singleSelectedWallet": "1 Wallet selecionada", + "configureWalletControls": "Configurar controles", + "viewAudit": "Ver auditoria", + "viewRevisions": "Ver revisões", + "configureScope": "Configurar escopo", + "viewBindings": "Ver vinculações", + "noMatches": "Nenhum controle corresponde a esses filtros.", + "clearFilters": "Limpar filtros", + "emptyProject": "Nenhum controle de Wallet ou de chave de API está configurado.", + "emptyProjectWallets": "Nenhum controle de Wallet está configurado.", + "emptyProjectApiKeys": "Nenhum controle de chave de API está configurado.", + "loadError": "Não foi possível carregar os controles de política.", + "retry": "Tentar novamente", + "range": "{start}–{end} de {total}" + } +} diff --git a/apps/sdp-web/messages/pt/dashboard-private-channels.json b/apps/sdp-web/messages/pt/dashboard-private-channels.json new file mode 100644 index 000000000..8d5a3de76 --- /dev/null +++ b/apps/sdp-web/messages/pt/dashboard-private-channels.json @@ -0,0 +1,298 @@ +{ + "DashboardPrivateChannels": { + "tabs": { + "overview": "Visão geral", + "channels": "Canais", + "deposit": "Depositar", + "transfer": "Transferir", + "withdraw": "Sacar", + "members": "Membros", + "events": "Eventos", + "instance": "Instância" + }, + "common": { + "loadError": "Ocorreu um erro ao carregar esta seção.", + "cancel": "Cancelar", + "amountUsdc": "Valor (USDC)", + "amountPlaceholder": "1.5", + "onChainBalance": "On-chain:", + "channelBalance": "Saldo do canal:", + "amountRequired": "Informe um valor em USDC.", + "amountInvalid": "Informe um valor em USDC maior que zero, com até 6 casas decimais.", + "amountWithUnit": "{amount} USDC" + }, + "overview": { + "title": "Visão geral", + "description": "Status em tempo real da sua instância conectada.", + "gateway": "Gateway", + "solanaVersion": "Versão do Solana", + "slot": "Slot", + "latestBlockhash": "Blockhash mais recente", + "escrowInstance": "Instância de escrow", + "escrowProgram": "Programa de escrow", + "authService": "Serviço de autenticação", + "ready": "Pronto", + "degraded": "Degradado — {reason}", + "unreachable": "Inacessível — {error}", + "onChain": "On-chain", + "notExecutable": "Não executável", + "reachable": "Acessível", + "notReachable": "Inacessível", + "ownerMismatch": "divergência de proprietário" + }, + "verifiedWallets": { + "title": "Wallets verificadas", + "description": "Verifique uma Wallet de custódia nesta instância para desbloquear transações. A verificação assina um desafio com a Wallet; a revogação a remove.", + "loadError": "Não foi possível carregar suas Wallets. Atualize a página para tentar novamente.", + "noWallets": "Nenhuma Wallet encontrada para o usuário. Crie uma.", + "createWallet": "Criar uma Wallet", + "verified": "Verificada", + "verify": "Verificar", + "revokeTitle": "Revogar verificação", + "revokeAria": "Revogar verificação para {pubkey}", + "orphaned": "Wallet de custódia não está mais listada", + "verifySuccess": "Wallet {key} verificada.", + "revokeSuccess": "Verificação de {key} revogada.", + "channelBalanceTooltip": "Saldo do canal para o mint {mint}", + "channelBalanceAmount": "{amount} USDC" + }, + "channels": { + "title": "Canais", + "description": "Canais lógicos agrupam a atividade dentro da sua instância conectada. O canal padrão é criado automaticamente e não pode ser excluído.", + "newChannel": "Novo canal", + "namePlaceholder": "Nome do canal (ex.: Tesouraria)", + "descriptionPlaceholder": "Descrição (opcional)", + "add": "Adicionar", + "empty": "Nenhum canal ainda.", + "defaultBadge": "Padrão", + "created": "Criado em {date}", + "deleteAria": "Excluir {name}", + "deleteDefaultTitle": "O canal padrão não pode ser excluído", + "deleteTitle": "Excluir canal", + "nameRequired": "O nome do canal é obrigatório.", + "createSuccess": "Canal “{name}” criado.", + "deleteSuccess": "Canal “{name}” excluído." + }, + "members": { + "title": "Membros", + "description": "Convide usuários do projeto SDP para o seu espaço de trabalho de Canais Privados e gerencie a quais canais eles pertencem.", + "countOne": "{count} membro convidado para este espaço de trabalho.", + "countOther": "{count} membros convidados para este espaço de trabalho.", + "inviteMember": "Convidar membro", + "empty": "Nenhum membro ainda. Convide um usuário do projeto SDP para começar.", + "columnEmail": "E-mail", + "columnName": "Nome", + "columnVerifiedWallets": "Wallets verificadas", + "columnChannels": "Canais", + "columnActions": "Ações", + "verifiedCount": "Verificadas: {count}", + "addToChannel": "Adicionar ao canal", + "defaultSuffix": "(padrão)", + "removeFromAria": "Remover de {label}", + "delete": "Excluir", + "inviteAria": "Convidar membro", + "inviteTitle": "Convidar membro", + "inviteDescription": "Escolha um usuário do projeto SDP para convidar. Uma credencial SPC será criada para essa pessoa.", + "projectUser": "Usuário do projeto", + "selectUser": "Selecione um usuário…", + "pickedName": "Nome: {name}", + "inviting": "Convidando…", + "invite": "Convidar", + "inviteSuccess": "Convite enviado para {email}.", + "inviteUrlCopied": "URL de convite copiada para a área de transferência.", + "deleteAria": "Excluir membro", + "removeTitle": "Remover membro", + "removeDescription": "Remove {email} do espaço de trabalho e de todos os canais aos quais essa pessoa pertence. A credencial SPC é mantida (o SPC não possui endpoint de exclusão de usuário), mas fica órfã em relação à SDP.", + "removing": "Removendo…", + "remove": "Remover", + "removeSuccess": "Membro removido." + }, + "deposit": { + "title": "Depositar", + "description": "Mova USDC de uma Wallet de custódia para o escrow do canal na Devnet. Acompanhe o progresso, do contrato de escrow até a confirmação on-chain.", + "fromWallet": "Da Wallet", + "fromWalletHelp": "O depósito é assinado a partir desta Wallet. Ela precisa ter USDC da Devnet (e um pouco de SOL).", + "recipient": "Destinatário (opcional)", + "recipientPlaceholder": "Por padrão, usa a Wallet que está depositando", + "recipientHelp": "Um endereço de Wallet ou walletId para creditar no canal. Deixe em branco para creditar nesta Wallet.", + "submit": "Depositar", + "submitToast": "Depósito enviado", + "progressLabel": "Depositando", + "failed": "O depósito falhou.", + "viewTransaction": "Ver transação no Solana Explorer", + "newDeposit": "Novo depósito", + "stageSentTitle": "Enviado para o escrow da Devnet", + "stageSentDescription": "Transmitindo o depósito para o programa de escrow na Devnet.", + "stageConfirmedTitle": "Confirmado na Devnet", + "stageConfirmedDescription": "A transação de depósito foi confirmada on-chain.", + "statusSubmitted": "Enviado", + "statusConfirmed": "Confirmado", + "statusFailed": "Falhou", + "noWalletsBefore": "Ainda não há Wallets verificadas. Verifique uma Wallet de custódia na ", + "noWalletsLink": "visão geral de Canais Privados", + "noWalletsAfter": " e a financie com USDC da Devnet, depois volte para depositar.", + "statusPending": "Preparando", + "statusSettled": "Liquidado", + "selectWallet": "Selecione a Wallet de origem do depósito." + }, + "withdraw": { + "title": "Sacar", + "description": "Faça o burn do saldo do canal de uma Wallet de custódia e o operador libera o USDC correspondente na Devnet. Acompanhe o progresso, do burn até a liberação na Devnet.", + "fromWallet": "Sacar de", + "fromWalletHelp": "O burn é assinado a partir desta Wallet. O saldo do canal dela é debitado.", + "destination": "Liberar para (opcional)", + "destinationPlaceholder": "Por padrão, usa a Wallet que está sacando", + "destinationHelp": "Um endereço da Devnet ou walletId para receber o USDC liberado. Deixe em branco para liberar para esta Wallet.", + "submit": "Sacar", + "submitToast": "Saque enviado", + "progressLabel": "Sacando", + "failed": "O saque falhou.", + "burnSignature": "Assinatura do burn:", + "viewRelease": "Ver liberação no Solana Explorer", + "newWithdrawal": "Novo saque", + "stageBurnSentTitle": "Burn enviado para o canal", + "stageBurnSentDescription": "Transmitindo o burn para a rede do canal.", + "stageBurnConfirmedTitle": "Burn confirmado (saldo debitado)", + "stageBurnConfirmedDescription": "O burn foi confirmado e o saldo do seu canal foi debitado.", + "stageReleasedTitle": "Liberado na Devnet", + "stageReleasedDescription": "O operador liberou o USDC correspondente para o destino.", + "statusPending": "Pendente", + "statusSubmitted": "Enviado", + "statusBurnConfirmed": "Burn confirmado", + "statusFailed": "Falhou", + "noWalletsBefore": "Ainda não há Wallets verificadas. Verifique uma Wallet de custódia na ", + "noWalletsLink": "visão geral de Canais Privados", + "noWalletsAfter": " e deposite no canal, depois volte para sacar.", + "statusSettled": "Liquidado", + "selectWallet": "Selecione a Wallet de origem do saque." + }, + "transfer": { + "title": "Transferir", + "description": "Transfira USDC da Wallet de custódia verificada selecionada para a Wallet verificada de outro membro no mesmo canal lógico. Os saldos pertencem à Wallet e são compartilhados entre canais lógicos.", + "noChannels": "Você não é membro de nenhum canal privado ativo. Peça a um administrador do canal para adicioná-lo antes de fazer uma transferência.", + "noSourceWallets": "Você não tem nenhuma Wallet de custódia verificada com a qual a SDP possa assinar. Verifique uma Wallet provisionada em Visão geral antes de fazer uma transferência.", + "channel": "Canal", + "channelDefaultSuffix": " (Padrão)", + "fromWallet": "Da Wallet verificada", + "fromWalletHelp": "A transferência é assinada a partir desta Wallet. O saldo do canal dela é debitado.", + "recipientWallet": "Wallet do destinatário", + "recipientsLoading": "Carregando Wallets verificadas de destinatários…", + "recipientsRetry": "Tentar carregar destinatários novamente", + "recipientsLoadFailed": "Não foi possível carregar as Wallets verificadas de destinatários.", + "recipientsEmpty": "Nenhum outro membro do canal tem uma Wallet verificada elegível para receber esta transferência.", + "selectChannel": "Selecione um canal.", + "selectSourceWallet": "Selecione uma Wallet de origem verificada.", + "selectRecipient": "Selecione uma Wallet de destinatário verificada.", + "selectChannelForRecipients": "Selecione um canal para carregar os destinatários verificados.", + "incomplete": "Preencha todos os campos da transferência.", + "submit": "Transferir USDC", + "submitFailed": "Não foi possível enviar a transferência. Tente novamente com os mesmos dados.", + "confirmedToast": "Transferência confirmada", + "submittedToast": "Transferência enviada, resultado pendente", + "failedToast": "A transferência do canal privado falhou.", + "progressLabel": "Transferido", + "senderFallback": "Wallet de origem verificada", + "recipientFallback": "Wallet de destinatário verificada", + "toMemberWallet": "Para a Wallet verificada do membro", + "signature": "Assinatura SPC", + "stageConfirmedTitle": "Transferência confirmada", + "stageConfirmedDescription": "O SPC executou a transferência e o saldo do destinatário foi atualizado. Isso é definitivo.", + "stageSubmittedTitle": "Aguardando o resultado da transferência", + "stageSubmittedDescription": "O SPC aceitou a transferência, mas ainda não informou o resultado. Verifique o saldo do destinatário antes de tentar novamente, para não enviar duas vezes.", + "stagePendingTitle": "Resultado do envio desconhecido", + "stagePendingDescription": "A transferência foi registrada, mas o resultado nunca foi retornado. Verifique o saldo do destinatário antes de tentar novamente.", + "stageFailedTitle": "Falha na transferência", + "stageFailedDescription": "O SPC não concluiu a transferência, então nenhum valor foi movimentado. Você pode tentar novamente.", + "statusPending": "Pendente", + "statusSubmitted": "Enviado", + "statusConfirmed": "Confirmado", + "statusFailed": "Falhou", + "newTransfer": "Nova transferência", + "tryAgain": "Tentar novamente" + }, + "events": { + "title": "Eventos", + "description": "Atividade do projeto para Canais Privados, incluindo eventos de ciclo de vida, de membros, de transferência e de erro. O histórico é mantido mesmo após a desconexão ou exclusão de uma instância.", + "empty": "Nenhum evento ainda. Conecte uma instância ou crie um canal para iniciar o feed de atividades.", + "columnEvent": "Evento", + "columnCategory": "Categoria", + "columnStatus": "Status", + "columnWhen": "Quando", + "loadMore": "Carregar mais", + "familyLifecycle": "Ciclo de vida", + "familyMember": "Membro", + "familyTransfer": "Transferência", + "familyError": "Erro", + "statusPending": "Pendente", + "statusConfirmed": "Confirmado", + "statusFailed": "Falhou", + "statusStale": "Desatualizado", + "statusInfo": "Info", + "typeInstanceConnected": "Instância conectada", + "typeInstanceDisconnected": "Instância desconectada", + "typeChannelCreated": "Canal criado", + "typeChannelArchived": "Canal arquivado", + "typeMemberAdded": "Membro adicionado", + "typeMemberRevoked": "Membro revogado", + "typeMemberRoleChanged": "Função do membro alterada", + "typeWalletChallengeRequested": "Desafio de Wallet solicitado", + "typeWalletVerified": "Wallet verificada", + "typeWalletVerificationRevoked": "Verificação de Wallet revogada", + "typeDepositSubmitted": "Depósito enviado", + "typeWithdrawalSubmitted": "Saque enviado", + "typeSpcUnreachable": "Canais Privados inacessíveis", + "typeDepositConfirmed": "Depósito confirmado", + "typeDepositSettled": "Depósito liquidado", + "typeDepositFailed": "Depósito falhou", + "typeWithdrawalConfirmed": "Burn do saque confirmado", + "typeTransferSubmitted": "Transferência de membro enviada", + "typeTransferConfirmed": "Transferência de membro confirmada", + "typeTransferFailed": "Transferência de membro falhou", + "typeWithdrawalSettled": "Saque liquidado", + "typeWithdrawalFailed": "Saque falhou", + "typeDepositAwaitingSpcCredit": "Aguardando crédito no canal", + "typeWithdrawalReleaseAttemptFailed": "Tentativa de liberação falhou", + "typeStuckWarning": "Transferência travada", + "typeNeedsManualReview": "Requer revisão manual" + }, + "instance": { + "title": "Conectar canal privado", + "description": "Aponte a SDP para uma instância do Solana Private Channels.", + "gatewayUrl": "URL do Gateway", + "gatewayPlaceholder": "http://gateway.example:8899", + "chainRpcUrl": "URL do RPC da rede", + "chainRpcPlaceholder": "https://devnet.helius-rpc.com/?api-key=…", + "authUrl": "URL de autenticação", + "authPlaceholder": "http://auth.example:8903", + "escrowProgramId": "ID do programa de escrow", + "withdrawProgramId": "ID do programa de saque", + "escrowInstanceAddr": "Endereço da instância de escrow", + "testConnection": "Testar conexão", + "testing": "Testando…", + "connect": "Conectar", + "connecting": "Conectando…", + "disconnect": "Desconectar", + "disconnecting": "Desconectando…", + "delete": "Excluir", + "deleting": "Excluindo…", + "statusReady": "Pronto", + "statusDegraded": "Degradado", + "statusUnreachable": "Inacessível", + "statusFailed": "Falhou", + "latency": "{ms} ms", + "latencyWithVersion": "{ms} ms · v{version}", + "connectSuccess": "Canal privado conectado.", + "disconnectSuccess": "Canal privado desconectado. Você pode editar e reconectar.", + "deleteSuccess": "Instância de canal privado excluída.", + "gatewayLabel": "Gateway:", + "reactivateAria": "Reativar instância existente", + "reactivateTitle": "Reativar instância existente", + "reactivateDescription": "Esta URL do Gateway já foi conectada a este projeto antes. Reativar substituirá a configuração armazenada no registro de instância existente. Todos os dados vinculados a ela passarão a pertencer à nova configuração. Continue por sua conta e risco.", + "reactivate": "Reativar", + "reactivating": "Reativando…", + "deleteAria": "Excluir instância de canal privado", + "deleteTitle": "Excluir instância de canal privado", + "deleteDescription": "Isso excluirá permanentemente o registro da instância e todos os dados vinculados a ela (canais, depósitos, transferências). Essa ação não pode ser desfeita." + } + } +} diff --git a/apps/sdp-web/messages/pt/shared.json b/apps/sdp-web/messages/pt/shared.json new file mode 100644 index 000000000..4cea92930 --- /dev/null +++ b/apps/sdp-web/messages/pt/shared.json @@ -0,0 +1,262 @@ +{ + "tabs": { + "overview": "Visão geral", + "apiPlayground": "API Playground" + }, + "authTerms": { + "prefix": "Ao usar o aplicativo, você concorda com os", + "link": "Termos de serviço da Solana Foundation" + }, + "homeSignedIn": { + "loading": "Carregando...", + "selectOrganization": "Selecione sua organização", + "selectOrganizationDescription": "Escolha ou crie uma organização para continuar.", + "loadingDashboard": "Carregando seu dashboard..." + }, + "allowlist": { + "comingSoon": "Em breve", + "description": "O gerenciamento da allowlist estará disponível em uma atualização futura." + }, + "members": { + "title": "Membros", + "description": "Pessoas com acesso a esta organização.", + "invite": "Convidar membro", + "inviteEmail": "Endereço de e-mail", + "inviteEmailPlaceholder": "colega@empresa.com", + "inviteRole": "Função", + "roleAdmin": "Administrador", + "roleMember": "Membro", + "inviteSubmit": "Enviar convite", + "inviteSending": "Enviando…", + "inviteSent": "Convite enviado para {email}.", + "inviteFailed": "Não foi possível enviar o convite: {error}", + "emailRequired": "Informe um endereço de e-mail.", + "columnMember": "Membro", + "columnRole": "Função", + "columnJoined": "Entrou em", + "empty": "Ainda não há membros.", + "loadFailed": "Não foi possível carregar os membros: {error}", + "unnamed": "Sem nome", + "unnamedMember": "Membro sem nome", + "emailUnavailable": "E-mail indisponível", + "statusPending": "Pendente", + "invitedOn": "Convidado em {date}", + "columnActions": "Ações", + "copyInviteLink": "Copiar link de convite", + "inviteLinkCopied": "Link de convite copiado.", + "inviteLinkCopyFailed": "Não foi possível copiar o link de convite.", + "revokeInvite": "Revogar convite", + "revoking": "Revogando…", + "revoked": "Convite para {email} revogado.", + "revokeFailed": "Não foi possível revogar o convite: {error}", + "invitationActions": "Ações para {email}", + "memberActions": "Ações para {member}", + "removeMember": "Remover membro", + "removeConfirm": "{member} perderá o acesso a esta organização imediatamente. Isso não pode ser desfeito.", + "removing": "Removendo…", + "removed": "{member} foi removido.", + "removeFailed": "Não foi possível remover o membro: {error}", + "cannotRemoveSelf": "Você não pode remover a si mesmo", + "cannotRemoveLastAdmin": "O último administrador não pode ser removido", + "cancel": "Cancelar" + }, + "SharedComponents": { + "copied": "Copiado", + "copy": "Copiar", + "apiDebugLogs": "Logs de depuração da API", + "pause": "Pausar", + "resume": "Retomar", + "requestSummary": "Método da requisição, duração, copiar resumo", + "query": "Consulta", + "requestBody": "Corpo da requisição", + "response": "Resposta", + "createApiKey": "Criar chave de API", + "selectApiKey": "Selecionar chave de API", + "selectOrganization": "Selecionar organização", + "organizations": "Organizações", + "projects": "Projetos", + "current": "Atual", + "noOrganizations": "Ainda não há organizações.", + "noProjects": "Ainda não há projetos.", + "locked": "Bloqueado", + "sandboxOnly": "Por enquanto, apenas o modo Sandbox está disponível.", + "mainnetSoon": "Suporte a Mainnet em breve.", + "createOrganization": "Criar organização", + "manageOrganization": "Gerenciar organização", + "clear": "Limpar", + "disable": "Desativar", + "collapse": "Recolher", + "close": "Fechar", + "closeModal": "Fechar modal", + "noRequests": "Nenhuma requisição capturada ainda.", + "noPayload": "Nenhuma consulta, corpo de requisição ou resposta capturada.", + "selectApiEndpoint": "Selecionar endpoint da API", + "request": "Requisição", + "output": "Saída", + "pathParameters": "Parâmetros de caminho", + "noPathParameters": "Este endpoint não requer parâmetros de caminho.", + "selectValue": "Selecionar valor", + "noRequestBody": "Este endpoint não requer um corpo de requisição JSON.", + "status": "Status:", + "apiKeyRequired": "Crie uma chave de API primeiro para ativar requisições reais no API Playground.", + "runRequest": "Executar requisição", + "reset": "Redefinir", + "retry": "Tentar novamente", + "copyCode": "Copiar código", + "code": "Código", + "example": "Exemplo", + "pending": "Pendente", + "durationMilliseconds": "{duration}ms", + "networkDebugSummary": "{pending} pendentes, {completed} concluídas", + "aiInstructions": "Instruções de IA", + "pageOf": "Página {page} de {pageCount}", + "previousPage": "Página anterior", + "nextPage": "Próxima página", + "rowsPerPage": "Linhas por página", + "loading": "Carregando…", + "noOptionsAvailable": "Nenhuma opção disponível.", + "noSearchMatches": "Nenhum resultado para sua busca.", + "required": "(obrigatório)", + "selectAnOption": "Selecione uma opção", + "search": "Buscar…", + "fillBeforeSending": "preencher antes de enviar", + "noValue": "- nenhum", + "aiInstructionIntro": "Use o endpoint {method} {path} da API {productName}.", + "aiPathParameters": "Parâmetros de caminho:", + "aiRequestBody": "Corpo da requisição:", + "aiInstructionOutro": "Retorne o corpo da resposta como JSON formatado e destaque quaisquer erros de validação ou autenticação.", + "runRequestToInspectOutput": "Execute a requisição para inspecionar a saída real da API deste endpoint.", + "requestFailed": "Falha na requisição", + "ready": "Pronto", + "completeRequiredFields": "Preencha os campos obrigatórios: {fields}", + "invalidJsonField": "{field} deve conter um JSON válido.", + "invalidApiKeyFormat": "Formato de chave de API inválido. Use um valor de chave bruto como sk_test_... ou sk_live_... com um sufixo válido.", + "playgroundExecutionFailed": "Falha na execução do Playground.", + "requestExecutionFailed": "Falha na execução da requisição." + }, + "dashboardShell": { + "workspace": "Espaço de trabalho", + "openNavigation": "Abrir navegação", + "primaryNavigation": "Principal", + "more": "Mais", + "moreDescription": "Vá para o restante do dashboard.", + "closeNavigation": "Fechar navegação", + "sandbox": "Sandbox", + "loadingDashboard": "Carregando dashboard...", + "reloadDashboard": "Recarregar dashboard", + "signInToContinue": "Entre para continuar", + "signInDescription": "Acesse o espaço de trabalho da sua organização e os controles da Wallet.", + "signIn": "Entrar", + "selectOrganization": "Selecione uma organização", + "selectOrganizationDescription": "Você precisa de uma organização para continuar.", + "counterparty": "Contraparte", + "transactions": "Transações", + "pay": "Pagar", + "deposit": "Depositar", + "requests": "Solicitações", + "recurring": "Recorrentes", + "privateChannels": "Canais Privados", + "create": "Criar", + "manage": "Gerenciar", + "home": "Início", + "wallets": "Wallets", + "issuance": "Emissão", + "payments": "Pagamentos", + "apiKeys": "Chaves de API", + "policies": "Políticas", + "newApiKey": "Nova chave de API", + "editApiKey": "Editar chave de API", + "backToApiKeys": "Voltar para Chaves de API", + "approvals": "Aprovações", + "pendingApprovals": "Aprovações pendentes: {count}", + "apiDocs": "Docs da API", + "settings": "Configurações", + "language": "Idioma", + "colorTheme": "Tema de cores", + "chooseLanguage": "Escolher idioma", + "moreLanguagesHint": "Mais idiomas aparecerão aqui conforme forem disponibilizados.", + "collapseSidebar": "Recolher barra lateral", + "expandSidebar": "Expandir barra lateral", + "expandPaymentsMenu": "Expandir menu de Pagamentos", + "collapsePaymentsMenu": "Recolher menu de Pagamentos", + "closeNavigationOverlay": "Fechar sobreposição de navegação", + "newCounterparty": "Nova contraparte", + "manageCounterparty": "Gerenciar contraparte", + "backToCounterparty": "Voltar para a contraparte", + "backToWallets": "Voltar para Wallets", + "backToWalletDetail": "Voltar para detalhes da Wallet", + "backToWallet": "Voltar para a Wallet", + "walletControls": "Controles da Wallet", + "createWallet": "Criar Wallet", + "activateProvider": "Ativar provedor", + "newAsset": "Novo ativo", + "assetManagement": "Gerenciamento de ativos", + "backToOverview": "Voltar para Visão geral", + "recurringPayments": "Pagamentos recorrentes", + "recurringPayment": "Pagamento recorrente", + "backToRecurringPayments": "Voltar para pagamentos recorrentes", + "receive": "Receber", + "send": "Enviar", + "backToPayments": "Voltar para Pagamentos", + "backToApprovals": "Voltar para Aprovações", + "members": "Membros", + "allowlist": "Allowlist" + }, + "validation": { + "allowlistValueRequired": "O valor da allowlist é obrigatório", + "allowlistEntryIdRequired": "O ID da entrada da allowlist é obrigatório", + "emailRequired": "O e-mail é obrigatório" + }, + "pay": { + "productName": "Solana Developer Platform", + "paymentReceived": "Pagamento recebido", + "paymentReceivedDescription": "Esta solicitação já foi paga. Não há mais nada a fazer.", + "linkExpired": "Link expirado", + "linkExpiredDescription": "Este link de pagamento não é mais válido. Peça ao remetente um novo link.", + "requestCanceled": "Solicitação cancelada", + "requestCanceledDescription": "Esta solicitação de pagamento foi cancelada pelo remetente.", + "paymentRequest": "Solicitação de pagamento", + "scanWallet": "Escaneie com uma Wallet Solana para pagar", + "openWallet": "Abrir na Wallet", + "to": "Para", + "token": "Token", + "expires": "Expira", + "noExpiry": "Sem expiração", + "securedBySolanaPay": "Protegido pelo Solana Pay", + "qrCode": "Código QR do Solana Pay" + }, + "homeWorkspace": { + "unavailable": "Indisponível", + "createFirstWalletBalances": "Crie sua primeira Wallet para começar a acompanhar os saldos.", + "noTrackedBalances": "Ainda não há saldos rastreados.", + "activityUnavailable": "A atividade está indisponível no momento.", + "paymentActivityAfterWallet": "A atividade de Pagamentos aparecerá depois que você criar uma Wallet.", + "noPaymentVolume": "Ainda não há volume de pagamentos registrado.", + "loadingPaymentActivity": "Carregando atividade de Pagamentos...", + "createFirstWalletActivity": "Crie sua primeira Wallet para começar a acompanhar saldos e atividades.", + "noRecentActivity": "Ainda não há atividade recente.", + "loadingRecentActivity": "Carregando atividade recente...", + "createWallet": "Criar Wallet", + "totalBalance": "Saldo total", + "todaysVolume": "Volume de hoje", + "recentTransactions": "Transações recentes", + "activityDescription": "Atividade mais recente de Wallet e Emissão em toda a organização.", + "seeAllPayments": "Ver todos os pagamentos", + "time": "Hora", + "activity": "Atividade", + "type": "Tipo", + "token": "Token", + "amount": "Valor", + "address": "Endereço", + "send": "Enviar", + "receive": "Receber", + "transfer": "Transferência", + "untitledToken": "Token sem título", + "unableToLoadIssuanceTokens": "Não foi possível carregar os Tokens de emissão", + "someIssuanceActivityUnavailable": "Parte da atividade de Emissão não pôde ser carregada.", + "paymentsActivityUnavailable": "A atividade de Pagamentos está indisponível no momento.", + "issuanceActivityUnavailable": "A atividade de Emissão está indisponível no momento.", + "failedToLoadActivity": "Falha ao carregar atividade do dashboard", + "balanceDataUnavailable": "Os dados de saldo estão indisponíveis no momento." + } +} diff --git a/apps/sdp-web/src/components/language-picker.tsx b/apps/sdp-web/src/components/language-picker.tsx index d569fe519..86f96b875 100644 --- a/apps/sdp-web/src/components/language-picker.tsx +++ b/apps/sdp-web/src/components/language-picker.tsx @@ -29,7 +29,8 @@ function getDisplayNames(displayLocale: AppLocale): Intl.DisplayNames { } function localeDisplayName(locale: AppLocale, displayLocale: AppLocale): string { - return getDisplayNames(displayLocale).of(locale) ?? locale; + const name = getDisplayNames(displayLocale).of(locale) ?? locale; + return name.charAt(0).toLocaleUpperCase(displayLocale) + name.slice(1); } export function LanguagePicker({ variant = "topbar" }: { variant?: "topbar" | "landing" }) { diff --git a/apps/sdp-web/src/i18n/README.md b/apps/sdp-web/src/i18n/README.md index 6345b1f07..1b36af68f 100644 --- a/apps/sdp-web/src/i18n/README.md +++ b/apps/sdp-web/src/i18n/README.md @@ -2,11 +2,11 @@ The dashboard keeps its supported BCP-47 locales in `config.ts` and its English source catalog in `../../messages/en.json`. -Supported locales today: `en`, `fr`. French catalogs live under `../../messages/fr/`. The release workflow restores 100% key parity with English before release; at runtime, a temporarily missing localized key falls back to its English source value. +Supported locales today: `en`, `fr`, `pt`. French catalogs live under `../../messages/fr/` and Brazilian Portuguese catalogs under `../../messages/pt/`. The release workflow restores 100% key parity with English before release; at runtime, a temporarily missing localized key falls back to its English source value. -Product PRs add or change copy only in the English source catalogs. Do not update French in the same PR: the release workflow asks Eve to fill missing locale keys on the repository-owned `codex/release-main` branch. The catalog policy verifies both that branch name and its source repository before allowing mixed catalog changes. A dedicated translation-quality PR may change localized catalogs as long as it does not also introduce English source changes. +Product PRs add or change copy only in the English source catalogs. Do not update localized catalogs in the same PR: the release workflow asks Eve to fill missing locale keys on the repository-owned `codex/release-main` branch. The catalog policy verifies both that branch name and its source repository before allowing mixed catalog changes. A dedicated translation-quality PR may change localized catalogs as long as it does not also introduce English source changes. -Eve receives the locale rules in `.github/translation-guidance.json` plus the namespace and nearby approved translations for every new string. That guidance is the terminology source of truth. In French, established product terms such as `Token` and `Wallet` stay in English; literal `jeton` and `portefeuille` variants are rejected by catalog validation. +Eve receives the locale rules in `.github/translation-guidance.json` plus the namespace and nearby approved translations for every new string. That guidance is the terminology source of truth. In French, established product terms such as `Token` and `Wallet` stay in English; literal `jeton` and `portefeuille` variants are rejected by catalog validation. Portuguese follows the same convention, rejecting literal `carteira` and `ficha` variants. Use `await getTranslations()` in Server Components and `useTranslations()` in Client Components. Both accept only keys that exist in the English catalog. For dates, numbers, lists, and relative time, construct the native `Intl` formatter with the resolved locale rather than pinning it to `en-US`. diff --git a/apps/sdp-web/src/i18n/config.ts b/apps/sdp-web/src/i18n/config.ts index 51ebd22df..e8999181e 100644 --- a/apps/sdp-web/src/i18n/config.ts +++ b/apps/sdp-web/src/i18n/config.ts @@ -1,4 +1,4 @@ -export const supportedLocales = ["en", "fr"] as const; +export const supportedLocales = ["en", "fr", "pt"] as const; export type AppLocale = (typeof supportedLocales)[number]; diff --git a/apps/sdp-web/src/i18n/messages.ts b/apps/sdp-web/src/i18n/messages.ts index 2a4b2ee0c..bdac8bc6a 100644 --- a/apps/sdp-web/src/i18n/messages.ts +++ b/apps/sdp-web/src/i18n/messages.ts @@ -14,6 +14,14 @@ import frDashboardPayments from "../../messages/fr/dashboard-payments.json"; import frDashboardPolicies from "../../messages/fr/dashboard-policies.json"; import frShared from "../../messages/fr/shared.json"; import fr from "../../messages/fr.json"; +import ptDashboardApprovals from "../../messages/pt/dashboard-approvals.json"; +import ptDashboardCustody from "../../messages/pt/dashboard-custody.json"; +import ptDashboardIssuance from "../../messages/pt/dashboard-issuance.json"; +import ptDashboardPayments from "../../messages/pt/dashboard-payments.json"; +import ptDashboardPolicies from "../../messages/pt/dashboard-policies.json"; +import ptDashboardPrivateChannels from "../../messages/pt/dashboard-private-channels.json"; +import ptShared from "../../messages/pt/shared.json"; +import pt from "../../messages/pt.json"; const enMessages = { ...en, @@ -71,6 +79,19 @@ const frCatalog = { const frMessages = mergeLocalizedMessages(enMessages, frCatalog); +const ptCatalog = { + ...pt, + ...ptDashboardApprovals, + ...ptDashboardCustody, + ...ptDashboardIssuance, + ...ptDashboardPayments, + ...ptDashboardPolicies, + ...ptDashboardPrivateChannels, + Shared: ptShared, +} satisfies LocalizedMessages; + +const ptMessages = mergeLocalizedMessages(enMessages, ptCatalog); + export type MessageKeyFor = TValue extends string ? "" : { @@ -85,6 +106,7 @@ export type TranslationValues = Record; const messagesByLocale: Record = { en: enMessages, fr: frMessages, + pt: ptMessages, }; export function getMessages(locale: AppLocale): Messages { diff --git a/apps/sdp-web/src/i18n/messages.unit.test.ts b/apps/sdp-web/src/i18n/messages.unit.test.ts index 986125dbb..c3d9c3a31 100644 --- a/apps/sdp-web/src/i18n/messages.unit.test.ts +++ b/apps/sdp-web/src/i18n/messages.unit.test.ts @@ -21,12 +21,14 @@ describe("i18n messages", () => { it("only accepts configured locales", () => { expect(isAppLocale("en")).toBe(true); expect(isAppLocale("fr")).toBe(true); + expect(isAppLocale("pt")).toBe(true); expect(isAppLocale("de")).toBe(false); }); it("resolves typed catalog entries", () => { expect(translate(getMessages("en"), "Home.trySdp")).toBe("Try SDP"); expect(translate(getMessages("fr"), "Home.contactUs")).toBe("Nous contacter"); + expect(translate(getMessages("pt"), "Home.contactUs")).toBe("Fale conosco"); }); it("keeps non-English catalogs inventory-matched to English", () => {