From 05b131188483670beda7faa2579ba67cfa8b36f8 Mon Sep 17 00:00:00 2001 From: "Jeyhun F. Aslanov" <64644942+jeyhunfaslanov@users.noreply.github.com> Date: Thu, 13 Aug 2026 19:38:11 +0400 Subject: [PATCH 1/2] fix(sse): extract perplexity-web answers from workflow_block (#10259) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Perplexity moved the answer text out of `markdown_block` into `workflow_block` (`intended_usage: "workflow_root"`), streaming it as RFC-6902 patches whose `field` is `"workflow_block"` and whose paths address `/steps//items//payload/text_payload/chunks/`. `extractContent` recognised neither shape. Two independent guards dropped every answer frame: - `isAnswerTextUsage("workflow_root")` is false, so the block loop `continue`d before any accumulation. - the diff guard skipped every patch whose `field !== "markdown_block"`. The stream therefore ran to `COMPLETED` with an empty accumulator and the executor surfaced `Provider returned empty content` (502) even though the upstream SSE carried the full answer. Every model was affected — the carrying block is model-independent — so the provider was unusable. Adds `workflow_block` to `PplxBlock`, an `applyWorkflowDiff` patch applier for the streaming path, and `applyWorkflowBlock` for a materialized block on the terminal frame. Answer tracks are keyed per step+item so concurrent items cannot overwrite each other's chunk indices, and only `variant: "answer"` payloads are accumulated — search queries, sources and "thinking" items stay out of the message. Fixtures in the regression test are trimmed from a live capture (pplx-auto, mode=copilot); replaying the full 96 KB capture through the patched extractor yields the complete 247-char answer over 7 incremental deltas, against an empty string before the fix. Co-authored-by: Jeyhun F. Aslanov --- open-sse/executors/perplexity-web/protocol.ts | 170 +++++++++++ .../perplexity-web-workflow-block.test.ts | 265 ++++++++++++++++++ 2 files changed, 435 insertions(+) create mode 100644 tests/unit/perplexity-web-workflow-block.test.ts diff --git a/open-sse/executors/perplexity-web/protocol.ts b/open-sse/executors/perplexity-web/protocol.ts index 0afc778e99..11e81f05d3 100644 --- a/open-sse/executors/perplexity-web/protocol.ts +++ b/open-sse/executors/perplexity-web/protocol.ts @@ -148,6 +148,36 @@ export interface PplxBlock { }>; goals?: Array<{ description?: string }>; }; + // Workflow API (`intended_usage: "workflow_root"`). Perplexity moved the answer + // text here from markdown_block: it now arrives as one WORKFLOW_ITEM_TEXT item + // whose `text_payload.variant` is "answer", nested under a workflow step. Other + // variants ("thinking") and item types (queries, sources) are not answer text. + workflow_block?: PplxWorkflowBlock; +} + +export interface PplxWorkflowTextPayload { + text?: string; + chunks?: string[]; + variant?: string; + is_streaming?: boolean; +} + +export interface PplxWorkflowItem { + type?: string; + variant?: string; + payload?: { text_payload?: PplxWorkflowTextPayload }; +} + +export interface PplxWorkflowStep { + status?: string; + title?: string; + tool_name?: string; + items?: PplxWorkflowItem[]; +} + +export interface PplxWorkflowBlock { + status?: string; + steps?: PplxWorkflowStep[]; } export interface PplxUpsellInformation { @@ -427,6 +457,134 @@ export function applyMarkdownDiff(acc: MarkdownAccumulator, patches: PplxDiffPat } } +/** Answer-text items carry this `variant`; "thinking" and friends are not answer text. */ +const WORKFLOW_ANSWER_VARIANT = "answer"; + +/** + * mdState key for one workflow answer item. Keyed per step+item so the + * `/chunks/` indices of two concurrent items can never overwrite each other. + */ +function workflowUsageKey(stepIdx: number, itemIdx: number): string { + return `workflow_root:${stepIdx}:${itemIdx}`; +} + +function isAnswerItem(item: PplxWorkflowItem | undefined): boolean { + if (!item) return false; + const payloadVariant = item.payload?.text_payload?.variant; + return (payloadVariant ?? item.variant) === WORKFLOW_ANSWER_VARIANT; +} + +/** + * Seed an accumulator from a materialized answer item. Chunks win over `text`: + * the terminal frame can carry a `text` that lags the chunk track (same + * precedence markdown_block already uses for `chunks` over `answer`). + */ +function seedFromAnswerItem(acc: MarkdownAccumulator, item: PplxWorkflowItem): void { + const tp = item.payload?.text_payload; + if (!tp) return; + if (Array.isArray(tp.chunks) && tp.chunks.length > 0) { + acc.chunks = tp.chunks.map((c) => String(c)); + } else if (typeof tp.text === "string" && tp.text.length > 0) { + acc.chunks = [tp.text]; + } +} + +function ensureAcc(mdState: Map, key: string): MarkdownAccumulator { + let acc = mdState.get(key); + if (!acc) { + acc = { chunks: [] }; + mdState.set(key, acc); + } + return acc; +} + +/** + * Apply a `field: "workflow_block"` diff patch set. + * + * Live shapes (Aug 2026 capture, pplx-auto / mode=copilot): + * {op:"add", path:"/steps/1", value:{items:[…]}} + * {op:"add", path:"/steps/0/items/1", value:{…}} + * {op:"add", path:"/steps/1/items/0/payload/text_payload/chunks/2", value:"…"} + * {op:"replace", path:"/steps/1/items/0/payload/text_payload/text", value:"…"} + * + * Only answer-variant items are accumulated; step/status patches are ignored. + */ +export function applyWorkflowDiff( + mdState: Map, + patches: PplxDiffPatch[] +): void { + for (const patch of patches) { + const path = patch.path ?? ""; + + // Whole step materialized — pick up every answer item it carries. + const stepMatch = /^\/steps\/(\d+)$/.exec(path); + if (stepMatch) { + const stepIdx = Number.parseInt(stepMatch[1], 10); + const step = (patch.value ?? {}) as PplxWorkflowStep; + (step.items ?? []).forEach((item, itemIdx) => { + if (!isAnswerItem(item)) return; + seedFromAnswerItem(ensureAcc(mdState, workflowUsageKey(stepIdx, itemIdx)), item); + }); + continue; + } + + // Single item appended to an existing step. + const itemMatch = /^\/steps\/(\d+)\/items\/(\d+)$/.exec(path); + if (itemMatch) { + const item = (patch.value ?? {}) as PplxWorkflowItem; + if (!isAnswerItem(item)) continue; + const key = workflowUsageKey( + Number.parseInt(itemMatch[1], 10), + Number.parseInt(itemMatch[2], 10) + ); + seedFromAnswerItem(ensureAcc(mdState, key), item); + continue; + } + + // Incremental chunk append — the streaming hot path. + const chunkMatch = /^\/steps\/(\d+)\/items\/(\d+)\/payload\/text_payload\/chunks\/(\d+)$/.exec( + path + ); + if (chunkMatch && typeof patch.value === "string") { + const key = workflowUsageKey( + Number.parseInt(chunkMatch[1], 10), + Number.parseInt(chunkMatch[2], 10) + ); + // Only extend a track already seeded by an answer item: a chunk patch + // carries no variant, so an unseeded key could be a "thinking" track. + const acc = mdState.get(key); + if (!acc) continue; + acc.chunks[Number.parseInt(chunkMatch[3], 10)] = patch.value; + continue; + } + + // Terminal `text` materialization — only used when no chunks arrived. + const textMatch = /^\/steps\/(\d+)\/items\/(\d+)\/payload\/text_payload\/text$/.exec(path); + if (textMatch && typeof patch.value === "string" && patch.value.length > 0) { + const key = workflowUsageKey( + Number.parseInt(textMatch[1], 10), + Number.parseInt(textMatch[2], 10) + ); + const acc = mdState.get(key); + if (!acc || acc.chunks.join("").length > 0) continue; + acc.chunks = [patch.value]; + } + } +} + +/** Accumulate every answer item of a materialized workflow_block. */ +export function applyWorkflowBlock( + mdState: Map, + workflow: PplxWorkflowBlock +): void { + (workflow.steps ?? []).forEach((step, stepIdx) => { + (step.items ?? []).forEach((item, itemIdx) => { + if (!isAnswerItem(item)) return; + seedFromAnswerItem(ensureAcc(mdState, workflowUsageKey(stepIdx, itemIdx)), item); + }); + }); +} + /** * Extract the assistant answer from the COMPLETED frame's `text` step-blob. * @@ -646,6 +804,18 @@ export async function* extractContent( } } + // Content: workflow_block answer items. Perplexity migrated the answer text + // here from markdown_block, so this must run BEFORE the isAnswerTextUsage + // gate — the carrying usage is "workflow_root", which that gate rejects. + if (block.workflow_block) { + applyWorkflowBlock(mdState, block.workflow_block); + continue; + } + if (block.diff_block?.field === "workflow_block") { + applyWorkflowDiff(mdState, block.diff_block.patches ?? []); + continue; + } + // Content: answer-text blocks (schematized diff frames OR materialized // markdown_block on the final COMPLETED frame). if (!isAnswerTextUsage(usage)) continue; diff --git a/tests/unit/perplexity-web-workflow-block.test.ts b/tests/unit/perplexity-web-workflow-block.test.ts new file mode 100644 index 0000000000..e7fc094b17 --- /dev/null +++ b/tests/unit/perplexity-web-workflow-block.test.ts @@ -0,0 +1,265 @@ +// Perplexity moved the answer text out of `markdown_block` into `workflow_block` +// (`intended_usage: "workflow_root"`), streaming it as RFC-6902 patches whose +// `field` is `"workflow_block"` and whose paths address +// `/steps//items//payload/text_payload/chunks/`. +// +// `extractContent` recognised neither shape: `isAnswerTextUsage("workflow_root")` +// is false, and the diff guard skipped every `field !== "markdown_block"` patch. +// The stream therefore completed with an empty accumulator and the executor +// surfaced "Provider returned empty content" while the upstream answer was +// present in the SSE all along. +// +// Fixtures below are trimmed from a live capture (pplx-auto, mode=copilot). + +import test from "node:test"; +import assert from "node:assert/strict"; + +const { extractContent } = await import("../../open-sse/executors/perplexity-web/protocol.ts"); + +function sseStream(events: unknown[]): ReadableStream { + const encoder = new TextEncoder(); + const chunks = events.map((e) => `event: message\r\ndata: ${JSON.stringify(e)}\r\n\r\n`); + chunks.push("event: end_of_stream\r\n\r\n"); + const body = chunks.join(""); + return new ReadableStream({ + start(controller) { + controller.enqueue(encoder.encode(body)); + controller.close(); + }, + }); +} + +async function collect(events: unknown[]) { + let answer = ""; + const deltas: string[] = []; + for await (const chunk of extractContent(sseStream(events))) { + if (chunk.error) throw new Error(chunk.error); + if (typeof chunk.delta === "string") deltas.push(chunk.delta); + if (typeof chunk.answer === "string") answer = chunk.answer; + } + return { answer, deltas }; +} + +const ANSWER_PART_1 = "- The Caspian Sea is the world's largest inland"; +const ANSWER_PART_2 = " body of water by area, spanning about 371,000 square kilometers"; +const ANSWER_PART_3 = " (143,200 square miles).[1][2]"; +const FULL_ANSWER = ANSWER_PART_1 + ANSWER_PART_2 + ANSWER_PART_3; + +// `add /steps/1` seeds the answer item; later `add …/chunks/` frames append. +const STREAMING_EVENTS = [ + { + status: "PENDING", + backend_uuid: "76cf494e-2663-43e8-9382-5f37129707bb", + blocks: [ + { + intended_usage: "workflow_root", + diff_block: { + field: "workflow_block", + patches: [ + { op: "replace", path: "/status", value: "WORKFLOW_EXECUTING_STEPS" }, + { + op: "add", + path: "/steps/1", + value: { + status: "WORKFLOW_PENDING", + title: "", + items: [ + { + id: "45d63f9870ab45bc9bd10e8a264a6fc4", + type: "WORKFLOW_ITEM_TEXT", + payload: { + text_payload: { + text: "", + chunks: [ANSWER_PART_1], + variant: "answer", + is_streaming: true, + }, + }, + variant: "answer", + }, + ], + }, + }, + ], + }, + }, + ], + }, + { + status: "PENDING", + blocks: [ + { + intended_usage: "workflow_root", + diff_block: { + field: "workflow_block", + patches: [ + { + op: "add", + path: "/steps/1/items/0/payload/text_payload/chunks/1", + value: ANSWER_PART_2, + }, + ], + }, + }, + ], + }, + { + status: "COMPLETED", + final_sse_message: true, + blocks: [ + { + intended_usage: "workflow_root", + diff_block: { + field: "workflow_block", + patches: [ + { op: "replace", path: "/status", value: "WORKFLOW_COMPLETED" }, + { + op: "add", + path: "/steps/1/items/0/payload/text_payload/chunks/2", + value: ANSWER_PART_3, + }, + { + op: "replace", + path: "/steps/1/items/0/payload/text_payload/is_streaming", + value: false, + }, + ], + }, + }, + ], + }, +]; + +test("extractContent reconstructs the answer from workflow_block diff patches", async () => { + const { answer, deltas } = await collect(STREAMING_EVENTS); + + assert.equal(answer, FULL_ANSWER); + assert.equal(deltas.join(""), FULL_ANSWER, "deltas must concatenate to the full answer"); + assert.ok(deltas.length > 1, "streaming must emit incremental deltas, not one final blob"); +}); + +// A reconnect (or a truncated diff track) can deliver only the materialized +// workflow_block on the terminal frame — the answer must still be recovered. +test("extractContent reads a materialized workflow_block on the COMPLETED frame", async () => { + const { answer } = await collect([ + { + status: "COMPLETED", + final_sse_message: true, + blocks: [ + { + intended_usage: "workflow_root", + workflow_block: { + status: "WORKFLOW_COMPLETED", + steps: [ + { + status: "WORKFLOW_COMPLETED", + title: "Searching the web", + tool_name: "search_web", + items: [{ type: "WORKFLOW_ITEM_QUERIES", payload: { queries_payload: {} } }], + }, + { + status: "WORKFLOW_COMPLETED", + title: "", + items: [ + { + type: "WORKFLOW_ITEM_TEXT", + payload: { + text_payload: { + text: FULL_ANSWER, + chunks: [ANSWER_PART_1, ANSWER_PART_2, ANSWER_PART_3], + variant: "answer", + is_streaming: false, + }, + }, + variant: "answer", + }, + ], + }, + ], + }, + }, + ], + }, + ]); + + assert.equal(answer, FULL_ANSWER); +}); + +// Non-answer workflow items (search queries, sources) must never leak into the +// assistant message. +test("extractContent ignores non-answer workflow items", async () => { + const { answer } = await collect([ + { + status: "COMPLETED", + final_sse_message: true, + blocks: [ + { + intended_usage: "workflow_root", + workflow_block: { + status: "WORKFLOW_COMPLETED", + steps: [ + { + items: [ + { + type: "WORKFLOW_ITEM_TEXT", + payload: { + text_payload: { + text: "Searching the web for facts", + chunks: ["Searching the web for facts"], + variant: "thinking", + }, + }, + variant: "thinking", + }, + { + type: "WORKFLOW_ITEM_TEXT", + payload: { + text_payload: { + text: FULL_ANSWER, + chunks: [FULL_ANSWER], + variant: "answer", + }, + }, + variant: "answer", + }, + ], + }, + ], + }, + }, + ], + }, + ]); + + assert.equal(answer, FULL_ANSWER); +}); + +// Guard the pre-existing markdown_block path against regression from the fix. +test("extractContent still handles legacy markdown_block diffs", async () => { + const { answer } = await collect([ + { + status: "PENDING", + blocks: [ + { + intended_usage: "ask_text", + diff_block: { + field: "markdown_block", + patches: [{ op: "replace", path: "", value: { chunks: [ANSWER_PART_1] } }], + }, + }, + ], + }, + { + status: "COMPLETED", + final_sse_message: true, + blocks: [ + { + intended_usage: "ask_text", + markdown_block: { chunks: [ANSWER_PART_1, ANSWER_PART_2, ANSWER_PART_3] }, + }, + ], + }, + ]); + + assert.equal(answer, FULL_ANSWER); +}); From 266e39d36d596b2e575adef304f1c8b294d2c8a2 Mon Sep 17 00:00:00 2001 From: DarkAngel <48388675+DarkEsteves@users.noreply.github.com> Date: Thu, 13 Aug 2026 16:40:36 +0100 Subject: [PATCH 2/2] feat(i18n): complete Portuguese (PT-PT) translation (#10250) - 12,141 strings translated to European Portuguese - Built on top of the existing pt.json with full coverage of the v3.8.50 catalog - Remaining ~440 strings are technical terms/brand names kept in English Co-authored-by: DarkEsteves --- src/i18n/messages/pt.json | 5469 +++++++++++++++++++------------------ 1 file changed, 2777 insertions(+), 2692 deletions(-) diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 9c9cc536d8..bca5a7520e 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -31,7 +31,7 @@ "active": "Ativo", "inactive": "Inativo", "noData": "Não há dados disponíveis", - "nothingHere": "Nothing here yet", + "nothingHere": "Ainda nada aqui", "configure": "Configurar", "manualConfig": "Configuração manual", "manage": "Gerenciar", @@ -47,7 +47,7 @@ "time": "Hora", "details": "Detalhes", "created": "Criado", - "lastUsed": "Last Refreshed", + "lastUsed": "Última Atualização", "loadMore": "Carregar mais", "noResults": "Nenhum resultado encontrado", "reloadPage": "Recarregar página", @@ -70,8 +70,8 @@ "note": "Nota", "free": "Grátis", "skipToContent": "Pular para o conteúdo", - "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", - "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "maintenanceServerIssues": "O servidor está a ter problemas. Algumas funcionalidades podem estar indisponíveis.", + "maintenanceServerUnreachable": "O servidor está inacessível. A religar...", "accept": "accept", "accountId": "accountId", "alias": "alias", @@ -150,9 +150,9 @@ "Failed to reset pricing": "Falha ao redefinir o preço", "apikey": "Chave de API", "http": "HTTP", - "goToDashboard": "Go to Dashboard", - "checkSystemStatus": "Check System Status", - "selectModel": "Select Model", + "goToDashboard": "Ir para o Painel", + "checkSystemStatus": "Verificar Estado do Sistema", + "selectModel": "Selecionar Modelo", "addModel": "Adicionar modelo", "effortNone": "Nenhum", "effortLow": "Baixo", @@ -165,9 +165,9 @@ "wireApi": "Wire API", "modelAliases": "Aliases do modelo", "combos": "Combos", - "noModelsFound": "No models found", - "clear": "Clear", - "done": "Done", + "noModelsFound": "Nenhum modelo encontrado", + "clear": "Limpar", + "done": "Concluído", "selectAll": "Selecionar tudo", "unselectAll": "Desmarcar tudo", "visibleModels": "visíveis", @@ -184,519 +184,519 @@ "selectAllProviders": "Verifique todos os fornecedores", "clearProviderSelection": "Desmarcar fornecedores", "providersSelectedCount": "{count} fornecedores verificados", - "errorOccurred": "Error Occurred", - "comboDeleted": "Combo Deleted", - "hide": "Hide", - "creating": "Creating", - "comboCreated": "Combo Created", - "swapFormats": "Swap Formats", - "daysAgo": "Days Ago", - "retries": "Retries", - "errorDuringRestore": "Error During Restore", - "eventsAppearHint": "Events Appear Hint", - "noLockouts": "No Lockouts", - "webSearchDesc": "Web Search Desc", - "audioProvidersHeading": "Audio Providers Heading", + "errorOccurred": "Ocorreu um Erro", + "comboDeleted": "Combo Eliminado", + "hide": "Ocultar", + "creating": "A criar", + "comboCreated": "Combo Criado", + "swapFormats": "Trocar Formatos", + "daysAgo": "Dias Atrás", + "retries": "Tentativas", + "errorDuringRestore": "Erro Durante o Restauro", + "eventsAppearHint": "Dica de Aparecimento de Eventos", + "noLockouts": "Sem Bloqueios", + "webSearchDesc": "Descrição de Pesquisa Web", + "audioProvidersHeading": "Fornecedores de Áudio", "cloudAgentProviders": "Provedores de agentes em nuvem", - "minutesAgo": "Minutes Ago", + "minutesAgo": "Minutos Atrás", "a": "A", - "liveAutoRefreshing": "Live Auto Refreshing", - "webSearch": "Web Search", - "anthropicPrefixPlaceholder": "Anthropic Prefix Placeholder", - "addModelToCombo": "Add Model To Combo", - "failedToLoad": "Failed To Load", - "categoryMedia": "Category Media", - "enableCloud": "Enable Cloud", - "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "retry": "Retry", + "liveAutoRefreshing": "Atualização Automática em Tempo Real", + "webSearch": "Pesquisa Web", + "anthropicPrefixPlaceholder": "Prefixo Anthropic", + "addModelToCombo": "Adicionar Modelo ao Combo", + "failedToLoad": "Falha ao Carregar", + "categoryMedia": "Categoria Multimédia", + "enableCloud": "Ativar Cloud", + "expirationBannerExpiringSoon": "Banner de Expiração em Breve", + "retry": "Tentar novamente", "embeddings": "Embeddings", - "errorCount": "Error Count", - "backupReasonManual": "Backup Reason Manual", - "safeSearchModerate": "Safe Search Moderate", - "activeLimiters": "Active Limiters", - "a2aCardTitle": "A2A Card Title", - "cloudWorkerUnreachable": "Cloud Worker Unreachable", - "testFailed": "Test Failed", - "compatibleBaseUrlHint": "Compatible Base Url Hint", - "usageTracking": "Usage Tracking", - "disableCloudTitle": "Disable Cloud Title", - "noConnections": "No Connections", - "providerHealth": "Provider Health", - "confirmDbImport": "Confirm Db Import", - "notAvailableSymbol": "Not Available Symbol", - "backupsAvailable": "Backups Available", - "providerAuto": "Provider Auto", - "newProviderNamePlaceholder": "New Provider Name Placeholder", - "a2aQuickStartStep2": "A2A Quick Start Step2", - "ok": "Ok", - "available": "Available", - "noBackupYet": "No Backup Yet", - "more": "More", - "noCompatibleYet": "No Compatible Yet", - "multiProvider": "Multi Provider", - "repairEnvHint": "Repair Env Hint", - "disablingCloud": "Disabling Cloud", - "testBench": "Test Bench", - "valid": "Valid", - "cloudBenefitShare": "Cloud Benefit Share", - "mcpCardTitle": "Mcp Card Title", - "disableConfirm": "Disable Confirm", - "filters": "Filters", - "expirationBannerExpiredDesc": "Expiration Banner Expired Desc", - "saveComboDefaults": "Save Combo Defaults", - "cloudConnectedVerified": "Cloud Connected Verified", - "uptime": "Uptime", - "compatibleProdPlaceholder": "Compatible Prod Placeholder", - "fallbackChainsTitle": "Fallback Chains Title", - "oauthLabel": "Oauth Label", - "a2aCardDescription": "A2A Card Description", - "okShort": "Ok Short", - "maintenance": "Maintenance", - "formatConverter": "Format Converter", - "zedImportNetworkError": "Zed Import Network Error", - "apiKeyLabel": "Api Key Label", - "noModelsForProvider": "No Models For Provider", - "mcpCardDescription": "Mcp Card Description", - "apiTypeLabel": "Api Type Label", - "configuredProvidersLabel": "Configured Providers Label", - "maxRetriesLabel": "Max Retries Label", - "title": "Title", - "output": "Output", - "prefixHint": "Prefix Hint", - "skipWizard": "Skip Wizard", - "failedCount": "Failed Count", - "confirmDbImportDesc": "Confirm Db Import Desc", - "entries": "Entries", - "until": "Until", - "disableCombo": "Disable Combo", - "liveMonitorDescriptionPrefix": "Live Monitor Description Prefix", - "runningCount": "Running Count", - "noActiveConnectionsInGroup": "No Active Connections In Group", - "savedSuccessfully": "Saved Successfully", - "systemStorage": "System Storage", - "videoDesc": "Video Desc", - "maxResults": "Max Results", - "timeRangeMonth": "Time Range Month", - "testSummary": "Test Summary", - "failedSetPassword": "Failed Set Password", - "audio": "Audio", - "restore": "Restore", - "disableWarning": "Disable Warning", - "moderationsDesc": "Moderations Desc", - "providerHealthStatusAria": "Provider Health Status Aria", - "modelNamePlaceholder": "Model Name Placeholder", - "mcpQuickStartStep2": "Mcp Quick Start Step2", - "quickStart": "Quick Start", - "fullExportFailedWithError": "Full Export Failed With Error", - "loadingBackups": "Loading Backups", - "anthropicBaseUrlPlaceholder": "Anthropic Base Url Placeholder", - "description": "Description", - "noProviderFound": "No Provider Found", - "auto": "Auto", - "protocolsDescription": "Protocols Description", - "cloudSessionNote": "Cloud Session Note", - "advancedSettings": "Advanced Settings", - "defaultStrategy": "Default Strategy", - "purgeExpiredLogs": "Purge Expired Logs", - "justNow": "Just Now", - "providerTestFailed": "Provider Test Failed", - "openaiBaseUrlPlaceholder": "Openai Base Url Placeholder", - "image": "Image", - "failedCreateChain": "Failed Create Chain", - "importDatabase": "Import Database", - "allDataLocal": "All Data Local", - "sectionTitle": "Section Title", - "failedToggle": "Failed Toggle", - "editCombo": "Edit Combo", - "testResults": "Test Results", - "searchQuery": "Search Query", + "errorCount": "Contagem de Erros", + "backupReasonManual": "Motivo do Backup Manual", + "safeSearchModerate": "Pesquisa Segura Moderada", + "activeLimiters": "Limitadores Ativos", + "a2aCardTitle": "Título do Cartão A2A", + "cloudWorkerUnreachable": "Worker Cloud Inacessível", + "testFailed": "Teste Falhou", + "compatibleBaseUrlHint": "Dica de URL Base Compatível", + "usageTracking": "Monitorização de Utilização", + "disableCloudTitle": "Desativar Cloud", + "noConnections": "Sem Ligações", + "providerHealth": "Saúde do Fornecedor", + "confirmDbImport": "Confirmar Importação da BD", + "notAvailableSymbol": "—", + "backupsAvailable": "Backups Disponíveis", + "providerAuto": "Fornecedor Automático", + "newProviderNamePlaceholder": "Espaço reservado do Nome do Novo Fornecedor", + "a2aQuickStartStep2": "Passo 2 do Início Rápido A2A", + "ok": "OK", + "available": "Disponível", + "noBackupYet": "Ainda Sem Backup", + "more": "Mais", + "noCompatibleYet": "Ainda Sem Compatíveis", + "multiProvider": "Multi-Fornecedor", + "repairEnvHint": "Dica de Reparação do Ambiente", + "disablingCloud": "A desativar Cloud", + "testBench": "Bancada de Testes", + "valid": "Válido", + "cloudBenefitShare": "Partilha de Benefício Cloud", + "mcpCardTitle": "Título do Cartão MCP", + "disableConfirm": "Confirmar Desativação", + "filters": "Filtros", + "expirationBannerExpiredDesc": "Descrição do Banner de Expiração Expirado", + "saveComboDefaults": "Guardar Predefinições do Combo", + "cloudConnectedVerified": "Cloud Ligada Verificada", + "uptime": "Tempo em Atividade", + "compatibleProdPlaceholder": "Espaço reservado de Produção Compatível", + "fallbackChainsTitle": "Cadeias de Fallback", + "oauthLabel": "OAuth", + "a2aCardDescription": "Descrição do Cartão A2A", + "okShort": "OK", + "maintenance": "Manutenção", + "formatConverter": "Conversor de Formato", + "zedImportNetworkError": "Erro de Rede na Importação do Zed", + "apiKeyLabel": "Chave de API", + "noModelsForProvider": "Sem Modelos para o Fornecedor", + "mcpCardDescription": "Descrição do Cartão MCP", + "apiTypeLabel": "Tipo de API", + "configuredProvidersLabel": "Fornecedores Configurados", + "maxRetriesLabel": "Tentativas Máximas", + "title": "Título", + "output": "Saída", + "prefixHint": "Dica de Prefixo", + "skipWizard": "Ignorar Assistente", + "failedCount": "Contagem de Falhas", + "confirmDbImportDesc": "Descrição da Confirmação de Importação da BD", + "entries": "Entradas", + "until": "Até", + "disableCombo": "Desativar Combo", + "liveMonitorDescriptionPrefix": "Prefixo da Descrição do Monitor em Tempo Real", + "runningCount": "Contagem em Execução", + "noActiveConnectionsInGroup": "Sem Ligações Ativas no Grupo", + "savedSuccessfully": "Guardado com Sucesso", + "systemStorage": "Armazenamento do Sistema", + "videoDesc": "Descrição de Vídeo", + "maxResults": "Resultados Máximos", + "timeRangeMonth": "Intervalo de Tempo: Mês", + "testSummary": "Resumo do Teste", + "failedSetPassword": "Falha ao Definir Palavra-passe", + "audio": "Áudio", + "restore": "Restaurar", + "disableWarning": "Aviso de Desativação", + "moderationsDesc": "Descrição de Moderações", + "providerHealthStatusAria": "Estado de Saúde do Fornecedor", + "modelNamePlaceholder": "Espaço reservado do Nome do Modelo", + "mcpQuickStartStep2": "Passo 2 do Início Rápido MCP", + "quickStart": "Início Rápido", + "fullExportFailedWithError": "Falha na Exportação Completa Com Erro", + "loadingBackups": "A carregar Backups", + "anthropicBaseUrlPlaceholder": "URL Base da Anthropic", + "description": "Descrição", + "noProviderFound": "Nenhum Fornecedor Encontrado", + "auto": "Automático", + "protocolsDescription": "Descrição dos Protocolos", + "cloudSessionNote": "Nota da Sessão Cloud", + "advancedSettings": "Definições Avançadas", + "defaultStrategy": "Estratégia Padrão", + "purgeExpiredLogs": "Limpar Registos Expirados", + "justNow": "Agora mesmo", + "providerTestFailed": "Teste do Fornecedor Falhou", + "openaiBaseUrlPlaceholder": "Espaço reservado da URL Base OpenAI", + "image": "Imagem", + "failedCreateChain": "Falha ao Criar Cadeia", + "importDatabase": "Importar Base de Dados", + "allDataLocal": "Todos os Dados Locais", + "sectionTitle": "Título da Secção", + "failedToggle": "Falha ao Alternar", + "editCombo": "Editar Combo", + "testResults": "Resultados do Teste", + "searchQuery": "Consulta de Pesquisa", "addCcCompatible": "Add Cc Compatible", - "duplicate": "Duplicate", - "createCombo": "Create Combo", - "searchTypeWeb": "Search Type Web", - "addChain": "Add Chain", - "prefixLabel": "Prefix Label", - "listModelsDesc": "List Models Desc", - "databaseSize": "Database Size", - "chainCreated": "Chain Created", - "providerTestTimeout": "Provider Test Timeout", - "routingStrategy": "Routing Strategy", - "translateAction": "Translate Action", - "exportFailed": "Export Failed", - "connectedVerificationPending": "Connected Verification Pending", - "a2aQuickStartTitle": "A2A Quick Start Title", - "couldNotTest": "Could Not Test", - "testAllCompatible": "Test All Compatible", - "anthropicCompatibleName": "Anthropic Compatible Name", - "disabling": "Disabling", - "failedEnable": "Failed Enable", - "categoryUtility": "Category Utility", - "customUrlOptional": "Custom Url Optional", - "localProviders": "Local Providers", - "comboNamePlaceholder": "Combo Name Placeholder", - "memoryRss": "Memory Rss", - "disableProvider": "Disable Provider", - "welcomeDesc": "Welcome Desc", - "nameLabel": "Name Label", - "allOperational": "All Operational", - "backupNow": "Backup Now", - "providerMaxRetriesAria": "Provider Max Retries Aria", - "textToSpeechDesc": "Text To Speech Desc", - "machineId": "Machine Id", - "globalProxy": "Global Proxy", - "hitsMisses": "Hits Misses", - "testDesc": "Test Desc", - "chatDesc": "Chat Desc", - "importSuccess": "Import Success", + "duplicate": "Duplicar", + "createCombo": "Criar Combo", + "searchTypeWeb": "Tipo de Pesquisa: Web", + "addChain": "Adicionar Cadeia", + "prefixLabel": "Prefixo", + "listModelsDesc": "Descrição de Listar Modelos", + "databaseSize": "Tamanho da Base de Dados", + "chainCreated": "Cadeia Criada", + "providerTestTimeout": "Tempo Limite do Teste do Fornecedor", + "routingStrategy": "Estratégia de Encaminhamento", + "translateAction": "Ação de Tradução", + "exportFailed": "Falha na Exportação", + "connectedVerificationPending": "Verificação de Ligação Pendente", + "a2aQuickStartTitle": "Título do Início Rápido A2A", + "couldNotTest": "Não Foi Possível Testar", + "testAllCompatible": "Testar Todos os Compatíveis", + "anthropicCompatibleName": "Nome Compatível com Anthropic", + "disabling": "A desativar", + "failedEnable": "Falha ao Ativar", + "categoryUtility": "Categoria Utilidade", + "customUrlOptional": "URL Personalizado Opcional", + "localProviders": "Fornecedores Locais", + "comboNamePlaceholder": "Espaço reservado do Nome do Combo", + "memoryRss": "Memória RSS", + "disableProvider": "Desativar Fornecedor", + "welcomeDesc": "Descrição de Boas-vindas", + "nameLabel": "Nome", + "allOperational": "Tudo Operacional", + "backupNow": "Fazer Backup Agora", + "providerMaxRetriesAria": "Tentativas Máximas do Fornecedor", + "textToSpeechDesc": "Descrição de Texto para Fala", + "machineId": "ID da Máquina", + "globalProxy": "Proxy Global", + "hitsMisses": "Acertos e Falhas", + "testDesc": "Descrição do Teste", + "chatDesc": "Descrição do Chat", + "importSuccess": "Importação Bem-sucedida", "chat": "Chat", - "a2aQuickStartStep1": "A2A Quick Start Step1", - "importFailed": "Import Failed", - "inputPlaceholder": "Input Placeholder", - "providerModelsTitle": "Provider Models Title", - "lastBackup": "Last Backup", - "yourEndpoint": "Your Endpoint", - "autoDisableThresholdDesc": "Auto Disable Threshold Desc", - "rerankDesc": "Rerank Desc", - "modelsPathPlaceholder": "Models Path Placeholder", - "noCombosYet": "No Combos Yet", - "connectedVerificationPendingWithError": "Connected Verification Pending With Error", - "comboDefaultsGuideHint1": "Combo Defaults Guide Hint1", - "enableCloudTitle": "Enable Cloud Title", - "configuredProvidersHint": "Configured Providers Hint", - "paused": "Paused", - "llmProviders": "Llm Providers", - "enableCombo": "Enable Combo", - "removeProviderOverrideAria": "Remove Provider Override Aria", - "nodeVersion": "Node Version", - "openai": "Openai", - "exportFailedWithError": "Export Failed With Error", - "proxyConfigured": "Proxy Configured", - "concurrencyPerModel": "Concurrency Per Model", - "protocolTasksLabel": "Protocol Tasks Label", - "oauthProviders": "Oauth Providers", - "lockedCount": "Locked Count", - "deleteChainConfirm": "Delete Chain Confirm", - "recentTranslations": "Recent Translations", - "zedImportButton": "Zed Import Button", - "responsesDesc": "Responses Desc", - "testedCount": "Tested Count", - "providersCommaSeparatedPlaceholder": "Providers Comma Separated Placeholder", - "signatureDefaults": "Signature Defaults", - "errorCreating": "Error Creating", - "timeRangeYear": "Time Range Year", + "a2aQuickStartStep1": "Passo 1 do Início Rápido A2A", + "importFailed": "Falha na Importação", + "inputPlaceholder": "Espaço reservado de Entrada", + "providerModelsTitle": "Modelos do Fornecedor", + "lastBackup": "Último Backup", + "yourEndpoint": "O Teu Endpoint", + "autoDisableThresholdDesc": "Descrição do Limiar de Desativação Automática", + "rerankDesc": "Descrição de Reordenar", + "modelsPathPlaceholder": "Espaço reservado do Caminho de Modelos", + "noCombosYet": "Ainda Sem Combos", + "connectedVerificationPendingWithError": "Verificação de Ligação Pendente Com Erro", + "comboDefaultsGuideHint1": "Dica 1 do Guia de Predefinições de Combo", + "enableCloudTitle": "Ativar Cloud", + "configuredProvidersHint": "Dica de Fornecedores Configurados", + "paused": "Em pausa", + "llmProviders": "Fornecedores de LLM", + "enableCombo": "Ativar Combo", + "removeProviderOverrideAria": "Remover Substituição do Fornecedor", + "nodeVersion": "Versão do Node", + "openai": "OpenAI", + "exportFailedWithError": "Falha na Exportação Com Erro", + "proxyConfigured": "Proxy Configurado", + "concurrencyPerModel": "Concorrência Por Modelo", + "protocolTasksLabel": "Tarefas do Protocolo", + "oauthProviders": "Fornecedores OAuth", + "lockedCount": "Contagem de Bloqueios", + "deleteChainConfirm": "Confirmar Eliminação da Cadeia", + "recentTranslations": "Traduções Recentes", + "zedImportButton": "Botão de Importação do Zed", + "responsesDesc": "Descrição de Respostas", + "testedCount": "Contagem de Testados", + "providersCommaSeparatedPlaceholder": "Espaço reservado de Fornecedores Separados por Vírgula", + "signatureDefaults": "Predefinições de Assinatura", + "errorCreating": "Erro ao Criar", + "timeRangeYear": "Intervalo de Tempo: Ano", "compatibleLabel": "Compatible Label", - "cloudDisabledSuccess": "Cloud Disabled Success", - "deleteConfirm": "Delete Confirm", - "check": "Check", - "safeSearch": "Safe Search", - "protocolLastActivity": "Protocol Last Activity", - "openMcpDashboard": "Open Mcp Dashboard", + "cloudDisabledSuccess": "Cloud Desativada com Sucesso", + "deleteConfirm": "Confirmar Eliminação", + "check": "Verificar", + "safeSearch": "Pesquisa Segura", + "protocolLastActivity": "Última Atividade do Protocolo", + "openMcpDashboard": "Abrir Painel MCP", "testBenchTab": "Test Bench Tab", - "chatPathLabel": "Chat Path Label", - "retryDelay": "Retry Delay", - "errorUpdating": "Error Updating", - "ideCliIntegrations": "Ide Cli Integrations", - "imageGeneration": "Image Generation", - "apiKeyRequired": "Api Key Required", - "resetAllTitle": "Reset All Title", - "connectionError": "Connection Error", - "modelName": "Model Name", - "apiKeyForCheck": "Api Key For Check", - "cloudRequestTimeout": "Cloud Request Timeout", - "showConfiguredOnly": "Show Configured Only", + "chatPathLabel": "Caminho de Chat", + "retryDelay": "Atraso entre Tentativas", + "errorUpdating": "Erro ao Atualizar", + "ideCliIntegrations": "Integrações de IDE e CLI", + "imageGeneration": "Geração de Imagem", + "apiKeyRequired": "Chave de API Obrigatória", + "resetAllTitle": "Repor Tudo", + "connectionError": "Erro de Ligação", + "modelName": "Nome do Modelo", + "apiKeyForCheck": "Chave de API para Verificar", + "cloudRequestTimeout": "Tempo Limite do Pedido à Cloud", + "showConfiguredOnly": "Mostrar Apenas Configurados", "showFreeOnly": "Somente grátis", "addFirstProvider": "Adicione seu primeiro provedor", "addFirstProviderDesc": "Conecte um provedor de IA para começar a rotear solicitações por meio do OmniRoute. Você pode usar provedores gratuitos, chaves de API ou contas OAuth.", "learnMore": "Saiba mais", - "includeDomains": "Include Domains", - "promptCache": "Prompt Cache", - "cloudConnected": "Cloud Connected", - "deleteChain": "Delete Chain", - "chatPathPlaceholder": "Chat Path Placeholder", - "databasePath": "Database Path", - "usingLocalServer": "Using Local Server", - "globalComboConfig": "Global Combo Config", - "backupFailed": "Backup Failed", - "tabProtocols": "Tab Protocols", - "continue": "Continue", - "categorySearch": "Category Search", - "rateLimitStatus": "Rate Limit Status", - "repairEnvSuccess": "Repair Env Success", - "nameRequired": "Name Required", - "country": "Country", - "trackMetricsDesc": "Track Metrics Desc", - "durationSecondsShort": "Duration Seconds Short", - "formatConverterDescription": "Format Converter Description", - "cloudBenefitAccess": "Cloud Benefit Access", - "maxRetries": "Max Retries", - "queueTimeout": "Queue Timeout", + "includeDomains": "Incluir Domínios", + "promptCache": "Cache de Prompt", + "cloudConnected": "Cloud Ligada", + "deleteChain": "Eliminar Cadeia", + "chatPathPlaceholder": "Espaço reservado do Caminho de Chat", + "databasePath": "Caminho da Base de Dados", + "usingLocalServer": "A Usar Servidor Local", + "globalComboConfig": "Configuração Global de Combo", + "backupFailed": "Falha no Backup", + "tabProtocols": "Separador de Protocolos", + "continue": "Continuar", + "categorySearch": "Pesquisar Categoria", + "rateLimitStatus": "Estado do Limite de Taxa", + "repairEnvSuccess": "Ambiente Reparado com Sucesso", + "nameRequired": "Nome Obrigatório", + "country": "País", + "trackMetricsDesc": "Descrição de Monitorizar Métricas", + "durationSecondsShort": "s", + "formatConverterDescription": "Descrição do Conversor de Formato", + "cloudBenefitAccess": "Acesso a Benefício Cloud", + "maxRetries": "Tentativas Máximas", + "queueTimeout": "Tempo Limite da Fila", "queueDepth": "Profundidade da fila", - "addProvider": "Add Provider", - "realtime": "Realtime", - "totalTranslations": "Total Translations", - "protocolActiveStreamsLabel": "Protocol Active Streams Label", - "repairEnv": "Repair Env", - "modelsCount": "Models Count", - "viewBackups": "View Backups", - "responsesApi": "Responses Api", - "copyComboName": "Copy Combo Name", - "failures": "Failures", - "failedUpdate": "Failed Update", - "imageDesc": "Image Desc", - "failedCreate": "Failed Create", - "remainingOfLimit": "Remaining Of Limit", - "protocolsTitle": "Protocols Title", - "expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc", - "source": "Source", - "failed": "Failed", + "addProvider": "Adicionar Fornecedor", + "realtime": "Tempo real", + "totalTranslations": "Total de Traduções", + "protocolActiveStreamsLabel": "Streams Ativos do Protocolo", + "repairEnv": "Reparar Ambiente", + "modelsCount": "Contagem de Modelos", + "viewBackups": "Ver Backups", + "responsesApi": "API de Respostas", + "copyComboName": "Copiar Nome do Combo", + "failures": "Falhas", + "failedUpdate": "Falha ao Atualizar", + "imageDesc": "Descrição de Imagem", + "failedCreate": "Falha ao Criar", + "remainingOfLimit": "Restante do Limite", + "protocolsTitle": "Protocolos", + "expirationBannerExpiringSoonDesc": "Descrição do Banner de Expiração em Breve", + "source": "Fonte", + "failed": "Falhou", "apiKeyMgmt": "Api Key Mgmt", - "mcpQuickStartStep1": "Mcp Quick Start Step1", - "runTest": "Run Test", - "loadingFallbackChains": "Loading Fallback Chains", - "healthy": "Healthy", - "version": "Version", - "saveBlockWeighted": "Save Block Weighted", - "zedImportNone": "Zed Import None", - "noBackupsYet": "No Backups Yet", - "noGlobalProxy": "No Global Proxy", - "noModels": "No Models", - "stickyLimit": "Sticky Limit", - "passedCount": "Passed Count", - "zedImportFailed": "Zed Import Failed", - "saving": "Saving", - "testAll": "Test All", - "globalProxyDesc": "Global Proxy Desc", - "latencyP99": "Latency P99", - "connectingToCloud": "Connecting To Cloud", - "responses": "Responses", - "errorDeleting": "Error Deleting", - "openaiPrefixPlaceholder": "Openai Prefix Placeholder", - "enterPassword": "Enter Password", - "openA2aDashboard": "Open A2A Dashboard", - "enableProvider": "Enable Provider", - "modeTest": "Mode Test", - "failedDeleteChain": "Failed Delete Chain", - "providerDesc": "Provider Desc", - "templateLoadHint": "Template Load Hint", - "lastFailure": "Last Failure", - "moveDown": "Move Down", - "providerLabel": "Provider Label", - "clearCacheFailed": "Clear Cache Failed", - "imagesGenerations": "Images Generations", - "repairEnvWorking": "Repair Env Working", - "millisecondsShort": "Milliseconds Short", - "globalLabel": "Global Label", - "failuresPlural": "Failures Plural", - "completionsLegacyDesc": "Completions Legacy Desc", - "searchProviders": "Search Providers", - "chatPathHint": "Chat Path Hint", - "defaultStrategyDesc": "Default Strategy Desc", - "latencyP95": "Latency P95", - "textToSpeech": "Text To Speech", - "searchType": "Search Type", - "messages": "Messages", - "aggregatorsGateways": "Aggregators Gateways", - "comboStrategyAria": "Combo Strategy Aria", - "input": "Input", - "testingConnection": "Testing Connection", - "excludeDomains": "Exclude Domains", - "webCookieProviders": "Web Cookie Providers", - "allTestsPassed": "All Tests Passed", - "openaiCompatibleName": "Openai Compatible Name", - "warningCostOptimizedPartialPricing": "Warning Cost Optimized Partial Pricing", - "comboDefaultsGuideTitle": "Combo Defaults Guide Title", - "hoursAgo": "Hours Ago", - "notAvailable": "Not Available", - "skipAndContinue": "Skip And Continue", - "moderations": "Moderations", - "proxyConfig": "Proxy Config", - "upstreamProxyProviders": "Upstream Proxy Providers", - "exportAll": "Export All", - "queuedCount": "Queued Count", - "resetAll": "Reset All", - "noTranslations": "No Translations", - "avgLatency": "Avg Latency", - "throttleStatus": "Throttle Status", - "backupRetentionDesc": "Backup Retention Desc", - "noCBData": "No Cb Data", - "chainDeleted": "Chain Deleted", - "timeLeft": "Time Left", - "expirationBannerExpired": "Expiration Banner Expired", - "language": "Language", - "invalidFileType": "Invalid File Type", - "monitoredProviders": "Monitored Providers", - "errors": "Errors", + "mcpQuickStartStep1": "Passo 1 do Início Rápido MCP", + "runTest": "Executar Teste", + "loadingFallbackChains": "A carregar Cadeias de Fallback", + "healthy": "Saudável", + "version": "Versão", + "saveBlockWeighted": "Guardar Bloco Ponderado", + "zedImportNone": "Sem Importação do Zed", + "noBackupsYet": "Ainda Sem Backups", + "noGlobalProxy": "Sem Proxy Global", + "noModels": "Sem Modelos", + "stickyLimit": "Limite Persistente", + "passedCount": "Contagem de Aprovados", + "zedImportFailed": "Falha na Importação do Zed", + "saving": "A guardar", + "testAll": "Testar Tudo", + "globalProxyDesc": "Descrição do Proxy Global", + "latencyP99": "Latência P99", + "connectingToCloud": "A ligar à Cloud", + "responses": "Respostas", + "errorDeleting": "Erro ao Eliminar", + "openaiPrefixPlaceholder": "Espaço reservado de Prefixo OpenAI", + "enterPassword": "Introduzir Palavra-passe", + "openA2aDashboard": "Abrir Painel A2A", + "enableProvider": "Ativar Fornecedor", + "modeTest": "Modo de Teste", + "failedDeleteChain": "Falha ao Eliminar Cadeia", + "providerDesc": "Descrição do Fornecedor", + "templateLoadHint": "Dica de Carregamento de Modelo", + "lastFailure": "Última Falha", + "moveDown": "Mover para Baixo", + "providerLabel": "Fornecedor", + "clearCacheFailed": "Falha ao Limpar Cache", + "imagesGenerations": "Gerações de Imagens", + "repairEnvWorking": "A Reparar Ambiente", + "millisecondsShort": "ms", + "globalLabel": "Global", + "failuresPlural": "Falhas", + "completionsLegacyDesc": "Descrição das Completions Legadas", + "searchProviders": "Fornecedores de Pesquisa", + "chatPathHint": "Dica do Caminho de Chat", + "defaultStrategyDesc": "Descrição da Estratégia Padrão", + "latencyP95": "Latência P95", + "textToSpeech": "Texto para Fala", + "searchType": "Tipo de Pesquisa", + "messages": "Mensagens", + "aggregatorsGateways": "Agregadores e Gateways", + "comboStrategyAria": "Estratégia do Combo", + "input": "Entrada", + "testingConnection": "A Testar Ligação", + "excludeDomains": "Excluir Domínios", + "webCookieProviders": "Fornecedores de Cookies Web", + "allTestsPassed": "Todos os Testes Passaram", + "openaiCompatibleName": "Nome Compatível com OpenAI", + "warningCostOptimizedPartialPricing": "Aviso de Preço Parcial em Custo Otimizado", + "comboDefaultsGuideTitle": "Título do Guia de Predefinições de Combo", + "hoursAgo": "Horas Atrás", + "notAvailable": "Não Disponível", + "skipAndContinue": "Ignorar e Continuar", + "moderations": "Moderações", + "proxyConfig": "Configuração de Proxy", + "upstreamProxyProviders": "Fornecedores de Proxy Upstream", + "exportAll": "Exportar Tudo", + "queuedCount": "Contagem na Fila", + "resetAll": "Repor Tudo", + "noTranslations": "Sem Traduções", + "avgLatency": "Latência Média", + "throttleStatus": "Estado de Limitação", + "backupRetentionDesc": "Descrição da Retenção de Backups", + "noCBData": "Sem Dados de Disjuntor", + "chainDeleted": "Cadeia Eliminada", + "timeLeft": "Tempo Restante", + "expirationBannerExpired": "Banner de Expiração Expirado", + "language": "Idioma", + "invalidFileType": "Tipo de Ficheiro Inválido", + "monitoredProviders": "Fornecedores Monitorizados", + "errors": "Erros", "heap": "Heap", - "chatCompletions": "Chat Completions", - "exampleTemplatesHint": "Example Templates Hint", - "retryDelayLabel": "Retry Delay Label", - "audioTranscription": "Audio Transcription", - "fallbackChainsDesc": "Fallback Chains Desc", - "exampleTemplates": "Example Templates", - "connectionsCount": "Connections Count", - "modelsPathLabel": "Models Path Label", - "activeProvidersHint": "Active Providers Hint", - "activeLockouts": "Active Lockouts", - "invalid": "Invalid", - "skipPassword": "Skip Password", - "moveUp": "Move Up", - "timeRange": "Time Range", - "stickyLimitDesc": "Sticky Limit Desc", - "cloudBenefitEdge": "Cloud Benefit Edge", - "custom": "Custom", - "verifying": "Verifying", - "baseUrlLabel": "Base Url Label", - "setPassword": "Set Password", - "safeSearchStrict": "Safe Search Strict", - "noChangesSinceBackup": "No Changes Since Backup", - "modelsPathHint": "Models Path Hint", - "audioTranscriptions": "Audio Transcriptions", - "testCombo": "Test Combo", - "mcpQuickStartTitle": "Mcp Quick Start Title", - "comboUpdated": "Combo Updated", - "weighted": "Weighted", - "providers": "Providers", + "chatCompletions": "Completions de Chat", + "exampleTemplatesHint": "Dica de Modelos de Exemplo", + "retryDelayLabel": "Atraso entre Tentativas", + "audioTranscription": "Transcrição de Áudio", + "fallbackChainsDesc": "Descrição das Cadeias de Fallback", + "exampleTemplates": "Modelos de Exemplo", + "connectionsCount": "Contagem de Ligações", + "modelsPathLabel": "Caminho de Modelos", + "activeProvidersHint": "Dica de Fornecedores Ativos", + "activeLockouts": "Bloqueios Ativos", + "invalid": "Inválido", + "skipPassword": "Ignorar Palavra-passe", + "moveUp": "Mover para Cima", + "timeRange": "Intervalo de Tempo", + "stickyLimitDesc": "Descrição do Limite Persistente", + "cloudBenefitEdge": "Vantagem Cloud", + "custom": "Personalizado", + "verifying": "A verificar", + "baseUrlLabel": "URL Base", + "setPassword": "Definir Palavra-passe", + "safeSearchStrict": "Pesquisa Segura Estrita", + "noChangesSinceBackup": "Sem Alterações Desde o Backup", + "modelsPathHint": "Dica do Caminho de Modelos", + "audioTranscriptions": "Transcrições de Áudio", + "testCombo": "Testar Combo", + "mcpQuickStartTitle": "Título do Início Rápido MCP", + "comboUpdated": "Combo Atualizado", + "weighted": "Ponderado", + "providers": "Fornecedores", "ccCompatibleLabel": "Cc Compatible Label", - "noFallbackChainsDesc": "No Fallback Chains Desc", - "yesImport": "Yes Import", - "lockoutsAutoRefreshHint": "Lockouts Auto Refresh Hint", - "tabApis": "Tab Apis", - "sectionDescription": "Section Description", - "filter": "Filter", - "purgeLogsFailed": "Purge Logs Failed", - "latency": "Latency", - "testAllOAuth": "Test All O Auth", - "mcpQuickStartStep3": "Mcp Quick Start Step3", - "repairEnvFailed": "Repair Env Failed", - "zedImportHint": "Zed Import Hint", - "modelsAcrossEndpoints": "Models Across Endpoints", - "autoDisableBannedAccounts": "Auto Disable Banned Accounts", - "securityDesc": "Security Desc", - "listModels": "List Models", - "backupRestore": "Backup Restore", - "target": "Target", - "zedImportSuccess": "Zed Import Success", - "lastHeaderUpdate": "Last Header Update", - "categoryCore": "Category Core", - "noFallbackChains": "No Fallback Chains", - "noSearchProviders": "No Search Providers", - "autoBalance": "Auto Balance", - "noModelsYet": "No Models Yet", - "signatureFamily": "Signature Family", - "externalApiCalls": "External Api Calls", - "providerOverridesDesc": "Provider Overrides Desc", - "signatureTool": "Signature Tool", - "connectionFailed": "Connection Failed", - "activeLimitersPlural": "Active Limiters Plural", - "doneDesc": "Done Desc", - "down": "Down", - "noDataYet": "No Data Yet", - "activeProviders": "Active Providers", - "nameInvalid": "Name Invalid", - "skip": "Skip", - "createChain": "Create Chain", - "audioSpeech": "Audio Speech", - "cacheCleared": "Cache Cleared", - "searchTypeNews": "Search Type News", - "durationMillisecondsShort": "Duration Milliseconds Short", - "addOpenAICompatible": "Add Open Ai Compatible", + "noFallbackChainsDesc": "Descrição de Sem Cadeias de Fallback", + "yesImport": "Sim, Importar", + "lockoutsAutoRefreshHint": "Dica de Atualização Automática de Bloqueios", + "tabApis": "Separador de APIs", + "sectionDescription": "Descrição da Secção", + "filter": "Filtrar", + "purgeLogsFailed": "Falha ao Limpar Registos", + "latency": "Latência", + "testAllOAuth": "Testar Todos os OAuth", + "mcpQuickStartStep3": "Passo 3 do Início Rápido MCP", + "repairEnvFailed": "Falha ao Reparar Ambiente", + "zedImportHint": "Dica de Importação do Zed", + "modelsAcrossEndpoints": "Modelos Entre Endpoints", + "autoDisableBannedAccounts": "Desativar Automaticamente Contas Banidas", + "securityDesc": "Descrição de Segurança", + "listModels": "Listar Modelos", + "backupRestore": "Restaurar Backup", + "target": "Alvo", + "zedImportSuccess": "Importação do Zed Bem-sucedida", + "lastHeaderUpdate": "Última Atualização de Cabeçalho", + "categoryCore": "Categoria Principal", + "noFallbackChains": "Sem Cadeias de Fallback", + "noSearchProviders": "Sem Fornecedores de Pesquisa", + "autoBalance": "Balanceamento Automático", + "noModelsYet": "Ainda Sem Modelos", + "signatureFamily": "Família de Assinatura", + "externalApiCalls": "Chamadas de API Externas", + "providerOverridesDesc": "Descrição das Substituições do Fornecedor", + "signatureTool": "Ferramenta de Assinatura", + "connectionFailed": "Falha na Ligação", + "activeLimitersPlural": "Limitadores Ativos", + "doneDesc": "Descrição de Concluído", + "down": "Em baixo", + "noDataYet": "Ainda Sem Dados", + "activeProviders": "Fornecedores Ativos", + "nameInvalid": "Nome Inválido", + "skip": "Ignorar", + "createChain": "Criar Cadeia", + "audioSpeech": "Fala (Áudio)", + "cacheCleared": "Cache Limpa", + "searchTypeNews": "Tipo de Pesquisa: Notícias", + "durationMillisecondsShort": "ms", + "addOpenAICompatible": "Adicionar Compatível com OpenAI", "chatTesterTab": "Chat Tester Tab", - "queued": "Queued", - "domainPlaceholder": "Domain Placeholder", - "durationMinutesShort": "Duration Minutes Short", - "verifyingConnection": "Verifying Connection", - "imageProviders": "Image Providers", - "protocolToolsLabel": "Protocol Tools Label", - "queryPlaceholder": "Query Placeholder", - "videoGeneration": "Video Generation", - "timeRangeWeek": "Time Range Week", - "limitExhausted": "Limit Exhausted", - "failedDisable": "Failed Disable", - "inMemoryNote": "In Memory Note", - "compatibleHint": "Compatible Hint", - "errorShort": "Error Short", - "advancedHint": "Advanced Hint", - "restoreFailed": "Restore Failed", - "searchProvidersHeading": "Search Providers Heading", - "comboName": "Combo Name", - "autoDisableDescription": "Auto Disable Description", - "embeddingsDesc": "Embeddings Desc", - "operational": "Operational", - "testAllApiKey": "Test All Api Key", - "backupCreated": "Backup Created", - "errorDuringImport": "Error During Import", - "comboDefaultsGuideHint2": "Combo Defaults Guide Hint2", - "connecting": "Connecting", - "fillModelAndProviders": "Fill Model And Providers", - "syncing": "Syncing", - "resetConfirm": "Reset Confirm", - "trackMetrics": "Track Metrics", - "successful": "Successful", - "recovering": "Recovering", - "autoDisableThreshold": "Auto Disable Threshold", + "queued": "Na fila", + "domainPlaceholder": "Espaço reservado de Domínio", + "durationMinutesShort": "min", + "verifyingConnection": "A Verificar Ligação", + "imageProviders": "Fornecedores de Imagem", + "protocolToolsLabel": "Ferramentas do Protocolo", + "queryPlaceholder": "Espaço reservado de Consulta", + "videoGeneration": "Geração de Vídeo", + "timeRangeWeek": "Intervalo de Tempo: Semana", + "limitExhausted": "Limite Esgotado", + "failedDisable": "Falha ao Desativar", + "inMemoryNote": "Nota em Memória", + "compatibleHint": "Dica de Compatibilidade", + "errorShort": "Erro", + "advancedHint": "Dica Avançada", + "restoreFailed": "Falha no Restauro", + "searchProvidersHeading": "Fornecedores de Pesquisa", + "comboName": "Nome do Combo", + "autoDisableDescription": "Descrição da Desativação Automática", + "embeddingsDesc": "Descrição de Embeddings", + "operational": "Operacional", + "testAllApiKey": "Testar Todas as Chaves de API", + "backupCreated": "Backup Criado", + "errorDuringImport": "Erro Durante a Importação", + "comboDefaultsGuideHint2": "Dica 2 do Guia de Predefinições de Combo", + "connecting": "A ligar", + "fillModelAndProviders": "Preencher Modelo e Fornecedores", + "syncing": "A sincronizar", + "resetConfirm": "Confirmar Reposição", + "trackMetrics": "Monitorizar Métricas", + "successful": "Bem-sucedido", + "recovering": "A recuperar", + "autoDisableThreshold": "Limiar de Desativação Automática", "anthropic": "Anthropic", - "syncingData": "Syncing Data", - "cloudBenefitPorts": "Cloud Benefit Ports", - "compatibleProviders": "Compatible Providers", + "syncingData": "A Sincronizar Dados", + "cloudBenefitPorts": "Portas de Benefício Cloud", + "compatibleProviders": "Fornecedores Compatíveis", "freeTierProviders": "Provedores de nível gratuito", "freeTierLabel": "Nível gratuito disponível", "freeTierProvidersDesc": "Provedores com níveis gratuitos – alguns exigem uma inscrição de chave de API, outros não precisam de nenhuma credencial.", - "clearCache": "Clear Cache", - "reqs": "Reqs", - "addAnthropicCompatible": "Add Anthropic Compatible", - "apiKeyProviders": "Api Key Providers", - "tabsAria": "Tabs Aria", - "resetting": "Resetting", - "millisecondsAbbr": "Milliseconds Abbr", - "backupReasonPreRestore": "Backup Reason Pre Restore", - "disableCloud": "Disable Cloud", - "newProviderNameAria": "New Provider Name Aria", - "passwordsMismatch": "Passwords Mismatch", - "a2aQuickStartStep3": "A2A Quick Start Step3", - "liveMonitorDescriptionSuffix": "Live Monitor Description Suffix", - "failedAddProvider": "Failed Add Provider", - "addAtLeastOneProvider": "Add At Least One Provider", - "reasonSeparator": "Reason Separator", - "zedImporting": "Zed Importing", - "confirmPasswordPlaceholder": "Confirm Password Placeholder", - "whatYouGet": "What You Get", - "signatureSession": "Signature Session", - "errorCountNoCode": "Error Count No Code", - "testing": "Testing", - "providersCommaSeparated": "Providers Comma Separated", - "exportDatabase": "Export Database", - "hitRate": "Hit Rate", - "completionsLegacy": "Completions Legacy", - "removeModel": "Remove Model", - "timeRangeDay": "Time Range Day", - "cloudRequestFailed": "Cloud Request Failed", - "updatedAt": "Updated At", - "monitoredProvidersHint": "Monitored Providers Hint", - "connectionSuccessful": "Connection Successful", - "latencyP50": "Latency P50", - "logsDeleted": "Logs Deleted", - "chatTester": "Chat Tester", - "safeSearchOff": "Safe Search Off", - "nameHint": "Name Hint", - "debugToggle": "Debug Toggle", + "clearCache": "Limpar Cache", + "reqs": "Pedidos", + "addAnthropicCompatible": "Adicionar Compatível com Anthropic", + "apiKeyProviders": "Fornecedores de Chave de API", + "tabsAria": "Separadores", + "resetting": "A repor", + "millisecondsAbbr": "ms", + "backupReasonPreRestore": "Motivo do Backup Pré-Restauro", + "disableCloud": "Desativar Cloud", + "newProviderNameAria": "Nome do Novo Fornecedor", + "passwordsMismatch": "As palavras-passe não coincidem", + "a2aQuickStartStep3": "Passo 3 do Início Rápido A2A", + "liveMonitorDescriptionSuffix": "Sufixo da Descrição do Monitor em Tempo Real", + "failedAddProvider": "Falha ao Adicionar Fornecedor", + "addAtLeastOneProvider": "Adiciona Pelo Menos Um Fornecedor", + "reasonSeparator": "Separador de Motivo", + "zedImporting": "A Importar do Zed", + "confirmPasswordPlaceholder": "Espaço reservado de Confirmação de Palavra-passe", + "whatYouGet": "O Que Recebes", + "signatureSession": "Sessão de Assinatura", + "errorCountNoCode": "Contagem de Erros Sem Código", + "testing": "A testar", + "providersCommaSeparated": "Fornecedores Separados por Vírgula", + "exportDatabase": "Exportar Base de Dados", + "hitRate": "Taxa de Acertos", + "completionsLegacy": "Completions Legadas", + "removeModel": "Remover Modelo", + "timeRangeDay": "Intervalo de Tempo: Dia", + "cloudRequestFailed": "Pedido à Cloud Falhou", + "updatedAt": "Atualizado em", + "monitoredProvidersHint": "Dica de Fornecedores Monitorizados", + "connectionSuccessful": "Ligação Bem-sucedida", + "latencyP50": "Latência P50", + "logsDeleted": "Registos Eliminados", + "chatTester": "Testador de Chat", + "safeSearchOff": "Pesquisa Segura Desligada", + "nameHint": "Dica de Nome", + "debugToggle": "Alternar Depuração", "embedding": "Embedding", - "issuesLabel": "Issues Label", - "optionAny": "Option Any", - "maxNestingDepth": "Max Nesting Depth", - "rerank": "Rerank", - "checking": "Checking", - "getStarted": "Get Started", - "restoreSuccess": "Restore Success", - "issuesDetected": "Issues Detected", - "signatureCache": "Signature Cache", - "modelLockouts": "Model Lockouts", - "usingCloudProxy": "Using Cloud Proxy", - "loadingHealth": "Loading Health", - "providerOverrides": "Provider Overrides", - "audioTranscriptionDesc": "Audio Transcription Desc", - "learnedFromHeaders": "Learned From Headers", - "totalRequests": "Total Requests", - "cloudUnstableNote": "Cloud Unstable Note", + "issuesLabel": "Problemas", + "optionAny": "Qualquer", + "maxNestingDepth": "Profundidade Máxima de Aninhamento", + "rerank": "Reordenar", + "checking": "A verificar", + "getStarted": "Começar", + "restoreSuccess": "Restauro Bem-sucedido", + "issuesDetected": "Problemas Detetados", + "signatureCache": "Assinatura de Cache", + "modelLockouts": "Bloqueios de Modelo", + "usingCloudProxy": "A Usar Proxy Cloud", + "loadingHealth": "A carregar Saúde", + "providerOverrides": "Substituições do Fornecedor", + "audioTranscriptionDesc": "Descrição da Transcrição de Áudio", + "learnedFromHeaders": "Aprendido dos Cabeçalhos", + "totalRequests": "Total de Pedidos", + "cloudUnstableNote": "Nota de Instabilidade Cloud", "gamificationAdmin": "Administrador de gamificação", "monitorAnomaliesAndHealth": "Monitore anomalias e a integridade do sistema", "flaggedAnomalies": "Anomalias sinalizadas", @@ -799,37 +799,37 @@ "batchPageLoadingMore": "Carregando mais…", "recommended": "Recomendado", "understand": "Compreendo", - "batchConceptTitle": "Batch processing", - "batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.", - "batchConceptHowItWorks": "How it works", - "batchConceptBenefit50pct": "50% discount on input + output tokens", - "batchConceptAsync24h": "Async with a 24h completion window", - "batchConceptUseCases": "Best for bulk classification, evaluations, and embeddings", - "filesConceptTitle": "Batch files", - "filesConceptSubtitle": "JSONL files used by batches: input requests, results, and errors.", - "filesConceptInput": "Input — your JSONL with one request per line", - "filesConceptOutput": "Output — results from completed requests", - "filesConceptError": "Errors — requests that failed", - "filesConceptRetention": "Retention: 30 days by default (29 days on Anthropic)", - "wizardTitle": "New batch", - "wizardClose": "Close", - "wizardNext": "Next", - "wizardBack": "Back", - "wizardCancel": "Cancel", - "wizardCreate": "Create batch", - "wizardCreating": "Creating…", - "wizardStep1Destination": "Destination", - "wizardStep2Input": "Input", - "wizardStep3Validate": "Validate", - "wizardStep4Cost": "Cost & create", - "wizardProviderLabel": "Provider", + "batchConceptTitle": "Processamento em lote", + "batchConceptSubtitle": "Processa milhares de pedidos de forma assíncrona a ~50% do custo (janela de 24h). Ideal para avaliações e classificações.", + "batchConceptHowItWorks": "Como funciona", + "batchConceptBenefit50pct": "50% de desconto em tokens de entrada + saída", + "batchConceptAsync24h": "Assíncrono com janela de conclusão de 24h", + "batchConceptUseCases": "Melhor para classificação em massa, avaliações e embeddings", + "filesConceptTitle": "Ficheiros de lote", + "filesConceptSubtitle": "Ficheiros JSONL usados pelos lotes: pedidos de entrada, resultados e erros.", + "filesConceptInput": "Entrada — o teu JSONL com um pedido por linha", + "filesConceptOutput": "Saída — resultados dos pedidos concluídos", + "filesConceptError": "Erros — pedidos que falharam", + "filesConceptRetention": "Retenção: 30 dias por padrão (29 dias na Anthropic)", + "wizardTitle": "Novo lote", + "wizardClose": "Fechar", + "wizardNext": "Seguinte", + "wizardBack": "Voltar", + "wizardCancel": "Cancelar", + "wizardCreate": "Criar lote", + "wizardCreating": "A criar…", + "wizardStep1Destination": "Destino", + "wizardStep2Input": "Entrada", + "wizardStep3Validate": "Validar", + "wizardStep4Cost": "Custo e criação", + "wizardProviderLabel": "Fornecedor", "wizardEndpointLabel": "Endpoint", - "wizardModelLabel": "Model", + "wizardModelLabel": "Modelo", "wizardInputKindJsonl": "JSONL", - "wizardInputKindCsv": "CSV (we'll convert)", - "wizardDropOrPick": "Drop a file or click to pick", - "wizardCsvMappingTitle": "Map CSV columns → request fields", - "wizardCsvMappingAddField": "Add field", + "wizardInputKindCsv": "CSV (nós convertemos)", + "wizardDropOrPick": "Larga um ficheiro ou clica para escolher", + "wizardCsvMappingTitle": "Mapear colunas CSV → campos do pedido", + "wizardCsvMappingAddField": "Adicionar campo", "wizardCsvNoColumns": "Nenhuma coluna detetada no cabeçalho do CSV.", "wizardCsvIgnoreColumn": "— ignorar —", "wizardCsvCustomIdMapped": "custom_id mapeado", @@ -837,8 +837,8 @@ "wizardCsvApplyMapping": "Aplicar mapeamento", "wizardCsvRowsParsed": "{count} linhas analisadas", "wizardCsvRowsSkipped": "{count} linhas ignoradas", - "wizardCsvRowError": "Row {row}: {reason}", - "wizardValidationOk": "All lines valid", + "wizardCsvRowError": "Linha {row}: {reason}", + "wizardValidationOk": "Todas as linhas válidas", "wizardValidating": "A validar…", "wizardValidationParseFailed": "A validação falhou — não foi possível analisar o conteúdo.", "wizardValidationSummary": "{lines} linhas · {ids} custom_ids únicos", @@ -846,105 +846,105 @@ "wizardValidationDuplicateIds": "custom_ids duplicados detetados:", "wizardValidationFirstErrors": "Erros (primeiros {count}):", "wizardValidationLine": "Linha {line}", - "wizardValidationErrors": "Validation errors", - "wizardValidationPreview": "Preview (first 5 requests)", - "wizardValidationSamplingNote": "File is large — validated by sampling (first 1000 + last 100 lines). Full validation runs server-side.", - "wizardCostSync": "Sync cost", - "wizardCostBatch": "Batch cost (-50%)", - "wizardCostSavings": "Savings", - "wizardCostEstimatedNotice": "Estimated cost — real billing may vary.", - "wizardErrorUpload": "Failed to upload file. Try again.", - "wizardErrorCreate": "Failed to create batch. Try again.", - "wizardEmptyProviders": "Connect a provider with batch support (OpenAI, Anthropic, or Gemini) to create a batch.", - "uploadModalTitle": "Upload batch file", - "uploadModalDropOrPick": "Drop a .jsonl file or click to pick", - "uploadModalUpload": "Upload", - "uploadModalCancel": "Cancel", - "uploadModalError": "Upload failed. Try again.", - "uploadModalSuccess": "Uploaded", - "uploadModalSizeLimit": "Max 512 MB", - "batchListNewButton": "New batch", - "batchListAutoRefresh": "Auto-refresh 30s", - "batchListCostColumn": "Cost", - "batchActionCancel": "Cancel", - "batchActionDownloadOutput": "Download output", - "batchActionDownloadErrors": "Download errors", - "batchActionRetry": "Retry failed", - "batchActionRetryConfirm": "Retry {n} failed request(s)? Final cost depends on actual tokens consumed.", - "expirationBadgeCritical": "Critical", - "expirationBadgeWarning": "Soon", - "expirationBadgeNormal": "Pending", - "expirationBadgeExpired": "Expired", - "filesListUploadButton": "Upload", - "filesListUsedByColumn": "Used by", - "filesListUsedByNone": "None", - "filesListUsedByRoleInput": "input", - "filesListUsedByRoleOutput": "output", - "filesListUsedByRoleError": "error", - "filesListSizeColumn": "Size", - "batchListProgressPartial": "(partial)", - "batchListProviderColumn": "Provider", + "wizardValidationErrors": "Erros de validação", + "wizardValidationPreview": "Pré-visualização (primeiros 5 pedidos)", + "wizardValidationSamplingNote": "O ficheiro é grande — validado por amostragem (primeiras 1000 + últimas 100 linhas). A validação completa corre no servidor.", + "wizardCostSync": "Custo síncrono", + "wizardCostBatch": "Custo do lote (-50%)", + "wizardCostSavings": "Poupança", + "wizardCostEstimatedNotice": "Custo estimado — a faturação real pode variar.", + "wizardErrorUpload": "Falha ao carregar o ficheiro. Tenta novamente.", + "wizardErrorCreate": "Falha ao criar o lote. Tenta novamente.", + "wizardEmptyProviders": "Liga um fornecedor com suporte a lote (OpenAI, Anthropic ou Gemini) para criar um lote.", + "uploadModalTitle": "Carregar ficheiro de lote", + "uploadModalDropOrPick": "Larga um ficheiro .jsonl ou clica para escolher", + "uploadModalUpload": "Carregar", + "uploadModalCancel": "Cancelar", + "uploadModalError": "Falha no carregamento. Tenta novamente.", + "uploadModalSuccess": "Carregado", + "uploadModalSizeLimit": "Máx. 512 MB", + "batchListNewButton": "Novo lote", + "batchListAutoRefresh": "Atualização automática 30s", + "batchListCostColumn": "Custo", + "batchActionCancel": "Cancelar", + "batchActionDownloadOutput": "Descarregar saída", + "batchActionDownloadErrors": "Descarregar erros", + "batchActionRetry": "Repetir falhados", + "batchActionRetryConfirm": "Repetir {n} pedido(s) falhado(s)? O custo final depende dos tokens efetivamente consumidos.", + "expirationBadgeCritical": "Crítico", + "expirationBadgeWarning": "Em breve", + "expirationBadgeNormal": "Pendente", + "expirationBadgeExpired": "Expirado", + "filesListUploadButton": "Carregar", + "filesListUsedByColumn": "Usado por", + "filesListUsedByNone": "Nenhum", + "filesListUsedByRoleInput": "entrada", + "filesListUsedByRoleOutput": "saída", + "filesListUsedByRoleError": "erro", + "filesListSizeColumn": "Tamanho", + "batchListProgressPartial": "(parcial)", + "batchListProviderColumn": "Fornecedor", "batchListProviderUnknown": "—", - "batchListProviderOther": "Other", - "batchListTitle": "Batches", - "batchListCount": "{count} batches", - "batchListRemovingCompleted": "Removing…", - "batchListRemoveCompleted": "Remove completed", - "batchListTableStatus": "Status", + "batchListProviderOther": "Outro", + "batchListTitle": "Lotes", + "batchListCount": "{count} lotes", + "batchListRemovingCompleted": "A remover…", + "batchListRemoveCompleted": "Remover concluídos", + "batchListTableStatus": "Estado", "batchListTableId": "ID", "batchListTableEndpoint": "Endpoint", - "batchListTableModel": "Model", - "batchListTableProgress": "Progress", - "batchListTableCreated": "Created", - "batchListTableExpires": "Expires", - "batchListLoading": "Loading…", - "batchListEmpty": "No batches found", - "batchListValidating": "Validating…", - "batchStatusAll": "All statuses", - "batchStatusInProgress": "In progress", - "batchStatusValidating": "Validating", - "batchStatusFinalizing": "Finalizing", - "batchStatusCompleted": "Completed", - "batchStatusFailed": "Failed", - "batchStatusCancelled": "Cancelled", - "batchStatusCancelling": "Cancelling", - "batchStatusExpired": "Expired", - "batchStatusCompletedWithFailures": "completed with failures", - "batchStatusInProgressWithFailures": "in progress (with failures)", - "batchStatusFinalizingWithFailures": "finalizing (with failures)", - "batchStatusCancelledWithFailures": "cancelled with failures", - "batchStatusExpiredWithFailures": "expired (partial)", - "wizardCostEstimating": "Estimating cost…", - "wizardCostRequests": "Requests", - "wizardCostInputTok": "input tok", - "wizardCostOutputTok": "output tok", - "wizardCostWindow": "Window", - "wizardDestinationSelectProvider": "Select a provider…", - "wizardDestinationSelectModel": "Select a model…", - "wizardDestinationConnectProvider": "Connect a provider", - "batchListBatchCreated": "Batch {id} created — refreshing list…", - "batchListBatchCreatedDismiss": "Dismiss", - "batchListRefreshing": "Refreshing…", - "batchListRefresh": "Refresh", - "uploadFileModalRemove": "Remove", - "uploadFileModalUploading": "Uploading…", - "wizardInputReading": "Reading file…", - "wizardInputReady": "Ready", - "wizardInputLargeFileLabel": "Large file — sampling validation", - "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.", - "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.", - "wizardCostWindow24h": "24h completion window", - "wizardValidationFieldsOk": "required fields valid", - "filesListDelete": "Delete", - "filesListDownload": "Download", - "batchDetailActionCancel": "Cancel batch", - "batchDetailActionRetry": "Retry failed requests", - "batchDetailCancelling": "Cancelling…", - "batchDetailRetrying": "Preparing retry…", - "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", - "batchActionCancelError": "Failed to cancel batch. Try again.", - "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)", + "batchListTableModel": "Modelo", + "batchListTableProgress": "Progresso", + "batchListTableCreated": "Criado", + "batchListTableExpires": "Expira", + "batchListLoading": "A carregar…", + "batchListEmpty": "Nenhum lote encontrado", + "batchListValidating": "A validar…", + "batchStatusAll": "Todos os estados", + "batchStatusInProgress": "Em curso", + "batchStatusValidating": "A validar", + "batchStatusFinalizing": "A finalizar", + "batchStatusCompleted": "Concluído", + "batchStatusFailed": "Falhou", + "batchStatusCancelled": "Cancelado", + "batchStatusCancelling": "A cancelar", + "batchStatusExpired": "Expirado", + "batchStatusCompletedWithFailures": "concluído com falhas", + "batchStatusInProgressWithFailures": "em curso (com falhas)", + "batchStatusFinalizingWithFailures": "a finalizar (com falhas)", + "batchStatusCancelledWithFailures": "cancelado com falhas", + "batchStatusExpiredWithFailures": "expirado (parcial)", + "wizardCostEstimating": "A estimar custo…", + "wizardCostRequests": "Pedidos", + "wizardCostInputTok": "tok de entrada", + "wizardCostOutputTok": "tok de saída", + "wizardCostWindow": "Janela", + "wizardDestinationSelectProvider": "Selecionar um fornecedor…", + "wizardDestinationSelectModel": "Selecionar um modelo…", + "wizardDestinationConnectProvider": "Ligar um fornecedor", + "batchListBatchCreated": "Lote {id} criado — a atualizar lista…", + "batchListBatchCreatedDismiss": "Dispensar", + "batchListRefreshing": "A atualizar…", + "batchListRefresh": "Atualizar", + "uploadFileModalRemove": "Remover", + "uploadFileModalUploading": "A carregar…", + "wizardInputReading": "A ler ficheiro…", + "wizardInputReady": "Pronto", + "wizardInputLargeFileLabel": "Ficheiro grande — validação por amostragem", + "wizardInputCsvJsonlReady": "JSONL gerado — pronto a validar.", + "wizardInputLargeFileWarning": "Ficheiro grande detetado — a validação corre por amostragem (primeiros 5 MB + últimos 100 KB). A validação completa corre no servidor.", + "wizardCostWindow24h": "Janela de conclusão de 24h", + "wizardValidationFieldsOk": "campos obrigatórios válidos", + "filesListDelete": "Eliminar", + "filesListDownload": "Descarregar", + "batchDetailActionCancel": "Cancelar lote", + "batchDetailActionRetry": "Repetir pedidos falhados", + "batchDetailCancelling": "A cancelar…", + "batchDetailRetrying": "A preparar repetição…", + "batchDetailCancelConfirm": "Cancelar este lote? Os pedidos em curso irão parar.", + "batchActionCancelError": "Falha ao cancelar o lote. Tenta novamente.", + "batchActionRetryError": "Falha ao repetir pedidos falhados. Tenta novamente.", + "batchConceptRetentionNote": "Os resultados e ficheiros de erro são retidos durante 30 dias (Anthropic: 29 dias)", "batchFilesSizeColumn": "Tamanho", "toggleNoAuthProvider": "Alternar fornecedor sem autenticação", "loadingModels": "A Carregar modelos…", @@ -979,7 +979,7 @@ "disabled": "Desativado", "featureFlagOmnirouteEmergencyFallbackDescription": "Encaminhar pedidos com orçamento esgotado para o fornecedor/modelo de contingência gratuito de emergência.", "featureFlagArenaEloSyncEnabledDescription": "Ativar a sincronização periódica do ELO da tabela de classificação da Arena AI para classificações de inteligência do modelo.", - "featureFlagExposeCcDiscoveryAliasesDescription": "Anuncie os ids de espelho claude/<provider>/<model> em /v1/models para que a lista de descoberta de modelos do gateway Claude Code inclua modelos não Claude. Aviso: duplica as entradas do catálogo para todos os clientes quando ativado globalmente.", + "featureFlagExposeCcDiscoveryAliasesDescription": "__MISSING__:Advertise claude/<provider>/<model> mirror ids on /v1/models so Claude Code gateway model discovery lists non-Claude models. Warning: doubles catalog entries for all clients when enabled globally.", "sidebar": { "home": "Página inicial", "dashboard": "Painel", @@ -996,7 +996,7 @@ "settings": "Configurações", "translator": "Tradutor", "playground": "Playground", - "searchTools": "Search Tools", + "searchTools": "Ferramentas de Pesquisa", "agents": "Agentes", "cloudAgents": "Agentes de nuvem", "memory": "Memória", @@ -1028,21 +1028,21 @@ "debug": "Depurar", "system": "Sistema", "help": "Ajuda", - "primarySection": "Main", + "primarySection": "Principal", "cliSection": "CLI", - "debugSection": "Debug", - "systemSection": "System", - "helpSection": "Help", + "debugSection": "Depuração", + "systemSection": "Sistema", + "helpSection": "Ajuda", "serverDisconnected": "Servidor desconectado", "serverDisconnectedMsg": "O servidor proxy foi interrompido ou está reiniciando.", "expandSidebar": "Expandir barra lateral", "collapseSidebar": "Recolher barra lateral", - "themes": "Themes", - "presetColors": "Popular colors", - "createTheme": "Create theme", - "chooseColor": "Pick one color", + "themes": "Temas", + "presetColors": "Cores populares", + "createTheme": "Criar tema", + "chooseColor": "Escolhe uma cor", "themeCoral": "Coral", - "themeBlue": "Blue", + "themeBlue": "Azul", "themeRed": "Vermelho", "themeGreen": "Verde", "themeViolet": "Violeta", @@ -1051,53 +1051,53 @@ "cliToolsShort": "Ferramentas", "cache": "Cache", "cacheShort": "Cache", - "batch": "Batch Jobs", - "themeSystem": "Theme System", - "whitelabelingDesc": "Whitelabeling Desc", - "switchThemes": "Switch Themes", - "themeAccentDesc": "Theme Accent Desc", - "uploadFavicon": "Upload Favicon", - "themeDark": "Theme Dark", - "customLogoDesc": "Custom Logo Desc", - "sidebarVisibilityToggle": "Sidebar Visibility Toggle", - "themeAccent": "Theme Accent", - "resetFavicon": "Reset Favicon", - "whitelabeling": "Whitelabeling", - "darkMode": "Dark Mode", - "uploadLogo": "Upload Logo", - "themeLight": "Theme Light", - "appName": "App Name", - "appNameDesc": "App Name Desc", - "resetLogo": "Reset Logo", - "customFavicon": "Custom Favicon", - "hideHealthLogs": "Hide Health Logs", - "customLogo": "Custom Logo", - "appearance": "Appearance", - "themeSelectionAria": "Theme Selection Aria", - "themeCreate": "Theme Create", - "customFaviconDesc": "Custom Favicon Desc", - "logoPreview": "Logo Preview", - "themeCustom": "Theme Custom", - "hideHealthLogsDesc": "Hide Health Logs Desc", - "faviconPreview": "Favicon Preview", - "changelog": "Changelog", - "contextSection": "Context & Cache", + "batch": "Trabalhos em Lote", + "themeSystem": "Tema do Sistema", + "whitelabelingDesc": "Descrição de Marca Própria", + "switchThemes": "Alternar Temas", + "themeAccentDesc": "Descrição do Acento do Tema", + "uploadFavicon": "Carregar Favicon", + "themeDark": "Tema Escuro", + "customLogoDesc": "Descrição do Logo Personalizado", + "sidebarVisibilityToggle": "Alternância de Visibilidade da Barra Lateral", + "themeAccent": "Acento do Tema", + "resetFavicon": "Repor Favicon", + "whitelabeling": "Marca Própria", + "darkMode": "Modo Escuro", + "uploadLogo": "Carregar Logo", + "themeLight": "Tema Claro", + "appName": "Nome da Aplicação", + "appNameDesc": "Descrição do Nome da Aplicação", + "resetLogo": "Repor Logo", + "customFavicon": "Favicon Personalizado", + "hideHealthLogs": "Ocultar Registos de Saúde", + "customLogo": "Logo Personalizado", + "appearance": "Aparência", + "themeSelectionAria": "Seleção de Tema", + "themeCreate": "Criar Tema", + "customFaviconDesc": "Descrição do Favicon Personalizado", + "logoPreview": "Pré-visualização do Logo", + "themeCustom": "Tema Personalizado", + "hideHealthLogsDesc": "Descrição de Ocultar Registos de Saúde", + "faviconPreview": "Pré-visualização do Favicon", + "changelog": "Registo de Alterações", + "contextSection": "Contexto e Cache", "contextCaveman": "Caveman", "contextRtk": "RTK", "contextCombos": "Combos de Engines", "contextLite": "Lite", - "contextAggressive": "Aggressive", + "contextAggressive": "Agressivo", "contextUltra": "Ultra", "contextOmniglyph": "OmniGlyph", - "contextSettings": "Compression Settings", + "contextSettings": "Definições de Compressão", "contextHeadroom": "Headroom", - "contextSessionDedup": "Session Dedup", + "contextSessionDedup": "Deduplicação de Sessão", "contextCcr": "CCR", "contextLlmlingua": "LLMLingua", "combosLive": "Combo Studio", "combosLiveSubtitle": "Cascata de encaminhamento em tempo real", "compressionStudio": "Compression Studio", - "compressionExclusions": "Exclusões", + "compressionExclusions": "__MISSING__:Exclusions", "contextSettingsSubtitle": "Predefinições globais", "contextHeadroomSubtitle": "Compactação tabular", "contextSessionDedupSubtitle": "Desduplicação entre turnos", @@ -1108,75 +1108,75 @@ "contextUltraSubtitle": "Poda heurística", "contextOmniglyphSubtitle": "Contexto como imagens", "compressionStudioSubtitle": "Cascata de motores em tempo real", - "compressionExclusionsSubtitle": "Desvio por modelo/ponto final", + "compressionExclusionsSubtitle": "__MISSING__:Per-model/endpoint bypass", "chaosConfigSubtitle": "Execução paralela multi-modelo", - "routingSection": "Routing", - "protocolsSection": "Protocols", - "agentsAiSection": "Agents & AI", - "cacheContextSection": "Cache & Context", - "analyticsSection": "Analytics", + "routingSection": "Encaminhamento", + "protocolsSection": "Protocolos", + "agentsAiSection": "Agentes e IA", + "cacheContextSection": "Cache e Contexto", + "analyticsSection": "Analítica", "costsSection": "Custos", - "monitoringSection": "Monitoring", - "auditSecuritySection": "Audit & Security", - "devtoolsSection": "Dev Tools", - "configurationSection": "Configuration", - "aiFeaturesSection": "AI Features", + "monitoringSection": "Monitorização", + "auditSecuritySection": "Auditoria e Segurança", + "devtoolsSection": "Ferramentas de Programador", + "configurationSection": "Configuração", + "aiFeaturesSection": "Funcionalidades de IA", "mcp": "MCP", "a2a": "A2A", "plugins": "Plugins", - "apiEndpoints": "API Endpoints", - "batchFiles": "Files", - "analyticsEvals": "Evals", - "analyticsSearch": "Search", - "analyticsUtilization": "Utilization", - "analyticsComboHealth": "Combo Health", - "analyticsCompression": "Compression", - "costsBudget": "Budget", + "apiEndpoints": "Endpoints de API", + "batchFiles": "Ficheiros", + "analyticsEvals": "Avaliações", + "analyticsSearch": "Pesquisa", + "analyticsUtilization": "Utilização", + "analyticsComboHealth": "Saúde dos Combos", + "analyticsCompression": "Compressão", + "costsBudget": "Orçamento", "costsFreeTiers": "Orçamento do Escalão Gratuito", "costsFreeTiersSubtitle": "Atribuições mensais de tokens gratuitos", "freeProviderRankings": "Classificações de Fornecedores Gratuitos", "freeProviderRankingsSubtitle": "Melhores fornecedores gratuitos classificados pelas pontuações ELO do modelo", "radar": "Catálogo Radar", "radarSubtitle": "Catálogo de modelos gratuito enriquecido pela comunidade", - "costsQuotaShare": "Quota Sharing", - "costsPricing": "Pricing", - "logsProxy": "Proxy Logs", - "logsConsole": "Console", - "logsActivity": "Activity", - "auditMcp": "MCP Audit", + "costsQuotaShare": "Partilha de Quota", + "costsPricing": "Preços", + "logsProxy": "Registos de Proxy", + "logsConsole": "Consola", + "logsActivity": "Atividade", + "auditMcp": "Auditoria MCP", "auditA2a": "Auditoria A2A", "settingsGeneral": "General", - "settingsAppearance": "Appearance", - "settingsAi": "AI Settings", - "settingsSecurity": "Security", + "settingsAppearance": "Aparência", + "settingsAi": "Definições de IA", + "settingsSecurity": "Segurança", "settingsAccessTokens": "Tokens de Acesso", "settingsFeatureFlags": "Sinalizadores de recursos", - "settingsCache": "Cache", - "settingsAuthz": "Authz", - "settingsRouting": "Routing", - "settingsResilience": "Resilience", + "settingsCache": "__MISSING__:Cache", + "settingsAuthz": "Autorização", + "settingsRouting": "Encaminhamento", + "settingsResilience": "Resiliência", "modelLockout": "Bloqueio de Modelo", - "settingsAdvanced": "Advanced", + "settingsAdvanced": "Avançado", "omniProxySection": "OmniProxy", - "quotaTracker": "Provider Quota", - "providerQuota": "Provider Quota", + "quotaTracker": "Quota de Fornecedor", + "providerQuota": "Quota de Fornecedor", "runtime": "Runtime", - "consoleLogs": "Console Logs", - "logsTimeline": "Timeline", - "logsTimelineSubtitle": "Linha do tempo de pedidos visuais", - "globalRouting": "Global Routing", - "mitmProxy": "MITM Proxy", + "consoleLogs": "Registos da Consola", + "logsTimeline": "Linha do Tempo", + "logsTimelineSubtitle": "__MISSING__:Visual request timeline", + "globalRouting": "Encaminhamento Global", + "mitmProxy": "Proxy MITM", "oneProxy": "1Proxy", - "agenticFeaturesSection": "Agentic Features", - "otherFeaturesSection": "Other Features", - "compressionContextGroup": "Compression Context", - "gamificationGroup": "Gamification", - "toolsGroup": "Tools", - "integrationsGroup": "Integrations", + "agenticFeaturesSection": "Funcionalidades Agênticas", + "otherFeaturesSection": "Outras Funcionalidades", + "compressionContextGroup": "Contexto de Compressão", + "gamificationGroup": "Gamificação", + "toolsGroup": "Ferramentas", + "integrationsGroup": "Integrações", "proxyGroup": "Proxy", - "costsParametersGroup": "Costs Parameters", - "auditGroup": "Audit", - "batchGroup": "Batch", + "costsParametersGroup": "Parâmetros de Custos", + "auditGroup": "Auditoria", + "batchGroup": "Lote", "homeSubtitle": "Visão geral do painel", "providersSubtitle": "Gerenciar provedores de IA", "quotaTrackerSubtitle": "Acompanhar limites de uso", @@ -1190,12 +1190,12 @@ "proxySubtitle": "Configurações do proxy HTTP", "mitmProxySubtitle": "Interceptação MITM", "oneProxySubtitle": "Gateway proxy público", - "leaderboard": "Leaderboard", - "profile": "Profile", + "leaderboard": "Tabela de Classificação", + "profile": "Perfil", "tokens": "Tokens", - "leaderboardSubtitle": "Rankings and achievements", - "profileSubtitle": "Account and preferences", - "tokensSubtitle": "Token usage and budgets", + "leaderboardSubtitle": "Classificações e conquistas", + "profileSubtitle": "Conta e preferências", + "tokensSubtitle": "Uso de tokens e orçamentos", "usageSubtitle": "Estatísticas de tráfego e uso", "analyticsComboHealthSubtitle": "Confiabilidade dos targets do combo", "analyticsUtilizationSubtitle": "Utilização de provedores", @@ -1238,9 +1238,9 @@ "settingsSecuritySubtitle": "Auth e criptografia", "settingsAccessTokensSubtitle": "Tokens de CLI com âmbito para modo remoto", "settingsFeatureFlagsSubtitle": "Alternar recursos do sistema", - "settingsCacheSubtitle": "Catálogo de Modelos e Cache de Respostas", - "settingsSidebar": "Sidebar", - "settingsSidebarSubtitle": "Customize sidebar layout", + "settingsCacheSubtitle": "__MISSING__:Model catalog and response caching", + "settingsSidebar": "Barra Lateral", + "settingsSidebarSubtitle": "Personaliza o layout da barra lateral", "settingsAuthzSubtitle": "Inventário de rotas e política de desvio", "docsSubtitle": "Documentação", "issuesSubtitle": "Reportar um bug", @@ -1320,7 +1320,7 @@ "refresh": "Atualizar", "loading": "Carregando webhooks...", "never": "Nunca", - "failureCount": "{count, plural, =0 {no failures} one {# failure} other {# failures}}", + "failureCount": "{count, plural, =0 {sem falhas} one {# falha} other {# falhas}}", "testWebhook": "Enviar teste", "testSuccess": "Webhook de teste enviado com sucesso.", "testFailed": "O teste do webhook falhou.", @@ -1398,7 +1398,7 @@ }, "custom": { "endpointUrl": "URL do Endpoint", - "endpointUrlPlaceholder": "https://api.yourdomain.com/webhook", + "endpointUrlPlaceholder": "https://api.oteudominio.com/webhook", "secretKey": "Chave Secreta", "secretKeyPlaceholder": "Introduza a chave secreta ou deixe em branco para gerar automaticamente", "secretKeyHint": "Utilizado para assinar o cabeçalho do payload para autenticação." @@ -1495,42 +1495,114 @@ "actor": "Ator", "actorPlaceholder": "Filtrar por ator", "eventTypes": { - "apiKey.activate": "Chave de API Ativada", - "apiKey.ban": "Chave de API Banida", - "apiKey.deactivate": "Chave de API Desativada", - "apiKey.regenerate": "Chave de API Regenerada", - "apiKey.scopes.grant": "Âmbitos da Chave de API Concedidos", - "apiKey.scopes.revoke": "Âmbitos da Chave de API Revogados", - "apiKey.scopes.update": "Âmbitos da Chave de API Atualizados", - "apiKey.unban": "Chave de API Desbanida", - "auth.login.error": "Erro de Início de Sessão", - "auth.login.failed": "Falha no Início de Sessão", - "auth.login.locked": "Início de Sessão Bloqueado", - "auth.login.misconfigured": "Início de Sessão Mal Configurado", - "auth.login.setup_required": "Configuração de Início de Sessão Necessária", - "auth.login.success": "Início de Sessão com Sucesso", - "auth.logout.success": "Fim de Sessão com Sucesso", - "compliance.cleanup": "Limpeza de Conformidade", - "provider.credentials.applied": "Credenciais do Fornecedor Aplicadas", - "provider.credentials.batch_revoked": "Credenciais do Fornecedor Revogadas em Lote", - "provider.credentials.bulk_created": "Credenciais do Fornecedor Criadas em Massa", - "provider.credentials.bulk_imported": "Credenciais do Fornecedor Importadas em Massa", - "provider.credentials.created": "Credenciais do Fornecedor Criadas", - "provider.credentials.imported": "Credenciais do Fornecedor Importadas", - "provider.credentials.revoked": "Credenciais do Provedor Revogadas", - "provider.credentials.updated": "Credenciais do Provedor Atualizadas", - "provider.validation.ssrf_blocked": "SSRF do Provedor Bloqueado", - "quota.plan.updated": "Plano de Quotas Atualizado", - "quota.pool.created": "Pool de Quotas Criado", - "quota.pool.deleted": "Pool de Quotas Eliminado", - "quota.pool.updated": "Pool de Quotas Atualizado", - "quota.store.driver_changed": "Driver do Armazenamento de Quotas Alterado", - "server.start": "Arranque do Servidor", - "service.reveal_api_key": "Chave de API do Serviço Revelada", - "settings.update": "Definições Atualizadas", - "settings.update_failed": "Falha ao Atualizar Definições", - "sync.token.created": "Token de Sincronização Criado", - "sync.token.revoked": "Token de Sincronização Revogado" + "apiKey.activate": "API Key Activated", + "apiKey.ban": "API Key Banned", + "apiKey.deactivate": "API Key Deactivated", + "apiKey.regenerate": "API Key Regenerated", + "apiKey.scopes.grant": "API Key Scopes Granted", + "apiKey.scopes.revoke": "API Key Scopes Revoked", + "apiKey.scopes.update": "API Key Scopes Updated", + "apiKey.unban": "API Key Unbanned", + "auth.login.error": "Login Error", + "auth.login.failed": "Login Failed", + "auth.login.locked": "Login Locked", + "auth.login.misconfigured": "Login Misconfigured", + "auth.login.setup_required": "Login Setup Required", + "auth.login.success": "Login Success", + "auth.logout.success": "Logout Success", + "compliance.cleanup": "Compliance Cleanup", + "provider.credentials.applied": "Provider Credentials Applied", + "provider.credentials.batch_revoked": "Provider Credentials Batch Revoked", + "provider.credentials.bulk_created": "Provider Credentials Bulk Created", + "provider.credentials.bulk_imported": "Provider Credentials Bulk Imported", + "provider.credentials.created": "Provider Credentials Created", + "provider.credentials.imported": "Provider Credentials Imported", + "provider.credentials.revoked": "Provider Credentials Revoked", + "provider.credentials.updated": "Provider Credentials Updated", + "provider.validation.ssrf_blocked": "Provider SSRF Blocked", + "quota.plan.updated": "Quota Plan Updated", + "quota.pool.created": "Quota Pool Created", + "quota.pool.deleted": "Quota Pool Deleted", + "quota.pool.updated": "Quota Pool Updated", + "quota.store.driver_changed": "Quota Store Driver Changed", + "server.start": "Server Start", + "service.reveal_api_key": "Service API Key Revealed", + "settings.update": "Settings Updated", + "settings.update_failed": "Settings Update Failed", + "sync.token.created": "Sync Token Created", + "sync.token.revoked": "Sync Token Revoked", + "apiKey": { + "activate": "Chave de API Ativada", + "ban": "Chave de API Banida", + "deactivate": "Chave de API Desativada", + "regenerate": "Chave de API Regenerada", + "scopes": { + "grant": "Âmbitos da Chave de API Concedidos", + "revoke": "Âmbitos da Chave de API Revogados", + "update": "Âmbitos da Chave de API Atualizados" + }, + "unban": "Chave de API Desbanida" + }, + "auth": { + "login": { + "error": "Erro de Início de Sessão", + "failed": "Falha no Início de Sessão", + "locked": "Início de Sessão Bloqueado", + "misconfigured": "Início de Sessão Mal Configurado", + "setup_required": "Configuração de Início de Sessão Necessária", + "success": "Início de Sessão com Sucesso" + }, + "logout": { + "success": "Fim de Sessão com Sucesso" + } + }, + "compliance": { + "cleanup": "Limpeza de Conformidade" + }, + "provider": { + "credentials": { + "applied": "Credenciais do Fornecedor Aplicadas", + "batch_revoked": "Credenciais do Fornecedor Revogadas em Lote", + "bulk_created": "Credenciais do Fornecedor Criadas em Massa", + "bulk_imported": "Credenciais do Fornecedor Importadas em Massa", + "created": "Credenciais do Fornecedor Criadas", + "imported": "Credenciais do Fornecedor Importadas", + "revoked": "Credenciais do Provedor Revogadas", + "updated": "Credenciais do Provedor Atualizadas" + }, + "validation": { + "ssrf_blocked": "SSRF do Provedor Bloqueado" + } + }, + "quota": { + "plan": { + "updated": "Plano de Quotas Atualizado" + }, + "pool": { + "created": "Pool de Quotas Criado", + "deleted": "Pool de Quotas Eliminado", + "updated": "Pool de Quotas Atualizado" + }, + "store": { + "driver_changed": "Driver do Armazenamento de Quotas Alterado" + } + }, + "server": { + "start": "Arranque do Servidor" + }, + "service": { + "reveal_api_key": "Chave de API do Serviço Revelada" + }, + "settings": { + "update": "Definições Atualizadas", + "update_failed": "Falha ao Atualizar Definições" + }, + "sync": { + "token": { + "created": "Token de Sincronização Criado", + "revoked": "Token de Sincronização Revogado" + } + } }, "mcpMetricCalls24h": "Chamadas (24h)", "mcpMetricSuccessRate": "Taxa de sucesso", @@ -1538,12 +1610,12 @@ "mcpMetricTopTool": "Ferramenta principal" }, "themesPage": { - "title": "Themes", + "title": "Temas", "description": "Escolha um tema predefinido ou crie o seu próprio com uma única cor", - "presetColors": "Popular colors", + "presetColors": "Cores populares", "customTheme": "Tema personalizado", "customThemeDesc": "Clique em criar tema e escolha uma cor", - "createTheme": "Create theme", + "createTheme": "Criar tema", "activePreset": "Tema ativo" }, "header": { @@ -1569,60 +1641,60 @@ "endpoint": "Endpoints", "endpointDescription": "Gerenciar endpoints proxy, MCP, A2A e endpoints de API", "mcp": "MCP", - "mcpDescription": "Model Context Protocol server management and tools", + "mcpDescription": "Gestão do servidor Model Context Protocol e ferramentas", "a2a": "A2A", - "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "a2aDescription": "Tarefas do protocolo Agente-para-Agente e observabilidade", "settings": "Configurações", "settingsDescription": "Gerencie suas preferências", "openaiCompatible": "Compatível com OpenAI", "anthropicCompatible": "Compatível Antrópico", - "media": "Media", - "mediaDescription": "Generate images, videos, and music", - "themes": "Themes", - "themesDescription": "Choose a color theme for the whole dashboard panel", - "costsDescription": "Track spending, analyze trends, and manage your AI budget across all providers", - "cacheDescription": "Monitor provider prompt cache efficiency and local semantic response reuse.", - "limitsDescription": "Configure rate limits and quotas per API key and provider", - "runtimeDescription": "Live runtime observability — circuit breakers, cooldowns, model lockouts, sessions and quota alerts", - "apiManagerDescription": "Manage API keys and access control for your OmniRoute instance", - "batchDescription": "Process large volumes of requests asynchronously with batched API calls", - "contextCavemanDescription": "Rule-based message compression, language packs, analytics and output mode controls.", - "contextRtkDescription": "Command-aware compression for tool output, terminal logs and build results.", - "contextCombosDescription": "Define how engines are combined for different routing scenarios.", - "changelogDescription": "Stay up to date with the latest platform features and announcements.", - "agentsDescription": "Manage and configure AI agent tools: Codex, Devin, Jules, and custom agents", - "cloudAgentsDescription": "Orchestrate cloud-based AI agents with live task tracking and plan approval", - "memoryDescription": "Persistent conversational memory with semantic search and FTS5 full-text indexing", - "skillsDescription": "Install and manage sandbox skills for automated prompt and tool execution", - "agentSkillsDescription": "Agent-ready skills catalog with one-click URL copy for AI client integration", - "translatorDescription": "Translate and test prompts across API formats: OpenAI ↔ Claude ↔ Gemini", - "playgroundDescription": "Test prompts interactively with live provider responses and format inspection", - "searchToolsDescription": "Search analytics, provider breakdown, cache hit rates, and cost tracking", - "logsDescription": "Real-time request logs, error traces, and streaming event inspector", - "auditDescription": "Compliance audit trail of API key usage, MCP tool calls, and policy events", - "webhooksDescription": "Configure webhook endpoints to receive real-time event notifications", - "healthDescription": "System health overview: providers, circuit breakers, rate limits, and database", - "proxyDescription": "Configure upstream proxy settings for outbound provider connections", - "apiEndpointsDescription": "Manage custom API endpoint configurations and routing overrides", - "batchFilesDescription": "Browse and manage batch job output files and results", - "analyticsEvalsDescription": "Model evaluation results and performance benchmarks", - "analyticsSearchDescription": "Search query analytics, cache hit rates, and cost tracking", - "analyticsUtilizationDescription": "Provider utilization metrics and capacity planning", - "analyticsComboHealthDescription": "Real-time health and performance of combo routing configurations", - "analyticsCompressionDescription": "Context compression analytics and token savings", - "costsBudgetDescription": "Budget limits and spending alerts per API key and provider", - "costsPricingDescription": "Custom pricing configuration for token cost calculations", - "logsProxyDescription": "Upstream proxy request logs and traffic inspection", - "logsConsoleDescription": "Application console output and debug logs", - "logsActivityDescription": "Audit trail of user actions and system events", - "auditMcpDescription": "MCP tool invocation audit trail and compliance records", + "media": "Multimédia", + "mediaDescription": "Gera imagens, vídeos e música", + "themes": "Temas", + "themesDescription": "Escolhe um tema de cor para todo o painel", + "costsDescription": "Acompanha gastos, analisa tendências e gere o teu orçamento de IA em todos os fornecedores", + "cacheDescription": "Monitoriza a eficiência da cache de prompt do fornecedor e a reutilização local de respostas semânticas.", + "limitsDescription": "Configura limites de taxa e quotas por chave de API e fornecedor", + "runtimeDescription": "Observabilidade de runtime ao vivo — disjuntores, arrefecimentos, bloqueios de modelo, sessões e alertas de quota", + "apiManagerDescription": "Gere chaves de API e controlo de acesso para a tua instância OmniRoute", + "batchDescription": "Processa grandes volumes de pedidos de forma assíncrona com chamadas de API em lote", + "contextCavemanDescription": "Compressão de mensagens baseada em regras, pacotes de idioma, analítica e controlos de modo de saída.", + "contextRtkDescription": "Compressão sensível a comandos para saída de ferramentas, registos de terminal e resultados de build.", + "contextCombosDescription": "Define como os motores são combinados para diferentes cenários de encaminhamento.", + "changelogDescription": "Mantém-te a par das últimas funcionalidades e anúncios da plataforma.", + "agentsDescription": "Gere e configura ferramentas de agentes de IA: Codex, Devin, Jules e agentes personalizados", + "cloudAgentsDescription": "Orquestra agentes de IA na cloud com acompanhamento de tarefas ao vivo e aprovação de planos", + "memoryDescription": "Memória conversacional persistente com pesquisa semântica e indexação de texto completo FTS5", + "skillsDescription": "Instala e gere competências sandbox para execução automatizada de prompts e ferramentas", + "agentSkillsDescription": "Catálogo de competências prontas a usar com cópia de URL em um clique para integração em clientes de IA", + "translatorDescription": "Traduz e testa prompts entre formatos de API: OpenAI ↔ Claude ↔ Gemini", + "playgroundDescription": "Testa prompts interativamente com respostas ao vivo de fornecedores e inspeção de formato", + "searchToolsDescription": "Analítica de pesquisa, repartição por fornecedor, taxas de acerto de cache e acompanhamento de custo", + "logsDescription": "Registos de pedidos em tempo real, rastreios de erros e inspetor de eventos de streaming", + "auditDescription": "Registo de auditoria de conformidade do uso de chaves de API, chamadas de ferramentas MCP e eventos de política", + "webhooksDescription": "Configura endpoints de webhook para receber notificações de eventos em tempo real", + "healthDescription": "Visão geral da saúde do sistema: fornecedores, disjuntores, limites de taxa e base de dados", + "proxyDescription": "Configura definições de proxy upstream para ligações de saída a fornecedores", + "apiEndpointsDescription": "Gere configurações personalizadas de endpoints de API e substituições de encaminhamento", + "batchFilesDescription": "Explora e gere ficheiros de saída e resultados de trabalhos em lote", + "analyticsEvalsDescription": "Resultados de avaliação de modelos e benchmarks de desempenho", + "analyticsSearchDescription": "Analítica de consultas de pesquisa, taxas de acerto de cache e acompanhamento de custo", + "analyticsUtilizationDescription": "Métricas de utilização de fornecedores e planeamento de capacidade", + "analyticsComboHealthDescription": "Saúde e desempenho em tempo real das configurações de encaminhamento de combos", + "analyticsCompressionDescription": "Analítica de compressão de contexto e poupança de tokens", + "costsBudgetDescription": "Limites de orçamento e alertas de gastos por chave de API e fornecedor", + "costsPricingDescription": "Configuração de preços personalizada para cálculos de custo de tokens", + "logsProxyDescription": "Registos de pedidos de proxy upstream e inspeção de tráfego", + "logsConsoleDescription": "Saída da consola da aplicação e registos de depuração", + "logsActivityDescription": "Registo de auditoria de ações do utilizador e eventos do sistema", + "auditMcpDescription": "Registo de auditoria de invocação de ferramentas MCP e registos de conformidade", "auditA2a": "Auditoria A2A", "auditA2aDescription": "Trilha de auditoria de execução de tarefas A2A, transições de estado e registros de invocação de habilidades", "settingsGeneralDescription": "Storage, database, and general instance configuration", - "settingsAppearanceDescription": "Theme, branding, and visual customization", - "settingsAiDescription": "AI behaviors, thinking budgets, vision, and memory settings", - "settingsCacheDescription": "TTL para entradas de cache do catálogo de modelos", - "settingsSecurityDescription": "Authentication, authorization, and access control settings", + "settingsAppearanceDescription": "Tema, marca e personalização visual", + "settingsAiDescription": "Comportamentos de IA, orçamentos de thinking, visão e definições de memória", + "settingsCacheDescription": "__MISSING__:TTL for model catalog cache entries", + "settingsSecurityDescription": "Definições de autenticação, autorização e controlo de acesso", "featureFlags": "Sinalizadores de recursos", "featureFlagsDescription": "Capacidades do sistema de controle e recursos experimentais", "featureFlagsActive": "{count} ativo", @@ -1638,7 +1710,7 @@ "featureFlagsCategoryHealth": "Saúde", "featureFlagsSourceDb": "BD", "featureFlagsSourceEnv": "ENV", - "featureFlagsSourceDefault": "DEF", + "featureFlagsSourceDefault": "PADRÃO", "featureFlagsReset": "Redefinir", "featureFlagsResetAll": "Redefinir todas as substituições", "featureFlagsResetAllConfirm": "Tem certeza de que deseja redefinir todas as substituições de sinalizadores de recursos? Isso reverterá todos os sinalizadores para seus valores ENV ou padrão.", @@ -1646,11 +1718,11 @@ "featureFlagsNoResults": "Nenhuma sinalização corresponde à sua pesquisa", "featureFlagsSaved": "Bandeira atualizada", "featureFlagsError": "Falha ao atualizar sinalizador", - "settingsRoutingDescription": "Routing rules, model aliases, combo defaults, and degradation settings", - "settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration", - "settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings", - "mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging", - "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining", + "settingsRoutingDescription": "Regras de encaminhamento, aliases de modelo, predefinições de combo e definições de degradação", + "settingsResilienceDescription": "Configuração de disjuntor, tentativas e fallback", + "settingsAdvancedDescription": "Regras avançadas de payload, limites de pedidos e definições de API de proxy", + "mitmProxyDescription": "Configura definições de proxy MITM para inspeção de tráfego e depuração", + "oneProxyDescription": "Configura definições do 1Proxy para encadeamento avançado de proxy", "omniSkillsDescription": "Instalar e gerir competências de sandbox para execução automatizada de prompts e ferramentas" }, "cloudSyncStatus": { @@ -1666,8 +1738,8 @@ }, "breadcrumbs": { "ariaLabel": "Caminho de navegação", - "dashboard": "Dashboard", - "providers": "Provedores", + "dashboard": "Painel", + "providers": "Fornecedores", "combos": "Combos", "settings": "Definições", "general": "Geral", @@ -1696,14 +1768,14 @@ "context": "Contexto", "compression": "Compressão", "services": "Serviços", - "analytics": "Análises", + "analytics": "Analíticos", "costs": "Custos", "health": "Saúde", "runtime": "Runtime", "webhooks": "Webhooks", "home": "Início", "activity": "Atividade", - "agentSkills": "AgentSkills", + "agentSkills": "Competências de Agente", "comboHealth": "Saúde do Combo", "evals": "Avaliações", "search": "Pesquisa", @@ -1714,9 +1786,9 @@ "mcp": "MCP", "batch": "Lote", "files": "Ficheiros", - "media": "Media", + "media": "Multimédia", "cache": "Cache", - "changelog": "Changelog", + "changelog": "Registo de alterações", "chaos": "Caos", "cloudAgents": "Agentes Cloud", "live": "Em direto", @@ -1738,7 +1810,7 @@ "freeProviderRankings": "Rankings de Fornecedores Gratuitos", "freeTiers": "Escalões Gratuitos", "gamification": "Gamificação", - "leaderboard": "Tabela de Classificação", + "leaderboard": "Tabela de classificação", "limits": "Limites", "profile": "Perfil", "plugins": "Plugins", @@ -1922,7 +1994,7 @@ "period7D": "7D", "period30D": "30D", "period90D": "90D", - "periodYTD": "YTD", + "periodYTD": "Do ano", "periodAll": "Tudo", "totalTokens": "Total de tokens", "inputTokens": "Tokens de entrada", @@ -1960,8 +2032,8 @@ "modelStatusError": "Erro", "comboHealth": "Saúde do Combo", "comboHealthDescription": "Quota ao nível do combo, distribuição de uso e métricas de desempenho", - "compressionAnalyticsTitle": "Compression Analytics", - "compressionAnalyticsDescription": "Compression analytics — token savings, mode breakdown, and provider stats.", + "compressionAnalyticsTitle": "Analítica de Compressão", + "compressionAnalyticsDescription": "Analítica de compressão — poupança de tokens, repartição de modos e estatísticas por fornecedor.", "autoRoutingTotalAutoRequests": "Total de solicitações automáticas", "autoRoutingAvgSelectionScore": "Pontuação média de seleção", "autoRoutingExplorationRate": "Taxa de Exploração", @@ -2047,7 +2119,7 @@ "comboHealthPerformance": "Desempenho", "comboHealthPerformanceDescription": "Fiabilidade e débito para o tráfego encaminhado do combo.", "comboHealthExecutionTargetsDescription": "Métricas de tempo de execução ao nível do passo e visibilidade da quota para alvos estruturados do combo.", - "comboHealthRequestShort": "{count} req", + "comboHealthRequestShort": "{count} ped.", "comboHealthQuotaScope": "Âmbito da quota: {scope}", "comboHealthTrendValue": "Tendência: {trend}", "comboHealthFetchFailed": "Falha ao obter os dados de estado do combo", @@ -2252,34 +2324,34 @@ "keyCreatedNote": "Copie e armazene esta chave agora — ela não será mostrada novamente.", "done": "Concluído", "savePermissions": "Salvar permissões", - "endpointRestrictions": "Allowed Endpoints", - "allEndpointsAllowed": "This key can access all API endpoints.", - "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}.", - "autoResolve": "Auto-Resolve", - "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "endpointRestrictions": "Endpoints Permitidos", + "allEndpointsAllowed": "Esta chave pode aceder a todos os endpoints da API.", + "endpointsRestricted": "Restrito a {count} endpoint{count, plural, one {} other {s}}.", + "autoResolve": "Resolução Automática", + "autoResolveDesc": "Resolve automaticamente nomes de modelos ambíguos para o fornecedor nativo desta chave de API.", "streamDefaultMode": "Compatibilidade predefinida de stream", "streamDefaultModeDesc": "Controla sinalizadores `stream` omitidos para esta chave. O modo JSON devolve respostas sem streaming, a menos que o cliente solicite explicitamente SSE.", "streamDefaultLegacy": "Legado", "streamDefaultJson": "Compatível com JSON", "streamDefaultBadge": "Predefinição de stream JSON", - "keyActive": "Key Active", - "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.", - "accessSchedule": "Access Schedule", - "accessScheduleDesc": "Restrict access to specific hours and days of the week.", - "scheduleFrom": "From", - "scheduleUntil": "Until", - "scheduleDays": "Days", - "scheduleTimezone": "Timezone", - "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin", - "scheduleActive": "Schedule", - "disabled": "Disabled", - "daySun": "Sun", - "dayMon": "Mon", - "dayTue": "Tue", - "dayWed": "Wed", - "dayThu": "Thu", - "dayFri": "Fri", - "daySat": "Sat", + "keyActive": "Chave Ativa", + "keyActiveDesc": "Ativa ou desativa esta chave de API. Chaves desativadas são imediatamente rejeitadas com 403.", + "accessSchedule": "Horário de Acesso", + "accessScheduleDesc": "Restringe o acesso a horas e dias específicos da semana.", + "scheduleFrom": "De", + "scheduleUntil": "Até", + "scheduleDays": "Dias", + "scheduleTimezone": "Fuso horário", + "scheduleTimezoneHint": "Usa nomes de fuso horário IANA, ex: America/New_York, Europe/Berlin", + "scheduleActive": "Horário", + "disabled": "Desativado", + "daySun": "Dom", + "dayMon": "Seg", + "dayTue": "Ter", + "dayWed": "Qua", + "dayThu": "Qui", + "dayFri": "Sex", + "daySat": "Sáb", "allowAll": "Permitir tudo", "restrict": "Restringir", "allowAllInfo": "Esta chave pode acessar todos os modelos disponíveis.", @@ -2304,8 +2376,8 @@ "failedUpdatePermissionsRetry": "Falha ao atualizar as permissões. Por favor, tente novamente.", "unknownProvider": "desconhecido", "copyMaskedKey": "Copiar chave mascarada", - "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", - "modelsCount": "{count, plural, one {# model} other {# models}}", + "keyOnlyAvailableAtCreation": "A chave completa só está disponível na criação — copia-a quando criares a chave pela primeira vez", + "modelsCount": "{count, plural, one {# modelo} other {# modelos}}", "devicesCount": "{count, plural, one {# dispositivo} other {# dispositivos}}", "devicesTooltip": "{count, plural, one {# dispositivo com IP/User-Agent distinto visto com esta chave (últimos 30 min)} other {# dispositivos com IP/User-Agent distintos vistos com esta chave (últimos 30 min)}}", "lastUsedOn": "Último: {date}", @@ -2355,7 +2427,7 @@ "filterStatusDisabled": "Desativado", "filterStatusBanned": "Banido", "filterStatusExpired": "Expirado", - "filterTypeStandard": "Standard", + "filterTypeStandard": "Padrão", "filterTypeManage": "Gerir", "filterTypeRestricted": "Restrito", "shownOf": "{shown} de {total} apresentados", @@ -2368,7 +2440,7 @@ "bypassProviderQuota": "Contornar limites de quota do fornecedor", "bypassProviderQuotaDescription": "Permite que esta chave ignore a política de limite do fornecedor/conta a montante durante o encaminhamento. As quotas em USD da chave de API continuam a aplicar-se.", "quotaPill": "QUOTA", - "quotaModeOnly": "qtSd-only" + "quotaModeOnly": "Apenas quota" }, "auditLog": { "title": "Registro de auditoria", @@ -2395,17 +2467,17 @@ "media": { "title": "Playground de Mídia", "subtitle": "Gere imagens, vídeos e música", - "model": "Model", + "model": "Modelo", "prompt": "Prompt", "generate": "Gerar", - "generating": "Generating...", - "loadingModels": "Loading available models...", - "noModels": "No models available. Configure providers with media capabilities first.", - "error": "Generation Failed", - "result": "Result", - "imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.", - "videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.", - "musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI.", + "generating": "A gerar...", + "loadingModels": "A carregar modelos disponíveis...", + "noModels": "Sem modelos disponíveis. Configura primeiro fornecedores com capacidades de multimédia.", + "error": "Falha na Geração", + "result": "Resultado", + "imageDescription": "Gera imagens a partir de prompts de texto usando OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI e mais.", + "videoDescription": "Cria vídeos com AnimateDiff, Stable Video Diffusion via ComfyUI ou SD WebUI.", + "musicDescription": "Compõe música usando Stable Audio Open ou MusicGen via ComfyUI.", "kinds": { "embedding": "Embedding", "image": "Imagem", @@ -2483,111 +2555,111 @@ "openrouterSttDescription": "Os modelos de reconhecimento de voz para texto do OpenRouter utilizam a sua conexão OpenRouter configurada. Nenhuma credencial separada é necessária." }, "search": { - "searchQuery": "Search Query", - "searchResults": "Search Results", - "cachedResult": "Cached", - "searchCost": "Cost", - "searchTools": "Search Tools", - "searchToolsDesc": "Advanced search testing with provider comparison", - "compareProviders": "Compare Providers", - "rerankResults": "Rerank Results", - "searchHistory": "Search History", - "urlOverlap": "URL Overlap", - "noSearchProviders": "No search providers configured. Add providers in Settings.", - "noRerankModels": "No rerank model available", - "webSearch": "Web Search", - "provider": "Provider", - "searchType": "Search Type", - "maxResults": "Max Results", - "filters": "Filters", - "country": "Country", - "language": "Language", - "timeRange": "Time Range", - "includeDomains": "Include Domains", - "excludeDomains": "Exclude Domains", - "safeSearch": "Safe Search", - "safeSearchOff": "Off", - "safeSearchModerate": "Moderate", - "safeSearchStrict": "Strict", - "queryPlaceholder": "Enter search query...", - "providerAuto": "auto (cheapest)", + "searchQuery": "Consulta de Pesquisa", + "searchResults": "Resultados de Pesquisa", + "cachedResult": "Em cache", + "searchCost": "Custo", + "searchTools": "Ferramentas de Pesquisa", + "searchToolsDesc": "Teste avançado de pesquisa com comparação de fornecedores", + "compareProviders": "Comparar Fornecedores", + "rerankResults": "Reordenar Resultados", + "searchHistory": "Histórico de Pesquisa", + "urlOverlap": "Sobreposição de URL", + "noSearchProviders": "Sem fornecedores de pesquisa configurados. Adiciona fornecedores nas Definições.", + "noRerankModels": "Sem modelo de reordenação disponível", + "webSearch": "Pesquisa Web", + "provider": "Fornecedor", + "searchType": "Tipo de Pesquisa", + "maxResults": "Resultados Máximos", + "filters": "Filtros", + "country": "País", + "language": "Idioma", + "timeRange": "Intervalo de Tempo", + "includeDomains": "Incluir Domínios", + "excludeDomains": "Excluir Domínios", + "safeSearch": "Pesquisa Segura", + "safeSearchOff": "Desligada", + "safeSearchModerate": "Moderada", + "safeSearchStrict": "Estrita", + "queryPlaceholder": "Introduz a consulta de pesquisa...", + "providerAuto": "auto (mais barato)", "searchTypeWeb": "web", - "searchTypeNews": "news", - "optionAny": "any", - "timeRangeDay": "Past day", - "timeRangeWeek": "Past week", - "timeRangeMonth": "Past month", - "timeRangeYear": "Past year", - "domainPlaceholder": "example.com", - "requestTimedOut": "Request timed out ({seconds}s)", - "networkError": "Network error", - "formatted": "Formatted", + "searchTypeNews": "notícias", + "optionAny": "qualquer", + "timeRangeDay": "Último dia", + "timeRangeWeek": "Última semana", + "timeRangeMonth": "Último mês", + "timeRangeYear": "Último ano", + "domainPlaceholder": "exemplo.com", + "requestTimedOut": "Pedido expirou ({seconds}s)", + "networkError": "Erro de rede", + "formatted": "Formatado", "rawJson": "JSON", - "cacheMiss": "cache miss", - "cacheHit": "cache hit", - "latency": "Latency", - "cost": "Cost", - "results": "Results", - "rerank": "Rerank", - "rerankModel": "Rerank Model", - "positionDelta": "Position Change", - "emptyState": "Send a search query to see results", + "cacheMiss": "falha de cache", + "cacheHit": "acerto de cache", + "latency": "Latência", + "cost": "Custo", + "results": "Resultados", + "rerank": "Reordenar", + "rerankModel": "Modelo de Reordenação", + "positionDelta": "Mudança de Posição", + "emptyState": "Envia uma consulta de pesquisa para veres resultados", "copy": "Copiar", "resetToDefault": "Redefinir para o padrão", - "tabSearch": "Search", + "tabSearch": "Pesquisa", "tabScrape": "Scrape", - "tabCompare": "Compare", - "modalitiesGuide": "Modalities guide", - "searchConceptTitle": "Search", - "searchConceptDesc": "Search = fetches a list of web results (title, URL, snippet, relevance score)", + "tabCompare": "Comparar", + "modalitiesGuide": "Guia de modalidades", + "searchConceptTitle": "Pesquisa", + "searchConceptDesc": "Pesquisa = obtém uma lista de resultados web (título, URL, excerto, pontuação de relevância)", "scrapeConceptTitle": "Scrape", - "scrapeConceptDesc": "Scrape = extracts the full content of a URL (markdown, text or HTML)", - "compareConceptTitle": "Compare", - "compareConceptDesc": "Compare = runs the same query across N providers side-by-side to compare latency, cost and result overlap", - "rerankConceptTitle": "Rerank", - "rerankConceptDesc": "Rerank = reorders results via LLM to improve relevance based on the query", - "autoConceptTitle": "Auto (cheapest)", - "autoConceptDesc": "Auto (cheapest) = automatically picks the cheapest available provider with configured credentials", - "providerCatalogTitle": "Provider Catalog", - "kindSearch": "Search", + "scrapeConceptDesc": "Scrape = extrai o conteúdo completo de um URL (markdown, texto ou HTML)", + "compareConceptTitle": "Comparar", + "compareConceptDesc": "Comparar = executa a mesma consulta em N fornecedores lado a lado para comparar latência, custo e sobreposição de resultados", + "rerankConceptTitle": "Reordenar", + "rerankConceptDesc": "Reordenar = reordena resultados via LLM para melhorar a relevância com base na consulta", + "autoConceptTitle": "Auto (mais barato)", + "autoConceptDesc": "Auto (mais barato) = escolhe automaticamente o fornecedor mais barato disponível com credenciais configuradas", + "providerCatalogTitle": "Catálogo de Fornecedores", + "kindSearch": "Pesquisa", "kindFetch": "Fetch/Scrape", - "statusConfigured": "Configured", - "statusMissing": "No credential", - "statusRateLimited": "Rate limited", - "configureProvider": "Configure in Providers", - "loadingProviders": "Loading providers…", - "failedToLoadProviders": "Failed to load providers", - "costPerQuery": "Cost/query", - "freeQuota": "Free quota/mo", - "scrapeUrl": "URL to scrape", - "scrapeUrlPlaceholder": "https://example.com", + "statusConfigured": "Configurado", + "statusMissing": "Sem credencial", + "statusRateLimited": "Limitado pela taxa", + "configureProvider": "Configurar em Fornecedores", + "loadingProviders": "A carregar fornecedores…", + "failedToLoadProviders": "Falha ao carregar fornecedores", + "costPerQuery": "Custo/consulta", + "freeQuota": "Quota grátis/mês", + "scrapeUrl": "URL para scrape", + "scrapeUrlPlaceholder": "https://exemplo.com", "scrapeUrlRequired": "O URL é obrigatório", "scrapeUrlInvalid": "URL inválido — tem de começar com http:// ou https://", - "scrapeExtract": "Extract", - "scrapeExtracting": "Extracting…", - "scrapeFullPage": "Full page", - "scrapeFormat": "Format", + "scrapeExtract": "Extrair", + "scrapeExtracting": "A extrair…", + "scrapeFullPage": "Página completa", + "scrapeFormat": "Formato", "formatMarkdown": "Markdown", "formatHtml": "HTML", - "formatText": "Text", - "scrapePreview": "Preview", + "formatText": "Texto", + "scrapePreview": "Pré-visualização", "scrapeRaw": "Raw", - "scrapeContentTruncated": "(truncated, view raw)", - "scrapeMetadata": "Metadata", - "scrapeProvider": "Provider", - "scrapeSize": "Size", + "scrapeContentTruncated": "(truncado, ver raw)", + "scrapeMetadata": "Metadados", + "scrapeProvider": "Fornecedor", + "scrapeSize": "Tamanho", "scrapeEmptyState": "Introduza um URL para extrair o seu conteúdo", "scrapeProvidersAvailable": "Provedores disponíveis: Firecrawl, Jina Reader, Tavily.", - "compareRun": "Compare", - "compareRunning": "Comparing…", - "autoProvider": "Auto (cheapest)", - "configuredStatus": "Configured", - "rateLimitedStatus": "Rate limited", - "noCredential": "No credential", - "searchTypeLabel": "Type", - "rerankModelLabel": "Rerank model", - "noneOption": "None", - "size": "Size", + "compareRun": "Comparar", + "compareRunning": "A comparar…", + "autoProvider": "Auto (mais barato)", + "configuredStatus": "Configurado", + "rateLimitedStatus": "Limitado pela taxa", + "noCredential": "Sem credencial", + "searchTypeLabel": "Tipo", + "rerankModelLabel": "Modelo de reordenação", + "noneOption": "Nenhum", + "size": "Tamanho", "configurationPane": "Painel de configuração", "configuration": "Configuração", "status": "Estado", @@ -2649,17 +2721,17 @@ "classifierCompatLoadFailed": "Falha ao carregar a definição", "classifierCompatMode": { "off": "Desativado", - "auto": "Auto", + "auto": "Automático", "always": "Sempre" }, - "ccDiscoveryInfoButton": "Como ativar a descoberta no Claude Code", - "ccDiscoveryInfoTooltip": "Anuncie modelos não Claude sob claude/<provider>/<model> IDs de espelho para que a descoberta de modelos do gateway do Claude Code possa listá-los. Dobra as entradas do catálogo para todos os clientes quando ativado globalmente.", - "ccDiscoveryInfoLink": "Abrir Feature Flags", - "ccOnboardingTitle": "settings.json para descoberta do modelo de gateway", - "ccOnboardingCopy": "Copiar", - "ccOnboardingCopied": "Copiado", - "ccOnboardingKeyPlaceholder": "", - "ccOnboardingWindowNote": "Claude Code assume uma janela de contexto de 200K para qualquer ID de modelo que não reconhece. Para um modelo com uma janela real diferente, adicione CLAUDE_CODE_AUTO_COMPACT_WINDOW logo abaixo para que a auto-compacção não ocorra muito cedo.", + "ccDiscoveryInfoButton": "__MISSING__:How to enable discovery in Claude Code", + "ccDiscoveryInfoTooltip": "__MISSING__:Advertise non-Claude models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Doubles catalog entries for all clients when enabled globally.", + "ccDiscoveryInfoLink": "__MISSING__:Open Feature Flags", + "ccOnboardingTitle": "__MISSING__:settings.json for gateway model discovery", + "ccOnboardingCopy": "__MISSING__:Copy", + "ccOnboardingCopied": "__MISSING__:Copied", + "ccOnboardingKeyPlaceholder": "__MISSING__:", + "ccOnboardingWindowNote": "__MISSING__:Claude Code assumes a 200K context window for any model id it does not recognize. For a model with a different real window, add CLAUDE_CODE_AUTO_COMPACT_WINDOW just under it so auto-compaction does not fire too early.", "failedSave": "Falha ao guardar", "profileSyncTitle": "Sincronização automática de perfis da CLI", "profileSyncDescription": "Após a sincronização dos modelos do fornecedor, regenerar automaticamente os perfis de ferramentas da CLI a partir do catálogo ativo. Desativado por predefinição — apenas os ficheiros de perfil são escritos; a configuração ativa/predefinida nunca é alterada.", @@ -2759,11 +2831,11 @@ "antigravityStep2Prefix": "2. Adicionar", "antigravityStep2Suffix": "ao seu arquivo hosts como 127.0.0.1.", "antigravityStep3": "3. Abra o Antigravity e as solicitações serão proxy.", - "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.", - "mitmStep1": "1. Start MITM to route requests through OmniRoute.", - "mitmStep2Prefix": "2. Add", - "mitmStep2Suffix": "to your hosts file as 127.0.0.1.", - "mitmStep3": "3. Open {toolName} and requests will be proxied.", + "mitmHowWorksDesc": "{toolName} envia pedidos para o endpoint do fornecedor. O MITM interceta e redireciona-os para o OmniRoute.", + "mitmStep1": "1. Inicia o MITM para encaminhar pedidos através do OmniRoute.", + "mitmStep2Prefix": "2. Adiciona", + "mitmStep2Suffix": "ao teu ficheiro hosts como 127.0.0.1.", + "mitmStep3": "3. Abre o {toolName} e os pedidos serão encaminhados via proxy.", "sudoPasswordRequiredTitle": "Senha Sudo obrigatória", "sudoPasswordHint": "A senha do administrador é necessária para modificar o arquivo hosts e as configurações de proxy do sistema.", "enterSudoPassword": "Digite a senha do sudo", @@ -2791,7 +2863,7 @@ "afterInstallationRun": "Após a instalação, execute", "toVerify": "para verificar.", "current": "Atual", - "baseUrlPlaceholder": "https://.../v1", + "baseUrlPlaceholder": "https://api.exemplo.com", "resetToDefault": "Redefinir para o padrão", "providerModelPlaceholder": "provedor/id do modelo", "apply": "Aplicar", @@ -2849,7 +2921,7 @@ "continue": "Use ao executar Continue em IDEs e você precisar de uma configuração de provedor portátil baseada em JSON.", "opencode": "Use quando preferir execuções de agentes nativos de terminal e automação com script via OpenCode.", "kiro": "Use ao integrar o Kiro e controlar o roteamento do modelo centralmente no OmniRoute.", - "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "windsurf": "Usa quando queres um IDE centrado em IA com modelos Codeium/Windsurf encaminhados pelo OmniRoute.", "antigravity": "Use quando o tráfego Antigravity/Kiro deve ser interceptado através do MITM e roteado para OmniRoute.", "copilot": "Use quando desejar UX no estilo de bate-papo do Copilot enquanto impõe chaves OmniRoute e regras de roteamento.", "amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.", @@ -2869,11 +2941,11 @@ "qwen": "Qwen Code CLI", "cursor": "Editor de código do cursor AI", "continue": "Continuar Assistente de IA", - "opencode": "OpenCode AI coding agent (Terminal)", - "kiro": "Amazon Kiro — AI-powered IDE", - "windsurf": "Windsurf AI Code Editor", - "copilot": "GitHub Copilot AI Assistant", - "amp": "Sourcegraph Amp coding assistant CLI", + "opencode": "Agente de programação OpenCode (Terminal)", + "kiro": "Amazon Kiro — IDE com IA", + "windsurf": "Editor de Código com IA Windsurf", + "copilot": "Assistente de IA GitHub Copilot", + "amp": "CLI de assistente de programação Sourcegraph Amp", "hermes": "Assistente de Terminal Hermes AI", "hermes-agent": "Hermes Agent (da Nousresearch) - IA de terminal avançada com suporte multi-modelo (delegação, visão, compressão, etc.)", "custom": "Gerador genérico de configuração CLI ou SDK compatível com OpenAI", @@ -2948,22 +3020,22 @@ "opencode": { "steps": { "1": { - "title": "Install OpenCode", - "desc": "Install via npm: npm install -g opencode-ai" + "title": "Instalar OpenCode", + "desc": "Instala via npm: npm install -g opencode-ai" }, "2": { - "title": "API Key" + "title": "Chave de API" }, "3": { - "title": "Set Base URL", + "title": "Definir URL Base", "desc": "opencode config set baseUrl {baseUrl}" }, "4": { - "title": "Select Model" + "title": "Selecionar Modelo" }, "5": { - "title": "Use Thinking Variant", - "desc": "For thinking models, run with --variant high/low/max (example command below)." + "title": "Usar Variante Thinking", + "desc": "Para modelos com thinking, executa com --variant high/low/max (comando de exemplo abaixo)." } }, "notes": { @@ -2974,18 +3046,18 @@ "kiro": { "steps": { "1": { - "title": "Open Kiro Settings", - "desc": "Go to Settings → AI Provider" + "title": "Abrir Definições do Kiro", + "desc": "Vai a Definições → Fornecedor de IA" }, "2": { - "title": "Base URL", - "desc": "Paste your OmniRoute endpoint URL" + "title": "URL Base", + "desc": "Cola o URL do endpoint do OmniRoute" }, "3": { - "title": "API Key" + "title": "Chave de API" }, "4": { - "title": "Select Model" + "title": "Selecionar Modelo" } }, "notes": { @@ -2995,24 +3067,24 @@ "windsurf": { "steps": { "1": { - "title": "Open AI Settings", - "desc": "Click the AI Settings icon in Windsurf or go to Settings" + "title": "Abrir Definições de IA", + "desc": "Clica no ícone de Definições de IA no Windsurf ou vai a Definições" }, "2": { - "title": "Add Custom Provider", - "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + "title": "Adicionar Fornecedor Personalizado", + "desc": "Seleciona \"Adicionar fornecedor personalizado\" (compatível com OpenAI)" }, "3": { - "title": "Base URL", + "title": "URL Base", "desc": "http://127.0.0.1:20128/v1" }, "4": { - "title": "API Key", - "desc": "Select your OmniRoute API key" + "title": "Chave de API", + "desc": "Seleciona a tua chave de API do OmniRoute" }, "5": { - "title": "Select Model", - "desc": "Choose a model from the dropdown" + "title": "Selecionar Modelo", + "desc": "Escolhe um modelo do menu" } } } @@ -3023,7 +3095,7 @@ "guidedClientsTab": "Guided Clients Tab", "mitmClientsTab": "Mitm Clients Tab", "customCliTab": "CLI personalizada", - "toolCategories": "Tool Categories", + "toolCategories": "Categorias de Ferramentas", "visibleToolsCount": "{count} ferramentas disponíveis", "customCliBuilderTitle": "Construtor CLI compatível com OpenAI", "customCliBuilderDescription": "Gere env vars e snippets JSON para qualquer CLI ou SDK que aceite um URL base, chave de API e ID de modelo compatível com OpenAI.", @@ -3075,7 +3147,7 @@ "hermesRoleKanbanDecomposerDesc": "Decomposição de tarefas Kanban", "hermesRoleProfileDescriber": "Descritor de Perfil", "hermesRoleProfileDescriberDesc": "Descrição do perfil do utilizador", - "hermesRoleGoalJudge": "Goal Judge", + "hermesRoleGoalJudge": "Juiz de Objetivos", "hermesRoleGoalJudgeDesc": "Avaliação da conclusão de objetivos", "hermesRoleCurator": "Curador", "hermesRoleCuratorDesc": "Curadoria de Habilidades e Memória", @@ -3199,12 +3271,12 @@ "priorityDesc": "Fallback sequencial: tenta primeiro o modelo 1, depois o 2, etc.", "weightedDesc": "Distribui o tráfego por porcentagem de peso com substituto", "roundRobinDesc": "Distribuição circular: cada solicitação vai para o próximo modelo em rotação", - "contextRelay": "Context Relay", - "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "contextRelay": "Retransmissão de Contexto", + "contextRelayDesc": "Preserva a continuidade da sessão com resumos de handoff quando as contas rodam", "randomDesc": "Seleção aleatória uniforme e, em seguida, retorno aos modelos restantes", "leastUsedDesc": "Escolhe o modelo com menos solicitações, equilibrando a carga ao longo do tempo", "costOptimizedDesc": "Rotas para o modelo mais barato primeiro com base no preço", - "cacheOptimizedDesc": "Routes each reusable prompt prefix consistently to the same provider account", + "cacheOptimizedDesc": "Encaminha cada prefixo de prompt reutilizável consistentemente para a mesma conta de fornecedor", "resetAware": "RR com reconhecimento de redefinição", "resetAwareDesc": "Equilibra a cota restante com redefinições de 5h e semanais e, em seguida, faz um round-robin de pontuações semelhantes", "strictRandom": "Aleatório Estrito", @@ -3225,13 +3297,13 @@ "retryDelay": "Atraso de nova tentativa (ms)", "concurrencyPerModel": "Simultaneidade/Modelo", "queueTimeout": "Tempo limite da fila (ms)", - "contextRelayHandoffThreshold": "Handoff Threshold", - "contextRelayHandoffThresholdHelp": "When quota usage reaches this threshold, OmniRoute generates a structured handoff summary before the active account is exhausted.", - "contextRelayMaxMessages": "Max Messages For Summary", - "contextRelayMaxMessagesHelp": "Limits how much recent history is condensed into the relay summary.", - "contextRelaySummaryModel": "Summary Model", - "contextRelaySummaryModelHelp": "Optional override model used only for generating the handoff summary. Leave empty to reuse the active combo model.", - "contextRelayProviderNote": "Context Relay currently generates handoffs for Codex account rotation. Pair it with multiple accounts of the same provider for the best continuity.", + "contextRelayHandoffThreshold": "Limiar de Handoff", + "contextRelayHandoffThresholdHelp": "Quando o uso de quota atinge este limiar, o OmniRoute gera um resumo de handoff estruturado antes de a conta ativa rodar.", + "contextRelayMaxMessages": "Máximo de Mensagens Para Resumo", + "contextRelayMaxMessagesHelp": "Limita quanto do histórico recente é condensado no resumo de retransmissão.", + "contextRelaySummaryModel": "Modelo de Resumo", + "contextRelaySummaryModelHelp": "Modelo de substituição opcional usado apenas para gerar o resumo de handoff. Deixa vazio para reutilizar o modelo do combo ativo.", + "contextRelayProviderNote": "A Retransmissão de Contexto gera atualmente handoffs para a rotação de contas Codex. Combina-a com várias contas do mesmo fornecedor.", "advancedHint": "Deixe em branco para usar padrões globais. Eles substituem as configurações por provedor.", "failoverBeforeRetry": "Failover antes de tentar novamente", "maxSetRetries": "Máximo de tentativas definidas", @@ -3282,40 +3354,40 @@ "weighted": "Ponderado", "leastUsed": "Menos usado", "costOpt": "Opção de custo", - "strategyGuideTitle": "How to use this strategy", - "strategyGuideWhen": "When to use", - "strategyGuideAvoid": "Avoid when", - "strategyGuideExample": "Example", + "strategyGuideTitle": "Como usar esta estratégia", + "strategyGuideWhen": "Quando usar", + "strategyGuideAvoid": "Evitar quando", + "strategyGuideExample": "Exemplo", "strategyGuide": { "priority": { - "when": "You have one preferred model and only want fallback on failure.", - "avoid": "You need request distribution across models.", - "example": "Primary coding model with cheaper backup for outages." + "when": "Tens um modelo preferido e só queres fallback em caso de falha.", + "avoid": "Precisas de distribuição de pedidos entre modelos.", + "example": "Modelo de programação principal com backup mais barato para falhas." }, "weighted": { - "when": "You need controlled traffic split across models.", - "avoid": "You cannot maintain accurate weights over time.", - "example": "80% stable model + 20% canary model rollout." + "when": "Precisas de divisão de tráfego controlada entre modelos.", + "avoid": "Não consegues manter pesos precisos ao longo do tempo.", + "example": "80% modelo estável + 20% lançamento canary." }, "round-robin": { - "when": "You want predictable and even distribution.", - "avoid": "Models differ too much in latency or cost.", - "example": "Same model on multiple accounts to spread throughput." + "when": "Queres distribuição previsível e uniforme.", + "avoid": "Os modelos diferem demasiado em latência ou custo.", + "example": "O mesmo modelo em várias contas para distribuir o rendimento." }, "random": { - "when": "You want simple distribution with minimal setup.", - "avoid": "You need strict traffic guarantees.", - "example": "Quick prototyping with equivalent models." + "when": "Queres distribuição simples com configuração mínima.", + "avoid": "Precisas de garantias estritas de tráfego.", + "example": "Prototipagem rápida com modelos equivalentes." }, "least-used": { - "when": "You want adaptive balancing based on live demand.", - "avoid": "Traffic is too low to benefit from usage balancing.", - "example": "Mixed workloads where one model often gets overloaded." + "when": "Queres balanceamento adaptativo baseado na procura em tempo real.", + "avoid": "O tráfego é demasiado baixo para beneficiar de balanceamento de uso.", + "example": "Cargas mistas onde um modelo fica muitas vezes sobrecarregado." }, "cost-optimized": { - "when": "Cost reduction is your top priority.", - "avoid": "Pricing data is missing or outdated.", - "example": "Background or batch jobs where lower cost is preferred." + "when": "A redução de custo é a tua prioridade máxima.", + "avoid": "Os dados de preço estão em falta ou desatualizados.", + "example": "Trabalhos em segundo plano ou batch onde se prefere custo mais baixo." }, "reset-aware": { "when": "Você roteia várias contas com telemetria de cota e diferentes janelas de redefinição.", @@ -3323,19 +3395,19 @@ "example": "Prefira uma redefinição semanal de 60% da conta amanhã a uma redefinição de 80% da conta mais tarde." }, "strict-random": { - "when": "Use when you want perfectly even spread — each model used once before repeating.", - "avoid": "Avoid when models have different quality or latency and order matters.", - "example": "Example: Multiple accounts of the same model to distribute usage evenly." + "when": "Usa quando queres distribuição perfeitamente uniforme — cada modelo usado uma vez antes de repetir.", + "avoid": "Evita quando os modelos têm qualidade ou latência diferentes e a ordem importa.", + "example": "Exemplo: várias contas do mesmo modelo para distribuir o uso uniformemente." }, "p2c": { - "when": "Use when you want low-latency selection using Power-of-Two-Choices algorithm.", - "avoid": "Avoid for small combos with 2 or fewer models — no benefit over round-robin.", - "example": "Example: High-throughput inference across 4+ equivalent model endpoints." + "when": "Usa quando queres seleção de baixa latência com o algoritmo Power-of-Two-Choices.", + "avoid": "Evita para combos pequenos com 2 ou menos modelos — sem benefício face ao round-robin.", + "example": "Exemplo: inferência de alto rendimento em 4+ endpoints de modelo equivalentes." }, "context-relay": { - "when": "Use when long sessions must survive account rotation without losing the working context.", - "avoid": "Avoid when account switching is rare or when you do not want extra summarization requests.", - "example": "Example: Codex sessions that rotate across multiple accounts near quota exhaustion." + "when": "Usa quando sessões longas têm de sobreviver à rotação de contas sem perder o contexto de trabalho.", + "avoid": "Evita quando a troca de contas é rara ou quando não queres pedidos extra de resumo.", + "example": "Exemplo: sessões Codex que rodam por várias contas perto de esgotar a quota." }, "fill-first": { "when": "Use quando quiser esgotar totalmente a cota de um provedor antes de passar para o próximo.", @@ -3359,49 +3431,49 @@ } }, "advancedHelp": { - "maxRetries": "How many retries are attempted before failing a request.", - "retryDelay": "Initial wait between retries. Higher values reduce burst pressure.", - "timeout": "Maximum request duration before aborting.", - "healthcheck": "Skips unhealthy models/providers from routing decisions.", - "concurrencyPerModel": "Max simultaneous requests allowed per model in round-robin.", - "queueTimeout": "How long a request can wait in queue before timing out.", + "maxRetries": "Quantas tentativas são feitas antes de falhar um pedido.", + "retryDelay": "Espera inicial entre tentativas. Valores mais altos reduzem pressão de pico.", + "timeout": "Duração máxima do pedido antes de abortar.", + "healthcheck": "Salta modelos/fornecedores sem saúde das decisões de encaminhamento.", + "concurrencyPerModel": "Máximo de pedidos simultâneos permitidos por modelo em round-robin.", + "queueTimeout": "Quanto tempo um pedido pode esperar na fila antes de expirar.", "failoverBeforeRetry": "Quando ativado, qualquer erro upstream aciona o failover imediato para o próximo destino combinado, ignorando todas as novas tentativas e URLs substitutos.", "maxSetRetries": "Número de vezes para tentar novamente o destino completo definido quando todos os alvos falharem. 0 = nenhuma nova tentativa de nível definido.", "setRetryDelayMs": "Atraso entre novas tentativas de nível definido, dando tempo para que problemas transitórios sejam resolvidos.", "disableSessionStickiness": "Rode para uma ligação diferente a cada pedido em vez de fixar uma conversa inteira a uma ligação através do hash da primeira mensagem. Substitui a predefinição global. Deixe em Herdar para preservar os acessos à cache de prompts em conversas com várias interações." }, - "templatesTitle": "Quick templates", - "templatesDescription": "Apply a starting profile, then adjust models and config.", - "templateApply": "Apply template", - "templateHighAvailability": "High availability", - "templateHighAvailabilityDesc": "Priority routing with health checks and safe retries.", - "templateCostSaver": "Cost saver", - "templateCostSaverDesc": "Cost-optimized routing for budget-first workloads.", - "templateBalanced": "Balanced load", - "templateBalancedDesc": "Least-used routing to spread demand over time.", - "usageGuideHide": "Hide", - "usageGuideDontShowAgain": "Don't show again", - "usageGuideShow": "Show guide", - "quickTestTitle": "Combo ready to validate", - "quickTestDescription": "Run a test now to confirm fallback and latency behavior.", - "testNow": "Test now", - "pricingCoverage": "Pricing coverage", - "pricingCoverageHint": "Cost-optimized works best when all combo models have pricing.", - "pricingAvailable": "Pricing available", - "pricingMissing": "No pricing", - "pricingAvailableShort": "priced", - "pricingMissingShort": "no-price", + "templatesTitle": "Modelos rápidos", + "templatesDescription": "Aplica um perfil inicial e depois ajusta modelos e configuração.", + "templateApply": "Aplicar modelo", + "templateHighAvailability": "Alta disponibilidade", + "templateHighAvailabilityDesc": "Encaminhamento por prioridade com verificações de saúde e tentativas seguras.", + "templateCostSaver": "Poupança de custo", + "templateCostSaverDesc": "Encaminhamento otimizado para custo em cargas com orçamento primeiro.", + "templateBalanced": "Carga balanceada", + "templateBalancedDesc": "Encaminhamento least-used para distribuir a procura ao longo do tempo.", + "usageGuideHide": "Ocultar", + "usageGuideDontShowAgain": "Não mostrar novamente", + "usageGuideShow": "Mostrar guia", + "quickTestTitle": "Combo pronto a validar", + "quickTestDescription": "Executa já um teste para confirmar o comportamento de fallback e latência.", + "testNow": "Testar agora", + "pricingCoverage": "Cobertura de preços", + "pricingCoverageHint": "A otimização de custo funciona melhor quando todos os modelos do combo têm preço.", + "pricingAvailable": "Preço disponível", + "pricingMissing": "Sem preço", + "pricingAvailableShort": "com preço", + "pricingMissingShort": "sem preço", "fallbackOnlyOnQuotaExhaustion": "Avançar apenas em caso de esgotamento da quota", "fallbackOnlyOnQuotaExhaustionShort": "fallback apenas de quota", - "warningRoundRobinSingleModel": "Round-robin is most useful with at least 2 models.", - "warningCostOptimizedPartialPricing": "Only {priced} of {total} models have pricing. Routing may be partially cost-aware.", - "warningCostOptimizedNoPricing": "No pricing data found for this combo. Cost-optimized may route unexpectedly.", - "filterAll": "All", - "filterIntelligent": "Intelligent", - "filterDeterministic": "Deterministic", - "filterEmptyTitle": "No combos match this strategy filter.", - "filterEmptyIntelligentDescription": "Create an auto or LKGP combo to populate the intelligent routing dashboard.", - "filterEmptyDeterministicDescription": "Only auto and LKGP combos exist right now. Switch back to All or create a deterministic combo.", + "warningRoundRobinSingleModel": "O round-robin é mais útil com pelo menos 2 modelos.", + "warningCostOptimizedPartialPricing": "Apenas {priced} de {total} modelos têm preço. O encaminhamento pode ser parcialmente sensível ao custo.", + "warningCostOptimizedNoPricing": "Não foram encontrados dados de preço para este combo. O custo otimizado pode encaminhar de forma inesperada.", + "filterAll": "Todos", + "filterIntelligent": "Inteligente", + "filterDeterministic": "Determinístico", + "filterEmptyTitle": "Nenhum combo corresponde a este filtro de estratégia.", + "filterEmptyIntelligentDescription": "Cria um combo automático ou LKGP para preencher o painel de encaminhamento inteligente.", + "filterEmptyDeterministicDescription": "Só existem combos automáticos e LKGP de momento. Volta a Todos ou cria um combo determinístico.", "readinessTitle": "Pronto para salvar?", "readinessDescription": "Revise a lista de verificação antes de criar ou atualizar este combo.", "readinessCheckName": "O nome do combo é válido", @@ -3415,12 +3487,12 @@ "saveBlockModels": "Adicione pelo menos um modelo.", "saveBlockWeighted": "Ajuste os pesos para 100% (atual: {total}%).", "saveBlockPricing": "Adicione preço para pelo menos um modelo ou escolha outra estratégia.", - "recommendationsLabel": "Recommended setup", - "applyRecommendations": "Apply recommendations", - "recommendationsUpdated": "Recommendations updated for {strategy}.", - "recommendationsApplied": "Recommendations applied to this combo.", - "intelligentPanelTitle": "Intelligent Routing Dashboard", - "intelligentPanelDesc": "Real-time scoring and health status for this auto-routing combo.", + "recommendationsLabel": "Configuração recomendada", + "applyRecommendations": "Aplicar recomendações", + "recommendationsUpdated": "Recomendações atualizadas para {strategy}.", + "recommendationsApplied": "Recomendações aplicadas a este combo.", + "intelligentPanelTitle": "Painel de Encaminhamento Inteligente", + "intelligentPanelDesc": "Pontuação em tempo real e estado de saúde para este combo de auto-encaminhamento.", "configOnlyStatus": "Vista de Configuração", "configOnlyHint": "Este painel mostra apenas as entradas de encaminhamento. O estado do disjuntor em tempo real está disponível na página de Estado.", "routingInputs": "Entradas de Encaminhamento", @@ -3442,89 +3514,89 @@ "manualModelUnknownProvider": "Prefixo de fornecedor desconhecido.", "builderDynamicAccountShort": "Conta dinâmica", "builderNeedValidName": "Defina um nome de combinação válido antes de continuar.", - "statusOverview": "Status Overview", - "normalOperation": "Normal Operation", - "allProvidersHealthy": "Providers are reporting healthy routing conditions.", - "incidentMode": "Incident Mode", - "highCircuitBreakerRate": "High circuit breaker trip rate detected.", - "activeModePack": "Active Mode Pack", - "modePackUpdated": "Mode pack updated to {pack}.", - "modePackHint": "Switch presets to bias the routing engine without rebuilding the combo.", - "providerScores": "Provider Scores", - "allProvidersEvaluated": "No candidate pool configured. All active providers are evaluated at runtime.", - "excludedProviders": "Excluded Providers", - "excludedProvidersHint": "Providers with an OPEN circuit breaker are temporarily excluded from routing.", - "noExcludedProviders": "No providers are currently excluded.", - "cooldownMinutes": "Cooldown: {minutes}m", - "builderIntelligentTitle": "Intelligent Routing Configuration", - "builderIntelligentDesc": "Configure the multi-factor scoring engine for this auto-routing combo.", - "candidatePoolLabel": "Candidate Pool", - "candidatePoolHint": "Select which providers this engine should evaluate. Leave empty to use all active providers.", - "candidatePoolEmpty": "No active providers available yet.", - "candidatePoolAllProviders": "All providers", - "modePackLabel": "Mode Pack", - "routerStrategyLabel": "Router Strategy", - "strategyRules": "Rules (6-Factor Scoring)", - "explorationRateLabel": "Exploration Rate", - "explorationRateHint": "{percent}% of requests can explore non-optimal providers.", - "budgetCapLabel": "Budget Cap (USD / request)", - "budgetCapPlaceholder": "No limit", - "advancedWeightsTitle": "Advanced: Scoring Weights", + "statusOverview": "Visão Geral do Estado", + "normalOperation": "Operação Normal", + "allProvidersHealthy": "Os fornecedores estão a reportar condições de encaminhamento saudáveis.", + "incidentMode": "Modo de Incidente", + "highCircuitBreakerRate": "Detetada taxa alta de disparo do disjuntor.", + "activeModePack": "Pacote de Modo Ativo", + "modePackUpdated": "Pacote de modo atualizado para {pack}.", + "modePackHint": "Alterna predefinições para enviesar o motor de encaminhamento sem reconstruir o combo.", + "providerScores": "Pontuações dos Fornecedores", + "allProvidersEvaluated": "Nenhum conjunto de candidatos configurado. Todos os fornecedores ativos são avaliados em runtime.", + "excludedProviders": "Fornecedores Excluídos", + "excludedProvidersHint": "Fornecedores com disjuntor ABERTO estão temporariamente excluídos do encaminhamento.", + "noExcludedProviders": "Nenhum fornecedor está atualmente excluído.", + "cooldownMinutes": "Arrefecimento: {minutes}m", + "builderIntelligentTitle": "Configuração de Encaminhamento Inteligente", + "builderIntelligentDesc": "Configura o motor de pontuação multi-fator para este combo de encaminhamento automático.", + "candidatePoolLabel": "Conjunto de Candidatos", + "candidatePoolHint": "Seleciona quais os fornecedores que este motor deve avaliar. Deixa vazio para usar todos os fornecedores ativos.", + "candidatePoolEmpty": "Ainda não há fornecedores ativos disponíveis.", + "candidatePoolAllProviders": "Todos os fornecedores", + "modePackLabel": "Pacote de Modo", + "routerStrategyLabel": "Estratégia de Encaminhamento", + "strategyRules": "Regras (Pontuação de 6 Fatores)", + "explorationRateLabel": "Taxa de Exploração", + "explorationRateHint": "{percent}% dos pedidos podem explorar fornecedores não ótimos.", + "budgetCapLabel": "Limite de Orçamento (USD / pedido)", + "budgetCapPlaceholder": "Sem limite", + "advancedWeightsTitle": "Avançado: Pesos de Pontuação", "nestedComboFlatten": "Aplanar combinações aninhadas", "nestedComboExecute": "Executar combinações aninhadas como destinos", "effectiveRoutingShare": "Quota de encaminhamento efetiva (peso ÷ total)", "weightQuota": "Quota", - "weightHealth": "Health", - "weightCostInv": "Cost", - "weightLatencyInv": "Latency", - "weightTaskFit": "Task Fit", - "weightStability": "Stability", - "weightTierPriority": "Tier", - "weightCacheAffinity": "Cache Hit Affinity", + "weightHealth": "Saúde", + "weightCostInv": "Custo", + "weightLatencyInv": "Latência", + "weightTaskFit": "Adequação à Tarefa", + "weightStability": "Estabilidade", + "weightTierPriority": "Nível", + "weightCacheAffinity": "Afinidade de Acerto de Cache", "weightSessionAvailability": "Disponibilidade da Sessão", - "reviewIntelligentTitle": "Intelligent Routing Config", + "reviewIntelligentTitle": "Configuração de Encaminhamento Inteligente", "strategyRecommendations": { "priority": { - "title": "Fail-safe baseline", - "description": "Use one primary model and keep fallback chain short and reliable.", - "tip1": "Put your most reliable model first.", - "tip2": "Keep 1-2 backup models with similar quality.", - "tip3": "Use safe retries to absorb transient provider failures." + "title": "Base à prova de falhas", + "description": "Usa um modelo primário e mantém a cadeia de fallback curta e fiável.", + "tip1": "Coloca o teu modelo mais fiável primeiro.", + "tip2": "Mantém 1-2 modelos de backup com qualidade semelhante.", + "tip3": "Usa tentativas seguras para absorver falhas transitórias de fornecedores." }, "weighted": { - "title": "Controlled traffic split", - "description": "Great for canary rollouts and gradual migration between models.", - "tip1": "Start with conservative split like 90/10.", - "tip2": "Keep the total at 100% and auto-balance after changes.", - "tip3": "Monitor success and latency before increasing canary weight." + "title": "Divisão de tráfego controlada", + "description": "Ótimo para lançamentos canary e migração gradual entre modelos.", + "tip1": "Começa com divisão conservadora tipo 90/10.", + "tip2": "Mantém o total em 100% e auto-balanceia após alterações.", + "tip3": "Monitoriza sucesso e latência antes de aumentar o peso canary." }, "round-robin": { - "title": "Predictable load sharing", - "description": "Best when models are equivalent and you need smooth distribution.", - "tip1": "Use at least 2 models.", - "tip2": "Set concurrency limits to avoid burst overload.", - "tip3": "Use queue timeout to fail fast under saturation." + "title": "Partilha de carga previsível", + "description": "Melhor quando os modelos são equivalentes e precisas de distribuição suave.", + "tip1": "Usa pelo menos 2 modelos.", + "tip2": "Define limites de concorrência para evitar sobrecarga de pico.", + "tip3": "Usa timeout de fila para falhar rápido sob saturação." }, "random": { - "title": "Quick spread with low setup", - "description": "Use when you need simple distribution without strict guarantees.", - "tip1": "Use models with similar latency profiles.", - "tip2": "Keep retries enabled to absorb random misses.", - "tip3": "Prefer this for experimentation, not strict SLAs." + "title": "Distribuição rápida com pouca configuração", + "description": "Usa quando precisas de distribuição simples sem garantias estritas.", + "tip1": "Usa modelos com perfis de latência semelhantes.", + "tip2": "Mantém as tentativas ativas para absorver falhas aleatórias.", + "tip3": "Prefere isto para experimentação, não para SLAs estritos." }, "least-used": { - "title": "Adaptive balancing", - "description": "Routes to less-used models to reduce hotspots over time.", - "tip1": "Works better under continuous traffic.", - "tip2": "Combine with health checks for safer balancing.", - "tip3": "Track per-model usage to validate distribution gains." + "title": "Balanceamento adaptativo", + "description": "Encaminha para modelos menos usados para reduzir pontos quentes ao longo do tempo.", + "tip1": "Funciona melhor sob tráfego contínuo.", + "tip2": "Combina com verificações de saúde para balanceamento mais seguro.", + "tip3": "Acompanha o uso por modelo para validar os ganhos de distribuição." }, "cost-optimized": { - "title": "Budget-first routing", - "description": "Routes to lower-cost models when pricing metadata is available.", - "tip1": "Ensure pricing coverage for all selected models.", - "tip2": "Keep a quality fallback for hard prompts.", - "tip3": "Use for batch/background jobs where cost is the main KPI." + "title": "Encaminhamento com orçamento primeiro", + "description": "Encaminha para modelos de menor custo quando há metadados de preço disponíveis.", + "tip1": "Garante cobertura de preços para todos os modelos selecionados.", + "tip2": "Mantém um fallback de qualidade para prompts difíceis.", + "tip3": "Usa para trabalhos batch/segundo plano onde o custo é o KPI principal." }, "reset-aware": { "title": "Rotação de conta com reconhecimento de redefinição", @@ -3534,11 +3606,11 @@ "tip3": "Mantenha a faixa de amarração pequena para que contas equivalentes ainda girem de forma justa." }, "strict-random": { - "title": "Shuffle deck distribution", - "description": "Each model is used exactly once per cycle before reshuffling.", - "tip1": "Use at least 2 models for meaningful distribution.", - "tip2": "Works best with equivalent-performance models.", - "tip3": "Ideal for load balancing across multiple API accounts." + "title": "Distribuição por baralhamento", + "description": "Cada modelo é usado exatamente uma vez por ciclo antes de baralhar.", + "tip1": "Usa pelo menos 2 modelos para distribuição significativa.", + "tip2": "Funciona melhor com modelos de desempenho equivalente.", + "tip3": "Ideal para balanceamento de carga entre várias contas de API." }, "fill-first": { "description": "Esgotar as cotas do provedor sequencialmente antes de voltar atrás.", @@ -3583,82 +3655,82 @@ "title": "Poder de Duas Escolhas" } }, - "templateFreeStack": "Free Stack ($0)", - "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models). Zero cost, never stops coding.", + "templateFreeStack": "Stack Grátis ($0)", + "templateFreeStackDesc": "Round-robin entre todos os fornecedores grátis: Kiro (Claude), Qoder (5 modelos), Qwen (4 modelos). Custo zero, nunca para.", "auto": "Auto Combo", "autoDesc": "Pool de roteamento inteligente (Otimizado)", "lkgp": "Modo LKGP", "lkgpDesc": "Último Provedor Bom Conhecido (Resiliência previsível)", - "wizardGuideTitle": "Getting Started with Combos", - "wizardGuideDesc": "Create model combos to route AI traffic intelligently", - "wizardGuideHint": "or click + Create Combo above", - "createFirstCombo": "Create Your First Combo", - "wizardStep1Title": "Name Your Combo", - "wizardStep1Desc": "Give your combo a unique name to identify it in routing rules", - "wizardStep2Title": "Add Models", - "wizardStep2Desc": "Select AI models and arrange their fallback priority order", - "wizardStep3Title": "Choose Strategy", + "wizardGuideTitle": "Primeiros passos com Combos", + "wizardGuideDesc": "Cria combos de modelos para encaminhar tráfego de IA de forma inteligente", + "wizardGuideHint": "ou clica em + Criar Combo acima", + "createFirstCombo": "Cria o Teu Primeiro Combo", + "wizardStep1Title": "Dá Nome ao Teu Combo", + "wizardStep1Desc": "Dá ao teu combo um nome único para o identificares nas regras de encaminhamento", + "wizardStep2Title": "Adicionar Modelos", + "wizardStep2Desc": "Seleciona modelos de IA e organiza a ordem de prioridade de fallback", + "wizardStep3Title": "Escolher Estratégia", "wizardStep3Desc": "Pick how requests are distributed across your models - 13 strategies available", - "wizardStep4Title": "Review & Save", - "wizardStep4Desc": "Review your configuration and activate the combo", - "emailVisibilityStateOn": "On", - "emailVisibilityStateOff": "Off", - "reorderHandle": "Drag to reorder", - "failedReorder": "Failed to reorder models", - "builderFlowTitle": "Combo Builder Flow", + "wizardStep4Title": "Rever e Guardar", + "wizardStep4Desc": "Rever a configuração e ativar o combo", + "emailVisibilityStateOn": "Ligado", + "emailVisibilityStateOff": "Desligado", + "reorderHandle": "Arrasta para reordenar", + "failedReorder": "Falha ao reordenar modelos", + "builderFlowTitle": "Fluxo do Construtor de Combos", "builderStage": { "basics": { - "label": "Basics", - "description": "Name and starting template" + "label": "Básico", + "description": "Nome e modelo inicial" }, "steps": { - "label": "Steps", - "description": "Provider, model, and account selection" + "label": "Passos", + "description": "Seleção de fornecedor, modelo e conta" }, "strategy": { - "label": "Strategy", - "description": "Routing behavior and advanced settings" + "label": "Estratégia", + "description": "Comportamento de encaminhamento e definições avançadas" }, "intelligent": { - "label": "Smart Routing", - "description": "Auto-routing candidate pool, presets, and scoring" + "label": "Encaminhamento Inteligente", + "description": "Conjunto de candidatos, predefinições e pontuação de auto-encaminhamento" }, "review": { - "label": "Review", - "description": "Final validation before saving" + "label": "Rever", + "description": "Validação final antes de guardar" } }, - "builderStageVisited": "Stage completed", - "builderStageCurrent": "Current stage", - "builderStagePending": "Pending", - "builderStageLocked": "Locked — complete previous stage first", - "builderTitle": "Build a Combo", - "builderBrowseCatalog": "Browse catalog", - "builderProvider": "Provider", - "builderLoadingProviders": "Loading providers...", - "builderSelectProvider": "Select provider", - "builderModel": "Model", - "builderSelectModel": "Select model", - "builderProviderFirst": "Pick provider first", - "builderAccount": "Account", - "builderPreview": "Preview", - "builderAddStep": "Add step", + "builderStageVisited": "Etapa concluída", + "builderStageCurrent": "Etapa atual", + "builderStagePending": "Pendente", + "builderStageLocked": "Bloqueado — completa primeiro a etapa anterior", + "builderTitle": "Construir um Combo", + "builderBrowseCatalog": "Explorar catálogo", + "builderProvider": "Fornecedor", + "builderLoadingProviders": "A carregar fornecedores...", + "builderSelectProvider": "Selecionar fornecedor", + "builderModel": "Modelo", + "builderSelectModel": "Selecionar modelo", + "builderProviderFirst": "Escolhe primeiro o fornecedor", + "builderAccount": "Conta", + "builderPreview": "Pré-visualização", + "builderAddStep": "Adicionar passo", "builderDuplicateExact": "Esta etapa exata de provedor/modelo/conta já está no combo.", - "builderComboRef": "Combo Ref", - "builderAddComboRef": "Add combo reference", - "builderComboRefStep": "Add combo reference", - "builderPinnedAccount": "Pinned Account", - "builderLegacyEntry": "Legacy entry", - "reviewName": "Name", - "reviewStrategy": "Strategy", - "reviewSteps": "Steps", - "reviewAccounts": "Accounts", - "reviewProviders": "Providers", - "reviewComboRefs": "Combo References", - "reviewAdvanced": "Advanced Settings", - "reviewAgentFlags": "Agent Flags", - "reviewSequence": "Model Sequence", - "reviewNoSteps": "No steps configured", + "builderComboRef": "Referência de Combo", + "builderAddComboRef": "Adicionar referência de combo", + "builderComboRefStep": "Adicionar referência de combo", + "builderPinnedAccount": "Conta Fixada", + "builderLegacyEntry": "Entrada legada", + "reviewName": "Nome", + "reviewStrategy": "Estratégia", + "reviewSteps": "Passos", + "reviewAccounts": "Contas", + "reviewProviders": "Fornecedores", + "reviewComboRefs": "Referências de Combo", + "reviewAdvanced": "Definições Avançadas", + "reviewAgentFlags": "Sinalizações de Agente", + "reviewSequence": "Sequência de Modelos", + "reviewNoSteps": "Nenhum passo configurado", "builderStagesDescription": "Conclua cada etapa para definir combos, construir etapas, selecionar estratégia de roteamento e revisar resultados.", "builderStepsDescription": "Crie cada etapa do combo em ordem: provedor, modelo e conta. Isso permite reutilizar o mesmo provedor e modelo em contas diferentes.", "selectProvider": "Selecione o provedor", @@ -3728,25 +3800,25 @@ "range7d": "7 dias", "range30d": "30 dias", "range90d": "90 dias", - "range180d": "180 Days", - "range365d": "365 Days", + "range180d": "180 Dias", + "range365d": "365 Dias", "rangeAll": "Todos os tempos", "spend30d": "Spend30D", - "activeModels": "Active Models", - "selectedWindow": "Selected Window", - "activeProviders": "Active Providers", + "activeModels": "Modelos Ativos", + "selectedWindow": "Janela Selecionada", + "activeProviders": "Fornecedores Ativos", "overviewTitle": "Overview Title", "spend7d": "Spend7D", "avgCostPerRequest": "Avg Cost Per Request", "noCostDataDescription": "No Cost Data Description", - "spendToday": "Spend Today", + "spendToday": "Gasto Hoje", "overviewLoadFailed": "Overview Load Failed", "overviewDescription": "Overview Description", - "providerShare": "Provider Share", - "topProviders": "Top Providers", - "costTrend": "Cost Trend", + "providerShare": "Quota por Fornecedor", + "topProviders": "Principais Fornecedores", + "costTrend": "Tendência de Custo", "noCostDataTitle": "No Cost Data Title", - "topModels": "Top Models", + "topModels": "Principais Modelos", "requestsInWindow": "Requests In Window", "tokenUsage": "Uso de token", "totalTokens": "Total de fichas", @@ -3823,7 +3895,7 @@ "disableCloud": "Desativar nuvem", "enableCloud": "Habilitar nuvem", "modelsAcrossEndpoints": "Modelos {models} em endpoints {endpoints}", - "loadingModels": "Loading available models...", + "loadingModels": "A carregar modelos disponíveis...", "chatDesc": "Bate-papo com e sem streaming com todos os provedores", "embeddings": "Incorporações", "embeddingsDesc": "Incorporações de texto para pipelines de pesquisa e RAG", @@ -3835,22 +3907,22 @@ "audioTranscriptionDesc": "Transcrever arquivos de áudio para texto (Whisper)", "textToSpeech": "Texto para fala", "textToSpeechDesc": "Converta texto em fala com som natural", - "musicGeneration": "Music Generation", - "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "musicGeneration": "Geração de Música", + "musicDesc": "Gera música e faixas de áudio via ComfyUI (Stable Audio, MusicGen)", "moderations": "Moderações", "moderationsDesc": "Moderação de conteúdo e classificação de segurança", "responsesDesc": "API Responses do OpenAI para Codex e fluxos de trabalho agênticos avançados", "listModelsDesc": "Listar todos os modelos disponíveis em todos os fornecedores conectados", "settingsApiDesc": "Ler e modificar a configuração do OmniRoute via API", - "settingsApi": "Settings API", + "settingsApi": "API de Definições", "categoryCore": "APIs Principais", "categoryMedia": "Mídia e Multi-Modal", - "categorySearch": "Search & Discovery", + "categorySearch": "Pesquisa e Descoberta", "categoryUtility": "Utilidades e Gestão", - "webSearch": "Web Search", - "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching", - "searchProvider": "Search Provider", - "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected.", + "webSearch": "Pesquisa Web", + "webSearchDesc": "Pesquisa web unificada entre vários fornecedores com failover automático e cache", + "searchProvider": "Fornecedor de Pesquisa", + "searchProviderDesc": "Este fornecedor é usado para pesquisa web via POST /v1/search. Não é necessária configuração de modelo — os fornecedores de pesquisa são registados automaticamente.", "enableCloudTitle": "Ativar proxy de nuvem", "whatYouGet": "O que você receberá", "cloudBenefitAccess": "Acesse sua API de qualquer lugar do mundo", @@ -3883,60 +3955,60 @@ "cloudWorkerUnreachable": "Não foi possível entrar em contato com o trabalhador da nuvem. Certifique-se de que o serviço de nuvem esteja em execução (npm run dev in/cloud).", "connectionFailed": "Falha na conexão", "syncFailed": "Falha ao sincronizar dados na nuvem", - "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredTitle": "Túnel Rápido da Cloudflare", "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint to make it accessible from the internet without configuring DNS.", "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. URLs change after restart.", - "cloudflaredEnable": "Enable Tunnel", - "cloudflaredInstallAndEnable": "Install & Enable", - "cloudflaredDisable": "Stop Tunnel", - "cloudflaredRunning": "Running", - "cloudflaredStarting": "Starting", - "cloudflaredStoppedState": "Stopped", - "cloudflaredNotInstalled": "Not installed", - "cloudflaredUnsupported": "Unsupported", - "cloudflaredError": "Error", - "cloudflaredStarted": "Cloudflare tunnel started", - "cloudflaredStopped": "Cloudflare tunnel stopped", - "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", + "cloudflaredEnable": "Ativar Túnel", + "cloudflaredInstallAndEnable": "Instalar e Ativar", + "cloudflaredDisable": "Parar Túnel", + "cloudflaredRunning": "Em execução", + "cloudflaredStarting": "A iniciar", + "cloudflaredStoppedState": "Parado", + "cloudflaredNotInstalled": "Não instalado", + "cloudflaredUnsupported": "Não suportado", + "cloudflaredError": "Erro", + "cloudflaredStarted": "Túnel da Cloudflare iniciado", + "cloudflaredStopped": "Túnel da Cloudflare parado", + "cloudflaredRequestFailed": "Falha ao atualizar o túnel da Cloudflare", "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after restart.", "cloudflaredUnsupportedNote": "This platform is not supported for managed installation.", - "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", - "cloudflaredLastError": "Last error: {error}", + "cloudflaredIdleNote": "Cria um túnel rápido temporário da Cloudflare para este endpoint.", + "cloudflaredLastError": "Último erro: {error}", "providerModelsTitle": "{provider} — Modelos", "noModelsForProvider": "Nenhum modelo disponível para este fornecedor.", "chat": "Bate-papo", "embedding": "Incorporação", "image": "Imagem", "custom": "personalizado", - "modelsCount": "{count, plural, one {# model} other {# models}}", - "sectionTitle": "Integration Surface", - "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", - "tabApis": "APIs", - "tabProtocols": "Protocols", - "tabsAria": "Endpoint sections", - "protocolsTitle": "Protocols", - "protocolsDescription": "MCP and A2A are first-class endpoints with dedicated observability and controls.", - "mcpCardTitle": "MCP Server", - "mcpCardDescription": "Model Context Protocol over stdio", - "a2aCardTitle": "A2A Server", - "a2aCardDescription": "Agent2Agent JSON-RPC endpoint", - "protocolToolsLabel": "Tools", - "protocolTasksLabel": "Tasks", - "protocolActiveStreamsLabel": "Active streams", - "protocolLastActivity": "Last activity", - "quickStart": "Quick Start", - "openMcpDashboard": "Open MCP management", - "openA2aDashboard": "Open A2A management", - "mcpQuickStartTitle": "MCP Quick Start", - "mcpQuickStartStep1": "Run the MCP server via `omniroute --mcp`.", - "mcpQuickStartStep2": "Configure your MCP client to connect over stdio transport.", - "mcpQuickStartStep3": "Invoke tools such as `omniroute_get_health` and `omniroute_list_combos`.", - "a2aQuickStartTitle": "A2A Quick Start", - "a2aQuickStartStep1": "Discover the agent card at `/.well-known/agent.json`.", - "a2aQuickStartStep2": "Send JSON-RPC requests to `POST /a2a` using `message/send` or `message/stream`.", - "a2aQuickStartStep3": "Track and control tasks using `tasks/get` and `tasks/cancel`.", - "completionsLegacy": "Completions (Legacy)", - "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format", + "modelsCount": "{count, plural, one {# modelo} other {# modelos}}", + "sectionTitle": "Superfície de Integração", + "sectionDescription": "APIs compatíveis com OpenAI e endpoints de protocolo operacional", + "tabApis": "__MISSING__:APIs", + "tabProtocols": "Protocolos", + "tabsAria": "Secções de endpoint", + "protocolsTitle": "Protocolos", + "protocolsDescription": "MCP e A2A são endpoints de primeira classe com observabilidade e controlos dedicados.", + "mcpCardTitle": "Servidor MCP", + "mcpCardDescription": "Model Context Protocol sobre stdio", + "a2aCardTitle": "Servidor A2A", + "a2aCardDescription": "Endpoint JSON-RPC Agent2Agent", + "protocolToolsLabel": "Ferramentas", + "protocolTasksLabel": "Tarefas", + "protocolActiveStreamsLabel": "Streams ativos", + "protocolLastActivity": "Última atividade", + "quickStart": "Início Rápido", + "openMcpDashboard": "Abrir gestão MCP", + "openA2aDashboard": "Abrir gestão A2A", + "mcpQuickStartTitle": "Início Rápido MCP", + "mcpQuickStartStep1": "Executa o servidor MCP via `omniroute --mcp`.", + "mcpQuickStartStep2": "Configura o teu cliente MCP para ligar por transporte stdio.", + "mcpQuickStartStep3": "Invoca ferramentas como `omniroute_get_health` e `omniroute_list_combos`.", + "a2aQuickStartTitle": "Início Rápido A2A", + "a2aQuickStartStep1": "Descobre o cartão do agente em `/.well-known/agent.json`.", + "a2aQuickStartStep2": "Envia pedidos JSON-RPC para `POST /a2a` usando `message/send` ou `message/stream`.", + "a2aQuickStartStep3": "Acompanha e controla tarefas usando `tasks/get` e `tasks/cancel`.", + "completionsLegacy": "Completions (Legado)", + "completionsLegacyDesc": "Completions de texto OpenAI legadas — aceita tanto string de prompt como formato de array de mensagens", "messagesApi": "Mensagens", "messagesApiDesc": "Formato API de mensagens antrópicas nativas para provedores compatíveis com Claude", "imageEdits": "Edições de imagem", @@ -3945,40 +4017,40 @@ "batchApiDesc": "Processe grandes lotes de solicitações de forma assíncrona (compatível com OpenAI)", "filesApi": "API de arquivos", "filesApiDesc": "Carregar e gerenciar arquivos para processamento em lote", - "videoGeneration": "Video Generation", - "videoDesc": "Generate videos using AI models like ComfyUI and Stable Video Diffusion.", - "tailscaleRequestFailed": "Failed to load Tailscale status", - "tailscaleEnableFailed": "Failed to enable Tailscale Funnel", - "tailscaleWaitingForLogin": "Complete the Tailscale login in the opened browser tab. OmniRoute will retry automatically.", - "tailscaleLoginTimedOut": "Timed out waiting for Tailscale login", - "tailscaleWaitingForFunnel": "Enable Funnel for this device in the opened browser tab. OmniRoute will keep polling.", - "tailscaleFunnelTimedOut": "Timed out waiting for Tailscale Funnel to be enabled", - "tailscaleStarted": "Tailscale Funnel enabled", - "tailscaleDisableFailed": "Failed to disable Tailscale Funnel", - "tailscaleStopped": "Tailscale Funnel disabled", - "tailscaleInstallFailed": "Failed to install Tailscale", - "tailscaleInstallProgress": "Working...", - "tailscaleInstalled": "Tailscale installed successfully", - "tailscaleRunning": "Running", - "tailscaleNeedsLogin": "Needs Login", - "tailscaleStoppedState": "Stopped", - "tailscaleNotInstalled": "Not installed", - "tailscaleUnsupported": "Unsupported", - "tailscaleError": "Error", - "tailscaleDisable": "Stop Funnel", - "tailscaleInstallAndEnable": "Install & Enable", - "tailscaleLoginAndEnable": "Login & Enable", - "tailscaleEnable": "Enable Funnel", - "tailscaleUrlNotice": "Uses your Tailscale .ts.net address. Login and Funnel approval may be required on first use.", + "videoGeneration": "Geração de Vídeo", + "videoDesc": "Gera vídeos usando modelos de IA como ComfyUI e Stable Video Diffusion.", + "tailscaleRequestFailed": "Falha ao carregar o estado do Tailscale", + "tailscaleEnableFailed": "Falha ao ativar Tailscale Funnel", + "tailscaleWaitingForLogin": "Completa o login do Tailscale no separador do browser aberto. O OmniRoute vai tentar novamente automaticamente.", + "tailscaleLoginTimedOut": "Tempo limite esgotado à espera do login do Tailscale", + "tailscaleWaitingForFunnel": "Ativa o Funnel para este dispositivo no separador do browser aberto. O OmniRoute vai continuar a verificar.", + "tailscaleFunnelTimedOut": "Tempo limite esgotado à espera da ativação do Tailscale Funnel", + "tailscaleStarted": "Tailscale Funnel ativado", + "tailscaleDisableFailed": "Falha ao desativar Tailscale Funnel", + "tailscaleStopped": "Tailscale Funnel desativado", + "tailscaleInstallFailed": "Falha ao instalar Tailscale", + "tailscaleInstallProgress": "A trabalhar...", + "tailscaleInstalled": "Tailscale instalado com sucesso", + "tailscaleRunning": "Em execução", + "tailscaleNeedsLogin": "Requer Login", + "tailscaleStoppedState": "Parado", + "tailscaleNotInstalled": "Não instalado", + "tailscaleUnsupported": "Não suportado", + "tailscaleError": "Erro", + "tailscaleDisable": "Parar Funnel", + "tailscaleInstallAndEnable": "Instalar e Ativar", + "tailscaleLoginAndEnable": "Iniciar Sessão e Ativar", + "tailscaleEnable": "Ativar Funnel", + "tailscaleUrlNotice": "Usa o teu endereço .ts.net do Tailscale. Pode ser necessário login e aprovação do Funnel na primeira utilização.", "tailscaleTitle": "Tailscale Funnel", - "tailscaleNeedsLoginHint": "Authenticate this machine with Tailscale, then enable Funnel.", - "tailscaleBinaryPath": "Binary: {path}", - "tailscaleLastError": "Last error: {error}", - "tailscaleInstallTitle": "Install Tailscale", - "tailscaleInstallIntro": "Installs Tailscale on this machine and prepares OmniRoute to enable Funnel.", - "tailscaleInstallPasswordHint": "On macOS and Linux, sudo may be required for the package install and daemon start.", - "tailscaleSudoPlaceholder": "Optional sudo password", - "tailscaleInstalling": "Installing", + "tailscaleNeedsLoginHint": "Autentica esta máquina com o Tailscale e depois ativa o Funnel.", + "tailscaleBinaryPath": "Binário: {path}", + "tailscaleLastError": "Último erro: {error}", + "tailscaleInstallTitle": "Instalar Tailscale", + "tailscaleInstallIntro": "Instala o Tailscale nesta máquina e prepara o OmniRoute para ativar o Funnel.", + "tailscaleInstallPasswordHint": "No macOS e Linux, pode ser necessário sudo para a instalação do pacote e início do daemon.", + "tailscaleSudoPlaceholder": "Palavra-passe sudo opcional", + "tailscaleInstalling": "A instalar", "tailscaleSudoLabel": "Senha Sudo (obrigatória no macOS/Linux)", "ngrokTitle": "Túnel ngrok", "ngrokRunning": "Rodando", @@ -4055,7 +4127,7 @@ "vscodeAliasModelsLabel": "Modelos do VS Code", "vscodeAliasChatLabel": "Chat do VS Code", "localServer": "Servidor local", - "cloudOmniroute": "Cloud OmniRoute", + "cloudOmniroute": "OmniRoute Cloud", "copyUrl": "Copiar URL", "badgeLoopbackTooltip": "Este endpoint só está acessível localmente (apenas loopback)", "badgeAlwaysProtectedTooltip": "Este endpoint está sempre protegido e requer autorização", @@ -4067,9 +4139,9 @@ "tierPublic": "Público", "hideInternal": "Ocultar Internos", "showInternal": "Mostrar Internos", - "customSystemPromptTitle": "Custom System Prompt", - "customSystemPromptDescription": "Inject a custom system prompt into every model request", - "customSystemPromptPlaceholder": "e.g. Always respond in pirate speak...", + "customSystemPromptTitle": "Prompt de Sistema Personalizado", + "customSystemPromptDescription": "Injeta um prompt de sistema personalizado em cada pedido de modelo", + "customSystemPromptPlaceholder": "ex: Responde sempre como pirata...", "obsidianEnterToken": "Introduza um token da API do Obsidian", "obsidianConnectFailed": "Falha ao ligar", "obsidianConnectionFailed": "A ligação falhou", @@ -4118,7 +4190,7 @@ "notionTokenConfigured": "Token configurado. As ferramentas Notion estão disponíveis através do MCP." }, "endpoints": { - "tabProxy": "Endpoint Proxy", + "tabProxy": "Proxy de Endpoint", "tabApiEndpoints": "Endpoints de API", "apiEndpointsTitle": "Endpoints de API", "apiEndpointsDescription": "Endpoints de API backend que podem ser consumidos por outras aplicações e serviços. Esta seção listará todas as APIs REST disponíveis com documentação e testes.", @@ -4130,19 +4202,19 @@ "featureAuth": "Gestão de chaves API e escopos OAuth por endpoint" }, "mcpDashboard": { - "loading": "Loading MCP dashboard...", - "activate": "activate", - "deactivate": "deactivate", - "confirmSwitchCombo": "Confirm {action} combo \"{combo}\"?", - "switchComboFailed": "Failed to switch combo state.", - "switchComboSuccess": "Combo \"{combo}\" updated.", - "confirmApplyProfile": "Apply resilience profile \"{profile}\"?", - "applyProfileFailed": "Failed to apply resilience profile.", - "applyProfileSuccess": "Profile \"{profile}\" applied.", - "confirmResetBreakers": "Reset all circuit breakers?", - "resetBreakersFailed": "Failed to reset circuit breakers.", - "resetBreakersSuccess": "Circuit breakers reset.", - "processStatus": "Process status", + "loading": "A carregar painel MCP...", + "activate": "ativar", + "deactivate": "desativar", + "confirmSwitchCombo": "Confirmar {action} do combo \"{combo}\"?", + "switchComboFailed": "Falha ao alternar o estado do combo.", + "switchComboSuccess": "Combo \"{combo}\" atualizado.", + "confirmApplyProfile": "Aplicar perfil de resiliência \"{profile}\"?", + "applyProfileFailed": "Falha ao aplicar o perfil de resiliência.", + "applyProfileSuccess": "Perfil \"{profile}\" aplicado.", + "confirmResetBreakers": "Repor todos os disjuntores?", + "resetBreakersFailed": "Falha ao repor os disjuntores.", + "resetBreakersSuccess": "Disjuntores repostos.", + "processStatus": "Estado do processo", "online": "Online", "offline": "Offline", "disableLabel": "Desativar {label}", @@ -4160,119 +4232,119 @@ "mcpStep2": "Configure o seu cliente MCP para se ligar através do transporte stdio.", "mcpStep3": "Invoque ferramentas como {code1} e {code2}.", "pid": "PID", - "sessionUptime": "Session uptime", - "lastHeartbeat": "Last heartbeat", - "activity24h": "Activity (24h)", - "totalCalls": "Total calls", - "successRate": "Success rate", - "avgLatency": "Avg latency", - "topTools": "Top tools", - "noToolCalls24h": "No tool calls in the last 24 hours.", - "runtimeDetails": "Runtime details", - "transport": "Transport", - "scopesEnforced": "Scopes enforced", - "yes": "yes", - "no": "no", - "lastCall": "Last call", - "heartbeatPath": "Heartbeat path", - "operationalControls": "Operational controls", - "switchCombo": "Switch combo", - "inactive": "inactive", - "active": "active", - "activateCombo": "Activate combo", - "deactivateCombo": "Deactivate combo", - "applyResilienceProfile": "Apply resilience profile", - "profileAggressive": "aggressive", - "profileBalanced": "balanced", - "profileConservative": "conservative", - "applyProfile": "Apply profile", - "resetCircuitBreakers": "Reset circuit breakers", - "resetCircuitBreakersHelp": "Clears current breaker state and failure counters for providers.", - "resetAllBreakers": "Reset all breakers", - "toolsAndScopes": "Tools and scopes", - "tableTool": "Tool", - "tableScopes": "Scopes", - "tablePhase": "Phase", - "tableAudit": "Audit", - "auditLog": "Audit log", - "auditSummary": "Calls: {total} | page {page} of {totalPages}", - "allTools": "All tools", - "allResults": "All results", - "success": "Success", - "failure": "Failure", + "sessionUptime": "Tempo de atividade da sessão", + "lastHeartbeat": "Último heartbeat", + "activity24h": "Atividade (24h)", + "totalCalls": "Total de chamadas", + "successRate": "Taxa de sucesso", + "avgLatency": "Latência média", + "topTools": "Principais ferramentas", + "noToolCalls24h": "Nenhuma chamada de ferramenta nas últimas 24 horas.", + "runtimeDetails": "Detalhes de runtime", + "transport": "Transporte", + "scopesEnforced": "Âmbitos aplicados", + "yes": "sim", + "no": "não", + "lastCall": "Última chamada", + "heartbeatPath": "Caminho do heartbeat", + "operationalControls": "Controlos operacionais", + "switchCombo": "Alternar combo", + "inactive": "inativo", + "active": "ativo", + "activateCombo": "Ativar combo", + "deactivateCombo": "Desativar combo", + "applyResilienceProfile": "Aplicar perfil de resiliência", + "profileAggressive": "agressivo", + "profileBalanced": "equilibrado", + "profileConservative": "conservador", + "applyProfile": "Aplicar perfil", + "resetCircuitBreakers": "Repor disjuntores", + "resetCircuitBreakersHelp": "Limpa o estado atual do disjuntor e os contadores de falhas dos fornecedores.", + "resetAllBreakers": "Repor todos os disjuntores", + "toolsAndScopes": "Ferramentas e âmbitos", + "tableTool": "Ferramenta", + "tableScopes": "Âmbitos", + "tablePhase": "Fase", + "tableAudit": "Auditoria", + "auditLog": "Registo de auditoria", + "auditSummary": "Chamadas: {total} | página {page} de {totalPages}", + "allTools": "Todas as ferramentas", + "allResults": "Todos os resultados", + "success": "Sucesso", + "failure": "Falha", "apiKeyIdPlaceholder": "apiKeyId", - "loadingAuditEntries": "Loading audit entries...", - "noAuditEntriesForFilters": "No audit entries found for current filters.", - "tableTimestamp": "Timestamp", - "tableDuration": "Duration", - "tableResult": "Result", - "tableApiKey": "API key", - "failed": "failed", - "previous": "Previous", - "next": "Next", - "apiKeyId": "Api Key Id", - "offset": "Offset", - "limit": "Limit", - "tool": "Tool" + "loadingAuditEntries": "A carregar entradas de auditoria...", + "noAuditEntriesForFilters": "Nenhuma entrada de auditoria encontrada para os filtros atuais.", + "tableTimestamp": "Marca de tempo", + "tableDuration": "Duração", + "tableResult": "Resultado", + "tableApiKey": "Chave de API", + "failed": "falhou", + "previous": "Anterior", + "next": "Seguinte", + "apiKeyId": "ID da Chave de API", + "offset": "Desvio", + "limit": "Limite", + "tool": "Ferramenta" }, "a2aDashboard": { - "loading": "Loading A2A dashboard...", - "confirmCancelTask": "Cancel task {taskId}?", - "cancelTaskFailed": "Failed to cancel task.", - "cancelTaskSuccess": "Task {taskId} cancelled.", - "smokeSendFailed": "message/send smoke test failed.", - "smokeSendSuccessWithTask": "message/send ok (task {taskId}).", + "loading": "A carregar o painel A2A...", + "confirmCancelTask": "Cancelar a tarefa {taskId}?", + "cancelTaskFailed": "Falha ao cancelar a tarefa.", + "cancelTaskSuccess": "Tarefa {taskId} cancelada.", + "smokeSendFailed": "Teste de fumo message/send falhou.", + "smokeSendSuccessWithTask": "message/send ok (tarefa {taskId}).", "smokeSendSuccess": "message/send ok.", - "smokeStreamFailed": "message/stream smoke test failed.", - "smokeStreamSuccessWithTask": "message/stream ok (task {taskId}{stateSuffix}).", - "smokeStreamNoTaskId": "message/stream finished without task id.", - "health": "Health", - "ok": "ok", - "totalTasks": "Total tasks", - "activeStreams": "Active streams", - "lastTask": "Last task", - "taskStateOverview": "Task state overview", + "smokeStreamFailed": "Teste de fumo message/stream falhou.", + "smokeStreamSuccessWithTask": "message/stream ok (tarefa {taskId}).", + "smokeStreamNoTaskId": "message/stream terminou sem ID de tarefa.", + "health": "Estado de saúde", + "ok": "OK", + "totalTasks": "Total de tarefas", + "activeStreams": "Streams ativos", + "lastTask": "Última tarefa", + "taskStateOverview": "Visão geral do estado da tarefa", "state": { - "submitted": "submitted", - "working": "working", - "completed": "completed", - "failed": "failed", - "cancelled": "cancelled" + "submitted": "submetido", + "working": "a trabalhar", + "completed": "concluído", + "failed": "falhou", + "cancelled": "cancelado" }, - "agentCard": "Agent card", + "agentCard": "Cartão do agente", "agentCardPath": "/.well-known/agent.json", - "version": "Version", + "version": "Versão", "url": "URL", "capabilities": "Capacidades", "agentCardNotAvailable": "Cartão de agente não disponível.", "quickValidation": "Validação rápida", "quickValidationDescription": "Executa chamadas smoke através do endpoint `/a2a` ativo.", - "runMessageSend": "Run message/send", - "runMessageStream": "Run message/stream", + "runMessageSend": "Executar message/send", + "runMessageStream": "Executar message/stream", "taskManagement": "Gerenciamento de tarefas", - "taskSummary": "{total} tasks | page {page} of {totalPages}", - "allStates": "all", - "allSkills": "all skills", - "loadingTasks": "Loading tasks...", - "noTasksForFilters": "No tasks found for current filters.", - "tableTask": "Task", - "tableSkill": "Skill", - "tableState": "State", - "tableUpdated": "Updated", - "tableActions": "Actions", - "view": "View", - "cancel": "Cancel", - "previous": "Previous", - "next": "Next", - "taskDetail": "Task detail", - "close": "Close", - "metadata": "Metadata", - "events": "Events", + "taskSummary": "{total} tarefas | página {page} de {totalPages}", + "allStates": "todos", + "allSkills": "todas as competências", + "loadingTasks": "A carregar tarefas...", + "noTasksForFilters": "Nenhuma tarefa encontrada para os filtros atuais.", + "tableTask": "Tarefa", + "tableSkill": "Competência", + "tableState": "Estado", + "tableUpdated": "Atualizado", + "tableActions": "Ações", + "view": "Ver", + "cancel": "Cancelar", + "previous": "Anterior", + "next": "Seguinte", + "taskDetail": "Detalhe da tarefa", + "close": "Fechar", + "metadata": "Metadados", + "events": "Eventos", "artifacts": "Artefatos", - "tablePhase": "Table Phase", - "offset": "Offset", - "limit": "Limit", - "skill": "Skill", + "tablePhase": "Fase da tabela", + "offset": "Desvio", + "limit": "Limite", + "skill": "Competência", "rpcEndpoint": "POSTAR /a2a", "rpcMethodSend": "mensagem/enviar", "rpcMethodStream": "mensagem/fluxo", @@ -4308,7 +4380,7 @@ "content": "Conteúdo", "contentPlaceholder": "Valor ou conteúdo JSON para lembrar", "created": "Criado", - "delete": "Delete", + "delete": "Eliminar", "deleteConfirmDesc": "Esta ação não pode ser anulada. A memória será removida permanentemente.", "deleteConfirmTitle": "Eliminar memória?", "description": "Visualize e gerencie entradas de memória armazenadas", @@ -4408,7 +4480,7 @@ "errorFetch": "Falha ao obter a pré-visualização" }, "previous": "Anterior", - "procedural": "Procedural", + "procedural": "Procedimental", "qdrant": { "title": "Qdrant (Armazenamento Vetorial de Nível 2)", "description": "Integração opcional do Qdrant para pesquisa semântica escalável", @@ -4486,9 +4558,9 @@ "memoryEnabled": "Memória ativada" }, "skills": { - "title": "Skills", + "title": "Competências", "description": "Gerencie e monitore skills de IA", - "skillsTab": "Skills", + "skillsTab": "Competências", "executionsTab": "Execuções", "selectSkillToInspect": "Selecione uma competência à esquerda para inspecionar.", "schemaTab": "Esquema", @@ -4509,8 +4581,8 @@ "delete": "Eliminar", "version": "Versão", "tableDescription": "Descrição", - "skill": "Skill", - "status": "Status", + "skill": "Competência", + "status": "Estado", "duration": "Duração", "time": "Tempo", "sandboxConfig": "Configuração da Sandbox", @@ -4518,11 +4590,11 @@ "cpuLimitDesc": "Tempo máximo de execução por skill", "memoryLimit": "Limite de Memória", "memoryLimitDesc": "Alocação máxima de memória", - "timeout": "Timeout", + "timeout": "Tempo Limite", "timeoutDesc": "Tempo máximo de espera por resposta", "networkAccess": "Acesso à Rede", "networkAccessDesc": "Permitir requisições de rede de saída", - "mode": "Mode", + "mode": "Modo", "q": "Q", "filterSkillsPlaceholder": "Filtre habilidades por nome, descrição ou tag", "allModes": "Todos os modos", @@ -4530,7 +4602,7 @@ "enabledSkills": "Ativado", "totalExecutions": "Execuções", "successRate": "Taxa de sucesso", - "marketplaceTab": "Marketplace", + "marketplaceTab": "Mercado", "applyFilters": "Aplicar filtros", "popularDefaultsLabel": "Popular por predefinição para o fornecedor selecionado:", "onMode": "LIGADO", @@ -4614,9 +4686,9 @@ "providers": "Provedores", "configuredProvidersLabel": "Configurado no painel", "configuredProvidersHint": "Provedores com credenciais salvas em /dashboard/providers, independentemente do estado do tempo de execução.", - "activeProviders": "{count} active", + "activeProviders": "{count} ativos", "activeProvidersHint": "Provedores configurados atualmente habilitados para solicitações de roteamento.", - "monitoredProviders": "{count} monitored", + "monitoredProviders": "{count} monitorizados", "monitoredProvidersHint": "Provedores atualmente monitorados por monitores de integridade dos disjuntores.", "healthyCount": "{count} íntegro", "nodeVersion": "Nó {version}", @@ -4637,11 +4709,11 @@ "resetting": "Redefinindo...", "resetAll": "Redefinir tudo", "until": "Até {time}", - "limitExhausted": "Exhausted", - "learnedFromHeaders": "Learned from headers", - "remainingOfLimit": "{remaining}/{limit} remaining", - "throttleStatus": "Throttle: {value}", - "lastHeaderUpdate": "Header update: {age}", + "limitExhausted": "Esgotado", + "learnedFromHeaders": "Aprendido dos cabeçalhos", + "remainingOfLimit": "{remaining}/{limit} restantes", + "throttleStatus": "Limitação: {value}", + "lastHeaderUpdate": "Atualização de cabeçalho: {age}", "databaseHealth": "Integridade do banco de dados", "databaseHealthDescription": "Diagnostique e repare linhas de quota/domínio obsoletas e referências de combinação quebradas.", "status": "Estado", @@ -4689,7 +4761,7 @@ "inactive": "Inativo", "noConnectionId": "sem ID de ligação", "accountModelSummary": "{connectionId} · {count} modelos", - "cooldown": "cooldown", + "cooldown": "arrefecimento", "durationRemaining": "{duration} restante", "noSyncedModelsOrTraffic": "Ainda sem modelos sincronizados ou tráfego recente.", "providerRowSummary": "{active}/{total} contas ativas · {requests} req · {successRate} de sucesso · {latency} média", @@ -4804,28 +4876,28 @@ "previous": "Anterior", "next": "Próximo", "providerWarningTitle": "Provider Warning Title", - "viewDetails": "View Details", - "eventMetadata": "Event Metadata", - "eventPayload": "Event Payload", - "requestId": "Request Id", + "viewDetails": "Ver Detalhes", + "eventMetadata": "Metadados do Evento", + "eventPayload": "Payload do Evento", + "requestId": "ID do Pedido", "providerWarningDesc": "Provider Warning Desc", "a": "A", - "offset": "Offset", - "limit": "Limit", - "status": "Status", - "resourceType": "Resource Type", - "totalEntries": "Total Entries", - "tab": "Tab", + "offset": "Desvio", + "limit": "Limite", + "status": "Estado", + "resourceType": "Tipo de Recurso", + "totalEntries": "Total de Entradas", + "tab": "Separador", "auditModalSubtitle": "Audit Modal Subtitle", - "close": "Close", - "runningRequests": "Active Requests", - "runningRequestsDesc": "Real-time view of currently running upstream requests", + "close": "Fechar", + "runningRequests": "Pedidos Ativos", + "runningRequestsDesc": "Vista em tempo real dos pedidos upstream atualmente em execução", "clearAll": "Limpar tudo", "confirmClearActiveRequests": "Limpar todas as solicitações ativas?", - "model": "Model", - "provider": "Provider", - "account": "Account", - "elapsed": "Elapsed", + "model": "Modelo", + "provider": "Fornecedor", + "account": "Conta", + "elapsed": "Decorrido", "activeStage": "Fase", "activeStageUnknown": "Ainda não enviado para o upstream", "activeStageRegistered": "Registado", @@ -4835,17 +4907,17 @@ "activeStageRateLimitSlotAcquired": "Slot de limite de taxa adquirido", "activeStageSendingToProvider": "A enviar para o upstream", "activeStageProviderResponseStarted": "Resposta do upstream iniciada", - "count": "Count", + "count": "Contagem", "payloads": "Payloads", - "viewPayloads": "View", - "activeCount": "{count} active", - "clientPayload": "Client Request Payload", - "upstreamPayload": "Upstream Provider Payload", - "upstreamNotSentYet": "Not sent to upstream yet", - "runningRequestDetailMeta": "Account: {account} — Elapsed: {elapsed}", - "export": "Export", - "exporting": "Exporting...", - "exportFailed": "Export failed", + "viewPayloads": "Ver", + "activeCount": "{count} ativos", + "clientPayload": "Payload do Pedido do Cliente", + "upstreamPayload": "Payload do Fornecedor Upstream", + "upstreamNotSentYet": "Ainda não enviado para upstream", + "runningRequestDetailMeta": "Conta: {account} — Decorrido: {elapsed}", + "export": "Exportar", + "exporting": "A exportar...", + "exportFailed": "Falha na exportação", "cleanHistoryButton": "Limpar histórico", "cleanHistoryTitle": "Limpar histórico de registos?", "cleanHistoryMessage": "Isto limpa permanentemente todas as linhas de registo de pedidos, linhas de detalhes legadas e ficheiros de artefactos locais em DATA_DIR/call_logs. A página em tempo real será atualizada após a limpeza.", @@ -4854,13 +4926,13 @@ "cleanHistorySuccess": "Foram limpas {deleted} entradas de registo, {deletedArtifacts} artefactos e {deletedDetailedLogs} linhas de detalhes legadas.", "cleanHistoryEmpty": "Não foi encontrado nenhum histórico de registo de pedidos.", "cleanHistoryFailed": "Falha ao limpar o histórico de registos.", - "timeRange": "Time Range", - "lastNHours": "Last {hours}", - "defaultRange": "default", + "timeRange": "Intervalo de Tempo", + "lastNHours": "Últimas {hours}", + "defaultRange": "padrão", "consoleViewer": { - "fetchFailed": "Failed to fetch logs", - "copyFailed": "Failed to copy log entry", - "copyLogEntry": "Copy log entry", + "fetchFailed": "Falha ao obter registos", + "copyFailed": "Falha ao copiar entrada de registo", + "copyLogEntry": "Copiar entrada de registo", "filterByLevel": "Filtrar por nível de registo", "searchPlaceholder": "Pesquisar registos…", "searchAria": "Pesquisar entradas de registo", @@ -5079,8 +5151,8 @@ "modelsHiddenCount": "{count} ocultados", "warningCount": "{count} Aviso", "noConnections": "Sem conexões", - "expiredBadge": "Expired", - "expiringSoonBadge": "Expiring Soon", + "expiredBadge": "Expirado", + "expiringSoonBadge": "Expira em Breve", "freeTier": "Plano gratuito", "freeTierAvailable": "Nível gratuito disponível", "hasFreeTooltip": "Nível gratuito disponível", @@ -5133,7 +5205,7 @@ "failedCreate": "Falha ao criar provedor", "errorOccurred": "Ocorreu um erro. Por favor, tente novamente.", "modelStatus": "Status do modelo", - "showConfiguredOnly": "Configured only", + "showConfiguredOnly": "Apenas configurados", "allModelsOperational": "Todos os modelos operacionais", "modelsWithIssues": "{count} modelo(s) com problemas", "allModelsNormal": "Todos os modelos estão respondendo normalmente.", @@ -5144,7 +5216,7 @@ "clearing": "Limpando...", "until": "Até {time}", "providerTestFailed": "Falha no teste do provedor", - "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "providerTestTimeout": "O teste do fornecedor expirou — demasiadas ligações para testar de uma vez", "modeTest": "{mode} Teste", "passedCount": "{count} aprovado", "failedCount": "{count} falhou", @@ -5178,9 +5250,9 @@ "providerNotFound": "Provedor não encontrado", "deleteConnectionConfirm": "Excluir esta conexão?", "deleteConnectionConfirmNamed": "Tem a certeza de que pretende eliminar {name}? Esta ação não pode ser anulada.", - "batchDeleteSelected": "Delete Selected ({count})", - "batchDeleteConfirm": "Delete {count} connection(s)? This action cannot be undone.", - "batchDeleteSuccess": "Deleted {count} connection(s)", + "batchDeleteSelected": "Eliminar Selecionadas ({count})", + "batchDeleteConfirm": "Eliminar {count} ligação(ões)? Esta ação não pode ser desfeita.", + "batchDeleteSuccess": "Eliminada(s) {count} ligação(ões)", "batchActivateSelected": "Ativar", "batchDeactivateSelected": "Desativar", "batchRetestSelected": "Retestar", @@ -5196,7 +5268,7 @@ "filterError": "Erro", "filterBanned": "Banido", "filterCreditsExhausted": "Créditos esgotados", - "accountSearchPlaceholder": "Search accounts…", + "accountSearchPlaceholder": "Pesquisar contas…", "noFilteredConnections": "Nenhuma ligação corresponde ao filtro atual.", "failedSetAlias": "Falha ao definir o alias", "setAliasSuccess": "Alias {alias} definido", @@ -5210,13 +5282,13 @@ "messagesApi": "API de mensagens", "responsesApi": "API de respostas", "embeddings": "Embeddings", - "audioTranscriptions": "Audio Transcriptions", - "audioSpeech": "Audio Speech", - "imagesGenerations": "Images Generations", + "audioTranscriptions": "Transcrições de Áudio", + "audioSpeech": "Fala (Áudio)", + "imagesGenerations": "Gerações de Imagens", "chatCompletions": "Conclusões de bate-papo", "importingModels": "Importando...", "importFromModels": "Importar de /modelos", - "modelsImported": "{count} models imported", + "modelsImported": "{count} modelos importados", "allModelsAlreadyImported": "Todos os modelos já foram importados", "noNewModelsToImport": "Nenhum modelo novo para importar — todos os modelos já estão no registo ou na lista de modelos personalizados", "skippingExistingModels": "A ignorar {count} modelos existentes", @@ -5243,7 +5315,7 @@ "importFailed": "Falha na importação", "noNewModelsAdded": "Nenhum novo modelo foi adicionado.", "adding": "Adicionando...", - "close": "Close", + "close": "Fechar", "importingModelsTitle": "Importando Modelos", "copyModel": "Copiar modelo", "filterModels": "Filtrar modelos...", @@ -5279,8 +5351,8 @@ "bulkAddFormatHint": "Uma chave por linha. Formato: name|apiKey ou apenas apiKey (nomeado automaticamente pelo índice).", "bulkValidateKeys": "Valide cada chave antes de salvar (mais lento)", "bulkAddAllKeys": "Adicionar todas as chaves", - "bulkAddedCount": "{count, plural, one {# key added} other {# keys added}}", - "bulkFailedCount": "{count, plural, one {# failed} other {# failed}}", + "bulkAddedCount": "{count, plural, one {# chave adicionada} other {# chaves adicionadas}}", + "bulkFailedCount": "{count, plural, one {# falha} other {# falhas}}", "optional": "Opcional", "anthropicCompatibleName": "Compatível Antrópico", "openaiCompatibleName": "Compatível com OpenAI", @@ -5297,7 +5369,7 @@ "unexpectedErrorOccurred": "Ocorreu um erro inesperado", "getApiKey": "Obter chave da API", "getApiKeyDescription": "Registe-se ou inscreva-se para uma chave de API", - "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "connectionCountLabel": "{count, plural, one {# ligação} other {# ligações}}", "messagesPath": "mensagens", "responsesPath": "respostas", "chatCompletionsPath": "bate-papo/conclusões", @@ -5312,17 +5384,17 @@ "configured": "configurado", "providerProxyConfigureHint": "Configure o proxy para todas as conexões deste provedor", "providerProxy": "Proxy do provedor", - "repairEnv": "Repair env", - "repairEnvWorking": "Repairing...", - "repairEnvHint": "Restore missing OAuth defaults into .env without overwriting existing values.", - "repairEnvSuccess": "OAuth defaults restored", - "repairEnvFailed": "Failed to repair .env", + "repairEnv": "Reparar env", + "repairEnvWorking": "A reparar...", + "repairEnvHint": "Restaura predefinições OAuth em falta no .env sem sobrescrever valores existentes.", + "repairEnvSuccess": "Predefinições OAuth restauradas", + "repairEnvFailed": "Falha ao reparar .env", "noConnectionsYet": "Ainda não há conexões", "addFirstConnectionHint": "Adicione sua primeira conexão para começar", "addConnection": "Adicionar conexão", "availableModels": "Modelos Disponíveis", - "builtInModels": "Built-in models", - "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "builtInModels": "Modelos integrados", + "builtInModelsHint": "Modelos do registo para este fornecedor. Usa o lápis para definir opções de compatibilidade.", "pageAutoRefresh": "A página será atualizada automaticamente...", "statusDisabled": "desativado", "statusConnected": "conectado", @@ -5368,27 +5440,27 @@ "reauthenticateConnection": "Autentique novamente esta conexão", "proxyConfig": "Configuração de proxy", "aliasExistsAlert": "O alias \"{alias}\" já existe. Use um modelo diferente ou edite o alias existente.", - "aliasInputPlaceholder": "alias name", - "clickToSetAlias": "Click to set alias", - "clickToEditAlias": "Alias: {alias} (click to edit)", + "aliasInputPlaceholder": "nome do alias", + "clickToSetAlias": "Clica para definir alias", + "clickToEditAlias": "Alias: {alias} (clica para editar)", "openRouterAnyModelHint": "OpenRouter suporta qualquer modelo. Adicione modelos e crie aliases para acesso rápido.", "modelIdFromOpenRouter": "ID do modelo (do OpenRouter)", "openRouterModelPlaceholder": "antrópico/claude-3-opus", "customModels": "Modelos personalizados", "customModelsHint": "Adicione IDs de modelo que não estão na lista padrão. Eles estarão disponíveis para roteamento.", - "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)", - "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)", - "compatAdjustmentsTitle": "Compatibility", - "compatButtonLabel": "Compatibility", + "normalizeToolCallIdLabel": "Normalizar IDs de chamada de ferramenta para 9 caracteres (ex: Mistral)", + "preserveDeveloperRoleLabel": "Manter role de developer da OpenAI Responses (não mapear para system)", + "compatAdjustmentsTitle": "Compatibilidade", + "compatButtonLabel": "Compatibilidade", "compatToolIdShort": "Tool ID 9", - "compatDeveloperShort": "Developer role", - "compatDoNotPreserveDeveloper": "Do not preserve developer role", - "compatBadgeNoPreserve": "No preserve", - "compatProtocolLabel": "Client request protocol", - "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).", + "compatDeveloperShort": "Role de developer", + "compatDoNotPreserveDeveloper": "Não preservar role de developer", + "compatBadgeNoPreserve": "Sem preservar", + "compatProtocolLabel": "Protocolo de pedido do cliente", + "compatProtocolHint": "Estas opções aplicam-se quando o OmniRoute deteta este formato de pedido (OpenAI Chat, Responses API ou Mensagens Anthropic).", "compatProtocolOpenAI": "OpenAI Chat Completions", "compatProtocolOpenAIResponses": "OpenAI Responses API", - "compatProtocolClaude": "Anthropic Messages", + "compatProtocolClaude": "Mensagens Anthropic", "targetFormatLabel": "Formato de Destino", "targetFormatHint": "Substituir o formato de transmissão upstream. Utilize 'Anthropic Messages' para encaminhar fornecedores compatíveis com OpenAI (ex. opencode-go) através do endpoint /v1/messages.", "targetFormatAuto": "Predefinição (auto)", @@ -5427,25 +5499,25 @@ "interceptFetchHint": "Reescrever chamadas de ferramentas nativas web_fetch para o /v1/web/fetch do OmniRoute.", "interceptionLoadError": "Falha ao carregar as definições de interceção: {error}", "interceptionSaveError": "Falha ao guardar as definições de interceção: {error}", - "ccAliasSectionTitle": "Expose em Claude Code (claude/…)", - "ccAliasSectionHint": "Anuncie os modelos deste fornecedor sob claude/<provider>/<model> IDs de espelho para que a descoberta de modelos do gateway do Claude Code possa listá-los. Desativado por padrão — ativar isto duplica as entradas do catálogo para todos os clientes.", - "ccAliasProviderLevelLabel": "Fornecedor padrão", - "ccAliasModelOverridesLabel": "Substituições por modelo", - "ccAliasModelOverrideAriaLabel": "Substituição para {modelId}", - "ccAliasStateInherit": "Herdar", - "ccAliasStateOn": "Ligado", - "ccAliasStateOff": "Desligado", - "ccAliasAddModelPlaceholder": "Id do modelo (ex: gpt-4o)", - "ccAliasAddModelButton": "Adicionar substituição", - "ccAliasLoadError": "Falha ao carregar as definições de discovery-alias: {error}", - "ccAliasSaveError": "Falha ao guardar a configuração do discovery-alias: {error}", - "compatUpstreamHeadersLabel": "Extra upstream headers", - "compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.", - "compatUpstreamHeaderName": "Header name", - "compatUpstreamHeaderValue": "Value", - "compatUpstreamAddRow": "Add header", - "compatUpstreamRemoveRow": "Remove row", - "compatBadgeUpstreamHeaders": "Headers", + "ccAliasSectionTitle": "__MISSING__:Expose in Claude Code (claude/…)", + "ccAliasSectionHint": "__MISSING__:Advertise this provider's models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Off by default — enabling this doubles catalog entries for all clients.", + "ccAliasProviderLevelLabel": "__MISSING__:Provider default", + "ccAliasModelOverridesLabel": "__MISSING__:Per-model overrides", + "ccAliasModelOverrideAriaLabel": "__MISSING__:Override for {modelId}", + "ccAliasStateInherit": "__MISSING__:Inherit", + "ccAliasStateOn": "__MISSING__:On", + "ccAliasStateOff": "__MISSING__:Off", + "ccAliasAddModelPlaceholder": "__MISSING__:Model id (e.g. gpt-4o)", + "ccAliasAddModelButton": "__MISSING__:Add override", + "ccAliasLoadError": "__MISSING__:Failed to load discovery-alias settings: {error}", + "ccAliasSaveError": "__MISSING__:Failed to save discovery-alias setting: {error}", + "compatUpstreamHeadersLabel": "Cabeçalhos upstream extra", + "compatUpstreamHeadersHint": "Definição de alto privilégio — mesmo nível de confiança que editar credenciais de API do fornecedor; só admins de confiança devem usar.", + "compatUpstreamHeaderName": "Nome do cabeçalho", + "compatUpstreamHeaderValue": "Valor", + "compatUpstreamAddRow": "Adicionar cabeçalho", + "compatUpstreamRemoveRow": "Remover linha", + "compatBadgeUpstreamHeaders": "Cabeçalhos", "perModelQuotaLabel": "Per Model Quota Label", "perModelQuotaDescription": "Per Model Quota Description", "importFreeModelsOnlyLabel": "Importar apenas modelos gratuitos", @@ -5488,23 +5560,23 @@ "deselectAllModels": "Desmarcar todos", "modelsActiveCount": "{active}/{total} ativos", "noModelsMatch": "Nenhum modelo corresponde a \"{filter}\"", - "groupLabel": "Environment", - "groupPlaceholder": "e.g. eKaizen, Personal", + "groupLabel": "Ambiente", + "groupPlaceholder": "ex: eKaizen, Pessoal", "failedTestConnection": "Falha ao testar a conexão", "failed": "Falha", "leaveBlankKeepCurrentApiKey": "Deixe em branco para manter a chave API atual.", "editCompatibleTitle": "Editar {type} Compatível", - "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "compatibleBaseUrlHint": "URL raiz da tua API compatível com {type}. Usa Definições Avançadas para caminhos de endpoint personalizados.", "apiKeyForCheck": "Chave API (para verificação)", "testModelIdLabel": "ID do modelo (opcional)", "testModelIdPlaceholder": "ex. id-do-meu-modelo", "testModelIdHint": "Se o fornecedor não tiver um endpoint /models, introduza um ID de modelo para validar através de /chat/completions.", "compatibleProdPlaceholder": "{type} Compatível (Produção)", - "tokenRefreshed": "Token refreshed successfully", - "tokenRefreshFailed": "Token refresh failed", + "tokenRefreshed": "Token atualizado com sucesso", + "tokenRefreshFailed": "Falha na atualização do token", "cursorSessionUnchanged": "Sessão já atual", - "applyCodexAuthLocal": "Apply auth", - "exportCodexAuthFile": "Export auth", + "applyCodexAuthLocal": "Aplicar auth", + "exportCodexAuthFile": "Exportar auth", "applyClaudeAuthLocal": "Aplicar autenticação", "exportClaudeAuthFile": "Exportar autenticação", "importClaudeAuth": "Importar autenticação", @@ -5579,10 +5651,10 @@ "geminiImportBulkFailed": "Algumas entradas não foram importadas", "geminiImportBulkZipExtracting": "Extraindo ZIP…", "geminiImportBulkZipError": "Falha ao extrair ZIP", - "codexAuthAppliedLocal": "Codex auth.json applied locally", - "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", - "codexAuthExported": "Codex auth.json exported", - "codexAuthExportFailed": "Failed to export Codex auth.json", + "codexAuthAppliedLocal": "Codex auth.json aplicado localmente", + "codexAuthApplyFailed": "Falha ao aplicar Codex auth.json localmente", + "codexAuthExported": "Codex auth.json exportado", + "codexAuthExportFailed": "Falha ao exportar Codex auth.json", "codexCliGuideButton": "Guia do Codex CLI", "codexCliGuideTitle": "Guia do Codex CLI", "codexCliGuideLoading": "A carregar o guia...", @@ -5629,67 +5701,67 @@ "codexImportBulkFailed": "{count} falhou", "codexImportBulkZipExtracting": "Extraindo ZIP…", "codexImportBulkZipError": "Falha ao extrair ZIP", - "advancedSettings": "Advanced Settings", - "chatPathLabel": "Chat Endpoint Path", + "advancedSettings": "Definições Avançadas", + "chatPathLabel": "Caminho do Endpoint de Chat", "chatPathPlaceholder": "/chat/completions", - "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", - "modelsPathLabel": "Models Endpoint Path", + "chatPathHint": "Caminho de chat personalizado para fornecedores com APIs não padrão (ex: /v4/chat/completions)", + "modelsPathLabel": "Caminho do Endpoint de Modelos", "modelsPathPlaceholder": "/models", - "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "modelsPathHint": "Caminho de modelos personalizado para validação (ex: /v4/models)", "clientIdentityLabel": "Identidade do cliente", "clientIdentityHint": "Opcional. Adiciona cabeçalhos de impressão digital do cliente (ex. User-Agent) correspondentes a um CLI conhecido para gateways compatíveis que os esperem.", "statusDeactivated": "Desativado (Manual)", "statusBanned": "Banido / Sandbox Violation", "statusCreditsExhausted": "Saldo Insuficiente", - "showEmails": "Show all emails", - "hideEmails": "Hide all emails", + "showEmails": "Mostrar todos os emails", + "hideEmails": "Ocultar todos os emails", "a": "A", "accountConcurrencyCapHint": "Account Concurrency Cap Hint", "accountConcurrencyCapLabel": "Account Concurrency Cap Label", "accountIdHint": "Account Id Hint", "accountIdLabel": "Account Id Label", "accountIdPlaceholder": "Account Id Placeholder", - "addAnotherApiKey": "Add another API key or paste multiple keys", + "addAnotherApiKey": "Adicionar outra chave de API ou colar várias chaves", "addCcCompatible": "Add Cc Compatible", - "aggregatorsGateways": "Aggregators Gateways", + "aggregatorsGateways": "Agregadores e Gateways", "enterpriseCloud": "Empresa e nuvem", - "apiFormatLabel": "Api Format Label", - "apiKeyOptionalHint": "Api Key Optional Hint", - "apiKeyOptionalLabel": "Api Key Optional Label", - "apiRegionChina": "Api Region China", - "apiRegionHint": "Api Region Hint", - "apiRegionInternational": "Api Region International", - "apiRegionLabel": "Api Region Label", - "apikey": "Apikey", - "audio": "Audio", - "audioProvidersHeading": "Audio Providers Heading", + "apiFormatLabel": "Formato da API", + "apiKeyOptionalHint": "Dica de Chave de API Opcional", + "apiKeyOptionalLabel": "Chave de API Opcional", + "apiRegionChina": "Região da API: China", + "apiRegionHint": "Dica da Região da API", + "apiRegionInternational": "Região da API: Internacional", + "apiRegionLabel": "Região da API", + "apikey": "Chave de API", + "audio": "Áudio", + "audioProvidersHeading": "Fornecedores de Áudio", "cloudAgentProviders": "Provedores de agentes em nuvem", - "audioShortLabel": "Audio Short Label", - "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", - "bailianBaseUrlHint": "Bailian Base Url Hint", - "claudeWebCookieHint": "Open claude.ai → DevTools → Application → Cookies → claude.ai, copy the 'sessionKey' value. Also need cf_clearance, __cf_bm, _cfuvid for Cloudflare.", + "audioShortLabel": "Áudio", + "azureOpenAiBaseUrlHint": "Dica de URL Base do Azure OpenAI", + "bailianBaseUrlHint": "Dica de URL Base do Bailian", + "claudeWebCookieHint": "Abre claude.ai → DevTools → Application → Cookies → claude.ai, copia o valor 'sessionKey'. Também é preciso cf_clearance.", "claudeWebCookiePlaceholder": "sessionKey=sk-ant-...", - "blackboxWebCookieHint": "Blackbox Web Cookie Hint", - "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blackboxWebCookieHint": "Dica de Cookie Web do Blackbox", + "blackboxWebCookiePlaceholder": "Espaço reservado de Cookie Web do Blackbox", "t3ChatWebCookieHint": "Abra t3.chat → DevTools → Aplicativo → Armazenamento local → https://t3.chat, copie 'convex-session-id'. Em seguida, abra DevTools → Rede, copie o cabeçalho completo do cookie de qualquer solicitação de chat. Cole os dois valores nos campos abaixo.", "t3ChatWebCookiePlaceholder": "id-de-sessão-convexa=abc123...", - "grokWebCookieHint": "Grok Web Cookie Hint", - "blockClaudeExtraUsageDescription": "Quando ativado, o OmniRoute marca esta conexão Claude como indisponível assim que a API de utilização reporta utilização extra em fila, de modo que a alternativa muda para outra conexão em vez de continuar com a faturação extra pay-as-you-go.", - "blockClaudeExtraUsageLabel": "Bloquear uso extra do Claude", + "grokWebCookieHint": "Dica de Cookie Web do Grok", + "blockClaudeExtraUsageDescription": "__MISSING__:When enabled, OmniRoute marks this Claude connection unavailable as soon as the usage API reports queued extra usage, so fallback switches to another connection instead of continuing on pay-as-you-go extra billing.", + "blockClaudeExtraUsageLabel": "__MISSING__:Block extra Claude usage", "disableCoolingDescription": "Ignorar o cooldown transitório para que esta ligação permaneça elegível mesmo após erros recuperáveis (estados terminais como banido/expirado continuam a aplicar-se).", "disableCoolingLabel": "Desativar cooldown para esta ligação", - "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}", - "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}", - "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.", + "bulkPasteAdded": "{count, plural, one {1 chave adicionada} other {# chaves adicionadas}}", + "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicado ignorado} other {# duplicados ignorados}}", + "bulkPasteHint": "Cola uma chave de API por linha. Linhas vazias são ignoradas e chaves duplicadas são ignoradas.", "ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint", "ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder", "ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint", "ccCompatibleContext1mDescription": "Cc Compatible Context1M Description", "ccCompatibleContext1mLabel": "Cc Compatible Context1M Label", - "ccCompatibleRedactThinkingDescription": "Adds the redact-thinking beta header for CC Compatible upstreams that require hidden Claude thinking streams.", - "ccCompatibleRedactThinkingLabel": "Enable redact-thinking beta", - "ccCompatibleSummarizeThinkingDescription": "Adds `display: \"summarized\"` to CC Compatible thinking requests so supported Claude models stream visible thinking deltas.", - "ccCompatibleSummarizeThinkingLabel": "Enable summarized thinking display", + "ccCompatibleRedactThinkingDescription": "Adiciona o cabeçalho beta redact-thinking para upstreams CC Compatible que requerem streams de thinking Claude ocultos.", + "ccCompatibleRedactThinkingLabel": "Ativar beta redact-thinking", + "ccCompatibleSummarizeThinkingDescription": "Adiciona `display: \"summarized\"` aos pedidos de thinking CC Compatible para que os modelos Claude suportados transmitam thinking visível.", + "ccCompatibleSummarizeThinkingLabel": "Ativar exibição de thinking resumido", "ccCompatibleDetailsTitle": "Cc Compatible Details Title", "ccCompatibleLabel": "Cc Compatible Label", "ccCompatibleModelsDescription": "Cc Compatible Models Description", @@ -5701,16 +5773,16 @@ "claudeExtraUsageShort": "Claude Extra Usage Short", "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", "codex5hToggleTitle": "Codex5H Toggle Title", - "codexFastServiceTierDescription": "Use the priority service tier for Codex requests when available.", - "codexFastServiceTierLabel": "Codex fast service tier", + "codexFastServiceTierDescription": "Usa o nível de serviço prioritário para pedidos Codex quando disponível.", + "codexFastServiceTierLabel": "Nível de serviço rápido Codex", "codexWeeklyToggleTitle": "Codex Weekly Toggle Title", - "compatUpstreamHeaderNamePlaceholder": "Compat Upstream Header Name Placeholder", - "compatUpstreamHeaderValuePlaceholder": "Compat Upstream Header Value Placeholder", - "compatible": "Compatible", - "configuredCount": "Configured Count", - "consoleApiKeyOracleHint": "Console Api Key Oracle Hint", - "consoleApiKeyOracleLabel": "Console Api Key Oracle Label", - "consoleApiKeyOraclePlaceholder": "Console Api Key Oracle Placeholder", + "compatUpstreamHeaderNamePlaceholder": "Espaço reservado do Nome do Cabeçalho Upstream", + "compatUpstreamHeaderValuePlaceholder": "Espaço reservado do Valor do Cabeçalho Upstream", + "compatible": "Compatível", + "configuredCount": "Contagem de Configurados", + "consoleApiKeyOracleHint": "Dica do Oráculo de Chave de API da Consola", + "consoleApiKeyOracleLabel": "Oráculo de Chave de API da Consola", + "consoleApiKeyOraclePlaceholder": "Espaço reservado do Oráculo de Chave de API da Consola", "newApiUserIdLabel": "ID de Utilizador New-API", "newApiUserIdPlaceholder": "ex.: 12345", "newApiUserIdHint": "Valor do cabeçalho New-Api-User do AgentRouter, utilizado junto com a chave de API da consola para consultar o saldo de quota.", @@ -5723,53 +5795,53 @@ "featureFlagNewApiAggregatorBalanceDescription": "Ativar a deteção de saldo para nós compatíveis com New-API / One-API / Sub2API agregadores", "cpaModeDisabledTitle": "Cpa Mode Disabled Title", "cpaModeEnabledTitle": "Cpa Mode Enabled Title", - "customUserAgentHint": "Custom User Agent Hint", - "customUserAgentLabel": "Custom User Agent Label", - "databricksBaseUrlHint": "Databricks Base Url Hint", - "defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.", - "defaultThinkingStrengthLabel": "Default thinking strength", - "deleteAllExtraApiKeys": "Delete all", - "excludedModelsHint": "Excluded Models Hint", - "excludedModelsLabel": "Excluded Models Label", - "excludedModelsPlaceholder": "Excluded Models Placeholder", - "expirationBannerExpired": "Expiration Banner Expired", - "expirationBannerExpiredDesc": "Expiration Banner Expired Desc", - "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc", - "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}", - "extraApiKeysHint": "Extra Api Keys Hint", - "extraApiKeysLabel": "Extra Api Keys Label", - "apiKeyHealthLabel": "API Key Health", - "apiKeyStatusActive": "Active", - "apiKeyStatusWarning": "Warning ({count} failures)", - "apiKeyStatusInvalid": "Invalid", - "primaryKey": "Primary Key", - "apiKeyInvalidAlert": "{count} API key(s) marked as invalid due to authentication failures in connections: {connections}. They will be skipped in rotation. Click to review.", - "apiKeyInvalidAlertTitle": "API Key Health Alert", - "apiKeyWarningAlert": "{count} API key(s) in warning state due to elevated failure rate in connections: {connections}. Review to prevent rotation issues.", - "apiKeyWarningAlertTitle": "API Key Warning", - "googlePseInfo": "Google Pse Info", + "customUserAgentHint": "Dica de User Agent Personalizado", + "customUserAgentLabel": "User Agent Personalizado", + "databricksBaseUrlHint": "Dica de URL Base do Databricks", + "defaultThinkingStrengthHint": "Usado quando um pedido não especifica esforço de raciocínio.", + "defaultThinkingStrengthLabel": "Força de thinking padrão", + "deleteAllExtraApiKeys": "Eliminar todas", + "excludedModelsHint": "Dica de Modelos Excluídos", + "excludedModelsLabel": "Modelos Excluídos", + "excludedModelsPlaceholder": "Espaço reservado de Modelos Excluídos", + "expirationBannerExpired": "Banner de Expiração Expirado", + "expirationBannerExpiredDesc": "Descrição do Banner de Expiração Expirado", + "expirationBannerExpiringSoon": "Banner de Expiração em Breve", + "expirationBannerExpiringSoonDesc": "Descrição do Banner de Expiração em Breve", + "extraApiKeyMasked": "Chave {index}: {prefix}••••{suffix}", + "extraApiKeysHint": "Dica de Chaves de API Extra", + "extraApiKeysLabel": "Chaves de API Extra", + "apiKeyHealthLabel": "Saúde das Chaves de API", + "apiKeyStatusActive": "Ativa", + "apiKeyStatusWarning": "Aviso ({count} falhas)", + "apiKeyStatusInvalid": "Inválida", + "primaryKey": "Chave Primária", + "apiKeyInvalidAlert": "{count} chave(s) de API marcada(s) como inválida(s) devido a falhas de autenticação nas ligações: {connections}. Serão tratadas como inválidas.", + "apiKeyInvalidAlertTitle": "Alerta de Saúde da Chave de API", + "apiKeyWarningAlert": "{count} chave(s) de API em estado de aviso devido a taxa de falhas elevada nas ligações: {connections}. Revê para prevenir falhas.", + "apiKeyWarningAlertTitle": "Aviso de Chave de API", + "googlePseInfo": "Info do Google PSE", "antigravityProjectIdHint": "Substituição opcional para solicitações de código de nuvem antigravidade. Deixe em branco para usar o projeto descoberto durante o Google OAuth.", "antigravityClientProfileLabel": "Perfil do cliente", "antigravityClientProfileHint": "Escolha qual a identidade de cliente Antigravity que o OmniRoute apresenta à API.", "antigravityClientProfileIde": "IDE", "antigravityClientProfileCli": "Harness / CLI", "codexFastTierActiveChip": "O nível Codex Fast está ativo", - "tierFast": "Fast", + "tierFast": "Rápido", "antigravityProjectIdLabel": "ID do projeto do Google Cloud", "antigravityProjectIdPlaceholder": "meu-gcp-project-id", - "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", - "herokuBaseUrlHint": "Heroku Base Url Hint", - "hideEmail": "Hide Email", - "imageProviders": "Image Providers", + "grokWebCookiePlaceholder": "Espaço reservado de Cookie Web do Grok", + "herokuBaseUrlHint": "Dica de URL Base do Heroku", + "hideEmail": "Ocultar Email", + "imageProviders": "Fornecedores de Imagem", "videoProviders": "Geração de Vídeo", "embeddingRerankProviders": "Incorporações e reclassificação", - "imagesShortLabel": "Images Short Label", - "llmProviders": "Llm Providers", - "localProviderApiKeyOptionalHint": "Local Provider Api Key Optional Hint", - "localProviderBaseUrlHint": "Local Provider Base Url Hint", - "localProviders": "Local Providers", - "maxConcurrentWholeNumberError": "Max Concurrent Whole Number Error", + "imagesShortLabel": "Imagens", + "llmProviders": "Fornecedores de LLM", + "localProviderApiKeyOptionalHint": "Dica de Chave de API Opcional do Fornecedor Local", + "localProviderBaseUrlHint": "Dica de URL Base do Fornecedor Local", + "localProviders": "Fornecedores Locais", + "maxConcurrentWholeNumberError": "Erro de Número Inteiro de Concorrência Máxima", "m365TierLabel": "Nível do Copilot", "m365TierHint": "Escolha qual a superfície do Microsoft 365 Copilot que esta ligação utiliza. Individual é o BizChat de consumo predefinido; Educação e Empresarial (trabalho) optam pelas superfícies do seu inquilino.", "m365TierIndividualOption": "Individual (predefinido)", @@ -5781,16 +5853,16 @@ "tierOverrideCheap": "Económico", "tierOverridePremium": "Premium", "tierOverrideHelpText": "Fixar este fornecedor a um nível de encaminhamento em vez de permitir que o OmniRoute o infira a partir do preço do modelo.", - "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", - "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", - "oauth": "Oauth", - "openCliTools": "Open Cli Tools", - "openSettings": "Open Settings", - "openaiResponsesStoreDescription": "Allow compatible Responses API requests to preserve stored response state.", - "openaiResponsesStoreLabel": "OpenAI Responses store", - "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", - "perplexityWebCookieHint": "Perplexity Web Cookie Hint", - "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "museSparkWebCookieHint": "Dica de Cookie Web do Muse Spark", + "museSparkWebCookiePlaceholder": "Espaço reservado de Cookie Web do Muse Spark", + "oauth": "OAuth", + "openCliTools": "Abrir Ferramentas CLI", + "openSettings": "Abrir Definições", + "openaiResponsesStoreDescription": "Permite que pedidos compatíveis com a Responses API preservem o estado de resposta armazenado.", + "openaiResponsesStoreLabel": "Armazenamento de respostas OpenAI", + "perplexitySearchSharedKeyInfo": "Info de Chave Partilhada de Pesquisa Perplexity", + "perplexityWebCookieHint": "Dica de Cookie Web do Perplexity", + "perplexityWebCookiePlaceholder": "Espaço reservado de Cookie Web do Perplexity", "personalAccessTokenLabel": "Personal Access Token Label", "qoderPatHint": "Qoder Pat Hint", "qoderPatPlaceholder": "Qoder Pat Placeholder", @@ -5805,54 +5877,54 @@ "rateLimitOverridesTpdLabel": "TPD (Tokens/dia)", "rateLimitOverridesTpmHint": "Tokens máximos por minuto para esta ligação. Substitui a predefinição do fornecedor.", "rateLimitOverridesTpmLabel": "TPM (Tokens/min)", - "refreshOauthTokenTitle": "Refresh Oauth Token Title", - "regionHint": "Region Hint", - "regionLabel": "Region Label", - "removeThisKey": "Remove This Key", - "routingTagsHint": "Routing Tags Hint", - "routingTagsLabel": "Routing Tags Label", - "routingTagsPlaceholder": "Routing Tags Placeholder", - "search": "Search", - "searchEngineIdHint": "Search Engine Id Hint", - "searchEngineIdLabel": "Search Engine Id Label", - "searchEngineIdRequired": "Search Engine Id Required", - "searchProvider": "Search Provider", - "searchProviderDesc": "Search Provider Desc", + "refreshOauthTokenTitle": "Atualizar Token OAuth", + "regionHint": "Dica de Região", + "regionLabel": "Região", + "removeThisKey": "Remover Esta Chave", + "routingTagsHint": "Dica de Etiquetas de Encaminhamento", + "routingTagsLabel": "Etiquetas de Encaminhamento", + "routingTagsPlaceholder": "Espaço reservado de Etiquetas de Encaminhamento", + "search": "Pesquisa", + "searchEngineIdHint": "Dica do ID do Motor de Pesquisa", + "searchEngineIdLabel": "ID do Motor de Pesquisa", + "searchEngineIdRequired": "ID do Motor de Pesquisa Obrigatório", + "searchProvider": "Fornecedor de Pesquisa", + "searchProviderDesc": "Descrição do Fornecedor de Pesquisa", "searchProviders": "Pesquisar fornecedores...", "searchByModel": "Pesquisar por modelo…", - "searchProvidersHeading": "Search Providers Heading", - "searxngBaseUrlHint": "Searxng Base Url Hint", - "searxngInfo": "Searxng Info", - "sessionCookieLabel": "Session Cookie Label", - "showEmail": "Show Email", - "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "searchProvidersHeading": "Fornecedores de Pesquisa", + "searxngBaseUrlHint": "Dica de URL Base do Searxng", + "searxngInfo": "Info do Searxng", + "sessionCookieLabel": "Cookie de Sessão", + "showEmail": "Mostrar Email", + "snowflakeBaseUrlHint": "Dica de URL Base do Snowflake", "supportedEndpointAudio": "Supported Endpoint Audio", "supportedEndpointChat": "Supported Endpoint Chat", "supportedEndpointEmbeddings": "Supported Endpoint Embeddings", "supportedEndpointImages": "Supported Endpoint Images", "supportedEndpointsLabel": "Supported Endpoints Label", - "tagGroupHint": "Tag Group Hint", - "tagGroupLabel": "Tag Group Label", - "tagGroupPlaceholder": "Tag Group Placeholder", - "testModel": "Test Model", - "testingModel": "Testing Model", + "tagGroupHint": "Dica de Grupo de Etiquetas", + "tagGroupLabel": "Grupo de Etiquetas", + "tagGroupPlaceholder": "Espaço reservado de Grupo de Etiquetas", + "testModel": "Testar Modelo", + "testingModel": "A Testar Modelo", "modelTestQuotaTooltip": "Quota esgotada — reinicia amanhã ou precisa de um reabastecimento", "toggleOffShort": "Toggle Off Short", "toggleOnShort": "Toggle On Short", - "tokenExpiredBadge": "Token Expired Badge", - "tokenExpiredTitle": "Token Expired Title", - "tokenExpiresSoonTitle": "Token Expires Soon Title", - "tokenShort": "Token Short", - "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}", - "unhideModel": "Unhide Model", - "upstreamProxyProviders": "Upstream Proxy Providers", - "validationModelIdHint": "Modelo utilizado para verificar a chave API. Deixe em branco para utilizar o primeiro modelo disponível do fornecedor.", - "validationModelIdLabel": "Modelo de validação", - "validationModelIdPlaceholder": "ex. meta-llama/llama-3.1-8b-instruct", - "vertexServiceAccountPlaceholder": "Paste your Service Account JSON ({\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"}) or an OAuth access_token", - "webCookieProviders": "Web Cookie Providers", - "weeklyShort": "Weekly Short", - "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "tokenExpiredBadge": "Token Expirado", + "tokenExpiredTitle": "Token Expirado", + "tokenExpiresSoonTitle": "Token Expira em Breve", + "tokenShort": "Token", + "totalKeysRotating": "{count, plural, one {1 chave em rotação} other {# chaves em rotação}}", + "unhideModel": "Mostrar Modelo", + "upstreamProxyProviders": "Fornecedores de Proxy Upstream", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Cola o teu JSON de Service Account ({\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"})", + "webCookieProviders": "Fornecedores de Cookies Web", + "weeklyShort": "Semanal", + "xiaomiMimoBaseUrlHint": "Dica de URL Base do Xiaomi Mimo", "globalCodexServiceMode": "Modo de serviço global do Codex", "connect": "Ligar", "manualApiKey": "Chave de API manual", @@ -5862,13 +5934,13 @@ "importGrokAuth": "Importar autenticação do Grok Build", "zedImportTitle": "Importar do Porta-chaves do Zed", "zedImportDescription": "Detetar credenciais de fornecedores de IA (OpenAI, Anthropic, Google, Mistral, xAI) guardadas pelo Zed IDE no porta-chaves do SO e importá-las como ligações. O Zed IDE tem de estar instalado nesta máquina.", - "zedImportButton": "Importar de Zed", - "zedImportFailed": "Falha na importação do Zed", - "zedImportHint": "Zed Import Hint", - "zedImportNetworkError": "Zed Import Network Error", - "zedImportNone": "Zed Import None", - "zedImportSuccess": "Credencial(ais) {credentials} importada(s) do Zed para o(s) provedor(es) {providers}", - "zedImporting": "A Importar…", + "zedImportButton": "__MISSING__:Import from Zed", + "zedImportFailed": "__MISSING__:Zed import failed", + "zedImportHint": "Dica de Importação do Zed", + "zedImportNetworkError": "Erro de Rede na Importação do Zed", + "zedImportNone": "Sem Importação do Zed", + "zedImportSuccess": "__MISSING__:Imported {credentials} credential(s) from Zed for {providers} provider(s)", + "zedImporting": "__MISSING__:Importing…", "zedNoCredentials": "Nenhuma credencial do Zed encontrada no porta-chaves", "zedUnsupportedCredentials": "Encontradas {count} credenciais no porta-chaves, mas nenhuma corresponde aos fornecedores suportados", "zedManualTitle": "Importação manual de token", @@ -6018,7 +6090,7 @@ "bailian-coding-plan": "Ligue o Alibaba Coding Plan com uma chave de API.", "bedrock": "Integração nativa com o Bedrock: a descoberta de modelos utiliza os modelos de fundação e perfis de inferência do Bedrock, enquanto o chat utiliza as APIs regionais Converse/ConverseStream do Bedrock Runtime.", "anthropic": "Ligue a Anthropic com uma chave de API.", - "ant-ling": "Registe-se e crie uma chave de API no console da API Ant Ling (https://chat.ant-ling.com/open), depois cole-a aqui. OmniRoute direciona o tráfego de chat para https://api.ant-ling.com/v1/chat/completions; o fornecedor é compatível com OpenAI e também expõe uma interface compatível com Anthropic.", + "ant-ling": "__MISSING__:Register and create an API key at the Ant Ling API console (https://chat.ant-ling.com/open), then paste it here. OmniRoute routes chat traffic to https://api.ant-ling.com/v1/chat/completions; the provider is OpenAI-compatible and also exposes an Anthropic-compatible surface.", "api-airforce": "Obtenha a sua chave de API em https://panel.api.airforce — endpoint compatível com a OpenAI em https://api.airforce/v1", "arcee-ai": "Obtenha a chave de API em arcee.ai", "azure-ai": "O Foundry utiliza a superfície v1 da OpenAI com nomes de implementação como modelos. O OmniRoute normaliza os URLs de recursos raiz para os endpoints v1 chat e /models.", @@ -6039,7 +6111,7 @@ "chutes": "Chave de API Bearer para o gateway compatível com OpenAI da Chutes.", "clarifai": "O Clarifai expõe chat, respostas e /models compatíveis com OpenAI em /v2/ext/openai/v1. Os modelos públicos/da comunidade requerem normalmente um PAT; as chaves com âmbito de aplicação só funcionam para recursos dentro dessa aplicação.", "cloudflare-ai": "Requer Token de API E ID de Conta (encontrados em dash.cloudflare.com)", - "clova-studio": "O CLOVA Studio (HyperCLOVA X) é compatível com OpenAI em /v1/openai. O OmniRoute interroga /v1/openai/models e direciona o tráfego de chat para /v1/openai/chat/completions. Utiliza o host atual clovastudio.stream.ntruss.com — o endpoint legado clovastudio.apigw.ntruss.com está a ser descontinuado.", + "clova-studio": "__MISSING__:CLOVA Studio (HyperCLOVA X) is OpenAI-compatible on /v1/openai. OmniRoute probes /v1/openai/models and routes chat traffic to /v1/openai/chat/completions. Uses the current clovastudio.stream.ntruss.com host — the legacy clovastudio.apigw.ntruss.com endpoint is being deprecated.", "codestral": "Ligue o Codestral com uma chave de API.", "cohere": "Avaliação gratuita: 1.000 chamadas de API/mês para testes, sem necessidade de cartão de crédito", "command-code": "Crie ou copie uma chave de API do Command Code e, em seguida, cole-a aqui como um token Bearer.", @@ -6083,9 +6155,9 @@ "watsonx": "O gateway de modelos watsonx expõe /chat/completions e /models compatíveis com a OpenAI em /ml/gateway/v1.", "ideogram": "Obtenha a chave de API em ideogram.ai/docs/api", "iflytek": "Obtenha a chave de API em console.xfyun.cn", - "inception": "Inception Labs é compatível com OpenAI em https://api.inceptionlabs.ai/v1. mercury-2 é o primeiro LLM de difusão (dLLM) no catálogo — geração 5-10x mais rápida do que modelos autoregressivos comparáveis, com chamada de ferramentas, json_mode e saídas estruturadas.", + "inception": "__MISSING__:Inception Labs is OpenAI-compatible at https://api.inceptionlabs.ai/v1. mercury-2 is the first diffusion LLM (dLLM) in the catalog — 5-10x faster generation than comparable autoregressive models, with tool calling, json_mode, and structured outputs.", "inference-net": "$25 em créditos gratuitos no registo, além de bolsas de investigação disponíveis", - "internlm": "Quota mensal gratuita ~1M de tokens de entrada / 3M de tokens de saída (~10 RPM)", + "internlm": "__MISSING__:Free monthly quota ~1M input / 3M output tokens (~10 RPM)", "jina-ai": "Chave de API Bearer para a API de rerank da Jina AI.", "jina-reader": "Ligue o Jina Reader com uma chave de API.", "kenari": "O Kenari expõe um endpoint de conclusões de chat compatível com a OpenAI em https://kenari.id/v1/chat/completions, além de um catálogo /v1/models em tempo real que abrange Claude, GPT, DeepSeek, GLM, Kimi e muito mais. O OmniRoute utiliza o protocolo OpenAI e lista modelos via passthrough.", @@ -6132,7 +6204,7 @@ "perplexity": "Ligue a Perplexity com uma chave de API.", "piapi": "Ligue a PiAPI com uma chave de API.", "pioneer": "$75 em créditos de utilização gratuitos — sem necessidade de cartão de crédito", - "plamo": "PLaMo é compatível com OpenAI em https://api.platform.preferredai.jp/v1. Construído pela Preferred Networks e otimizado para japonês. A documentação está principalmente em japonês.", + "plamo": "__MISSING__:PLaMo is OpenAI-compatible at https://api.platform.preferredai.jp/v1. Built by Preferred Networks and optimized for Japanese. Docs are primarily in Japanese.", "poe": "O Poe expõe chat e responses compatíveis com a OpenAI em https://api.poe.com/v1, com verificações de saldo autenticadas em /usage/current_balance.", "pollinations": "Nível gratuito sem chave: openai, openai-fast, openai-large, qwen-coder, mistral, deepseek, grok, gemini-flash-lite-3.1, perplexity-fast, perplexity-reasoning. Os modelos premium (claude, gemini, midijourney) requerem uma chave de API da Pollinations de enter.pollinations.ai.", "publicai": "Requer uma chave de API — crédito único no registo, depois pago", @@ -6143,7 +6215,7 @@ "runwayml": "A geração de vídeo da Runway é baseada em tarefas. O OmniRoute submete tarefas de texto para vídeo ou imagem para vídeo, consulta /v1/tasks/[id] e normaliza as saídas de vídeo concluídas de volta para a resposta /v1/videos/generations semelhante à da OpenAI.", "sambanova": "$5 em créditos gratuitos no registo (validade de 30 dias), sem necessidade de cartão de crédito", "sap": "A descoberta de modelos utiliza /v2/lm/scenarios/foundation-models/models em AI_API_URL. Os pedidos de chat utilizam deploymentUrl/chat/completions e requerem AI-Resource-Group.", - "sarvam": "Sarvam AI é compatível com OpenAI em /v1. OmniRoute investiga /v1/models e direciona o tráfego de chat para /v1/chat/completions. Os modelos são ajustados para línguas índicas.", + "sarvam": "__MISSING__:Sarvam AI is OpenAI-compatible on /v1. OmniRoute probes /v1/models and routes chat traffic to /v1/chat/completions. Models are tuned for Indic languages.", "scaleway": "1M de tokens gratuitos para novas contas — em conformidade com a UE/RGPD (Paris), Qwen3 235B e Llama 70B", "sensenova": "Obtenha a chave de API em platform.sensenova.cn", "siliconflow": "$1 em créditos gratuitos mais modelos permanentemente gratuitos após verificação de identidade", @@ -6160,7 +6232,7 @@ "together": "Ligue a Together AI com uma chave de API.", "tokenrouter": "O TokenRouter expõe um endpoint de chat completions compatível com a OpenAI em https://api.tokenrouter.com/v1/chat/completions, além de um catálogo /v1/models funcional. O OmniRoute utiliza o protocolo OpenAI.", "topaz": "Ligue a Topaz com uma chave de API.", - "typhoon": "Typhoon é compatível com OpenAI em /v1. Construído pela SCB 10X (Tailândia); typhoon-v2.5-30b-a3b-instruct é um modelo multilíngue com foco na Tailândia.", + "typhoon": "__MISSING__:Typhoon is OpenAI-compatible on /v1. Built by SCB 10X (Thailand); typhoon-v2.5-30b-a3b-instruct is a thai-first, multilingual model.", "udio": "Cole o cookie de sessão de udio.com (autenticação Supabase)", "uncloseai": "Nenhuma autenticação necessária. A API aceita qualquer string não vazia como chave para identificação.", "upstage": "Ligue a Upstage com uma chave de API.", @@ -6173,7 +6245,7 @@ "voyage-ai": "Chave de API Bearer para as APIs de embeddings e rerank da Voyage AI.", "wafer": "Chave de API de https://wafer.ai", "wandb": "Ligue o Weights & Biases Inference com uma chave de API.", - "writer": "Writer Palmyra é compatível com OpenAI em https://api.writer.com/v1. palmyra-x5 oferece uma janela de contexto de 1M tokens.", + "writer": "__MISSING__:Writer Palmyra is OpenAI-compatible at https://api.writer.com/v1. palmyra-x5 offers a 1M-token context window.", "x5lab": "O X5Lab expõe um endpoint de chat completions compatível com a OpenAI em https://api.x5lab.dev/v1/chat/completions, além de um catálogo /v1/models em tempo real. O OmniRoute utiliza o protocolo OpenAI e lista modelos via passthrough.", "xai": "Ligue a xAI (Grok) com uma chave de API.", "xiaomi-mimo": "Ligue a Xiaomi MiMo com uma chave de API.", @@ -6414,34 +6486,34 @@ "systemPrompt": "Alerta do sistema", "thinkingBudget": "Pensando no orçamento", "proxy": "Procurador", - "httpProxy": "HTTP Proxy", + "httpProxy": "Proxy HTTP", "1proxy": "1proxy", - "proxySubTabsAria": "Proxy sections", - "requestBodyLimitTitle": "Request Body Limit", - "requestBodyLimitDescription": "Maximum API payload size accepted before a request body is parsed. Dedicated upload routes keep at least their built-in 100 MB limit.", - "requestBodyLimitInputLabel": "Request body limit in MB", - "requestBodyLimitEmptyError": "Enter a limit in MB", - "requestBodyLimitWholeNumberError": "Use a whole number", - "requestBodyLimitMinimumError": "Minimum is {min} MB", - "requestBodyLimitMaximumError": "Maximum is {max} MB", - "requestBodyLimitLoadFailed": "Failed to load request limit settings", - "requestBodyLimitSaveSuccess": "Request body limit saved", - "requestBodyLimitSaveFailed": "Failed to save request body limit", - "requestBodyLimitSaving": "Saving...", - "requestBodyLimitSave": "Save", - "requestBodyLimitCurrent": "Current: {value}", - "cacheConfigLoadFailed": "Falha ao carregar as definições de cache", - "cacheConfigSaveSuccess": "Definições de cache guardadas", - "cacheConfigSaveFailed": "Falha ao guardar as definições de cache", - "modelCatalogTtlWholeNumberError": "Utilize um número inteiro", - "modelCatalogTtlMinimumError": "O mínimo é {min} ms", - "modelCatalogTtlMaximumError": "O máximo é {max} ms", - "modelCatalogCacheTtl": "Cache TTL do Catálogo de Modelos", - "modelCatalogCacheTtlDescription": "Quanto tempo as respostas do catálogo de modelos são armazenadas em cache antes de serem atualizadas", - "modelCatalogCacheTtlLabel": "TTL do cache do catálogo de modelos em milissegundos", - "modelCatalogCacheTtlSaving": "A Guardar...", - "modelCatalogCacheTtlSave": "Guardar", - "modelCatalogCacheTtlCurrent": "Atual: {value} ms", + "proxySubTabsAria": "Secções de proxy", + "requestBodyLimitTitle": "Limite do Corpo do Pedido", + "requestBodyLimitDescription": "Tamanho máximo de payload de API aceite antes de o corpo do pedido ser analisado. As rotas de upload dedicadas mantêm pelo menos o seu próprio limite.", + "requestBodyLimitInputLabel": "Limite do corpo do pedido em MB", + "requestBodyLimitEmptyError": "Introduz um limite em MB", + "requestBodyLimitWholeNumberError": "Usa um número inteiro", + "requestBodyLimitMinimumError": "O mínimo é {min} MB", + "requestBodyLimitMaximumError": "O máximo é {max} MB", + "requestBodyLimitLoadFailed": "Falha ao carregar as definições de limite de pedidos", + "requestBodyLimitSaveSuccess": "Limite do corpo do pedido guardado", + "requestBodyLimitSaveFailed": "Falha ao guardar o limite do corpo do pedido", + "requestBodyLimitSaving": "A guardar...", + "requestBodyLimitSave": "Guardar", + "requestBodyLimitCurrent": "Atual: {value}", + "cacheConfigLoadFailed": "__MISSING__:Failed to load cache settings", + "cacheConfigSaveSuccess": "__MISSING__:Cache settings saved", + "cacheConfigSaveFailed": "__MISSING__:Failed to save cache settings", + "modelCatalogTtlWholeNumberError": "__MISSING__:Use a whole number", + "modelCatalogTtlMinimumError": "__MISSING__:Minimum is {min} ms", + "modelCatalogTtlMaximumError": "__MISSING__:Maximum is {max} ms", + "modelCatalogCacheTtl": "__MISSING__:Model Catalog Cache TTL", + "modelCatalogCacheTtlDescription": "__MISSING__:How long model catalog responses are cached before refreshing", + "modelCatalogCacheTtlLabel": "__MISSING__:Model catalog cache TTL in milliseconds", + "modelCatalogCacheTtlSaving": "__MISSING__:Saving...", + "modelCatalogCacheTtlSave": "__MISSING__:Save", + "modelCatalogCacheTtlCurrent": "__MISSING__:Current: {value} ms", "mitmProxy": "Proxy MITM", "pricing": "Preços", "storage": "Armazenamento", @@ -6473,39 +6545,39 @@ "skillsComingSoon": "Marketplace em breve.", "memorySkillsTitle": "Memória e Skills", "memorySkillsDesc": "Contexto persistente e capacidades A2A", - "modelsDevTitle": "Model Database", - "modelsDevDesc": "Auto-sync pricing, capabilities & specs from models.dev", - "modelsDevEnabled": "Enable models.dev Sync", - "modelsDevEnabledDesc": "Fetch model pricing, capabilities, and specs from the open-source models.dev database", - "modelsDevInterval": "Sync Interval", - "syncNow": "Sync Now", - "syncing": "Syncing...", - "lastSync": "Last sync", - "never": "Never", + "modelsDevTitle": "Base de Dados de Modelos", + "modelsDevDesc": "Sincroniza automaticamente preços, capacidades e especificações do models.dev", + "modelsDevEnabled": "Ativar Sincronização models.dev", + "modelsDevEnabledDesc": "Obtém preços, capacidades e especificações de modelos da base de dados open-source models.dev", + "modelsDevInterval": "Intervalo de Sincronização", + "syncNow": "Sincronizar Agora", + "syncing": "A sincronizar...", + "lastSync": "Última sincronização", + "never": "Nunca", "justNow": "agora mesmo", - "modelsDevStats": "Sync Statistics", - "modelsDevStatsDesc": "Current models.dev data coverage", + "modelsDevStats": "Estatísticas de Sincronização", + "modelsDevStatsDesc": "Cobertura atual de dados do models.dev", "providers": "Provedores", - "modelsWithPricing": "Models with Pricing", - "capabilities": "Capabilities", - "lastSyncCount": "Last Sync Count", - "lastSyncFull": "Last full sync", - "modelsDevInfo": "How It Works", - "modelsDevInfoDesc": "models.dev is an open-source database of AI model specifications maintained by the SST/OpenCode team. It provides pricing, capabilities, context limits, and modalities for 4,000+ models across 100+ providers.", - "modelsDevInfoResolution": "Pricing resolution order (highest priority first):", - "modelsDevInfoOrder": "User Override → models.dev → LiteLLM → Hardcoded Default", + "modelsWithPricing": "Modelos com Preço", + "capabilities": "Capacidades", + "lastSyncCount": "Contagem da Última Sincronização", + "lastSyncFull": "Última sincronização completa", + "modelsDevInfo": "Como Funciona", + "modelsDevInfoDesc": "models.dev é uma base de dados open-source de especificações de modelos de IA mantida pela equipa SST/OpenCode. Fornece dados de preços e capacidades.", + "modelsDevInfoResolution": "Ordem de resolução de preços (prioridade mais alta primeiro):", + "modelsDevInfoOrder": "Substituição do Utilizador → models.dev → LiteLLM → Predefinição Hardcoded", "systemTheme": "Tema do sistema", - "debugToggle": "Enable Debug Mode", + "debugToggle": "Ativar Modo de Depuração", "logToolSourcesToggle": "Registar Fontes de Ferramentas", "logToolSourcesDescription": "Emitir uma linha de registo de diagnóstico por pedido, resumindo a contagem de ferramentas e a distribuição de fontes MCP/alojadas/cliente.", - "homePinProviderQuotaToHome": "Pin Information to Home Page", + "homePinProviderQuotaToHome": "Fixar Informação na Página Inicial", "homePinnedSectionsDesc": "Escolha quais as secções a fixar no topo da página inicial.", - "homeProviderQuotaLimits": "Provider Quota Limits", - "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.", - "homeQuickStart": "Quick Start", - "homeQuickStartDesc": "Show the Quick Start panel on the Home page.", - "homeProviderTopology": "Provider Topology", - "homeProviderTopologyDesc": "Show the Provider Topology on the Home page.", + "homeProviderQuotaLimits": "Limites de Quota de Fornecedor", + "homeProviderQuotaLimitsDesc": "Fixa o contentor de estado de Quota de Fornecedor (com botão Atualizar Tudo) no topo da página inicial.", + "homeQuickStart": "Início Rápido", + "homeQuickStartDesc": "Mostra o painel de Início Rápido na página inicial.", + "homeProviderTopology": "Topologia de Fornecedores", + "homeProviderTopologyDesc": "Mostra a Topologia de Fornecedores na página inicial.", "accountEmailVisibility": "Visibilidade do e-mail da conta", "accountEmailVisibilityDesc": "Mostrar e-mails de conta completos nos ecrãs de provedores, combos, registos, quotas e playground. Desative esta opção para os mascarar por predefinição.", "comboConfigMode": "Modo de configuração de combos", @@ -6521,28 +6593,28 @@ "providerQuotaAutoRefreshInterval": "Intervalo de atualização", "providerQuotaAutoRefreshIntervalDesc": "Com que frequência a vista de quotas deve ser atualizada, em segundos.", "seconds": "segundos", - "sidebarVisibilityToggle": "Show Sidebar Items", + "sidebarVisibilityToggle": "Mostrar Itens da Barra Lateral", "enableCache": "Habilitar cache", - "cacheTTL": "Cache TTL", + "cacheTTL": "TTL da Cache", "maxCacheSize": "Tamanho máximo do cache", "clearCache": "Limpar Cache", - "cacheCleared": "Cache cleared successfully", - "clearCacheFailed": "Failed to clear cache", + "cacheCleared": "Cache limpa com sucesso", + "clearCacheFailed": "Falha ao limpar a cache", "cacheHits": "Acessos de cache", "cacheMisses": "Perdas de cache", "hitRate": "Taxa de acerto", "cacheEntries": "Entradas de cache", - "cacheSettings": "Cache Settings", - "semanticCache": "Semantic Cache", - "maxEntries": "Max Entries", - "ttlMinutes": "TTL (minutes)", + "cacheSettings": "Definições de Cache", + "semanticCache": "Cache Semântica", + "maxEntries": "Máx. de Entradas", + "ttlMinutes": "TTL (minutos)", "promptCache": "Cache de prompt", - "strategy": "Strategy", - "preserveClientCache": "Preserve Client Cache", - "enabled": "Enabled", + "strategy": "Estratégia", + "preserveClientCache": "Preservar Cache do Cliente", + "enabled": "Ativado", "loading": "Loading...", "saving": "Salvando...", - "save": "Save", + "save": "Guardar", "circuitBreaker": "Disjuntor", "retryPolicy": "Política de Nova Tentativa", "maxRetries": "Máximo de tentativas", @@ -6606,7 +6678,7 @@ "showTailscaleFunnelDesc": "Mostre os controles do Tailscale Funnel na página Endpoint.", "showNgrokTunnel": "Túnel Ngrok", "showNgrokTunnelDesc": "Mostre os controles do ngrok Tunnel na página Endpoint.", - "sidebarVisibility": "Hide sidebar items", + "sidebarVisibility": "Ocultar itens da barra lateral", "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter.", "sidebarVisibilityHint": "Any sidebar section is hidden automatically when a...", "hideHealthLogs": "Ocultar registros de verificação de integridade", @@ -6621,20 +6693,20 @@ "themeViolet": "Violeta", "themeOrange": "Laranja", "themeCyan": "Ciano", - "whitelabeling": "Branding", - "whitelabelingDesc": "Customize the application name and logo", - "appName": "Application Name", - "appNameDesc": "Display name shown in sidebar and browser tab", - "customLogo": "Custom Logo URL", - "customLogoDesc": "URL to your custom logo image", - "uploadLogo": "Upload Logo", - "resetLogo": "Reset to Default", - "logoPreview": "Preview", - "customFavicon": "Browser Favicon", - "customFaviconDesc": "URL to your custom favicon (shown in browser tab)", - "uploadFavicon": "Upload Favicon", - "resetFavicon": "Reset Favicon", - "faviconPreview": "Favicon Preview", + "whitelabeling": "Marca", + "whitelabelingDesc": "Personaliza o nome e o logo da aplicação", + "appName": "Nome da Aplicação", + "appNameDesc": "Nome de exibição mostrado na barra lateral e no separador do browser", + "customLogo": "URL de Logo Personalizado", + "customLogoDesc": "URL para a tua imagem de logo personalizada", + "uploadLogo": "Carregar Logo", + "resetLogo": "Repor para Predefinição", + "logoPreview": "Pré-visualização", + "customFavicon": "Favicon do Browser", + "customFaviconDesc": "URL para o teu favicon personalizado (mostrado no separador do browser)", + "uploadFavicon": "Carregar Favicon", + "resetFavicon": "Repor Favicon", + "faviconPreview": "Pré-visualização do Favicon", "logoFileTooLarge": "O ficheiro do logótipo deve ter menos de 500KB", "faviconFileTooLarge": "O ficheiro do favicon deve ter menos de 50KB", "invalidLogoFileType": "Tipo de ficheiro inválido. Por favor, carregue PNG, JPG, SVG, GIF ou WebP.", @@ -6738,21 +6810,21 @@ "refreshInterval": "Intervalo de Atualização", "ruleModeDescription": "Descrição do Modo de Regra" }, - "bulkHealthcheck": "Bulk Healthcheck", - "bulkHealthcheckDesc": "Test all configured proxies against a target URL to find which ones work.", - "healthcheckTesting": "Testing...", - "healthcheckAll": "Healthcheck All", - "healthcheckFailed": "Failed to run healthcheck", - "healthcheckTestingAll": "Testing all proxies in parallel...", + "bulkHealthcheck": "Verificação de Saúde em Massa", + "bulkHealthcheckDesc": "Testa todos os proxies configurados contra um URL alvo para descobrir quais funcionam.", + "healthcheckTesting": "A testar...", + "healthcheckAll": "Verificar Saúde de Todos", + "healthcheckFailed": "Falha ao executar a verificação de saúde", + "healthcheckTestingAll": "A testar todos os proxies em paralelo...", "healthcheckTotal": "Total", - "healthcheckWorking": "Working", - "healthcheckFailedLabel": "Failed", - "healthcheckStatus": "Status", - "healthcheckProxyUrl": "Proxy URL", - "healthcheckLatency": "Latency", + "healthcheckWorking": "A funcionar", + "healthcheckFailedLabel": "Falhou", + "healthcheckStatus": "Estado", + "healthcheckProxyUrl": "URL do Proxy", + "healthcheckLatency": "Latência", "proxyDocumentationScopeTitle": "Resolução do âmbito do proxy", "proxyDocumentationScopeDescBefore": "O OmniRoute resolve o proxy de saída por ordem de prioridade:", - "proxyDocumentationScopeOrder": "combo → account → provider → global", + "proxyDocumentationScopeOrder": "combo → conta → fornecedor → global", "proxyDocumentationScopeDescAfter": ". O âmbito mais específico vence.", "proxyDocumentationAddTitle": "Adicionar um proxy personalizado", "proxyDocumentationAddDescBefore": "Aceda ao", @@ -6772,7 +6844,7 @@ "denoRelayOrgDomainRequired": "O domínio da organização é obrigatório", "denoRelayDeployFailed": "Falha no Deno Deploy", "denoRelayTokenHint": "Token de organização (prefixo ddo_) de console.deno.com → Organização → Definições → Tokens de Organização. Usado uma vez para o deploy e nunca armazenado.", - "denoRelayOrgDomainHint": "O domínio predefinido da sua organização do Deno Deploy (ex. acme.deno.net). O relay estará acessível em https://<app-name>.<org-slug>.deno.net.", + "denoRelayOrgDomainHint": "O domínio predefinido da sua organização do Deno Deploy (ex. acme.deno.net). O relay estará acessível em https://..deno.net.", "proxyFreePoolFilterProtocol": "Filtrar por protocolo", "proxyFreePoolProtocol": "Protocolo", "proxyFreePoolCountryPlaceholder": "País (ex. US)", @@ -6823,7 +6895,7 @@ "thinkingBudgetDesc": "Controle o uso do token de raciocínio de IA em todas as solicitações", "passthrough": "Passagem", "passthroughDesc": "Sem alterações – o cliente controla o orçamento pensado", - "auto": "Auto Combo", + "auto": "Combo Automático", "autoDesc": "Pool de roteamento inteligente (Otimizado)", "custom": "Personalizado", "customDesc": "Defina um orçamento fixo de tokens para todas as solicitações", @@ -6867,11 +6939,11 @@ "providersBlocked": "{count} provedor(es) bloqueado(s) em /models", "blockProviderTitle": "Bloquear {provider}", "unblockProviderTitle": "Desbloquear {provider}", - "cliFingerprint": "CLI Fingerprint Matching", + "cliFingerprint": "Correspondência de Fingerprint CLI", "cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.", - "cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active", - "enableFingerprintTitle": "Enable fingerprint for {provider}", - "disableFingerprintTitle": "Disable fingerprint for {provider}", + "cliFingerprintEnabled": "{count} fornecedor(es) com fingerprint CLI ativo", + "enableFingerprintTitle": "Ativar fingerprint para {provider}", + "disableFingerprintTitle": "Desativar fingerprint para {provider}", "systemTransforms": "Pipeline de transformação de bloco de sistema", "systemTransformsDesc": "Pipeline ordenado por provedor de transformações aplicadas ao corpo da solicitação antes do encaminhamento. Suporta qualquer ID de provedor.", "systemTransformsAddProvider": "Adicionar provedor", @@ -6900,8 +6972,8 @@ "costOptDesc": "Prefira a conta mais barata disponível", "resetAware": "RR com reconhecimento de redefinição", "resetAwareDesc": "Prefira contas com cota restante saudável e redefinições mais próximas", - "strictRandom": "Strict Random", - "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "strictRandom": "Aleatório Estrito", + "strictRandomDesc": "Baralhar — usa cada conta uma vez antes de baralhar novamente", "stickyLimit": "Limite pegajoso", "stickyLimitDesc": "Chamadas por conta antes de mudar", "routingStrategyTitle": "Estratégia de encaminhamento", @@ -6922,7 +6994,7 @@ "providerRoutingInheritGlobal": "Herdar predefinição global", "modelAliases": "Aliases de modelo", "modelAliasesTitle": "Aliases de Modelo", - "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "modelAliasesDesc": "Remapeia nomes de modelos usando correspondências exatas ou padrões wildcard.", "addCustomAlias": "Adicionar Alias Personalizado", "deprecatedModelId": "ID do modelo depreciado", "newModelId": "Novo ID do modelo", @@ -7011,7 +7083,7 @@ "comboStrategyAria": "Estratégia combinada", "priority": "Prioridade", "weighted": "Ponderado", - "contextRelay": "Context Relay", + "contextRelay": "Retransmissão de Contexto", "contextRelayDesc": "Hands off context between providers with automatic summarization", "maxRetriesLabel": "Máximo de tentativas", "retryDelayLabel": "Atraso de nova tentativa (ms)", @@ -7037,10 +7109,10 @@ "concurrencyPerModel": "Simultaneidade/Modelo", "queueTimeout": "Tempo limite da fila (ms)", "queueDepth": "Profundidade da fila", - "contextRelayHandoffThreshold": "Handoff Threshold", - "contextRelayMaxMessages": "Max Messages For Summary", - "contextRelaySummaryModel": "Summary Model", - "contextRelayProviderNote": "Context Relay currently generates handoffs for Codex accounts and uses these values as global defaults for new or unconfigured combos.", + "contextRelayHandoffThreshold": "Limiar de Handoff", + "contextRelayMaxMessages": "Máx. de Mensagens Para Resumo", + "contextRelaySummaryModel": "Modelo de Resumo", + "contextRelayProviderNote": "A Retransmissão de Contexto gera atualmente handoffs para contas Codex e usa estes valores como predefinições globais para novas contas.", "providerProfiles": "Perfis de Provedores", "providerProfilesDesc": "Configurações de resiliência separadas para provedores OAuth (baseado em sessão) e chave de API (medida). Os provedores OAuth têm limites mais rígidos devido aos limites de taxas mais baixos.", "oauthProviders": "Provedores OAuth", @@ -7122,7 +7194,7 @@ "daysAgo": "{count}d atrás", "backupReasonManual": "manual", "backupReasonPreRestore": "pré-restauração", - "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "connectionsCount": "{count, plural, one {# ligação} other {# ligações}}", "noChangesSinceBackup": "Nenhuma alteração desde o último backup", "backupFailed": "Falha no backup", "restoreFailed": "Falha na restauração", @@ -7167,7 +7239,7 @@ "howPricingWorks": "Como funciona o preço", "cacheWrite": "Gravação em cache", "unsaved": "não salvo", - "resetDefaults": "Restaurar predefinições", + "resetDefaults": "__MISSING__:Reset defaults", "saveProvider": "Salvar provedor", "model": "Modelo", "models": "modelos", @@ -7202,21 +7274,21 @@ "themeCoral": "Coral", "adaptiveVolumeRouting": "Roteamento de Volume Adaptativo", "adaptiveVolumeRoutingDesc": "Escala conexões dinamicamente com base no volume e pressão na taxa de transferência.", - "lkgpToggleTitle": "Last Known Good Provider (LKGP)", - "lkgpToggleDesc": "When enabled, the router remembers which provider last served a successful response and tries it first on subsequent requests.", + "lkgpToggleTitle": "Último Bom Fornecedor Conhecido (LKGP)", + "lkgpToggleDesc": "Quando ativado, o router lembra qual o fornecedor que serviu a última resposta bem-sucedida e tenta-o primeiro nos pedidos seguintes.", "echoRequestedModelTitle": "Ecoar o nome do modelo solicitado nas respostas", "echoRequestedModelDesc": "Quando ativado, o campo `model` da resposta ecoa o alias ou o nome da combinação que o cliente solicitou, em vez do nome do modelo a montante. Corrige clientes rigorosos (ex. Claude Desktop) que rejeitam uma resposta cujo modelo não corresponde ao pedido.", "webSearchRouteTitle": "Encaminhamento de pesquisa web", "webSearchRouteDesc": "Quando um pedido inclui uma ferramenta nativa web_search, encaminha todo o pedido para este modelo em vez do predefinido — útil para fornecedores que não implementam a ferramenta de servidor web_search da Anthropic. Deixe em branco para desativar.", "webSearchRoutePlaceholder": "ex. openrouter,anthropic/claude-3.5-sonnet", "paidModelPatternWarning": "Este padrão apenas corresponde a modelos pagos — ative os modelos pagos ou ajuste o padrão.", - "clearLkgpCache": "Clear LKGP Cache", - "lkgpCacheCleared": "LKGP cache cleared successfully", - "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "clearLkgpCache": "Limpar Cache LKGP", + "lkgpCacheCleared": "Cache LKGP limpa com sucesso", + "lkgpCacheClearFailed": "Falha ao limpar a cache LKGP", "days": "Dias", "lkgp": "Modo LKGP", "lkgpDesc": "Último Provedor Bom Conhecido (Resiliência previsível)", - "maintenance": "Maintenance", + "maintenance": "Manutenção", "purgeExpiredLogs": "Purgar Logs Expirados", "purgeLogsFailed": "Falha ao purgar logs", "logsDeleted": "{count, plural, =0 {Nenhum registo expirado purgado} one {Purgado # registo expirado} other {Purgados # registos expirados}}", @@ -7229,45 +7301,45 @@ "resetUsagePeriod_12h": "12 horas", "resetUsagePeriod_1d": "1 dia", "resetUsagePeriod_7d": "7 dias", - "resetUsagePeriod_30d": "30 days", + "resetUsagePeriod_30d": "30 dias", "resetUsagePeriod_all": "Todo o período", "resetUsageSuccess": "{count, plural, =0 {Nenhuma linha de dados de utilização eliminada} one {Dados de utilização repostos (# linha eliminada)} other {Dados de utilização repostos (# linhas eliminadas)}}", "resetUsageFailed": "Falha ao repor os dados de utilização", "reset": "Repor", "resetting": "A repor...", - "contextOpt": "Context Optimized", - "contextOptDesc": "Routes based on context window requirements and conversation length", - "cacheOpt": "Cache Optimized", - "cacheOptDesc": "Keeps the same reusable prompt prefix on the same provider account", - "priorityDesc": "Sequential fallback - tries provider 1 first, then provider 2, and so on", - "weightedDesc": "Distributes traffic by percentage weights across providers", - "modelRoutingTitle": "Model Routing Rules", - "modelRoutingDesc": "Automatically route models to specific combos using glob patterns", - "addRule": "Add Rule", - "routeToCombo": "Route to Combo", - "selectCombo": "Select combo...", - "priorityHint": "Higher = checked first. Use 10+ for specific patterns.", - "patternHint": "Use * for any chars, ? for single char. Case-insensitive.", - "noRoutingRules": "No routing rules configured. Requests use the global combo by default.", - "routingRuleHint": "Add a rule like claude-opus* -> frontier-combo to automatically route requests.", - "deleteRoutingRule": "Delete this model routing rule?", - "exactMatchMode": "Exact Match", - "wildcardPatternMode": "Wildcard Pattern", - "exactMatchModeDesc": "Use exact aliases for deprecated or renamed model IDs.", - "wildcardPatternModeDesc": "Use wildcard aliases with * and ? when a family of models should map to one target.", - "noExactAliasesConfigured": "No exact-match aliases configured.", - "wildcardRulesTitle": "Wildcard Rules", - "noWildcardAliasesConfigured": "No wildcard aliases configured.", - "overview": "Overview", - "unknownError": "Unknown Error", + "contextOpt": "Otimizado para Contexto", + "contextOptDesc": "Encaminha com base nos requisitos da janela de contexto e comprimento da conversa", + "cacheOpt": "Otimizado para Cache", + "cacheOptDesc": "Mantém o mesmo prefixo de prompt reutilizável na mesma conta de fornecedor", + "priorityDesc": "Fallback sequencial - tenta primeiro o fornecedor 1, depois o fornecedor 2, e assim por diante", + "weightedDesc": "Distribui o tráfego por pesos percentuais entre fornecedores", + "modelRoutingTitle": "Regras de Encaminhamento de Modelos", + "modelRoutingDesc": "Encaminha automaticamente modelos para combos específicos usando padrões glob", + "addRule": "Adicionar Regra", + "routeToCombo": "Encaminhar para Combo", + "selectCombo": "Selecionar combo...", + "priorityHint": "Mais alto = verificado primeiro. Usa 10+ para padrões específicos.", + "patternHint": "Usa * para qualquer conjunto de caracteres, ? para um único caractere. Sem distinção de maiúsculas.", + "noRoutingRules": "Nenhuma regra de encaminhamento configurada. Os pedidos usam o combo global por padrão.", + "routingRuleHint": "Adiciona uma regra como claude-opus* -> frontier-combo para encaminhar pedidos automaticamente.", + "deleteRoutingRule": "Eliminar esta regra de encaminhamento de modelo?", + "exactMatchMode": "Correspondência Exata", + "wildcardPatternMode": "Padrão Wildcard", + "exactMatchModeDesc": "Usa aliases exatos para IDs de modelo descontinuados ou renomeados.", + "wildcardPatternModeDesc": "Usa aliases wildcard com * e ? quando uma família de modelos deve mapear para um alvo.", + "noExactAliasesConfigured": "Nenhum alias de correspondência exata configurado.", + "wildcardRulesTitle": "Regras Wildcard", + "noWildcardAliasesConfigured": "Nenhum alias wildcard configurado.", + "overview": "Visão Geral", + "unknownError": "Erro Desconhecido", "pricingSourceLiteLLM": "Pricing Source Lite Llm", "clearSyncedPricingConfirm": "Clear Synced Pricing Confirm", "clearSyncedPricingFailed": "Clear Synced Pricing Failed", "pricingSourceUser": "Pricing Source User", "pageDescription": "Page Description", "pricingSyncStatus": "Pricing Sync Status", - "whitelist": "Whitelist", - "syncDisabled": "Sync Disabled", + "whitelist": "Lista branca", + "syncDisabled": "Sincronização Desativada", "pricingLoadFailed": "Pricing Load Failed", "pricingSyncDescription": "Pricing Sync Description", "clearSyncedPricingSuccess": "Clear Synced Pricing Success", @@ -7275,23 +7347,23 @@ "pricingSourceDefault": "Pricing Source Default", "pricingSyncSuccess": "Pricing Sync Success", "enableSyncError": "Enable Sync Error", - "syncEnabled": "Sync Enabled", - "blacklist": "Blacklist", + "syncEnabled": "Sincronização Ativada", + "blacklist": "Lista negra", "pricingSourceModelsDev": "Pricing Source Models Dev", - "syncedModels": "Synced Models", - "budget": "Budget", + "syncedModels": "Modelos Sincronizados", + "budget": "Orçamento", "pricingSyncTitle": "Pricing Sync Title", "pricingResetFailedWithReason": "Falha ao redefinir o preço: {reason}", - "tab": "Tab", + "tab": "Separador", "pricingSavedProvider": "Preço salvo para {provider}", "pricingSyncFailed": "Pricing Sync Failed", "pricingSaveFailedWithReason": "Falha ao salvar o preço: {reason}", "pricingResetProvider": "Redefinição de preços para {provider}", - "nextSync": "Next Sync", + "nextSync": "Próxima Sincronização", "pricingSyncFailedWithReason": "Falha na sincronização de preços: {reason}", - "clearSyncedPricing": "Clear Synced Pricing", - "compressionTitle": "Prompt Compression", - "compressionDesc": "Reduce token usage by compressing prompts before sending to providers", + "clearSyncedPricing": "Limpar Preços Sincronizados", + "compressionTitle": "Compressão de Prompt", + "compressionDesc": "Reduz o uso de tokens comprimindo prompts antes de os enviar aos fornecedores", "compressionGuidanceFullGuideLink": "Guia completo de compressão", "compressionGuidanceShow": "Detalhes", "compressionGuidanceHide": "Ocultar detalhes", @@ -7307,74 +7379,74 @@ "tokenSaverInputCompressionDesc": "Reescrever o histórico de chat elegível preservando o código, os URLs e a intenção.", "tokenSaverFineTunePrefix": "Ajustar cada motor em", "tokenSaverFineTuneSuffix": "ou combinar motores por pedido em", - "compressionMode": "Compression Mode", - "compressionModeOff": "Off", - "compressionModeOffDesc": "No compression applied", + "compressionMode": "Modo de Compressão", + "compressionModeOff": "Desligado", + "compressionModeOffDesc": "Sem compressão aplicada", "compressionModeLite": "Lite", - "compressionModeLiteDesc": "Whitespace and blank line reduction", - "compressionModeStandard": "Standard (Caveman)", - "compressionModeStandardDesc": "Rule-based compression with 30+ patterns, preserves code blocks and URLs", - "compressionModeAggressive": "Aggressive", - "compressionModeAggressiveDesc": "Summarization + tool result compression + progressive aging for maximum savings", + "compressionModeLiteDesc": "Redução de espaços em branco e linhas vazias", + "compressionModeStandard": "Padrão (Caveman)", + "compressionModeStandardDesc": "Compressão baseada em regras com mais de 30 padrões, preserva blocos de código e URLs", + "compressionModeAggressive": "Agressivo", + "compressionModeAggressiveDesc": "Sumarização + compressão de resultados de ferramentas + envelhecimento progressivo para poupança máxima", "compressionModeUltra": "Ultra", - "compressionModeUltraDesc": "Heuristic token pruning with optional local SLM fallback", - "compressionAggressiveConfig": "Aggressive Engine Configuration", - "compressionAggressiveConfigDesc": "Fine-tune summarization, tool compression, and aging thresholds", - "compressionUltraConfig": "Ultra Engine Configuration", - "compressionUltraConfigDesc": "Fine-tune heuristic pruning, SLM fallback, and per-message thresholds", - "compressionUltraRate": "Keep Rate", - "compressionUltraMinScore": "Minimum Score Threshold", - "compressionUltraSlmFallback": "Fallback to Aggressive", - "compressionUltraModelPath": "SLM Model Path", + "compressionModeUltraDesc": "Poda heurística de tokens com fallback local SLM opcional", + "compressionAggressiveConfig": "Configuração do Motor Agressivo", + "compressionAggressiveConfigDesc": "Afina sumarização, compressão de ferramentas e limiares de envelhecimento", + "compressionUltraConfig": "Configuração do Motor Ultra", + "compressionUltraConfigDesc": "Afina a poda heurística, fallback SLM e limiares por mensagem", + "compressionUltraRate": "Taxa de Manutenção", + "compressionUltraMinScore": "Limiar de Pontuação Mínima", + "compressionUltraSlmFallback": "Fallback para Agressivo", + "compressionUltraModelPath": "Caminho do Modelo SLM", "compressionUltraEngine": "Nível Ultra", "compressionUltraEngineHeuristic": "Heurística (Nível-A, predefinição)", "compressionUltraEngineSlm": "SLM (LLMLingua-2, ativação opcional)", "compressionUltraSlmHint": "O SLM transfere um pequeno modelo ONNX na primeira utilização (cold-start) e recorre de forma transparente à heurística em caso de limite de tempo ou se estiver indisponível.", "compressionUltraSlmPrewarm": "Pré-aquecer o modelo SLM ao ativar", - "compressionSummarizerEnabled": "Enable Summarizer", - "compressionMaxTokensPerMessage": "Max Tokens Per Message", - "compressionMinSavings": "Min Savings Threshold", - "compressionAgingThresholds": "Aging Thresholds", - "compressionAgingThresholdsDesc": "Number of recent messages kept at each aging tier (higher = more preserved)", - "compressionToolStrategies": "Tool Result Strategies", - "compressionToolStrategiesDesc": "Toggle compression strategies for different tool result types", - "compressionGeneral": "General Settings", - "compressionAutoTrigger": "Auto-Trigger Threshold", - "compressionCacheTTL": "Cache TTL", - "compressionPreserveSystem": "Preserve System Prompt", + "compressionSummarizerEnabled": "Ativar Sumarizador", + "compressionMaxTokensPerMessage": "Máx. de Tokens Por Mensagem", + "compressionMinSavings": "Limiar Mínimo de Poupança", + "compressionAgingThresholds": "Limiares de Envelhecimento", + "compressionAgingThresholdsDesc": "Número de mensagens recentes mantidas em cada nível de envelhecimento (mais alto = mais preservado)", + "compressionToolStrategies": "Estratégias de Resultados de Ferramentas", + "compressionToolStrategiesDesc": "Alterna estratégias de compressão para diferentes tipos de resultados de ferramentas", + "compressionGeneral": "Definições Gerais", + "compressionAutoTrigger": "Limiar de Disparo Automático", + "compressionCacheTTL": "TTL da Cache", + "compressionPreserveSystem": "Preservar Prompt do Sistema", "compressionPreserveSystemAlways": "Sempre", "compressionPreserveSystemWhenNoCache": "Quando não houver cache", "compressionPreserveSystemNever": "Nunca", "compressionLiveZoneTitle": "Zona Ativa alinhada com a cache", "compressionLiveZoneDesc": "Manter o prefixo de conversa comprimido estável e processar apenas os itens recém-adicionados.", - "compressionExclusionsTitle": "Exclusões de Compressão", - "compressionExclusionsDesc": "IDs de modelo ou padrões de fornecedor/modelo que nunca devem ser comprimidos. `*` é o único caractere curinga (por exemplo, `openai/*`, `*embedding*`). Um pedido correspondente passa através de byte-idêntico — nenhum motor de compressão é executado.", - "compressionExclusionsPlaceholder": "Um padrão por linha, por exemplo: \nopenai/text-embedding-3-large \nanthropic/*", - "compressionExclusionsSave": "Guardar", - "compressionExclusionsSaved": "Guardado", - "compressionExclusionsCount": "{count, plural, one {# exclusão} other {# exclusões}} configuradas", - "compressionExclusionsEmpty": "Sem exclusões configuradas — todos os modelos/pontos finais são elegíveis para compressão (comportamento padrão).", - "compressionCavemanConfig": "Caveman Engine Configuration", - "compressionCavemanConfigDesc": "Fine-tune the rule-based compression engine", + "compressionExclusionsTitle": "__MISSING__:Compression Exclusions", + "compressionExclusionsDesc": "__MISSING__:Model ids or provider/model patterns that must never be compressed. `*` is the only wildcard (e.g. `openai/*`, `*embedding*`). A matching request passes through byte-identical — no compression engine runs.", + "compressionExclusionsPlaceholder": "__MISSING__:One pattern per line, e.g.\nopenai/text-embedding-3-large\nanthropic/*", + "compressionExclusionsSave": "__MISSING__:Save", + "compressionExclusionsSaved": "__MISSING__:Saved", + "compressionExclusionsCount": "__MISSING__:{count, plural, one {# exclusion} other {# exclusions}} configured", + "compressionExclusionsEmpty": "__MISSING__:No exclusions configured — every model/endpoint is eligible for compression (default behavior).", + "compressionCavemanConfig": "Configuração do Motor Caveman", + "compressionCavemanConfigDesc": "Afina o motor de compressão baseado em regras", "compressionCavemanPanelHint": "O seu estado (ligado/desligado) e nível são definidos no painel:", - "compressionRoles": "Compress Message Roles", - "compressionRoleUser": "User", - "compressionRoleAssistant": "Assistant", - "compressionRoleSystem": "System", - "compressionMinLength": "Minimum Message Length", - "compressionSkipRules": "Skip Compression Rules", - "compressionSkipRulesDesc": "Click rules to skip them during compression", - "compressionPreservePatterns": "Preserve Patterns", - "compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)", - "compressionLogTitle": "Compression Log", - "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.", + "compressionRoles": "Comprimir Papéis de Mensagem", + "compressionRoleUser": "Utilizador", + "compressionRoleAssistant": "Assistente", + "compressionRoleSystem": "Sistema", + "compressionMinLength": "Comprimento Mínimo da Mensagem", + "compressionSkipRules": "Regras de Compressão a Ignorar", + "compressionSkipRulesDesc": "Clica nas regras para as ignorares durante a compressão", + "compressionPreservePatterns": "Padrões a Preservar", + "compressionPreservePatternsDesc": "Padrões regex que nunca são comprimidos (um por linha)", + "compressionLogTitle": "Registo de Compressão", + "compressionLogEmpty": "Ainda sem pedidos comprimidos. As estatísticas de compressão aparecerão aqui quando os pedidos forem processados com compressão.", "minutes": "minutos", "compressionModeRtk": "RTK", - "compressionModeRtkDesc": "Command-aware tool output filtering", - "compressionModeCodexResponses": "Responses tool output", - "compressionModeCodexResponsesDesc": "Conservative compression for eligible shell, patch, search, build, and JSON outputs", - "compressionModeStacked": "Stacked", - "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression", + "compressionModeRtkDesc": "Filtragem de saída de ferramenta sensível a comandos", + "compressionModeCodexResponses": "Saída de ferramenta Responses", + "compressionModeCodexResponsesDesc": "Compressão conservadora para saídas shell, patch, search, build e JSON elegíveis", + "compressionModeStacked": "Empilhado", + "compressionModeStackedDesc": "Filtragem de saída de ferramenta RTK seguida de compressão de mensagens Caveman", "qdrantTitle": "Qdrant (Memoria vetorial)", "qdrantDesc": "Opcional. Indexa memorias semanticas em um banco vetorial externo para busca mais rapida.", "qdrantStatusActive": "Ativo", @@ -7422,17 +7494,17 @@ "resilienceScope": "Escopo:", "resilienceTrigger": "Gatilho:", "resilienceEffect": "Efeito:", - "resilienceRequestQueueTitle": "Request Queue & Rate", - "resilienceAutoEnableApiKeyProviders": "Auto-enable for API-key providers", - "resilienceRequestsPerMinute": "Requests per minute", - "resilienceMinTimeBetweenRequests": "Minimum time between requests", - "resilienceConcurrentRequests": "Concurrent requests", + "resilienceRequestQueueTitle": "Fila de Pedidos e Taxa", + "resilienceAutoEnableApiKeyProviders": "Auto-ativar para fornecedores com chave de API", + "resilienceRequestsPerMinute": "Pedidos por minuto", + "resilienceMinTimeBetweenRequests": "Tempo mínimo entre pedidos", + "resilienceConcurrentRequests": "Pedidos concorrentes", "resilienceMaxQueueWaitTime": "Tempo máximo de espera na fila", - "resilienceBaseCooldown": "Base cooldown", - "resilienceUseUpstreamRetryHints": "Use upstream retry hints", - "resilienceDefaultPerProvider": "Default (per provider)", - "resilienceAlwaysOn": "Always on", - "resilienceAlwaysOff": "Always off", + "resilienceBaseCooldown": "Arrefecimento base", + "resilienceUseUpstreamRetryHints": "Usar dicas de tentativa upstream", + "resilienceDefaultPerProvider": "Padrão (por fornecedor)", + "resilienceAlwaysOn": "Sempre ligado", + "resilienceAlwaysOff": "Sempre desligado", "routingRemoveEntry": "Remover entrada", "routingNeedlesSubstrings": "Agulhas (substrings para combinar)", "routingCaseSensitive": "Diferencia maiúsculas de minúsculas", @@ -7520,20 +7592,20 @@ "visionBridgePromptHint": "Enviado para o modelo de visão antes de a descrição extraída ser reinjetada no pedido original.", "visionBridgeTimeoutMs": "Tempo limite (ms)", "visionBridgeMaxImagesPerRequest": "Máximo de imagens por solicitação", - "resilienceMaxBackoffSteps": "Max backoff steps", - "resilienceProviderBreakerTitle": "Circuit Breaker per Provider", - "resilienceFailureThreshold": "Failure threshold", - "resilienceDegradationThreshold": "Degradation threshold", + "resilienceMaxBackoffSteps": "Máx. de passos de backoff", + "resilienceProviderBreakerTitle": "Disjuntor por Fornecedor", + "resilienceFailureThreshold": "Limiar de falha", + "resilienceDegradationThreshold": "Limiar de degradação", "resilienceResetTimeout": "Redefinir tempo limite", "resilienceFailureThresholdLabel": "Limite de falha", "resilienceResetTimeoutLabel": "Redefinir tempo limite", - "resilienceConnectionCooldownTitle": "Connection Cooldown", + "resilienceConnectionCooldownTitle": "Arrefecimento de Ligação", "resilienceUseUpstreamRetryHintsLabel": "Use dicas de nova tentativa upstream", "resilienceUseUpstream429BreakerLabel": "Use dicas upstream 429 (disjuntor)", "resilienceMaxBackoffStepsLabel": "Etapas máximas de espera", "resilienceYes": "Sim", "resilienceNo": "Não", - "resilienceDefault": "Default", + "resilienceDefault": "Padrão", "storageDatabaseBackupRetention": "Retenção de backup de banco de dados", "storageDatabaseBackups": "Cópias de segurança da base de dados", "storageBackupRetentionDescription": "As cópias de segurança automáticas do SQLite são armazenadas em", @@ -7678,8 +7750,8 @@ "description": "Filtragem de saídas de comandos." }, "codex-responses": { - "label": "Responses Tool Output", - "description": "Conservative compression for supported Responses tool outputs." + "label": "Saída de Ferramenta Responses", + "description": "Compressão conservadora para saídas de ferramentas Responses suportadas." }, "headroom": { "label": "Headroom", @@ -7720,8 +7792,8 @@ "description": "Escada YAGNI: a menor alteração funcional, sem abstrações não solicitadas." }, "ponytail": { - "label": "Ponytail (lazy senior dev)", - "description": "Lazy senior-dev discipline: climb the YAGNI ladder, fix root cause, smallest working diff." + "label": "Ponytail (dev sénior preguiçoso)", + "description": "Disciplina de dev sénior preguiçoso: sobe a escada YAGNI, corrige a causa raiz, menor diff funcional." }, "terse-cjk": { "label": "CJK conciso (文言)", @@ -7746,11 +7818,11 @@ "cliproxyapiImportAuthButton": "Importar contas", "payloadRulesTitle": "Regras de carga útil", "payloadRulesDesc": "Configure as mutações de payload do pedido por modelo e protocolo. As alterações são guardadas nas definições e recarregadas a quente no runtime imediatamente após guardar.", - "payloadRuleDefaultTitle": "default", + "payloadRuleDefaultTitle": "padrão", "payloadRuleDefaultDesc": "Aplica parâmetros apenas quando o caminho de destino está em falta no payload de saída.", - "payloadRuleOverrideTitle": "override", + "payloadRuleOverrideTitle": "substituição", "payloadRuleOverrideDesc": "Força valores no payload, substituindo tudo o que já estiver presente nesse caminho.", - "payloadRuleFilterTitle": "filter", + "payloadRuleFilterTitle": "filtro", "payloadRuleFilterDesc": "Remove parâmetros bloqueados do payload antes de o pedido upstream ser enviado.", "payloadRuleDefaultRawTitle": "defaultRaw", "payloadRuleDefaultRawDesc": "Tal como default, mas os valores de string são analisados primeiro como JSON quando possível. O alias de entrada legado default-raw também é aceite ao guardar.", @@ -7797,11 +7869,11 @@ "codexFastTierDesc": "Injete globalmente service_tier=priority para solicitações do OpenAI Codex.", "codexFastTierHint": "Quando habilitado, o OmniRoute adiciona service_tier=priority às solicitações de saída do Codex para conexões que ainda não especificam uma camada. O nível de prioridade requer uma chave de API OpenAI Enterprise ou o caminho ChatGPT-auth Codex; outros tipos de chave receberão um erro relacionado ao nível do OpenAI. As configurações por conexão na página do provedor Codex têm precedência.", "codexFastTierSaveError": "Falha ao atualizar a configuração do Codex Fast Tier", - "codexAutoPingTitle": "Codex Quota Auto-Ping", - "codexAutoPingDesc": "Opt-in per connection: sends a tiny request right after a Codex session window resets so it isn't cold when you need it.", - "codexAutoPingWarning": "Consumes a small amount of real Codex quota on every ping. Off by default — enable only for connections you actively rely on.", - "codexAutoPingSaveError": "Failed to update Codex Auto-Ping setting", - "codexAutoPingToggleAria": "Toggle Codex quota auto-ping for {connection}", + "codexAutoPingTitle": "Auto-Ping de Quota do Codex", + "codexAutoPingDesc": "Opt-in por ligação: envia um pedido pequeno logo após a janela de sessão Codex reiniciar para não estar fria quando a usares.", + "codexAutoPingWarning": "Consome uma pequena quantidade de quota real do Codex em cada ping. Desligado por padrão — ativa apenas para ligações que uses ativamente.", + "codexAutoPingSaveError": "Falha ao atualizar a definição de Auto-Ping do Codex", + "codexAutoPingToggleAria": "Alternar auto-ping de quota do Codex para {connection}", "codexFastTierTierLabel": "Nível de serviço", "codexFastTierTierPriority": "Prioridade", "codexFastTierTierFlex": "Flex", @@ -7928,8 +8000,8 @@ "resilienceProviderCooldownEnabledDesc": "Quando ativado, os fornecedores com falhas são monitorizados globalmente e ignorados durante um período de cooldown.", "resilienceProviderCooldownMin": "Cooldown mínimo", "resilienceProviderCooldownMax": "Cooldown máximo", - "forcedFingerprintTitle": "Always enabled for {provider} — required for OAuth account safety; cannot be turned off.", - "forcedFingerprintBadge": "Required", + "forcedFingerprintTitle": "Sempre ativado para {provider} — obrigatório para a segurança da conta OAuth; não pode ser desligado.", + "forcedFingerprintBadge": "Obrigatório", "sessionAffinityTitle": "Afinidade de sessão", "sessionAffinityDesc": "Mantém uma conversa na mesma conta durante este número de segundos, para qualquer fornecedor. 0 desativa.", "sessionAffinityTtl": "TTL de afinidade (segundos)", @@ -8001,20 +8073,20 @@ "modelLockoutMaxBackoffStepsDescription": "Número máximo de passos de backoff antes de o cooldown parar de aumentar. O limite do Cooldown Máximo é atingido primeiro na maioria das configurações, tornando este um teto de segurança para quando o Cooldown Máximo for aumentado.", "disableSessionStickiness": "Desativar persistência de sessão", "disableSessionStickinessDesc": "As combinações round-robin e aleatórias alternam para uma ligação diferente a cada pedido em vez de fixarem uma conversa inteira a uma ligação através do hash da primeira mensagem. Deixe desativado para preservar os hits da cache de prompts em conversas com múltiplos turnos. As sobreposições por combinação têm precedência.", - "promptCacheAffinity": "Prompt-cache locality routing", - "promptCacheAffinityDesc": "Prefer the same provider account for matching prompt-cache keys while preserving health and quota failover.", + "promptCacheAffinity": "Encaminhamento por localidade de prompt-cache", + "promptCacheAffinityDesc": "Prefere a mesma conta de fornecedor para chaves de prompt-cache correspondentes, preservando o failover de saúde e quota.", "credentialRedaction": "Ocultação de Credenciais", "credentialRedactionDesc": "Oculte chaves de API, tokens e segredos do contexto enviado para os fornecedores e das respostas.", "enableCredentialRedaction": "Ativar ocultação de credenciais", "enableCredentialRedactionDesc": "Remove chaves de API, tokens, chaves privadas e JWTs de mensagens, chamadas de ferramentas e respostas.", - "pricingAutoSyncDisabled": "Automatic Sync Disabled", - "pricingAutoSyncEnabled": "Automatic Sync Enabled", + "pricingAutoSyncDisabled": "Sincronização Automática Desativada", + "pricingAutoSyncEnabled": "Sincronização Automática Ativada", "modalityBridgeIntro": "Conecte conteúdo multimodal ao texto antes de chegar a modelos apenas de texto. A visão está ativa; o áudio chega com o AudioBridge; o vídeo está no roteiro.", "modalityBridgeVisionTab": "Visão", "modalityBridgeAudioTab": "Áudio", "modalityBridgeVideoTab": "Vídeo", "modalityBridgeSubTabsAria": "Secções da Ponte de Modalidade", - "modalityBridgeVisionTitle": "Vision Bridge", + "modalityBridgeVisionTitle": "Ponte de Visão", "modalityBridgeVisionDesc": "Descreva imagens com um modelo de visão e continue com o modelo de texto escolhido pelo utilizador.", "modalityBridgeMode": "Modo", "modalityBridgeModeAuto": "Automático (recomendado)", @@ -8091,7 +8163,7 @@ "oneproxyCountry": "Oneproxy País", "oneproxyDelete": "Oneproxy Eliminar", "oneproxyEmpty": "Oneproxy Vazio", - "oneproxyHost": "Oneproxy Host", + "oneproxyHost": "Host do Oneproxy", "oneproxyLatency": "Latência do Oneproxy", "oneproxyProtocol": "Protocolo Oneproxy", "oneproxyQuality": "Qualidade Oneproxy", @@ -8158,22 +8230,22 @@ "thinkingModeAdaptiveDesc": "__MISSING__:Scale thinking budget from a base effort using message count, tools, and prompt length." }, "contextRtk": { - "title": "RTK Engine", - "description": "Command-aware compression for tool output, terminal logs and build results.", - "enabled": "Enabled", - "intensity": "Intensity", - "intensityMinimal": "Minimal", - "intensityStandard": "Standard", - "intensityAggressive": "Aggressive", - "toolResults": "Tool results", - "assistantMessages": "Assistant messages", - "codeBlocks": "Code blocks", + "title": "Motor RTK", + "description": "Compressão sensível a comandos para saída de ferramentas, registos de terminal e resultados de build.", + "enabled": "Ativado", + "intensity": "Intensidade", + "intensityMinimal": "Mínimo", + "intensityStandard": "Padrão", + "intensityAggressive": "Agressivo", + "toolResults": "Resultados de ferramentas", + "assistantMessages": "Mensagens do assistente", + "codeBlocks": "Blocos de código", "filterCatalog": "Catálogo de Filtros", "filterCatalogDesc": "Filtros de saída disponíveis por categoria", "guidedConfig": "Configuração", "guidedConfigDesc": "Ajuste como o RTK filtra a saída do seu terminal", - "maxLines": "Max lines", - "maxChars": "Max chars", + "maxLines": "Máx. de linhas", + "maxChars": "Máx. de caracteres", "deduplicateThreshold": "Limite de desduplicação", "customFilters": "Filtros personalizados", "detectedType": "Tipo detectado", @@ -8185,22 +8257,22 @@ "rawOutputFailures": "Falhas", "rawOutputAlways": "Sempre", "rawOutputMaxBytes": "Máximo de bytes de saída bruta", - "filterTesting": "Filter Testing", - "pasteOutput": "Paste tool output to test filtering...", + "filterTesting": "Teste de Filtros", + "pasteOutput": "Cola a saída da ferramenta para testar a filtragem...", "presetHigh": "Agressivo", "presetLow": "Luz", "presetMaxChars": "Máximo de caracteres de saída", "presetMaxLines": "Máximo de linhas de saída", "presetMedium": "Padrão", - "run": "Run", - "result": "Result", - "previewEmpty": "Run a sample to preview RTK output.", - "detected": "Detected", + "run": "Executar", + "result": "Resultado", + "previewEmpty": "Executa uma amostra para pré-visualizar a saída RTK.", + "detected": "Detetado", "masterSwitchOffAlert": "O interruptor principal do Token Saver está DESATIVADO — estas definições não afetarão os pedidos até que o ative na página Endpoint.", - "tokensFiltered": "Tokens filtered", - "filtersActive": "Filters active", - "requests": "Requests", - "avgSavings": "Avg savings", + "tokensFiltered": "Tokens filtrados", + "filtersActive": "Filtros ativos", + "requests": "Pedidos", + "avgSavings": "Poupança média", "simpleMode": "Simples", "advancedMode": "Avançado", "searchFilters": "Filtros de pesquisa...", @@ -8400,26 +8472,26 @@ } }, "contextCombos": { - "title": "Compression Combos", - "description": "Define how engines are combined for different routing scenarios.", - "createCombo": "Create Compression Combo", - "editCombo": "Edit", - "deleteCombo": "Delete", - "deleteConfirm": "Delete this compression combo?", + "title": "Combos de Compressão", + "description": "Define como os motores são combinados para diferentes cenários de encaminhamento.", + "createCombo": "Criar Combo de Compressão", + "editCombo": "Editar", + "deleteCombo": "Eliminar", + "deleteConfirm": "Eliminar este combo de compressão?", "pipeline": "Pipeline", - "addStep": "Add Step", - "removeStep": "Remove", - "name": "Name", - "descriptionField": "Description", - "languagePacks": "Language Packs", - "outputMode": "Output Mode", - "assignToRouting": "Assign to Routing Combos", - "noAssignments": "No routing combos available", - "default": "Default", - "setAsDefault": "Set as Default", - "save": "Save", - "cancel": "Cancel", - "enabled": "Enabled", + "addStep": "Adicionar Passo", + "removeStep": "Remover", + "name": "Nome", + "descriptionField": "Descrição", + "languagePacks": "Pacotes de Idioma", + "outputMode": "Modo de Saída", + "assignToRouting": "Atribuir a Combos de Encaminhamento", + "noAssignments": "Sem combos de encaminhamento disponíveis", + "default": "Padrão", + "setAsDefault": "Definir como Padrão", + "save": "Guardar", + "cancel": "Cancelar", + "enabled": "Ativado", "loading": "A carregar…", "hubTitle": "Hub de Compressão", "hubDescription": "Escolha qual o perfil de compressão a executar globalmente.", @@ -8463,7 +8535,7 @@ "noRun": "Nenhuma execução de compressão disponível.", "liveDataHint": "Os dados em tempo real chegam através do canal de compressão WebSocket.", "cockpitView": "Vista do cockpit", - "canvas": "Canvas", + "canvas": "Tela", "waterfall": "Cascata", "replayDone": "Reprodução concluída", "pauseReplay": "Pausar reprodução", @@ -8472,7 +8544,7 @@ "replay": "Reproduzir", "resetReplay": "Repor reprodução", "stepProgress": "passo {current}/{total}", - "inlineView": "Inline", + "inlineView": "Em linha", "splitComingSoon": "Vista dividida (brevemente)", "inputPlaceholder": "Cole um prompt, resultado da ferramenta ou contexto…", "activeCombined": "Ativo no fluxo combinado", @@ -8583,21 +8655,21 @@ "starting": "A iniciar…", "stop": "Parar", "stopping": "A parar…", - "restart": "Restart", + "restart": "Reiniciar", "restarting": "A reiniciar…", - "update": "Update", + "update": "Atualizar", "updating": "A atualizar…", - "install": "Install", + "install": "Instalar", "installing": "A instalar…", - "autoStart": "Auto-start", + "autoStart": "Início Automático", "autoStartDescription": "Iniciar o {name} automaticamente quando o OmniRoute iniciar", - "apiKey": "API Key", + "apiKey": "Chave de API", "apiKeyDescription": "Chave utilizada pelo OmniRoute para se autenticar no {name}", "keyRotated": "Chave rodada — o {name} foi reiniciado para aplicar a nova chave", "keyRotateFailed": "Falha ao rodar a chave", "keyRevealFailed": "Falha ao revelar a chave", "keyRevealEmpty": "Falha ao revelar: a chave não foi devolvida", - "reveal": "Reveal", + "reveal": "Revelar", "revealing": "A revelar…", "hide": "Ocultar", "rotateKey": "Rodar chave", @@ -8660,38 +8732,38 @@ "save": "Guardar" }, "contextCaveman": { - "title": "Caveman Engine", - "description": "Rule-based message compression, language packs, analytics and output mode controls.", + "title": "Motor Caveman", + "description": "Compressão de mensagens baseada em regras, pacotes de idioma, analítica e controlos de modo de saída.", "advancedConfig": "Configuração avançada", "advancedConfigDesc": "Ajustar o comportamento da compactação", "aggressiveSettings": "Configurações agressivas", "aggressiveSettingsDesc": "Compressão máxima com potenciais compensações de qualidade", - "requests": "Requests", - "tokensSaved": "Tokens saved", - "savingsPercent": "Savings %", - "avgLatency": "Avg latency", - "languagePacks": "Language Packs", - "languagePacksDesc": "Enable compression rules for specific languages.", + "requests": "Pedidos", + "tokensSaved": "Tokens poupados", + "savingsPercent": "% de Poupança", + "avgLatency": "Latência média", + "languagePacks": "Pacotes de Idioma", + "languagePacksDesc": "Ativa regras de compressão para idiomas específicos.", "labelAutoTrigger": "Compactar automaticamente quando o contexto exceder", "labelCompressionRate": "Força de compressão", "labelMaxTokens": "Tokens de destino por mensagem", "labelMinLength": "Comprimento mínimo da mensagem", "labelMinSavings": "Tokens mínimos para salvar", - "enabled": "Enabled", - "autoDetect": "Auto-detect language", - "rulesCount": "{count} rules", + "enabled": "Ativado", + "autoDetect": "Detetar idioma automaticamente", + "rulesCount": "{count} regras", "inputCompressionTitle": "Compressão de entrada", "inputCompressionDesc": "Reescrever o histórico do chat com palavras mais curtas. Reduz os tokens de entrada em cerca de 50%.", - "analyticsTitle": "Compression Analytics", - "noAnalytics": "No compression analytics yet.", + "analyticsTitle": "Analítica de Compressão", + "noAnalytics": "Ainda sem analítica de compressão.", "masterDisabledWarning": "O interruptor principal do Token Saver está DESATIVADO — estas definições não afetarão os pedidos até que o ative nas Definições de Compressão ou o altere aqui.", "outputMode": "Modo de saída", "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.", - "outputModeTitle": "Output Mode", + "outputModeTitle": "Modo de Saída", "quickSettings": "Configurações rápidas", "quickSettingsDesc": "Configurações básicas de compactação para começar", - "autoClarity": "Auto-Clarity Bypass", - "bypassConditions": "Bypass conditions", + "autoClarity": "Desvio Auto-Clarity", + "bypassConditions": "Condições de desvio", "bypassConditionsList": "de segurança, irreversível, de esclarecimento, sensível à ordem", "simpleMode": "Simples", "advancedMode": "Avançado", @@ -8703,9 +8775,9 @@ "ultraSettings": "Configurações Ultra", "ultraSettingsDesc": "Compressão semântica alimentada por SLM", "preview": { - "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.", - "full": "Respond terse and compact. Preserve all technical substance.", - "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols." + "lite": "Responde de forma concisa. Preserva termos técnicos, código, erros, URLs e identificadores.", + "full": "Responde de forma curta e compacta. Preserva toda a substância técnica.", + "ultra": "Responde de forma ultra curta com abreviaturas técnicas comuns. Preserva símbolos exatos." } }, "translator": { @@ -9066,7 +9138,7 @@ "circuitBreakers": "Disjuntores", "lockedIPs": "IPs bloqueados", "lockoutsAutoRefreshHint": "Bloqueios de limite de taxa por modelo • Atualização automática de 10s", - "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "lockedCount": "{count, plural, one {# bloqueado} other {# bloqueados}}", "timeLeft": "{time} restantes", "howItWorks": "Como funciona", "howItWorksSubtitle": "Saiba como as avaliações validam suas respostas do LLM", @@ -9110,12 +9182,12 @@ "modelsUnderTest": "Modelos em teste", "searchSuitesPlaceholder": "Pesquisar suítes...", "passSuffix": "passar", - "casesCount": "{count, plural, one {# case} other {# cases}}", + "casesCount": "{count, plural, one {# caso} other {# casos}}", "runEval": "Executar avaliação", "runAllSuites": "Executar tudo", "runAllRunning": "Correndo tudo...", "runAllProgress": "Executando {current}/{total}: {name}", - "runAllFailedSuites": "{count, plural, one {# suite failed} other {# suites failed}}", + "runAllFailedSuites": "{count, plural, one {# suíte falhou} other {# suítes falharam}}", "runAllCompleted": "Executou {suites} suítes — {passed} aprovado, {failed} falhou", "runAllCompletedWithFailures": "Executei suítes {completed}; {failedSuites} não foi concluído", "runningProgress": "Executando {current}/{total}...", @@ -9165,7 +9237,7 @@ "providerLimits": "Limites do provedor", "noProviders": "Nenhum provedor conectado", "connectProvidersForQuota": "Conecte-se a provedores com OAuth para rastrear o uso e os limites de cota de API.", - "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "accountsCount": "{count, plural, one {# conta} other {# contas}}", "filteredFromCount": "(filtrado de {count})", "autoRefresh": "Atualização automática", "refreshAll": "Atualizar tudo", @@ -9178,14 +9250,14 @@ "quotaVisibilityUpdateFailed": "Falha ao atualizar a visibilidade da quota", "account": "Conta", "modelQuotas": "Cotas de modelo", - "lastUsed": "Last Refreshed", + "lastUsed": "Última Atualização", "actions": "Ações", "refreshQuota": "Atualizar cota", "today": "Hoje", "tomorrow": "Amanhã", "dayTimeFormat": "{day}, {time}", "inDuration": "em {duration}", - "notApplicable": "N/A", + "notApplicable": "N/D", "rawPlanWithValue": "Plano bruto: {plan}", "noPlanFromProvider": "Nenhum plano do provedor", "tokenExpiresIn": "O token expira em {time}", @@ -9194,9 +9266,9 @@ "cardExpand": "Expandir", "cardCollapse": "Recolher", "moreQuotas": "+{count} mais", - "ungrouped": "Ungrouped", - "viewFlat": "Flat", - "viewByEnvironment": "By Environment", + "ungrouped": "Não agrupado", + "viewFlat": "Plano", + "viewByEnvironment": "Por Ambiente", "noQuotaDataAvailable": "Não há dados de cota disponíveis", "noAccountsForTierFilter": "Nenhuma conta encontrada para filtro de nível", "tierAll": "Todos", @@ -9246,7 +9318,7 @@ "confirmRedeemResetCreditButton": "Resgatar crédito", "resetCreditRedeemed": "Reposição resgatada", "resetCreditRedeemFailed": "Falha ao resgatar o crédito de reposição", - "suiteBuilderSaveFailed": "Failed to save suite", + "suiteBuilderSaveFailed": "Falha ao guardar a suíte", "clone": "Clonar", "exportSuite": "Exportar", "importSuite": "Importar", @@ -9258,102 +9330,102 @@ "suiteBuilderCloneSuffix": "copiar", "suiteBuilderImportedSuite": "Suíte Importada", "scorecardTitle": "Scorecard", - "evalApiKey": "API Key", - "scorecardPassRate": "Pass Rate", - "targetTypeModel": "Model", - "actualOutputLabel": "Actual Output", - "evalTargetHint": "Select a model or combo to evaluate.", - "suiteBuilderDeleted": "Suite deleted successfully", - "suiteBuilderCaseCardHint": "Define the input prompt and expected output criteria.", - "nextResetUtc": "Next reset (UTC)", - "scorecardHint": "Aggregated pass rates across all evaluation suites.", - "suiteLatestRunsHint": "Most recent evaluation runs for this suite.", - "saving": "Saving", - "suiteBuilderCaseModelLabel": "Model (optional)", - "evalControlsTitle": "Evaluation Controls", - "suiteBuilderEditTitle": "Edit Eval Suite", - "suiteBuilderCaseStrategyLabel": "Validation Strategy", - "notifySelectDifferentCompareTarget": "Please select a different target for comparison", - "recentRunsHint": "Showing the most recent evaluation runs. Click a run to see detailed results.", - "evalCompareHint": "Optionally compare results against a second target.", - "suiteBuilderCaseInvalid": "This case has validation errors. Please fix before saving.", - "historyEmpty": "No evaluation history yet", - "suiteBuilderUpdated": "Suite updated successfully", - "resetInterval": "Reset Interval", - "suiteBuilderCreateTitle": "Create Eval Suite", - "activePeriodSpend": "Active Period Spend", - "evalApiKeyHint": "Select which API key to use for evaluation requests.", - "evalCompareOptional": "Compare (optional)", - "suiteBuilderDeleteFailed": "Failed to delete suite", - "suiteBuilderCaseSystemPromptPlaceholder": "Optional system instructions...", - "scorecardCases": "Cases", - "runCompletedWithScore": "Evaluation completed — {score}% pass rate", - "suiteBuilderCustomBadge": "Custom", - "targetSuiteDefaults": "Suite defaults", - "suiteBuilderDeleteConfirm": "Are you sure you want to delete this suite? This action cannot be undone.", - "suiteBuilderNameLabel": "Suite Name", - "scorecardSuites": "Suites", - "evalCompareTarget": "Compare Target", - "suiteBuilderCaseModelPlaceholder": "e.g. gpt-4o-mini", - "evalControlsHint": "Configure your evaluation target and API key, then run suites to validate model quality.", - "recentRunsTitle": "Recent Runs", - "suiteBuilderCaseSystemPromptLabel": "System Prompt", - "suiteBuilderCaseExpectedPlaceholder": "e.g. def fibonacci", + "evalApiKey": "Chave de API", + "scorecardPassRate": "Taxa de Aprovação", + "targetTypeModel": "Modelo", + "actualOutputLabel": "Saída Real", + "evalTargetHint": "Seleciona um modelo ou combo para avaliar.", + "suiteBuilderDeleted": "Suíte eliminada com sucesso", + "suiteBuilderCaseCardHint": "Define o prompt de entrada e os critérios de saída esperados.", + "nextResetUtc": "Próxima reposição (UTC)", + "scorecardHint": "Taxas de aprovação agregadas em todas as suítes de avaliação.", + "suiteLatestRunsHint": "Execuções de avaliação mais recentes desta suíte.", + "saving": "A guardar", + "suiteBuilderCaseModelLabel": "Modelo (opcional)", + "evalControlsTitle": "Controlos de Avaliação", + "suiteBuilderEditTitle": "Editar Suíte de Avaliação", + "suiteBuilderCaseStrategyLabel": "Estratégia de Validação", + "notifySelectDifferentCompareTarget": "Seleciona um alvo diferente para comparação", + "recentRunsHint": "A mostrar as execuções de avaliação mais recentes. Clica numa execução para veres resultados detalhados.", + "evalCompareHint": "Opcionalmente compara resultados com um segundo alvo.", + "suiteBuilderCaseInvalid": "Este caso tem erros de validação. Corrige antes de guardar.", + "historyEmpty": "Ainda sem histórico de avaliação", + "suiteBuilderUpdated": "Suíte atualizada com sucesso", + "resetInterval": "Intervalo de Reposição", + "suiteBuilderCreateTitle": "Criar Suíte de Avaliação", + "activePeriodSpend": "Gasto do Período Ativo", + "evalApiKeyHint": "Seleciona qual a chave de API a usar nos pedidos de avaliação.", + "evalCompareOptional": "Comparar (opcional)", + "suiteBuilderDeleteFailed": "Falha ao eliminar a suíte", + "suiteBuilderCaseSystemPromptPlaceholder": "Instruções de sistema opcionais...", + "scorecardCases": "Casos", + "runCompletedWithScore": "Avaliação concluída — {score}% de taxa de aprovação", + "suiteBuilderCustomBadge": "Personalizado", + "targetSuiteDefaults": "Predefinições da suíte", + "suiteBuilderDeleteConfirm": "Tens a certeza de que queres eliminar esta suíte? Esta ação não pode ser desfeita.", + "suiteBuilderNameLabel": "Nome da Suíte", + "scorecardSuites": "Suítes", + "evalCompareTarget": "Alvo de Comparação", + "suiteBuilderCaseModelPlaceholder": "ex: gpt-4o-mini", + "evalControlsHint": "Configura o teu alvo de avaliação e chave de API, e depois executa suítes para validar a qualidade do modelo.", + "recentRunsTitle": "Execuções Recentes", + "suiteBuilderCaseSystemPromptLabel": "Prompt de Sistema", + "suiteBuilderCaseExpectedPlaceholder": "ex: def fibonacci", "suiteBuilderCaseExpectedPlaceholderContains": "por exemplo def fibonacci", "suiteBuilderCaseExpectedPlaceholderExact": "Cole a resposta exata esperada", "suiteBuilderCaseExpectedPlaceholderRegex": "por exemplo ^\\\\s*\\\\{.*\\\\}\\\\s*$", "suiteBuilderCaseExpectedHintRegex": "Use uma expressão regular JavaScript sem quebrar barras.", - "suiteBuilderNamePlaceholder": "e.g. Coding Quality Suite", - "suiteBuilderAddCase": "Add Case", - "cancel": "Cancel", - "evalTarget": "Target", - "suiteBuilderCaseNameLabel": "Case Name", - "weeklyLimitUsd": "Weekly Limit (USD)", - "suiteBuilderCaseUserPromptPlaceholder": "e.g. Write a fibonacci function in Python", - "suiteBuilderNameRequired": "Suite name is required", - "suiteBuilderCaseUserPromptLabel": "User Prompt", - "daily": "Daily", - "resultErrorLabel": "Error", - "suiteBuilderBuiltInBadge": "Built-in", - "suiteBuilderCaseCardTitle": "Test Case", + "suiteBuilderNamePlaceholder": "ex: Suíte de Qualidade de Codificação", + "suiteBuilderAddCase": "Adicionar Caso", + "cancel": "Cancelar", + "evalTarget": "Alvo", + "suiteBuilderCaseNameLabel": "Nome do Caso", + "weeklyLimitUsd": "Limite Semanal (USD)", + "suiteBuilderCaseUserPromptPlaceholder": "ex: Escreve uma função fibonacci em Python", + "suiteBuilderNameRequired": "O nome da suíte é obrigatório", + "suiteBuilderCaseUserPromptLabel": "Prompt do Utilizador", + "daily": "Diário", + "resultErrorLabel": "Erro", + "suiteBuilderBuiltInBadge": "Integrado", + "suiteBuilderCaseCardTitle": "Caso de Teste", "suiteBuilderDuplicateCase": "Duplicar", - "weeklyLimitPlaceholder": "e.g. 50.00", - "suiteBuilderCaseTagsHint": "Comma-separated tags for organizing test cases.", - "notifyEvalRunFailedWithReason": "Evaluation failed: {reason}", - "weekly": "Weekly", - "runEvalRunning": "Running evaluation...", - "delete": "Delete", - "resetTimeUtc": "Reset Time (UTC)", - "evalApiKeyAuto": "Auto (use default)", - "suiteBuilderDescriptionPlaceholder": "Optional description of what this suite tests...", - "targetComparisonTitle": "Target Comparison", - "save": "Save", - "suiteBuilderCreated": "Suite created successfully", - "suiteLatestRuns": "Latest Runs", - "suiteBuilderCaseExpectedLabel": "Expected Value", - "historyLatency": "Latency", - "suiteBuilderCaseTagsPlaceholder": "e.g. coding, python", + "weeklyLimitPlaceholder": "ex: 50.00", + "suiteBuilderCaseTagsHint": "Etiquetas separadas por vírgula para organizar os casos de teste.", + "notifyEvalRunFailedWithReason": "A avaliação falhou: {reason}", + "weekly": "Semanal", + "runEvalRunning": "A executar avaliação...", + "delete": "Eliminar", + "resetTimeUtc": "Hora de Reposição (UTC)", + "evalApiKeyAuto": "Auto (usar predefinição)", + "suiteBuilderDescriptionPlaceholder": "Descrição opcional do que esta suíte testa...", + "targetComparisonTitle": "Comparação de Alvos", + "save": "Guardar", + "suiteBuilderCreated": "Suíte criada com sucesso", + "suiteLatestRuns": "Últimas Execuções", + "suiteBuilderCaseExpectedLabel": "Valor Esperado", + "historyLatency": "Latência", + "suiteBuilderCaseTagsPlaceholder": "ex: codificação, python", "targetTypeCombo": "Combo", - "scorecardPassed": "Passed", - "suiteBuilderCaseTagsLabel": "Tags", - "suiteBuilderNewSuite": "New Suite", - "notifyEvalLoadFailed": "Failed to load evaluation data", - "notConfigured": "Not Configured", - "suiteBuilderCaseNamePlaceholder": "e.g. Python fibonacci test", - "intervalLabel": "Interval", - "suiteBuilderCreateAction": "Create Suite", - "suiteBuilderCasesHint": "Each case sends a prompt and validates the response.", - "suiteBuilderUpdatedAt": "Updated", - "errorBadge": "Error", - "suiteBuilderCasesTitle": "Test Cases", - "edit": "Edit", - "monthly": "Monthly", - "suiteBuilderCasesRequired": "At least one test case is required", - "weeklyLimitSummary": "Weekly budget limit summary", - "suiteBuilderDescriptionLabel": "Description", - "targetComparisonHint": "Side-by-side comparison of evaluation results between targets.", - "compareCompletedWithScore": "Comparison completed — {score}% pass rate", - "staleQuotaTooltip": "Last refresh failed — showing cached data", + "scorecardPassed": "Aprovados", + "suiteBuilderCaseTagsLabel": "Etiquetas", + "suiteBuilderNewSuite": "Nova Suíte", + "notifyEvalLoadFailed": "Falha ao carregar os dados de avaliação", + "notConfigured": "Não Configurado", + "suiteBuilderCaseNamePlaceholder": "ex: Teste fibonacci Python", + "intervalLabel": "Intervalo", + "suiteBuilderCreateAction": "Criar Suíte", + "suiteBuilderCasesHint": "Cada caso envia um prompt e valida a resposta.", + "suiteBuilderUpdatedAt": "Atualizada", + "errorBadge": "Erro", + "suiteBuilderCasesTitle": "Casos de Teste", + "edit": "Editar", + "monthly": "Mensal", + "suiteBuilderCasesRequired": "É necessário pelo menos um caso de teste", + "weeklyLimitSummary": "Resumo do limite de orçamento semanal", + "suiteBuilderDescriptionLabel": "Descrição", + "targetComparisonHint": "Comparação lado a lado dos resultados de avaliação entre alvos.", + "compareCompletedWithScore": "Comparação concluída — {score}% de taxa de aprovação", + "staleQuotaTooltip": "A última atualização falhou — a mostrar dados em cache", "quotaThresholdLabel": "Minutos restantes", "quotaCutoffsColumnHelp": "Interrompa as solicitações quando a cota restante cair para esse percentual ou menos.", "quotaCutoffsButtonDefault": "Padrão", @@ -9555,14 +9627,14 @@ }, "auth": { "welcome": "Bem vindo", - "signIn": "Faça login", + "signIn": "Iniciar sessão", "enterPassword": "Digite sua senha para continuar", - "password": "Senha", + "password": "Palavra-passe", "unifiedProxy": "Proxy de API de IA unificado", "unifiedAiApiProxy": "Proxy de API de IA unificado", "unifiedAiApiProxyDesc": "Encaminhe solicitações para vários provedores de IA por meio de um único endpoint. Balanceamento de carga, failover e rastreamento de uso integrados.", "passwordNotEnabled": "A proteção por senha não está ativada", - "loading": "Carregando...", + "loading": "A autenticar...", "invalidPassword": "Senha inválida", "errorOccurredRetry": "Ocorreu um erro. Por favor, tente novamente.", "configureInstance": "Vamos configurar sua instância do OmniRoute", @@ -9605,19 +9677,19 @@ "backToLogin": "Voltar ao login", "forgotPassword": "Esqueceu a senha?", "continueWithOidc": "Continuar com OIDC", - "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "defaultPasswordHint": "Palavra-passe padrão: CHANGEME (a não ser que INITIAL_PASSWORD esteja definida)", "Authorization": "Autorização", "Content-Disposition": "Disposição de conteúdo", - "waitingForAuthorization": "Waiting for authorization...", - "waitingForGoogleAuthorization": "Waiting for Google authorization...", - "waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...", - "waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...", - "waitingForQoderAuthorization": "Waiting for Qoder authorization...", - "exchangingCodeForTokens": "Exchanging code for tokens...", - "nodeIncompatibleTitle": "Incompatible Node.js Version", - "nodeIncompatibleDesc": "You are running Node.js {version}, which is outside OmniRoute's supported secure runtime policy. Use a patched Node.js 20.x or 22.x LTS release.", - "nodeIncompatibleFixLabel": "Fix: install a patched Node.js 22 LTS release", - "nodeIncompatibleHint": "OmniRoute requires Node.js 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended.", + "waitingForAuthorization": "A aguardar autorização...", + "waitingForGoogleAuthorization": "A aguardar autorização do Google...", + "waitingForOpenAIAuthorization": "A aguardar autorização da OpenAI...", + "waitingForAntigravityAuthorization": "A aguardar autorização do Antigravity...", + "waitingForQoderAuthorization": "A aguardar autorização do Qoder...", + "exchangingCodeForTokens": "A trocar código por tokens...", + "nodeIncompatibleTitle": "Versão de Node.js Incompatível", + "nodeIncompatibleDesc": "Estás a executar Node.js {version}, que está fora da política de runtime seguro suportada pelo OmniRoute. Usa uma versão corrigida ou atualizada.", + "nodeIncompatibleFixLabel": "Como corrigir", + "nodeIncompatibleHint": "O OmniRoute requer Node.js 22.22.2+ (22.x LTS) ou 24.0.0+ (24.x LTS). Recomenda-se Node 24 LTS.", "resetViaAppDataTitle": "Reiniciar através de Dados da App", "resetViaAppDataDescription": "Elimine o ficheiro de configurações do diretório de dados da aplicação para redefinir a sua palavra-passe:", "quitDesktopApp": "Sair completamente da aplicação de desktop OmniRoute", @@ -9773,10 +9845,10 @@ "supportedProvidersToc": "Provedores", "commonUseCases": "Casos de uso comuns", "clientCompatibility": "Compatibilidade do cliente", - "protocolsToc": "Protocols", + "protocolsToc": "Protocolos", "apiReference": "Referência de API", - "managementApiReference": "Management API Reference", - "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "managementApiReference": "Referência da API de Gestão", + "managementApiDescription": "Endpoints de automação para o registo de proxies, atribuições de âmbito e migração de proxies legados.", "method": "Método", "path": "Caminho", "notes": "Notas", @@ -9817,7 +9889,7 @@ "deployPwaTitle": "PWA", "deployPwaText": "Instale o OmniRoute como um aplicativo da Web progressivo em navegadores Android, iOS e desktop.", "deployTermuxTitle": "Termux (Android)", - "deployTermuxText": "Run OmniRoute headless on Android via Termux. Access the dashboard from your mobile browser.", + "deployTermuxText": "Executa o OmniRoute headless no Android via Termux. Acede ao painel a partir do browser do telemóvel.", "featureRoutingTitle": "Roteamento multiprovedor", "featureRoutingText": "Encaminhe solicitações para mais de 30 provedores de IA por meio de um único endpoint compatível com OpenAI. Suporta APIs de chat, respostas, áudio e imagem.", "featureCombosTitle": "Combos e Balanceamento", @@ -9874,22 +9946,22 @@ "clientKimiBullet1": "Use o OmniRoute como um URL base estável enquanto alterna contas ou combinações de provedores abaixo.", "clientKimiBullet2": "Prefira modelos prefixados em fluxos de codificação para que o substituto e a trilha de auditoria permaneçam explícitos.", "clientKimiBullet3": "Use `/v1/responses` quando desejar roteamento no estilo Respostas nativo para clientes que usam ferramentas.", - "protocolsTitle": "Protocols: MCP & A2A", - "protocolsDescription": "OmniRoute exposes two operational protocols in addition to OpenAI-compatible APIs: MCP for tool execution and A2A for agent-to-agent workflows.", + "protocolsTitle": "Protocolos: MCP e A2A", + "protocolsDescription": "O OmniRoute expõe dois protocolos operacionais além das APIs compatíveis com OpenAI: MCP para execução de ferramentas e A2A para orquestração entre agentes.", "protocolMcpTitle": "MCP (Model Context Protocol)", - "protocolMcpDesc": "Use MCP over stdio to let clients discover and call OmniRoute tools with audit visibility.", - "protocolMcpStep1": "Start MCP transport with `omniroute --mcp`.", - "protocolMcpStep2": "Point your MCP client to stdio transport.", - "protocolMcpStep3": "Call `omniroute_get_health` and `omniroute_list_combos` to validate connectivity.", + "protocolMcpDesc": "Usa MCP sobre stdio para permitir que clientes descubram e chamem ferramentas do OmniRoute com visibilidade de auditoria.", + "protocolMcpStep1": "Inicia o transporte MCP com `omniroute --mcp`.", + "protocolMcpStep2": "Aponta o teu cliente MCP para o transporte stdio.", + "protocolMcpStep3": "Chama `omniroute_get_health` e `omniroute_list_combos` para validar a ligação.", "protocolA2aTitle": "A2A (Agent2Agent)", - "protocolA2aDesc": "Use A2A JSON-RPC to submit tasks synchronously or via SSE streaming.", - "protocolA2aStep1": "Read `/.well-known/agent.json` for agent discovery.", - "protocolA2aStep2": "Send `message/send` or `message/stream` requests to `POST /a2a`.", - "protocolA2aStep3": "Manage task lifecycle with `tasks/get` and `tasks/cancel`.", - "protocolTroubleshootingTitle": "Protocol Troubleshooting", - "protocolTroubleshooting1": "If MCP status is offline, verify the stdio process is running and heartbeat file is updating.", - "protocolTroubleshooting2": "If A2A tasks stay in `working`, inspect `/api/a2a/tasks/:id` and stream events for terminal state.", - "protocolTroubleshooting3": "Use `/dashboard/mcp` and `/dashboard/a2a` for operational controls and audit visibility.", + "protocolA2aDesc": "Usa A2A JSON-RPC para submeter tarefas de forma síncrona ou via streaming SSE.", + "protocolA2aStep1": "Lê `/.well-known/agent.json` para descoberta de agentes.", + "protocolA2aStep2": "Envia pedidos `message/send` ou `message/stream` para `POST /a2a`.", + "protocolA2aStep3": "Gere o ciclo de vida das tarefas com `tasks/get` e `tasks/cancel`.", + "protocolTroubleshootingTitle": "Resolução de Problemas de Protocolo", + "protocolTroubleshooting1": "Se o estado MCP estiver offline, verifica se o processo stdio está a correr e se o ficheiro de heartbeat está a atualizar.", + "protocolTroubleshooting2": "Se as tarefas A2A ficarem em `working`, inspeciona `/api/a2a/tasks/:id` e faz stream de eventos para o estado terminal.", + "protocolTroubleshooting3": "Usa `/dashboard/mcp` e `/dashboard/a2a` para controlos operacionais e visibilidade de auditoria.", "endpointChatNote": "Endpoint de chat compatível com OpenAI (padrão).", "endpointResponsesNote": "Endpoint da API de respostas (Codex, série o).", "endpointModelsNote": "Catálogo de modelos para todos os provedores conectados.", @@ -9900,13 +9972,13 @@ "endpointRewriteChatNote": "Auxiliar de reescrita para clientes sem /v1.", "endpointRewriteResponsesNote": "Reescreva o auxiliar para respostas sem /v1.", "endpointRewriteModelsNote": "Reescreva o auxiliar para descoberta de modelo sem /v1.", - "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).", - "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.", - "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.", - "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.", - "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.", - "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.", - "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.", + "mgmtProxiesListNote": "Lista itens de registo de proxy guardados (suporta paginação).", + "mgmtProxiesCreateNote": "Cria um item de proxy reutilizável no registo.", + "mgmtProxiesHealthNote": "Obtém métricas de saúde 24h/contínuas por proxy guardado a partir dos registos de proxy.", + "mgmtProxiesBulkAssignNote": "Atribui ou limpa um proxy em muitos scope IDs num único pedido.", + "mgmtAssignmentsListNote": "Lista atribuições de proxy por âmbito, scope_id ou proxy_id.", + "mgmtAssignmentsUpdateNote": "Atribui ou limpa proxy para âmbito global/fornecedor/conta/combo.", + "mgmtLegacyMigrationNote": "Importa mapas legacy proxyConfig para atribuições de registo.", "modelPrefixesDescriptionStart": "Use o prefixo do provedor antes do nome do modelo para rotear para um provedor específico. Exemplo:", "modelPrefixesDescriptionEnd": "rotas para GitHub Copilot.", "provider": "Provedor", @@ -10078,35 +10150,35 @@ "termsSection6Text": "OmniRoute é um software de código aberto. Você é livre para inspecioná-lo, modificá-lo e distribuí-lo sob os termos de sua licença." }, "agents": { - "title": "CLI Agents", - "description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.", - "refresh": "Refresh", - "installed": "Installed", - "notFound": "Not Found", - "builtIn": "Built-in", - "custom": "Custom", - "remove": "Remove", - "addCustomAgent": "Add Custom Agent", - "addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.", - "agentName": "Agent Name", - "binaryName": "Binary Name", - "versionCommand": "Version Command", - "spawnArgs": "Spawn Args", - "addAgent": "Add Agent", - "scanning": "Scanning system for CLI agents...", - "opencodeIntegration": "OpenCode Integration", - "opencodeDetected": "opencode {version} detected", - "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.", - "downloadConfig": "Download {file}", - "downloaded": "Downloaded!", - "setupGuideTitle": "Setup guide", - "openCliTools": "Open CLI Tools", - "setupGuideDetectCliTitle": "Detect installed CLIs", - "setupGuideDetectCliDesc": "Click Refresh after installing or updating a CLI so OmniRoute can rescan binaries and versions.", - "setupGuideCustomAgentTitle": "Register custom binary", - "setupGuideCustomAgentDesc": "Use Add Custom Agent when your CLI is not in the built-in list. Provide binary name and version command.", - "setupGuideCommandMissingTitle": "Fix 'command not found'", - "setupGuideCommandMissingDesc": "Ensure the CLI command exists in PATH, open a new terminal session, and rerun Refresh.", + "title": "Agentes", + "description": "Descrição", + "refresh": "Atualizar", + "installed": "Instalado", + "notFound": "Agente não encontrado", + "builtIn": "Integrado", + "custom": "Personalizado", + "remove": "Remover", + "addCustomAgent": "Adicionar agente personalizado", + "addCustomAgentDesc": "Regista qualquer ferramenta CLI para deteção. Será detetada automaticamente.", + "agentName": "Nome do agente", + "binaryName": "Nome do binário", + "versionCommand": "Comando de Versão", + "spawnArgs": "Argumentos de Lançamento", + "addAgent": "Adicionar agente", + "scanning": "A analisar...", + "opencodeIntegration": "Integração OpenCode", + "opencodeDetected": "opencode {version} detetado", + "opencodeDesc": "Gera um {configFile} pronto a usar com a tua configuração OmniRoute", + "downloadConfig": "Descarregar {file}", + "downloaded": "Descarregado!", + "setupGuideTitle": "Guia de configuração", + "openCliTools": "Abrir ferramentas CLI", + "setupGuideDetectCliTitle": "Detetar CLIs instalados", + "setupGuideDetectCliDesc": "Clica em Atualizar depois de instalar ou atualizar um CLI para o OmniRoute voltar a analisar binários e versões.", + "setupGuideCustomAgentTitle": "Registar binário personalizado", + "setupGuideCustomAgentDesc": "Usa Adicionar Agente Personalizado quando o teu CLI não está na lista integrada. Fornece o nome do binário e o comando de versão.", + "setupGuideCommandMissingTitle": "Corrigir erro 'comando não encontrado'", + "setupGuideCommandMissingDesc": "Certifica-te de que o comando CLI existe no PATH, abre uma nova sessão de terminal e volta a correr Atualizar.", "cliToolsRedirectTitle": "Cli Tools Redirect Title", "cliToolsRedirectDesc": "Cli Tools Redirect Desc", "spawnArgsPlaceholder": "Spawn Args Placeholder", @@ -10233,12 +10305,12 @@ } }, "templateNames": { - "simple-chat": "Simple Chat", + "simple-chat": "Chat Simples", "streaming": "Streaming", - "system-prompt": "System Prompt", + "system-prompt": "Prompt de Sistema", "thinking": "Thinking", - "tool-calling": "Tool Calling", - "multi-turn": "Multi-turn", + "tool-calling": "Chamada de Ferramentas", + "multi-turn": "Multi-turno", "vision": "Visão", "schema-coercion": "Coerção de esquema" }, @@ -10280,101 +10352,101 @@ } }, "cache": { - "title": "Cache Management", + "title": "Gestão de Cache", "description": "Monitor and manage semantic response cache, hit rates, and token savings.", - "refresh": "Refresh", - "clearAll": "Clear All", - "memoryEntries": "Memory Entries", - "memoryEntriesSub": "In-memory LRU", - "dbEntries": "DB Entries", - "dbEntriesSub": "Persisted (SQLite)", - "cacheHits": "Cache Hits", - "cacheHitsSub": "of {total} total", - "tokensSaved": "Tokens Saved", - "tokensSavedSub": "Estimated from hits", - "hitRate": "Hit Rate", - "performance": "Cache Performance", - "autoRefresh": "Auto-refreshes every {seconds}s", - "hits": "Hits", - "misses": "Misses", + "refresh": "Atualizar", + "clearAll": "Limpar tudo", + "memoryEntries": "Entradas em Memória", + "memoryEntriesSub": "LRU em memória", + "dbEntries": "Entradas na BD", + "dbEntriesSub": "Persistido (SQLite)", + "cacheHits": "Acertos de cache", + "cacheHitsSub": "Acertos", + "tokensSaved": "Tokens Poupançados", + "tokensSavedSub": "Estimado a partir de acertos", + "hitRate": "Taxa de acertos", + "performance": "Desempenho da Cache", + "autoRefresh": "Atualiza automaticamente a cada {seconds}s", + "hits": "Acertos", + "misses": "Falhas", "total": "Total", - "behavior": "Cache Behavior", - "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", - "behaviorBypass": "Bypass with header {header}.", - "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", - "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", - "idempotency": "Idempotency Layer", - "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window", + "behavior": "Comportamento", + "behaviorDeterministic": "Determinístico", + "behaviorBypass": "Ignora com o cabeçalho {header}.", + "behaviorTwoTier": "Armazenamento em dois níveis: LRU em memória (rápido) + SQLite (persistente entre reinícios).", + "behaviorTtl": "TTL padrão: 30 minutos. Configura via {envVar}.", + "idempotency": "Camada de Idempotência", + "activeDedupKeys": "Chaves de Deduplicação Ativas", + "dedupWindow": "Janela de Deduplicação", "clearSuccess": "Cache cleared. {count} expired entries removed.", - "clearError": "Failed to clear cache.", - "unavailable": "Cache unavailable", - "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "clearError": "Erro ao limpar", + "unavailable": "Cache indisponível", + "unavailableDesc": "Não foi possível obter as estatísticas de cache. Confirma que o servidor está a correr.", "loadingCacheAria": "A carregar a cache", - "promptCache": "Prompt Cache (Provider-Side)", - "semanticCache": "Semantic Cache", - "promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.", - "promptTrendDesc": "Hourly request volume, cache coverage, and cache read volume across the last 24 hours.", - "cachedRequests": "Cached Requests", - "cachedRequests24h": "Cached Requests (24h)", - "cacheHitRate": "Cache Hit Rate", - "cacheRate": "Cache Rate", - "cacheRateDesc": "of total requests", + "promptCache": "Cache de Prompt (Lado do Fornecedor)", + "semanticCache": "Cache semântica", + "promptCacheSectionDesc": "Mostra a atividade de cache de prompt do lado do fornecedor a partir do histórico de utilização, para veres onde o controlo de cache está ativo.", + "promptTrendDesc": "Tendência de uso de prompts ao longo do tempo", + "cachedRequests": "Pedidos em Cache", + "cachedRequests24h": "Pedidos em Cache (24h)", + "cacheHitRate": "Taxa de Acertos de Cache", + "cacheRate": "Taxa de Cache", + "cacheRateDesc": "do total de pedidos", "cachedTokens": "Cached Tokens", "cacheCreationTokens": "Cache Creation Tokens", - "cacheMetrics": "Prompt Cache Metrics", - "withCacheControl": "With Cache Control", + "cacheMetrics": "Métricas de Cache de Prompt", + "withCacheControl": "Com Controlo de Cache", "cachedTokensRead": "Cached Tokens (Read)", "cacheCreationWrite": "Cache Creation (Write)", - "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatio": "Taxa de Reutilização de Cache", "cacheReuseRatioDesc": "Cached tokens / Total input tokens", - "estCostSaved": "Est. Cost Saved", - "lastUpdated": "Last updated", - "hoursTracked": "hours tracked", - "busiestHour": "Busiest Hour", - "peakCacheRate": "Peak Cache Rate", - "trendHour": "Hour", - "activityVolume": "Activity", - "requestsShort": "reqs", - "inputShort": "In", - "cachedShort": "Cached", - "writeShort": "Write", - "resetting": "Resetting...", - "resetMetrics": "Reset Metrics", - "byProvider": "Breakdown by Provider", - "providerCacheRateDesc": "Each provider exposes total input tokens, cache read tokens, and cache write tokens so you can verify the reuse ratio against raw totals.", - "provider": "Provider", - "requests": "Requests", + "estCostSaved": "Custo Estimado Poupançado", + "lastUpdated": "Última atualização", + "hoursTracked": "Horas registadas", + "busiestHour": "Hora de Maior Movimento", + "peakCacheRate": "Taxa de Cache Máxima", + "trendHour": "Hora", + "activityVolume": "Atividade", + "requestsShort": "Pedidos", + "inputShort": "Entrada", + "cachedShort": "Em cache", + "writeShort": "Escrita", + "resetting": "A repor...", + "resetMetrics": "Repor Métricas", + "byProvider": "Repartição por Fornecedor", + "providerCacheRateDesc": "Cada fornecedor expõe o total de tokens de entrada, tokens de leitura de cache e tokens de escrita de cache para poderes verificar a reutilização.", + "provider": "Fornecedor", + "requests": "Pedidos", "inputTokens": "Input Tokens", "cachedTokensCol": "Cached", "cacheCreation": "Creation", - "trend24h": "Cache Trend (24h)", - "peakCached": "Peak cached", - "cached": "Cached", - "overview": "Overview", + "trend24h": "Tendência de Cache (24h)", + "peakCached": "Máximo em cache", + "cached": "Em cache", + "overview": "Visão geral", "tableProvider": "Fornecedor", "tableModel": "Modelo", "performanceTitle": "Desempenho", - "semanticCacheSectionDesc": "OmniRoute's own deterministic response cache. When enabled, repeated non-streaming temperature=0 requests can be served locally without hitting the upstream provider.", - "semanticCacheDisabledDesc": "Semantic cache is disabled. OmniRoute will skip local response reuse until you turn it back on in Settings.", - "semanticEntriesDesc": "Persisted semantic cache records currently stored in SQLite. Provider-side prompt cache activity is not listed here.", - "searchEntries": "Search entries...", - "search": "Search", - "loading": "Loading...", - "entriesLoadError": "Failed to load semantic cache entries.", - "noEntries": "No cache entries found", - "noPromptCacheData": "No provider-side prompt cache activity has been recorded yet.", - "noTrendData": "No prompt cache activity has been recorded over the last 24 hours.", - "signature": "Signature", - "model": "Model", - "created": "Created", - "expires": "Expires", - "actions": "Actions", + "semanticCacheSectionDesc": "Secção de cache semântica", + "semanticCacheDisabledDesc": "A cache semântica está desativada. O OmniRoute vai saltar a reutilização local de respostas até a reativares nas Definições.", + "semanticEntriesDesc": "Registos de cache semântica persistidos atualmente armazenados em SQLite. A atividade de cache de prompt do lado do fornecedor não está listada aqui.", + "searchEntries": "Pesquisar entradas...", + "search": "Pesquisar", + "loading": "A carregar cache...", + "entriesLoadError": "Falha ao carregar as entradas da cache semântica.", + "noEntries": "Nenhuma entrada de cache encontrada", + "noPromptCacheData": "Ainda não foi registada atividade de cache de prompt do lado do fornecedor.", + "noTrendData": "Não foi registada atividade de cache de prompt nas últimas 24 horas.", + "signature": "Assinatura", + "model": "Modelo", + "created": "Criado", + "expires": "Expira", + "actions": "Ações", "deduplicatedRequests": "Requisições Desduplicadas", "savedCalls": "Chamadas API Poupadas", "totalProcessed": "Total Processado", - "disabled": "Disabled", - "totalRequests": "Total Requests", + "disabled": "Desativado", + "totalRequests": "Total de pedidos", "reasoningCache": "Repetição do raciocínio", "reasoningCacheDesc": "Preserva o pensamento do modelo para fluxos de chamada de ferramentas multivoltas", "reasoningEntries": "Entradas ativas", @@ -10411,7 +10483,7 @@ "minutesAgo": "há {minutes}m", "hoursAgo": "há {hours}h", "daysAgo": "há {days}d", - "entries": "Entries" + "entries": "Entradas" }, "proxyConfigModal": { "levelGlobal": "Globais", @@ -10420,7 +10492,7 @@ "levelKey": "Chave", "levelDirect": "Direto (sem proxy)", "titleGlobal": "Configuração de proxy global", - "titleLevel": "{level} Proxy — {label}", + "titleLevel": "Proxy de {level} — {label}", "loading": "Carregando configuração de proxy...", "inheritingFrom": "Herdando de", "source": "Fonte", @@ -10461,23 +10533,23 @@ "deviceCodeVerificationUrl": "URL de verificação", "deviceCodeYourCode": "Seu código", "deviceCodeWaiting": "Aguardando autorização...", - "googleLoopbackTitle": "O início de sessão do Google não pode ser concluído a partir deste endereço", - "googleLoopbackWhatHappens": "O Google só libera o código de autorização uma vez que {redirectUri} é acessível a partir do navegador que aprova o início de sessão. Aqui, esse endereço aponta para este computador, não para o servidor OmniRoute — por isso, a tela de consentimento fica pendurada em vez de redirecionar, e não há URL de callback para copiar.", - "googleLoopbackRecommended": "Recomendado — execute isto no seu próprio computador e cole o resultado abaixo:", - "googleLoopbackHelperNote": "Abre o consentimento do Google localmente (onde 127.0.0.1 funciona) e imprime um blob omniroute-cred-v1.… de uma linha. Cole esse blob no campo da Etapa 2 abaixo — aceita um blob de credencial, bem como uma URL de callback.", - "googleLoopbackTunnelLabel": "Ou encaminhe a porta do painel através do SSH e recarregue o OmniRoute através do túnel:", - "googleLoopbackTunnelNote": "Substitua {userPlaceholder} pelo seu nome de utilizador SSH, mantenha o terminal aberto, depois abra {localUrl} e conecte-se novamente a partir daí.", - "googleLoopbackHeadlessAlt": "Para uso totalmente headless sem qualquer callback local, configure as suas próprias credenciais do Google OAuth e uma URL base pública.", + "googleLoopbackTitle": "__MISSING__:Google sign-in can't complete from this address", + "googleLoopbackWhatHappens": "__MISSING__:Google only releases the authorization code once {redirectUri} is reachable from the browser that approves the sign-in. Here that address points at this computer, not at the OmniRoute server — so the consent screen hangs instead of redirecting, and there is no callback URL to copy.", + "googleLoopbackRecommended": "__MISSING__:Recommended — run this on your own computer, then paste the result below:", + "googleLoopbackHelperNote": "__MISSING__:It opens the Google consent locally (where 127.0.0.1 works) and prints a one-line omniroute-cred-v1.… blob. Paste that blob into the Step 2 field below — it accepts a credential blob as well as a callback URL.", + "googleLoopbackTunnelLabel": "__MISSING__:Or forward the dashboard port over SSH and reload OmniRoute through the tunnel:", + "googleLoopbackTunnelNote": "__MISSING__:Replace {userPlaceholder} with your SSH username, keep the terminal open, then open {localUrl} and connect again from there.", + "googleLoopbackHeadlessAlt": "__MISSING__:For fully headless use with no local callback at all, configure your own Google OAuth credentials plus a public base URL.", "remoteAccessInfo": "Acesso remoto: Como você está acessando o OmniRoute remotamente, após a autorização você verá uma página de erro (localhost não encontrado). Isso é normal – basta copiar o URL completo da barra de endereço do seu navegador e colá-lo abaixo.", - "loopbackMismatchTitle": "O início de sessão não pode ser concluído a partir deste endereço", - "loopbackMismatchWhatHappened": "O que está a acontecer", - "loopbackMismatchExplanation": "Depois de aprovar o login, {providerName} envia sempre o navegador de volta para {redirectUri}. Esse endereço aponta para o computador que está a correr este navegador, não para o servidor OmniRoute — por isso, o código de autorização nunca chega ao OmniRoute e o provedor falha o login sem mostrar um erro.", - "loopbackMismatchHowToFix": "Como corrigir isso", - "loopbackMismatchStep1": "Neste computador, abra um terminal e inicie um túnel SSH para o servidor OmniRoute:", - "loopbackMismatchStep1Note": "Substitua {userPlaceholder} pelo seu nome de utilizador SSH. Mantenha este terminal aberto até a conexão aparecer como ativa — ambas as portas são necessárias: uma serve o painel, a outra recebe o callback.", - "loopbackMismatchStep2": "Neste navegador, reabra o OmniRoute através do túnel:", - "loopbackMismatchStep3": "Depois, conecte-se ao {providerName} novamente a partir da nova aba. O callback agora chega ao servidor e o login é concluído normalmente.", - "loopbackMismatchAlternative": "Sem acesso SSH? Se este fornecedor oferecer uma aba de importação de token, conecte-se com um token em vez disso — esse caminho não utiliza um callback de loopback.", + "loopbackMismatchTitle": "__MISSING__:Sign-in can't complete from this address", + "loopbackMismatchWhatHappened": "__MISSING__:What's happening", + "loopbackMismatchExplanation": "__MISSING__:After you approve the login, {providerName} always sends the browser back to {redirectUri}. That address points at the computer running this browser, not at the OmniRoute server — so the authorization code never reaches OmniRoute and the provider fails the sign-in without showing an error.", + "loopbackMismatchHowToFix": "__MISSING__:How to fix it", + "loopbackMismatchStep1": "__MISSING__:On this computer, open a terminal and start an SSH tunnel to the OmniRoute server:", + "loopbackMismatchStep1Note": "__MISSING__:Replace {userPlaceholder} with your SSH username. Keep this terminal open until the connection shows as active — both ports are needed: one serves the dashboard, the other receives the callback.", + "loopbackMismatchStep2": "__MISSING__:In this browser, reopen OmniRoute through the tunnel:", + "loopbackMismatchStep3": "__MISSING__:Then connect {providerName} again from the new tab. The callback now reaches the server and the login completes normally.", + "loopbackMismatchAlternative": "__MISSING__:No SSH access? If this provider offers a token import tab, connect with a token instead — that path doesn't use a loopback callback.", "step1OpenUrl": "Etapa 1: abra este URL em seu navegador", "copy": "Copiar", "step2PasteCallback": "Etapa 2: cole o URL de retorno de chamada ou o código de autorização aqui", @@ -10517,7 +10589,7 @@ "saving": "A Guardar…", "saveConnection": "Guardar Conexão", "gheDescription": "Introduza a URL base da sua instância do GitHub Enterprise (por exemplo, https://ghe.suaempresa.com).", - "gheUrlPlaceholder": "https://ghe.yourcompany.com", + "gheUrlPlaceholder": "https://ghe.atuaempresa.com", "gheUrlLabel": "URL do GitHub Enterprise", "gheUrlRequired": "É necessário o URL do GitHub Enterprise", "gitlabDuoSetupTitle": "Configuração do OAuth Duo do GitLab", @@ -10570,9 +10642,9 @@ "selectProxy": "Selecionar {name}", "title": "Title", "description": "Description", - "importLegacy": "Import Legacy", - "bulkAssign": "Bulk Assign", - "addProxy": "Add Proxy", + "importLegacy": "Importar Legado", + "bulkAssign": "Atribuição em Massa", + "addProxy": "Adicionar Proxy", "loading": "Loading", "noProxies": "No Proxies", "tableName": "Table Name", @@ -10581,9 +10653,9 @@ "tableHealth": "Table Health", "tableUsage": "Table Usage", "tableActions": "Table Actions", - "test": "Test", - "edit": "Edit", - "delete": "Delete", + "test": "Testar", + "edit": "Editar", + "delete": "Eliminar", "modalCreateTitle": "Modal Create Title", "modalEditTitle": "Modal Edit Title", "labelName": "Label Name", @@ -10633,7 +10705,7 @@ "errorBulkFailed": "Error Bulk Failed", "success": "✓", "failure": "✗", - "failed": "Failed", + "failed": "Falhou", "successRate": "{rate}% de sucesso", "avgLatency": "Média de {latency}ms", "assignmentsCount": "{count} atribuições", @@ -10700,33 +10772,33 @@ "title": "Title", "description": "Description", "endpoint": "Endpoint", - "provider": "Provider", - "model": "Model", + "provider": "Fornecedor", + "model": "Modelo", "accountKey": "Account Key", "autoAccounts": "Automático ({count} contas)", "noAccounts": "No Accounts", - "send": "Send", - "cancel": "Cancel", - "audioFile": "Audio File", + "send": "Enviar", + "cancel": "Cancelar", + "audioFile": "Ficheiro de Áudio", "attachImages": "Attach Images", "multipartFormData": "Multipart Form Data", "upToImages": "Up To Images", "selectAudioFile": "Select Audio File", - "clearAll": "Clear All", - "request": "Request", - "response": "Response", - "transcription": "Transcription", - "copy": "Copy", + "clearAll": "Limpar Tudo", + "request": "Pedido", + "response": "Resposta", + "transcription": "Transcrição", + "copy": "Copiar", "resetToDefault": "Reset To Default", "downloadAudio": "Download Audio", "copyText": "Copy Text", "transcriptionHint": "Transcription Hint", "imagesGenerated": "{count} imagens geradas", "generatedImage": "Imagem gerada {index}", - "save": "Save", + "save": "Guardar", "endpointOptions": { "chat": "Chat", - "responses": "Responses", + "responses": "Respostas", "completions": "Conclusões", "images": "Images", "embeddings": "Embeddings", @@ -10735,7 +10807,7 @@ "video": "Video", "music": "Music", "moderations": "Moderações", - "rerank": "Rerank", + "rerank": "Reordenar", "search": "Search", "webFetch": "Web fetch" }, @@ -10743,50 +10815,50 @@ "clearChat": "Limpar bate-papo", "typeMessagePlaceholder": "Digite uma mensagem... (Shift+Enter para nova linha)", "tabChat": "Chat", - "tabCompare": "Compare", + "tabCompare": "Comparar", "tabApi": "API", - "tabBuild": "Build", - "configPane": "Config", - "systemPrompt": "System prompt", - "systemPromptPlaceholder": "You are a helpful assistant.", - "modelPlaceholder": "e.g. openai/gpt-4o", + "tabBuild": "Construir", + "configPane": "Configuração", + "systemPrompt": "Prompt do sistema", + "systemPromptPlaceholder": "És um assistente útil.", + "modelPlaceholder": "ex: openai/gpt-4o", "endpointLabel": "Endpoint", - "parametersLabel": "Parameters", - "collapseConfig": "Collapse config pane", - "expandConfig": "Expand config pane", - "temperature": "Temperature", - "maxTokens": "Max tokens", + "parametersLabel": "Parâmetros", + "collapseConfig": "Recolher painel de configuração", + "expandConfig": "Expandir painel de configuração", + "temperature": "Temperatura", + "maxTokens": "Máx. de tokens", "topP": "Top-p", - "presencePenalty": "Presence penalty", - "frequencyPenalty": "Frequency penalty", + "presencePenalty": "Penalidade de presença", + "frequencyPenalty": "Penalidade de frequência", "reasoningLabel": "Raciocínio", "thinking": "Pensamento", "effort": "Esforço", "effortDefault": "Predefinido", - "seedPlaceholder": "Random (leave empty)", - "presetsLabel": "Presets", - "loadPreset": "Load preset", - "savePreset": "Save preset", - "noPresets": "No presets", - "presetNamePlaceholder": "Preset name", - "savingPreset": "Saving…", - "nameRequired": "Name is required", - "failedToSavePreset": "Failed to save preset", - "improvePrompt": "Improve prompt", - "improvingPrompt": "Improving…", - "improvePromptTitle": "Improve your prompt with AI", - "setModelFirst": "Set a model first", + "seedPlaceholder": "Aleatório (deixa vazio)", + "presetsLabel": "Predefinições", + "loadPreset": "Carregar predefinição", + "savePreset": "Guardar predefinição", + "noPresets": "Sem predefinições", + "presetNamePlaceholder": "Nome da predefinição", + "savingPreset": "A guardar…", + "nameRequired": "O nome é obrigatório", + "failedToSavePreset": "Falha ao guardar predefinição", + "improvePrompt": "Melhorar prompt", + "improvingPrompt": "A melhorar…", + "improvePromptTitle": "Melhora o teu prompt com IA", + "setModelFirst": "Define primeiro um modelo", "setModelInConfigFirst": "Defina primeiro um modelo no painel de Configuração.", "improvePromptFailed": "Falha ao melhorar o prompt.", "improvePromptAria": "Melhorar prompt com IA", "confirmImprovePrompt": "Confirmar melhoria do prompt", "improvePromptDescription": "Isto irá enviar o seu prompt de sistema atual para para gerar uma versão melhorada.", - "improveQuotaWarning": "This will consume quota from the model configured in Config.", - "improveConfirm": "Improve", - "exportCode": "Export code", - "exportCodeTitle": "Export Code", + "improveQuotaWarning": "Isto vai consumir quota do modelo configurado em Configuração.", + "improveConfirm": "Melhorar", + "exportCode": "Exportar código", + "exportCodeTitle": "Exportar Código", "exportShort": "Exportar", - "noStateToExport": "No playground state available to export.", + "noStateToExport": "Não há estado do playground disponível para exportar.", "closeExportModal": "Fechar modal de exportação", "close": "Fechar", "exportRealKeyWarning": "Aviso de segurança: exportação bloqueada — foi detetada uma chave de API real no resultado. Redefina a sua chave de API e tente novamente.", @@ -10795,13 +10867,13 @@ "copyLangCode": "Copiar código {language}", "loadingPresets": "A carregar…", "loadPresetPlaceholder": "Carregar predefinição…", - "copyCode": "Copy", - "copiedCode": "Copied!", - "addModel": "+ Add model", - "runAll": "Run all", - "cancelAll": "Cancel all", - "maxColumnsReached": "Maximum {max} columns", - "modelPlaceholderCompare": "Model (Cmd+K)…", + "copyCode": "Copiar", + "copiedCode": "Copiado!", + "addModel": "+ Adicionar modelo", + "runAll": "Executar tudo", + "cancelAll": "Cancelar tudo", + "maxColumnsReached": "Máximo de {max} colunas", + "modelPlaceholderCompare": "Modelo (Cmd+K)…", "noModel": "Sem modelo", "statusLabel": "Estado: {status}", "status": { @@ -10819,29 +10891,29 @@ "waitingForResponse": "A aguardar resposta…", "ttft": "TTFT", "tps": "TPS", - "metricsDisclaimer": "client-side estimate", + "metricsDisclaimer": "estimativa do lado do cliente", "tokensLabel": "Tokens", - "costLabel": "Cost", - "costEstimated": "(estimated)", + "costLabel": "Custo", + "costEstimated": "(estimado)", "ttftTitle": "Tempo até ao primeiro token (estimativa do lado do cliente)", "tpsTitle": "Tokens por segundo (estimativa do lado do cliente)", "tokenCountsTitle": "Tokens de prompt ↑ / Tokens de conclusão ↓", "estimatedCostTitle": "Custo estimado (precisão não garantida)", - "toolsLabel": "Tools", + "toolsLabel": "Ferramentas", "toolsCount": "Ferramentas ({count})", - "addTool": "Add tool", + "addTool": "Adicionar ferramenta", "editTool": "Editar ferramenta {name}", "removeTool": "Remover ferramenta {name}", - "toolNamePlaceholder": "Function name", + "toolNamePlaceholder": "Nome da função", "toolNameRequiredPlaceholder": "Nome da função *", - "toolDescPlaceholder": "Description (optional)", + "toolDescPlaceholder": "Descrição (opcional)", "toolParamsLabel": "Parâmetros (esquema JSON)", "toolParamsJsonSchema": "Esquema JSON para parâmetros", - "toolParamsInvalid": "Parameters must be valid JSON", - "structuredOutputLabel": "Structured Output", - "enableJsonMode": "Enable JSON mode", - "disableJsonMode": "Disable JSON mode", - "invalidJson": "Invalid JSON", + "toolParamsInvalid": "Os parâmetros têm de ser JSON válido", + "structuredOutputLabel": "Saída Estruturada", + "enableJsonMode": "Ativar modo JSON", + "disableJsonMode": "Desativar modo JSON", + "invalidJson": "JSON inválido", "jsonMode": "Modo JSON", "jsonModeDescription": "Força response_format: json_schema", "schemaName": "Nome do esquema", @@ -10852,7 +10924,7 @@ "seed": "Seed", "stopSequences": "Sequências de paragem", "stopSequencesPlaceholder": "ex. \"\\n\\n\" ou \"END\"", - "autoProvider": "Auto", + "autoProvider": "Automático", "httpError": "Erro {status}", "requestCancelled": "Pedido cancelado", "networkError": "Erro de rede", @@ -10878,9 +10950,9 @@ "columnCount": "{count}/{max} colunas", "addModelToCompare": "Adicionar uma coluna de modelo para comparar", "modelsSimultaneously": "Até {max} modelos em simultâneo", - "running": "Running…", - "runLabel": "Run", - "enterToolResult": "Enter tool result…", + "running": "A executar…", + "runLabel": "Executar", + "enterToolResult": "Introduzir resultado da ferramenta…", "build": { "step1Label": "O que testar?", "step2Label": "Configurar", @@ -10974,71 +11046,71 @@ "stop": "Parar" }, "requestLogger": { - "recording": "Recording", - "paused": "Paused", - "pipelineLogsOn": "Pipeline logs on", - "pipelineLogsOff": "Pipeline logs off", - "updatingPipelineLogs": "Updating pipeline logs...", - "updatePipelineFailed": "Failed to update pipeline logging", - "capturePipeline": "Capture pipeline payloads for new requests", - "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", - "allProviders": "All providers", - "allModels": "All models", - "allAccounts": "All accounts", - "allApiKeys": "All API keys", + "recording": "A gravar", + "paused": "Em pausa", + "pipelineLogsOn": "Registos de pipeline ligados", + "pipelineLogsOff": "Registos de pipeline desligados", + "updatingPipelineLogs": "A atualizar registos de pipeline...", + "updatePipelineFailed": "Falha ao atualizar o registo de pipeline", + "capturePipeline": "Capturar payloads de pipeline para novos pedidos", + "searchPlaceholder": "Pesquisar modelos, fornecedores, contas, chaves de API, combos...", + "allProviders": "Todos os fornecedores", + "allModels": "Todos os modelos", + "allAccounts": "Todas as contas", + "allApiKeys": "Todas as chaves de API", "total": "Total", - "ok": "Success", - "err": "Error", + "ok": "Sucesso", + "err": "Erro", "combo": "Combo", - "keys": "Keys", - "shown": "Shown", - "sortNewest": "Newest", - "sortOldest": "Oldest", + "keys": "Chaves", + "shown": "Mostrados", + "sortNewest": "Mais recentes", + "sortOldest": "Mais antigos", "sortTokensDesc": "Tokens ↓", "sortTokensAsc": "Tokens ↑", - "sortDurationDesc": "Duration ↓", - "sortDurationAsc": "Duration ↑", - "sortStatusDesc": "Status ↓", - "sortStatusAsc": "Status ↑", - "sortModelAsc": "Model A-Z", - "sortModelDesc": "Model Z-A", - "sortLogs": "Sort logs", - "refresh": "Refresh", - "columnsLabel": "Columns", + "sortDurationDesc": "Duração ↓", + "sortDurationAsc": "Duração ↑", + "sortStatusDesc": "Estado ↓", + "sortStatusAsc": "Estado ↑", + "sortModelAsc": "Modelo A-Z", + "sortModelDesc": "Modelo Z-A", + "sortLogs": "Ordenar registos", + "refresh": "Atualizar", + "columnsLabel": "Colunas", "cacheSem": "SEM", "cacheUp": "UP", - "semantic": "Semantic", + "semantic": "Semântico", "upstream": "Upstream", - "semanticCacheHit": "Semantic cache hit (served by OmniRoute)", - "upstreamResponse": "Upstream provider response", - "noApiKey": "No API key", - "requestedRoutedTitle": "Requested {requested}, routed as {routed}", + "semanticCacheHit": "Acerto de cache semântica (servido pelo OmniRoute)", + "upstreamResponse": "Resposta do fornecedor upstream", + "noApiKey": "Sem chave de API", + "requestedRoutedTitle": "Pedido {requested}, encaminhado como {routed}", "statusFilters": { - "all": "All", + "all": "Todos", "error": "Errors", - "success": "Success", + "success": "Sucesso", "combo": "Combo" }, "columns": { - "status": "Status", - "cacheSource": "Cache Source", - "model": "Model", - "requested": "Requested", - "provider": "Provider", - "protocol": "Request Protocol", - "account": "Account", - "apiKey": "API Key", + "status": "Estado", + "cacheSource": "Fonte de Cache", + "model": "Modelo", + "requested": "Pedido", + "provider": "Fornecedor", + "protocol": "Protocolo do Pedido", + "account": "Conta", + "apiKey": "Chave de API", "combo": "Combo", "tokens": "Tokens", "compressed": "Compressão", "tps": "TPS", - "duration": "Duration", - "time": "Time" + "duration": "Duração", + "time": "Hora" }, - "loadingLogs": "Loading logs...", - "noLogs": "No logs yet. Make some API calls to see them here.", - "noMatchingLogs": "No logs matching current filters.", - "callLogsInfo": "Call logs are also saved as JSON files to {dataDir} and rotated based on {retentionDays} and {maxEntries}.", + "loadingLogs": "A carregar registos...", + "noLogs": "Ainda sem registos. Faz algumas chamadas de API para os veres aqui.", + "noMatchingLogs": "Nenhum registo corresponde aos filtros atuais.", + "callLogsInfo": "Os registos de chamadas também são guardados como ficheiros JSON em {dataDir} e rodados com base em {retentionDays} e {maxEntries}.", "loadMore": "Carregar mais", "loadingMore": "A carregar mais...", "correlationId": "ID de Correlação", @@ -11084,7 +11156,7 @@ }, "payloadMissing": "O artefato de carga detalhada já não está disponível para esta entrada de log.", "payloadCorrupt": "O artefato do payload detalhado não pôde ser analisado.", - "notAvailable": "N/A", + "notAvailable": "N/D", "semanticCache": "Semântico (OmniRoute)", "upstreamCache": "Upstream (Fornecedor)", "ariaLabel": "Detalhe do registo de pedidos", @@ -11103,7 +11175,7 @@ "input": "Entrada", "totalIn": "Total Entrada: {value}", "cacheRead": "Cache Leitura: {value}", - "cacheWrite": "Cache Write: {value}", + "cacheWrite": "Escrita de Cache: {value}", "compressed": "Comprimido: {from} → {to} ({percent}% poupados)", "output": "Saída", "totalOut": "Total Saída: {value}", @@ -11137,54 +11209,54 @@ } }, "proxyLogger": { - "filterAll": "All", - "filterErrors": "Errors", - "filterSuccess": "Success", - "filterTimeout": "Timeout", - "colStatus": "Status", + "filterAll": "Todos", + "filterErrors": "Erros", + "filterSuccess": "Sucesso", + "filterTimeout": "Tempo Limite", + "colStatus": "Estado", "colProxy": "Proxy", "colTls": "TLS", - "colType": "Type", - "colLevel": "Level", - "colProvider": "Provider", - "colTarget": "Target", - "colLatency": "Latency", - "colClientIp": "Client IP", - "colTime": "Time", - "recording": "Recording", - "paused": "Paused", - "searchPlaceholder": "Search host, provider, target, IP...", - "allTypes": "All Types", - "allLevels": "All Levels", - "allProviders": "All Providers", + "colType": "Tipo", + "colLevel": "Nível", + "colProvider": "Fornecedor", + "colTarget": "Alvo", + "colLatency": "Latência", + "colClientIp": "IP do Cliente", + "colTime": "Hora", + "recording": "A gravar", + "paused": "Em pausa", + "searchPlaceholder": "Pesquisar host, fornecedor, alvo, IP...", + "allTypes": "Todos os Tipos", + "allLevels": "Todos os Níveis", + "allProviders": "Todos os Fornecedores", "total": "total", "ok": "OK", - "err": "ERR", + "err": "ERRO", "timeoutShort": "TMO", - "direct": "direct", - "newest": "Newest", - "oldest": "Oldest", - "latencyDesc": "Latency ↓", - "latencyAsc": "Latency ↑", - "refresh": "Refresh", - "columns": "Columns", - "loadingProxyLogs": "Loading proxy logs...", - "noProxyLogs": "No proxy logs yet. Configure proxies and make API calls to see them here.", - "noMatchingLogs": "No logs match the current filters.", - "tlsFingerprint": "Chrome 124 TLS Fingerprint", + "direct": "direto", + "newest": "Mais recentes", + "oldest": "Mais antigos", + "latencyDesc": "Latência ↓", + "latencyAsc": "Latência ↑", + "refresh": "Atualizar", + "columns": "Colunas", + "loadingProxyLogs": "A carregar registos de proxy...", + "noProxyLogs": "Ainda não há registos de proxy. Configura proxies e faz chamadas de API para os veres aqui.", + "noMatchingLogs": "Nenhum registo corresponde aos filtros atuais.", + "tlsFingerprint": "Fingerprint TLS Chrome 124", "colPublicIp": "IP público" }, "endpointOptions": { - "speech": "Speech", - "search": "Search", - "images": "Images", + "speech": "Fala", + "search": "Pesquisa", + "images": "Imagens", "chat": "Chat", - "music": "Music", - "responses": "Responses", - "rerank": "Rerank", - "video": "Video", + "music": "Música", + "responses": "Respostas", + "rerank": "Reordenar", + "video": "Vídeo", "embeddings": "Embeddings", - "transcription": "Transcription" + "transcription": "Transcrição" }, "toolDescriptions": { "cline": "Cline", @@ -11196,121 +11268,121 @@ }, "runtime": { "title": "Runtime", - "description": "Realtime observability — 3-layer resilience + sessions + quota alerts", - "pause": "Pause", - "resume": "Resume", - "refreshNow": "Refresh now", - "kpiSessions": "Sessions", - "kpiCircuits": "Circuits", - "kpiCooldowns": "Cooldowns", - "kpiLockouts": "Lockouts", - "hintStickyBound": "{count} sticky-bound", - "hintRecovering": "{count} recovering", - "hintAllHealthy": "all healthy", - "hintOpen": "open", - "hintConnsCooling": "connections cooling", - "hintModelsBlocked": "models blocked", - "resilienceTitle": "3-Layer Resilience", - "resilienceSubtitle": "Mirrors the documented resilience model", - "providersHealthy": "{percent}% providers healthy", - "layer": "Layer {n}", - "layer1Title": "Provider Circuit Breakers", - "layer1Desc": "Stop traffic to providers failing at the upstream level", - "layer2Title": "Connection Cooldowns", - "layer2Desc": "Skip one bad account/key; other connections keep serving", - "layer3Title": "Model Lockouts", - "layer3Desc": "Per-model rate-limit locks; same connection still serves other models", - "badgeAffectedOf": "{affected} of {total} affected", - "badgeCooling": "{count} cooling", - "badgeLocked": "{count} locked", - "emptyCircuits": "No circuit breakers active yet", - "emptyCooldowns": "No connection cooldowns active", - "emptyLockouts": "No model lockouts", - "moreCooldowns": "+{count} more cooldowns", - "moreLockouts": "+{count} more lockouts", - "feedTitle": "Live Feed", - "feedSubtitle": "Last {count} events", - "feedFilterAll": "All", - "feedFilterCircuits": "Circuits", - "feedFilterCooldowns": "Cooldowns", - "feedFilterLockouts": "Lockouts", - "feedFilterSessions": "Sessions", + "description": "Observabilidade em tempo real — resiliência de 3 camadas + sessões + alertas de quota", + "pause": "Pausar", + "resume": "Retomar", + "refreshNow": "Atualizar agora", + "kpiSessions": "Sessões", + "kpiCircuits": "Circuitos", + "kpiCooldowns": "Arrefecimentos", + "kpiLockouts": "Bloqueios", + "hintStickyBound": "{count} com sticky-bound", + "hintRecovering": "{count} a recuperar", + "hintAllHealthy": "tudo saudável", + "hintOpen": "aberto", + "hintConnsCooling": "ligações em arrefecimento", + "hintModelsBlocked": "modelos bloqueados", + "resilienceTitle": "Resiliência de 3 Camadas", + "resilienceSubtitle": "Espelha o modelo de resiliência documentado", + "providersHealthy": "{percent}% fornecedores saudáveis", + "layer": "Camada {n}", + "layer1Title": "Disjuntores de Fornecedor", + "layer1Desc": "Parar o tráfego para fornecedores a falhar ao nível do upstream", + "layer2Title": "Arrefecimentos de Ligação", + "layer2Desc": "Salta uma conta/chave má; as outras ligações continuam a servir", + "layer3Title": "Bloqueios de Modelo", + "layer3Desc": "Bloqueios de limite de taxa por modelo; a mesma ligação continua a servir outros modelos", + "badgeAffectedOf": "{affected} de {total} afetados", + "badgeCooling": "{count} em arrefecimento", + "badgeLocked": "{count} bloqueados", + "emptyCircuits": "Ainda sem disjuntores ativos", + "emptyCooldowns": "Sem arrefecimentos de ligação ativos", + "emptyLockouts": "Sem bloqueios de modelo", + "moreCooldowns": "+{count} mais arrefecimentos", + "moreLockouts": "+{count} mais bloqueios", + "feedTitle": "Feed ao Vivo", + "feedSubtitle": "Últimos {count} eventos", + "feedFilterAll": "Todos", + "feedFilterCircuits": "Circuitos", + "feedFilterCooldowns": "Arrefecimentos", + "feedFilterLockouts": "Bloqueios", + "feedFilterSessions": "Sessões", "feedFilterQuotas": "Quotas", - "feedClear": "Clear", - "feedEmptyWaiting": "Waiting for events... (polled every 5s)", - "feedEmptyFiltered": "No events match this filter", - "sessionsTitle": "Active Sessions", - "sessionsSubtitle": "Sticky-bound request fingerprints (live)", - "sessionsActive": "{count} active", - "sessionsEmptyTitle": "No active sessions", - "sessionsEmptyHint": "Sessions appear as requests flow through the proxy", - "tblSession": "Session", - "tblAge": "Age", - "tblIdle": "Idle", - "tblReqs": "Reqs", - "tblBoundTo": "Bound to", - "topApiKeys": "Top API keys", - "quotaMonitorsTitle": "Quota Monitors", - "quotaMonitorsSubtitle": "Live quota state per account window", - "openQuota": "Open Quota", - "allQuotasHealthy": "All quotas healthy", - "statusExhausted": "EXHAUSTED", - "statusAlerting": "ALERTING", - "statusError": "ERROR", - "moreSuffix": "+{count} more" + "feedClear": "Limpar", + "feedEmptyWaiting": "À espera de eventos... (verificação a cada 5s)", + "feedEmptyFiltered": "Nenhum evento corresponde a este filtro", + "sessionsTitle": "Sessões Ativas", + "sessionsSubtitle": "Fingerprints de pedidos com sticky-bound (ao vivo)", + "sessionsActive": "{count} ativas", + "sessionsEmptyTitle": "Sem sessões ativas", + "sessionsEmptyHint": "As sessões aparecem conforme os pedidos fluem pelo proxy", + "tblSession": "Sessão", + "tblAge": "Idade", + "tblIdle": "Inativo", + "tblReqs": "Pedidos", + "tblBoundTo": "Ligado a", + "topApiKeys": "Principais chaves de API", + "quotaMonitorsTitle": "Monitores de Quota", + "quotaMonitorsSubtitle": "Estado de quota ao vivo por janela de conta", + "openQuota": "Quota Aberta", + "allQuotasHealthy": "Todas as quotas saudáveis", + "statusExhausted": "ESGOTADO", + "statusAlerting": "EM ALERTA", + "statusError": "ERRO", + "moreSuffix": "+{count} mais" }, "quotaShare": { "weightPercent": "Peso %", - "title": "Quota Sharing", - "description": "Share provider quotas across API keys with % limits", - "newPool": "New pool", + "title": "Partilha de Quota", + "description": "Partilha quotas de fornecedores entre chaves de API com limites em %", + "newPool": "Novo pool", "betaTitle": "Beta — UI preview.", - "betaDescription": "Configuration is saved in localStorage (not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split; real enforcement will land in a future iteration with DB persistence and upstream call interception.", - "kpiActivePools": "Active pools", - "kpiKeysAllocated": "Keys allocated", - "kpiAvgUnallocated": "Avg unallocated", - "kpiProvidersWithQuota": "Providers w/ quota", - "emptyTitle": "No pools configured", - "emptyDescription": "Create a pool to assign API keys to share a provider's quota window with % allocations.", - "loading": "Loading…", - "removePool": "Remove pool", - "removeConfirm": "Remove this pool?", + "betaDescription": "A configuração é guardada em localStorage (ainda não persistida no servidor). A imposição de limite por pedido ainda não está ativa.", + "kpiActivePools": "Pools ativos", + "kpiKeysAllocated": "Chaves atribuídas", + "kpiAvgUnallocated": "Média não atribuída", + "kpiProvidersWithQuota": "Fornecedores com quota", + "emptyTitle": "Nenhum pool configurado", + "emptyDescription": "Cria um pool para atribuir chaves de API para partilhar a janela de quota de um fornecedor com atribuições em %.", + "loading": "A carregar…", + "removePool": "Remover pool", + "removeConfirm": "Remover este pool?", "pool": "Pool", - "used": "used", - "allocationsCount": "Allocations ({count})", - "allocatedFree": "{allocated}% allocated · {free}% free", - "noAllocations": "No keys allocated yet", - "capLabel": "cap {value}", - "notTrackedYet": "(not tracked yet)", - "policy": "Policy", + "used": "usado", + "allocationsCount": "Atribuições ({count})", + "allocatedFree": "{allocated}% atribuído · {free}% livre", + "noAllocations": "Ainda sem chaves atribuídas", + "capLabel": "limite {value}", + "notTrackedYet": "(ainda não monitorizado)", + "policy": "Política", "apiKeyColumn": "Chave de API", "weightColumn": "Peso", "fairShareShort": "justo", - "policyHard": "hard", - "policySoft": "soft", + "policyHard": "rígida", + "policySoft": "suave", "policyBurst": "burst", - "policyHardHint": "Block when key exhausts allocation", - "policySoftHint": "Allow overflow, alert only", - "policyBurstHint": "Allow burst into free pool", - "editAllocations": "Edit allocations", - "newPoolTitle": "New quota pool", - "providerConnection": "Provider connection (account)", - "selectConnection": "Select a connection…", - "noEligibleConnections": "No connections with quota data. Refresh from /dashboard/quota first.", - "quotaWindow": "Quota window", - "selectWindow": "Select a window…", - "alreadyUsedSuffix": "(already used)", - "windowReset": "Reset", - "duplicatePoolError": "A pool for this connection + window already exists", - "cancel": "Cancel", - "createPool": "Create pool", - "editTitle": "Edit allocations", - "noKeysAdded": "No keys allocated. Add one below.", + "policyHardHint": "Bloquear quando a chave esgota a atribuição", + "policySoftHint": "Permitir overflow, apenas alertar", + "policyBurstHint": "Permitir burst para o pool livre", + "editAllocations": "Editar atribuições", + "newPoolTitle": "Novo pool de quota", + "providerConnection": "Ligação do fornecedor (conta)", + "selectConnection": "Seleciona uma ligação…", + "noEligibleConnections": "Sem ligações com dados de quota. Atualiza primeiro a partir de /dashboard/quota.", + "quotaWindow": "Janela de quota", + "selectWindow": "Seleciona uma janela…", + "alreadyUsedSuffix": "(já usado)", + "windowReset": "Repor", + "duplicatePoolError": "Já existe um pool para esta ligação + janela", + "cancel": "Cancelar", + "createPool": "Criar pool", + "editTitle": "Editar atribuições", + "noKeysAdded": "Sem chaves atribuídas. Adiciona uma abaixo.", "totalLabel": "Total: {percent}%", - "totalExceeded": "⚠ exceeds 100%", - "addKey": "+ Add key…", - "equalSplit": "Equal split", - "save": "Save allocations", + "totalExceeded": "⚠ excede 100%", + "addKey": "+ Adicionar chave…", + "equalSplit": "Divisão igual", + "save": "Guardar atribuições", "betaPreviewLabel": "Beta – visualização da IU.", "betaConfigSavedPrefix": "A configuração é salva em", "betaConfigSavedSuffix": "(ainda não persistido no servidor). A aplicação do limite por solicitação ainda não está conectada ao pipeline do proxy. Esta tela permite desenhar e visualizar a divisão de cotas; a aplicação real chegará em uma iteração futura com persistência de banco de dados e interceptação de chamadas upstream.", @@ -11386,7 +11458,7 @@ "endpointsBaseUrl": "URL base", "endpointsCollapse": "Recolher", "endpointsExpand": "Expandir", - "endpointsAnthropicNote": "Anthropic-native", + "endpointsAnthropicNote": "Nativo Anthropic", "endpointsResponsesNote": "Respostas OpenAI — codex/github", "endpointsWsNote": "WebSocket — apenas codex", "betaText": "A Partilha de Quota está funcional, mas são esperados bugs. Encontrou algum? Por favor, reporte-o.", @@ -11401,40 +11473,40 @@ }, "plugins": { "title": "Plugins", - "description": "Install and manage plugins for extending OmniRoute functionality", - "loading": "Loading plugins...", - "scanning": "Scanning...", - "scanForPlugins": "Scan for Plugins", - "noPlugins": "No plugins installed", - "noPluginsDescription": "Place plugin directories in ~/.omniroute/plugins/ and click Scan.", - "activate": "Activate", - "deactivate": "Deactivate", - "uninstall": "Uninstall", - "uninstallConfirm": "Uninstall plugin \"{name}\"?", - "pluginScanComplete": "Plugin scan complete", - "pluginScanFailed": "Plugin scan failed", - "activated": "{name} activated", - "deactivated": "{name} deactivated", - "activateFailed": "Failed to activate {name}", - "deactivateFailed": "Failed to deactivate {name}", - "uninstalled": "{name} uninstalled", - "uninstallFailed": "Failed to uninstall {name}", - "configure": "Configure: {name}", - "configurePlugin": "Configure", - "noConfigSettings": "This plugin has no configurable settings.", - "saving": "Saving...", - "saveConfiguration": "Save Configuration", - "configurationSaved": "Configuration saved", - "saveConfigurationFailed": "Failed to save configuration", - "pluginNotFound": "Plugin not found", - "version": "Version", - "author": "Author", - "description_label": "Description", - "status": "Status", - "enabled": "Enabled", - "disabled": "Disabled", + "description": "Instala e gere plugins para estender a funcionalidade do OmniRoute", + "loading": "A carregar plugins...", + "scanning": "A analisar...", + "scanForPlugins": "Analisar Plugins", + "noPlugins": "Nenhum plugin instalado", + "noPluginsDescription": "Coloca diretórios de plugin em ~/.omniroute/plugins/ e clica em Analisar.", + "activate": "Ativar", + "deactivate": "Desativar", + "uninstall": "Desinstalar", + "uninstallConfirm": "Desinstalar o plugin \"{name}\"?", + "pluginScanComplete": "Análise de plugins concluída", + "pluginScanFailed": "Falha na análise de plugins", + "activated": "{name} ativado", + "deactivated": "{name} desativado", + "activateFailed": "Falha ao ativar {name}", + "deactivateFailed": "Falha ao desativar {name}", + "uninstalled": "{name} desinstalado", + "uninstallFailed": "Falha ao desinstalar {name}", + "configure": "Configurar: {name}", + "configurePlugin": "Configurar", + "noConfigSettings": "Este plugin não tem definições configuráveis.", + "saving": "A guardar...", + "saveConfiguration": "Guardar Configuração", + "configurationSaved": "Configuração guardada", + "saveConfigurationFailed": "Falha ao guardar a configuração", + "pluginNotFound": "Plugin não encontrado", + "version": "Versão", + "author": "Autor", + "description_label": "Descrição", + "status": "Estado", + "enabled": "Ativado", + "disabled": "Desativado", "installedTab": "Instalado", - "marketplaceTab": "Marketplace", + "marketplaceTab": "Mercado", "marketplaceUrlLabel": "URL personalizado do Marketplace", "marketplaceUrlPlaceholder": "Deixe em branco para o registo oficial do Omniroute", "saveMarketplaceUrl": "Guardar e recarregar", @@ -11495,7 +11567,7 @@ "filterAria": "Filtrar por tipo de evento", "refresh": "Atualizar", "refreshAria": "Atualizar feed de atividade", - "loading": "A carregar", + "loading": "A carregar atividade...", "loadingActivity": "A carregar atividade…", "fetchFailed": "Falha ao obter atividade", "relative": { @@ -11772,7 +11844,7 @@ "resumeBtn": "Retomar", "clearBtn": "Limpar", "exportHar": "Exportar .har", - "recordSession": "REC", + "recordSession": "GRAVAR", "stopSession": "Parar", "liveBadge": "em direto", "offlineBadge": "offline", @@ -11836,7 +11908,7 @@ "timingUpstreamResponse": "Resposta upstream", "timingNoData": "Sem dados de temporização disponíveis.", "timingTotalLatency": "Latência total", - "timingTimestamp": "Timestamp", + "timingTimestamp": "Marca de tempo", "timingMethod": "Método", "timingStatus": "Estado", "timingRequestSize": "Tamanho do pedido", @@ -12053,7 +12125,7 @@ }, "omni-cache": { "name": "Cache", - "description": "Gira a cache de respostas do LLM. Visualize estatísticas da cache, limpe entradas, configure políticas de TTL e controle os limiares de colocação em cache por semelhança semântica." + "description": "Cache inteligente omni" }, "omni-compression": { "name": "Compressão", @@ -12085,7 +12157,7 @@ }, "omni-webhooks": { "name": "Webhooks", - "description": "Registe, liste, teste e remova endpoints de webhook. Configure subscrições de eventos (request.completed, provider.error, budget.exceeded, etc.) e gira as tentativas de entrega." + "description": "Webhooks omni" }, "omni-mcp": { "name": "Servidor MCP", @@ -12105,15 +12177,15 @@ }, "cli-serve": { "name": "CLI: Serve", - "description": "Inicie, pare e reinicie o servidor OmniRoute a partir da CLI. Gira o modo daemon, a configuração de portas, a recuperação automática, a integração na bandeja do sistema e o atalho para abrir o painel." + "description": "Serve o agente localmente" }, "cli-health": { - "name": "CLI: Health", - "description": "Verifique o estado de saúde do servidor, o estado dos componentes e as métricas em tempo real a partir da CLI. Execute `health`, `health components` e `health watch` para obter um painel em tempo real dos disjuntores e do estado dos fornecedores." + "name": "CLI: Saúde", + "description": "Verifica o estado de saúde" }, "cli-providers": { - "name": "CLI: Providers", - "description": "Gira as ligações de fornecedores a partir da CLI: liste fornecedores disponíveis/configurados, adicione, teste, teste-all, valide, rode chaves de API e veja métricas por fornecedor." + "name": "CLI: Fornecedores", + "description": "Gere fornecedores em linha de comandos" }, "cli-keys": { "name": "CLI: Chaves de API", @@ -12125,7 +12197,7 @@ }, "cli-chat": { "name": "CLI: Chat", - "description": "Enviar conclusões de chat, transmitir respostas em fluxo e iniciar uma sessão REPL interativa a partir da CLI. Suporta todos os fornecedores OmniRoute, encaminhamento combinado e configuração de prompts do sistema." + "description": "Cliente de chat em linha de comandos" }, "cli-routing": { "name": "CLI: Encaminhamento e Combos", @@ -12149,7 +12221,7 @@ }, "cli-mcp": { "name": "CLI: MCP", - "description": "Inspecionar o estado do servidor MCP, listar ferramentas e âmbitos registados, executar invocações de ferramentas e gerir registos de auditoria MCP a partir da CLI." + "description": "Servidor MCP em linha de comandos" }, "cli-a2a": { "name": "CLI: Protocolo A2A", @@ -12246,7 +12318,7 @@ }, "categoryApi": "API", "categoryCli": "CLI", - "categoryConfig": "Config", + "categoryConfig": "Configuração", "filterAll": "Tudo", "coverageLabel": "Cobertura", "mcpUrl": "URL do MCP", @@ -12289,7 +12361,7 @@ "colScore": "Pontuação", "colAvgScore": "Pontuação Média", "colModels": "Modelos", - "colType": "Type", + "colType": "Tipo", "filterConfiguredOnly": "Apenas configurados", "filterAvailableOnly": "Apenas disponíveis", "filterAvailableOnlyHelp": "Ocultar fornecedores cujas ligações estejam todas com limite de taxa atingido ou sem quota.", @@ -12347,7 +12419,7 @@ "custom": "Personalizado", "noSavedProxies": "Nenhum proxy guardado — adicione um em Definições → Proxy", "directConnection": "Direto (sem proxy)", - "host": "Host", + "host": "Anfitrião", "port": "Porta", "usernameOptional": "Nome de utilizador (opcional)", "passwordOptional": "Palavra-passe (opcional)", @@ -12558,7 +12630,7 @@ "danger": "Perigo", "requiresRestart": "Requer reinício", "source": "Origem", - "ccDiscoveryAliasesEnvWarning": "Ativo via variável de ambiente (EXPOSE_CC_DISCOVERY_ALIASES) — isto substitui qualquer alternância de painel abaixo.", + "ccDiscoveryAliasesEnvWarning": "__MISSING__:Active via environment variable (EXPOSE_CC_DISCOVERY_ALIASES) — this overrides any dashboard toggle below.", "resetFlag": "Repor {label} para a predefinição", "reset": "Repor", "loadFailed": "Falha ao carregar os sinalizadores de funcionalidades", @@ -12587,7 +12659,7 @@ "block": "Bloquear", "redact": "Ocultar", "disabled": "Desativado", - "dual": "Dual", + "dual": "Duplo", "alias": "Alias", "canonical": "Canónico" }, @@ -12941,80 +13013,80 @@ "viewFullHistory": "Ver histórico completo no GitHub" }, "reasoningRouting": { - "title": "Reasoning routing policies", - "apiKeyTitle": "Reasoning routing for this API key", - "subtitle": "Reroute models and reasoning effort without requiring client support. Requests remain unchanged when no rule matches.", - "loadError": "Reasoning rules could not be loaded.", - "saveError": "The rule is invalid or could not be saved.", - "saved": "Reasoning rule saved.", - "deleteConfirm": "Delete this reasoning rule?", - "deleteError": "The reasoning rule could not be deleted.", - "empty": "No matching reasoning rules configured.", - "all": "All", - "any": "Any", - "enabled": "Enabled", - "disabled": "Disabled", - "filterSearch": "Search rules", - "filterScope": "Filter by scope", - "filterStatus": "Filter by status", - "allModels": "all models", - "keepModel": "Keep model", - "otherModel": "Other model", + "title": "Políticas de encaminhamento de raciocínio", + "apiKeyTitle": "Encaminhamento de raciocínio para esta chave de API", + "subtitle": "Reencaminha modelos e esforço de raciocínio sem exigir suporte do cliente. Os pedidos permanecem inalterados quando nenhuma regra corresponde.", + "loadError": "Não foi possível carregar as regras de raciocínio.", + "saveError": "A regra é inválida ou não pôde ser guardada.", + "saved": "Regra de raciocínio guardada.", + "deleteConfirm": "Eliminar esta regra de raciocínio?", + "deleteError": "Não foi possível eliminar a regra de raciocínio.", + "empty": "Nenhuma regra de raciocínio correspondente configurada.", + "all": "Todos", + "any": "Qualquer", + "enabled": "Ativado", + "disabled": "Desativado", + "filterSearch": "Pesquisar regras", + "filterScope": "Filtrar por âmbito", + "filterStatus": "Filtrar por estado", + "allModels": "todos os modelos", + "keepModel": "Manter modelo", + "otherModel": "Outro modelo", "combo": "Combo", - "priorityShort": "priority {value}", - "toggleAria": "Enable {name}", - "edit": "Edit", - "delete": "Delete", - "name": "Name", - "description": "Description", - "scopeLabel": "Scope", - "apiKey": "API key", - "sourceCombo": "Source combo", - "connection": "Connection", - "sourceModel": "Source model or wildcard", - "sourceModelOptional": "Empty = all models", - "sourceModelExample": "e.g. gpt-5*", - "sourceEffort": "Source effort", - "missing": "Not specified", - "signalOnly": "Non-discrete reasoning signal", - "requestTags": "Request tags", - "requestTagsExample": "coding, internal", - "tagMode": "Tag matching", - "effortMode": "Effort mode", - "targetEffort": "Target effort", - "routingTarget": "Routing target", - "targetModel": "Target model", - "targetCombo": "Target combo", - "budgetAction": "Thinking budget", - "budgetTokens": "Budget tokens", - "priority": "Priority", - "saveChanges": "Save changes", - "add": "Add rule", - "cancel": "Cancel", - "simulateTitle": "Simulate rule", - "model": "Model", - "effort": "Effort", - "transport": "Transport", - "simulate": "Simulate without upstream", - "extendedComboWarning": "Max/Ultra is validated separately for every combo target during routing.", - "extendedUnknownWarning": "Enter a target model to verify Max/Ultra support.", - "extendedUnsupportedWarning": "Max/Ultra is only known to be supported by suitable Codex GPT-5.6 models. Unknown custom models are accepted by the server with a warning.", + "priorityShort": "prioridade {value}", + "toggleAria": "Ativar {name}", + "edit": "Editar", + "delete": "Eliminar", + "name": "Nome", + "description": "Descrição", + "scopeLabel": "Âmbito", + "apiKey": "Chave de API", + "sourceCombo": "Combo de origem", + "connection": "Ligação", + "sourceModel": "Modelo de origem ou wildcard", + "sourceModelOptional": "Vazio = todos os modelos", + "sourceModelExample": "ex: gpt-5*", + "sourceEffort": "Esforço de origem", + "missing": "Não especificado", + "signalOnly": "Sinal de raciocínio não discreto", + "requestTags": "Etiquetas de pedido", + "requestTagsExample": "codificação, interno", + "tagMode": "Correspondência de etiquetas", + "effortMode": "Modo de esforço", + "targetEffort": "Esforço alvo", + "routingTarget": "Alvo de encaminhamento", + "targetModel": "Modelo alvo", + "targetCombo": "Combo alvo", + "budgetAction": "Orçamento de thinking", + "budgetTokens": "Tokens de orçamento", + "priority": "Prioridade", + "saveChanges": "Guardar alterações", + "add": "Adicionar regra", + "cancel": "Cancelar", + "simulateTitle": "Simular regra", + "model": "Modelo", + "effort": "Esforço", + "transport": "Transporte", + "simulate": "Simular sem upstream", + "extendedComboWarning": "Max/Ultra é validado separadamente para cada alvo de combo durante o encaminhamento.", + "extendedUnknownWarning": "Introduz um modelo alvo para verificar o suporte a Max/Ultra.", + "extendedUnsupportedWarning": "Max/Ultra só é conhecido como suportado por modelos Codex GPT-5.6 adequados. Modelos personalizados desconhecidos são aceites.", "scope": { "global": "Global", - "apiKey": "API key", + "apiKey": "Chave de API", "combo": "Combo", - "model": "Model", - "connection": "Connection" + "model": "Modelo", + "connection": "Ligação" }, "mode": { - "inherit": "Inherit client", - "default": "Use default", - "force": "Force" + "inherit": "Herdar do cliente", + "default": "Usar padrão", + "force": "Forçar" }, "budget": { - "preserve": "Preserve", - "remove": "Remove", - "set": "Set fixed value" + "preserve": "Preservar", + "remove": "Remover", + "set": "Definir valor fixo" } }, "chaosConfig": { @@ -13064,8 +13136,8 @@ }, "kimiSponsorBanner": { "foundingFriendTitle": "A Kimi (Moonshot AI) é a Amiga do Código Aberto fundadora do OmniRoute", - "description": "Os novos utilizadores ganham 15% de créditos de API extra no primeiro carregamento. Use o Kimi K3 no OmniRoute através da API oficial da Kimi.", - "cta": "Obter uma chave de API da Kimi", + "description": "O Kimi K3 traz uma janela de contexto de 1M de tokens e desempenho de codificação de ponta para o OmniRoute por uma fração do custo.", + "cta": "Obter Kimi Code", "partnerLinkNote": "Link de parceiro", "dismissAriaLabel": "Dispensar" }, @@ -13094,15 +13166,15 @@ "privacyLocalOnly": "Todo o processamento ocorre na sua instância OmniRoute", "activateButton": "Ativar", "activating": "A ativar...", - "keySectionTitle": "Already have a supporter key?", - "keyInvalidFormatError": "Invalid key format. It must start with \"omr_\" followed by 40 hex characters.", - "activateWithKeyButton": "Activate supporter", - "changeKeyButton": "Change key", - "claimSectionTitle": "Don't have a supporter key yet?", - "contributorButton": "I'm a contributor", - "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", - "supporterButton": "Support the project", - "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "keySectionTitle": "Já tens uma chave de supporter?", + "keyInvalidFormatError": "Formato de chave inválido. Tem de começar com \"omr_\" seguido de 40 caracteres hex.", + "activateWithKeyButton": "Ativar supporter", + "changeKeyButton": "Alterar chave", + "claimSectionTitle": "Ainda não tens uma chave de supporter?", + "contributorButton": "Sou contribuidor", + "contributorHint": "Verifica a tua conta GitHub — 5+ pull requests merged ou um lugar no top-100 de contribuidores desbloqueia uma chave de supporter grátis.", + "supporterButton": "Apoiar o projeto", + "supporterHint": "Apoia o OmniRoute para obteres uma chave de supporter com o catálogo ao vivo e vantagens extra.", "colProvider": "Fornecedor", "colModel": "Modelo", "colQuota": "Quota", @@ -13115,16 +13187,16 @@ "capTools": "Ferramentas", "capVision": "Visão", "capThinking": "Pensando", - "catalogTab": "Catalog", - "freeCreditsTab": "Free credits", - "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", - "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", - "requiredActionLabel": "What to do:", - "claimButton": "Claim credits", - "campaignsTitle": "Limited-time campaigns", - "campaignsEmpty": "No active campaigns right now — check back later.", - "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", - "campaignsValidUntil": "Valid until {date}" + "catalogTab": "Catálogo", + "freeCreditsTab": "Créditos grátis", + "freeCreditsSubtitle": "Links de referência de fornecedores monitorizados pelo Radar — usá-los não te custa nada extra e ajuda a apoiar o OmniRoute.", + "fixedLinksEmpty": "Ainda não há links de referência disponíveis. Sincroniza o Radar para verificar atualizações.", + "requiredActionLabel": "O que fazer:", + "claimButton": "Reclamar créditos", + "campaignsTitle": "Campanhas por tempo limitado", + "campaignsEmpty": "Sem campanhas ativas de momento — volta mais tarde.", + "campaignsUpsellCommunity": "As campanhas por tempo limitado são um extra de supporter. Tudo o que está nos links fixos desta página continua grátis para todos.", + "campaignsValidUntil": "Válido até {date}" }, "radarSetupPage": { "title": "Configuração do Fornecedor", @@ -13159,11 +13231,11 @@ "connectionId": "Ligação", "authType": "Autenticação", "backoffLevel": "Backoff", - "cooldown": "Cooldown", + "cooldown": "Arrefecimento", "lastError": "Último Erro", "lockouts": "Bloqueios", "healthy": "Saudável", - "coolingDown": "Cooldown", + "coolingDown": "Arrefecimento", "circuitOpen": "Circuito Aberto", "recovering": "A Recuperar", "degraded": "Degradado", @@ -13197,7 +13269,7 @@ "detail": { "title": "Detalhe da Ligação", "metadata": "Metadados", - "cooldown": "Cooldown", + "cooldown": "Arrefecimento", "lastError": "Último Erro", "breaker": "Disjuntor", "lockouts": "Bloqueios de Modelo", @@ -13239,17 +13311,24 @@ "pollErrorLocalOnly": "Esta página só é acessível a partir de localhost ou LAN (LOCAL_ONLY).", "pollErrorStopped": "Sondagem interrompida: o servidor rejeitou o pedido (404/403).", "pollErrorTransient": "Erro ao obter dados: a repetir automaticamente.", - "degraded": "Dados parciais: fontes indisponíveis: {sources}", - "degraded.source.database": "Base de Dados", - "degraded.source.circuitBreaker": "Disjuntor", - "degraded.source.modelLockouts": "Bloqueios de Modelo", - "degraded.source.count": "Contagem de Ligações" + "degraded": { + "source": { + "database": "Base de Dados", + "circuitBreaker": "Disjuntor", + "modelLockouts": "Bloqueios de Modelo", + "count": "Contagem de Ligações" + } + }, + "degraded.source.database": "Database", + "degraded.source.circuitBreaker": "Circuit Breaker", + "degraded.source.modelLockouts": "Model Lockouts", + "degraded.source.count": "Connection Count" }, "featureFlagCapabilityFilterEnabledDescription": "Rejeitar pedidos antes do envio quando o modelo de destino não tiver as capacidades necessárias (visão, ferramentas, saída estruturada, janela de contexto). Protege pedidos diretos de um único fornecedor que contornam o filtro de compatibilidade da camada combinada.", - "capabilityFilter.visionMismatch": "O fornecedor não suporta visão para este pedido de imagem", - "capabilityFilter.toolsMismatch": "O fornecedor não suporta a chamada de ferramentas", - "capabilityFilter.structuredOutputMismatch": "O fornecedor não suporta saída estruturada", - "capabilityFilter.contextWindowMismatch": "A solicitação excede a janela de contexto do fornecedor", + "capabilityFilter.visionMismatch": "Provider does not support vision for this image request", + "capabilityFilter.toolsMismatch": "Provider does not support tool calling", + "capabilityFilter.structuredOutputMismatch": "Provider does not support structured output", + "capabilityFilter.contextWindowMismatch": "Request exceeds provider context window", "publicSystem": { "notFound": { "title": "Página não encontrada", @@ -13305,7 +13384,7 @@ "maintenanceInfo": "Informações de Manutenção", "service": "Serviço", "unknown": "desconhecido", - "notAvailable": "n/a", + "notAvailable": "n/d", "providersTracked": "Provedores Rastreados", "circuitBreakerState": "Estado do Disjuntor do Fornecedor", "lastUpdate": "Última atualização: {timestamp}", @@ -13403,7 +13482,7 @@ "apiKey": "Chave da API", "apiKeyDescription": "Cole uma chave de API {providerLabel} / CodeWhisperer de longa duração. Ela é armazenada como uma credencial bearer sem token de atualização; a descoberta de perfil é feita com o melhor esforço.", "idcStartUrl": "URL de Início do IDC", - "idcStartUrlPlaceholder": "https://your-org.awsapps.com/start", + "idcStartUrlPlaceholder": "https://a-tua-org.awsapps.com/start", "idcStartUrlDescription": "A URL do AWS IAM Identity Center da sua organização", "awsRegion": "Região AWS", "regionPlaceholder": "us-east-1", @@ -13459,7 +13538,7 @@ "authorizeImportant": "Importante: deve estar autenticado em trae.ai neste navegador primeiro. A página de autorização apenas confirma uma sessão existente — não pode autenticar você. Se vir \"Falha na Autenticação\", clique em \"Abrir solo.trae.ai\", autentique-se e depois volte aqui.", "waitingForAuthorization": "À espera de trae.ai…", "authorizeWithBrowser": "Autorizar com o Navegador", - "openSoloTrae": "Open solo.trae.ai", + "openSoloTrae": "Abrir solo.trae.ai", "orPasteManually": "ou cole um token manualmente", "manualInstructions": "Inicie sessão em solo.trae.ai, abra o DevTools → Rede, envie qualquer mensagem de chat e copie o JWT do cabeçalho da requisição Authorization: Cloud-IDE-JWT {tokenPlaceholder}. A duração do JWT é de ~14 dias. Os campos de identidade opcionais vêm de common_params no mesmo corpo da requisição.", "accessTokenLabel": "Token de Acesso (Cloud-IDE-JWT)", @@ -13562,9 +13641,9 @@ "metadata": { "compressionTitle": "Compressão", "compressionDescription": "Configure as definições de compressão de contexto para reduzir o uso de tokens e os custos.", - "relayTitle": "OmniRoute — Relay Proxies", + "relayTitle": "OmniRoute — Proxies de Relay", "relayDescription": "Endpoints de proxy relay sem servidor para a sua infraestrutura de IA", - "trafficInspectorTitle": "Traffic Inspector — OmniRoute", + "trafficInspectorTitle": "Inspetor de Tráfego — OmniRoute", "trafficInspectorDescription": "Monitor chamadas LLM + depurar o tráfego HTTPS de qualquer aplicação" }, "conductor": { @@ -13624,5 +13703,11 @@ "hint": "Quando ativado, os modelos descobertos aparecem nas seleções do provedor em todo o OmniRoute.", "updateFailed": "Falha ao atualizar (HTTP {status})", "networkError": "Erro de rede — não foi possível atualizar a configuração de exposição do fornecedor" + }, + "capabilityFilter": { + "visionMismatch": "O fornecedor não suporta visão para este pedido de imagem", + "toolsMismatch": "O fornecedor não suporta a chamada de ferramentas", + "structuredOutputMismatch": "O fornecedor não suporta saída estruturada", + "contextWindowMismatch": "A solicitação excede a janela de contexto do fornecedor" } -} +} \ No newline at end of file