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 = (
+ <>
+
-
- {/* 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. */}
-
+ )}
+
) : 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", () => {