diff --git a/src/app/terms/page.tsx b/src/app/terms/page.tsx
index c840d060e0..2b6138a75d 100644
--- a/src/app/terms/page.tsx
+++ b/src/app/terms/page.tsx
@@ -27,7 +27,7 @@ export default function TermsPage() {
- {t("lastUpdated", { date: "February 13, 2026" })}
+ {t("lastUpdated", { date: t("policyLastUpdatedDate") })}
diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json
index 3d46975a0c..1e7ba97811 100644
--- a/src/i18n/messages/en.json
+++ b/src/i18n/messages/en.json
@@ -117,13 +117,13 @@
"quickStartDesc": "Get up and running in 4 steps. Connect providers, route models, monitor everything.",
"fullDocs": "Full Docs",
"step1Title": "1. Create API key",
- "step1Desc": "Go to {endpoint} → Registered Keys. Generate one key per environment.",
+ "step1Desc": "Go to
Endpoint -> Registered Keys. Generate one key per environment.",
"step2Title": "2. Connect providers",
- "step2Desc": "Add accounts in {providers}. Supports OAuth, API Key, and free tiers.",
+ "step2Desc": "Add accounts in
Providers. Supports OAuth, API Key, and free tiers.",
"step3Title": "3. Point your client",
"step3Desc": "Set base URL to {url} in your IDE or API client.",
"step4Title": "4. Monitor & optimize",
- "step4Desc": "Track tokens, cost and errors in {logs} and {analytics}.",
+ "step4Desc": "Track tokens, cost and errors in
Request Logs and
Analytics.",
"providersOverview": "Providers Overview",
"configuredOf": "{configured} configured of {total} available providers",
"noModelsAvailable": "No models available for this provider.",
@@ -137,7 +137,13 @@
"documentation": "Documentation",
"healthMonitor": "Health Monitor",
"reportIssue": "Report issue",
- "activeError": "{active} active · {errors} error"
+ "activeError": "{active} active · {errors} error",
+ "oauthLabel": "OAuth",
+ "apiKeyLabel": "API Key",
+ "requestsShort": "{count} reqs",
+ "providerModelsTitle": "{provider} - Models",
+ "copiedModel": "Copied: {model}",
+ "aliasLabel": "alias"
},
"analytics": {
"title": "Analytics",
@@ -243,6 +249,13 @@
"noEntries": "No audit entries found",
"filterByAction": "Filter by action...",
"filterByActor": "Filter by actor...",
+ "filterEntriesAria": "Filter audit log entries",
+ "filterByActionTypeAria": "Filter by action type",
+ "filterByActorAria": "Filter by actor",
+ "refreshAuditLogAria": "Refresh audit log",
+ "tableAria": "Audit log entries",
+ "failedFetchAuditLog": "Failed to fetch audit log",
+ "notAvailable": "—",
"description": "Administrative actions and security events",
"showing": "Showing {count} entries (offset {offset})",
"previous": "Previous"
@@ -258,7 +271,199 @@
"instructions": "Instructions",
"modelMapping": "Model Mapping",
"baseUrl": "Base URL",
- "apiKey": "API Key"
+ "apiKey": "API Key",
+ "configured": "Configured",
+ "notConfigured": "Not configured",
+ "notInstalled": "Not installed",
+ "custom": "Custom",
+ "unknown": "Unknown",
+ "lastSavedAt": "Last saved: {date}",
+ "never": "Never",
+ "justNow": "just now",
+ "minutesAgoShort": "{count}m ago",
+ "hoursAgoShort": "{count}h ago",
+ "daysAgoShort": "{count}d ago",
+ "monthsAgoShort": "{count}mo ago",
+ "yearsAgoShort": "{count}y ago",
+ "runtimeCheckFailed": "Runtime check failed",
+ "yourApiKeyPlaceholder": "your-api-key",
+ "modelPlaceholder": "provider/model-id",
+ "configurationSaved": "Configuration saved successfully.",
+ "failedToSave": "Failed to save configuration.",
+ "noApiKeysCreateOne": "No API keys - Create one in Keys page",
+ "defaultOmnirouteKey": "sk_omniroute (default)",
+ "selectModel": "Select Model",
+ "selectModelForAlias": "Select model for {alias}",
+ "selectModelForTool": "Select Model for {tool}",
+ "select": "Select",
+ "clear": "Clear",
+ "comingSoon": "Coming soon",
+ "checkingRuntime": "Checking runtime status...",
+ "guideOnlyIntegration": "Guide-only integration (no local runtime required)",
+ "cliRuntimeDetected": "CLI runtime detected and ready",
+ "cliFoundNotRunnable": "CLI found but not runnable{reason}",
+ "cliRuntimeNotDetected": "CLI runtime not detected",
+ "binary": "Binary",
+ "configPath": "Config path",
+ "configPathShort": "Config",
+ "failedCheckRuntimeStatus": "Failed to check runtime status.",
+ "copy": "Copy",
+ "copied": "Copied",
+ "copyConfig": "Copy Config",
+ "saveConfig": "Save Config",
+ "selectionSaved": "Selection saved",
+ "guide": "Guide",
+ "detected": "Detected",
+ "notReady": "Not ready",
+ "active": "Active",
+ "inactive": "Inactive",
+ "startMitm": "Start MITM",
+ "stopMitm": "Stop MITM",
+ "mitmStarted": "MITM started successfully!",
+ "mitmStopped": "MITM stopped successfully!",
+ "failedStart": "Failed to start MITM",
+ "failedStop": "Failed to stop MITM",
+ "saveMappings": "Save Mappings",
+ "mappingsSaved": "Mappings saved!",
+ "failedSaveMappings": "Failed to save mappings",
+ "howItWorks": "How it works:",
+ "antigravityHowWorksDesc": "Antigravity sends requests to Google's endpoint. MITM intercepts and redirects them to OmniRoute.",
+ "antigravityStep1": "1. Start MITM to route requests through OmniRoute.",
+ "antigravityStep2Prefix": "2. Add",
+ "antigravityStep2Suffix": "to your hosts file as 127.0.0.1.",
+ "antigravityStep3": "3. Open Antigravity and requests will be proxied.",
+ "sudoPasswordRequiredTitle": "Sudo Password Required",
+ "sudoPasswordHint": "Administrator password is required to modify hosts file and system proxy settings.",
+ "enterSudoPassword": "Enter sudo password",
+ "sudoPasswordRequiredError": "Sudo password is required.",
+ "cancel": "Cancel",
+ "confirm": "Confirm",
+ "settingsApplied": "Settings applied successfully!",
+ "failedApplySettings": "Failed to apply settings",
+ "settingsReset": "Settings reset successfully!",
+ "failedResetSettings": "Failed to reset settings",
+ "backupRestored": "Backup restored!",
+ "failedRestore": "Failed to restore",
+ "checkingCli": "Checking {tool} CLI...",
+ "cliNotRunnable": "{tool} CLI installed but not runnable",
+ "cliNotInstalled": "{tool} CLI not installed",
+ "cliNotDetected": "{tool} CLI not detected",
+ "cliDetectedReady": "{tool} CLI detected and ready",
+ "cliFoundFailedHealthcheck": "{tool} CLI was found but failed runtime healthcheck{reason}.",
+ "installCliPrompt": "Please install {tool} CLI to use this feature.",
+ "installCodexPrompt": "Please install Codex CLI to use auto-apply feature.",
+ "hide": "Hide",
+ "howToInstall": "How to Install",
+ "installationGuide": "Installation Guide",
+ "platforms": "macOS / Linux / Windows:",
+ "afterInstallationRun": "After installation, run",
+ "toVerify": "to verify.",
+ "current": "Current",
+ "baseUrlPlaceholder": "https://.../v1",
+ "resetToDefault": "Reset to default",
+ "providerModelPlaceholder": "provider/model-id",
+ "apply": "Apply",
+ "reset": "Reset",
+ "manualConfig": "Manual Config",
+ "backups": "Backups",
+ "configBackups": "Config Backups",
+ "noBackupsYet": "No backups yet. Backups are created automatically before each Apply or Reset.",
+ "restore": "Restore",
+ "backupRestoredReloading": "Backup restored! Reloading status...",
+ "failedRestoreBackup": "Failed to restore backup",
+ "applied": "Applied!",
+ "failed": "Failed",
+ "resetDone": "Reset!",
+ "omnirouteConfiguredOpenAiCompatible": "OmniRoute is configured as OpenAI-compatible provider",
+ "provider": "Provider",
+ "model": "Model",
+ "providers": "Providers",
+ "auth": "Auth",
+ "noApiKeysAvailable": "No API keys available",
+ "usingDefaultOmniroute": "Using default: sk_omniroute",
+ "updateConfig": "Update Config",
+ "applyConfig": "Apply Config",
+ "noBackupsAvailable": "No backups available.",
+ "profileSaved": "Profile \"{name}\" saved!",
+ "failedSaveProfile": "Failed to save profile",
+ "profileActivated": "Profile activated!",
+ "failedActivateProfile": "Failed to activate profile",
+ "profiles": "Profiles",
+ "savedProfiles": "Saved Profiles",
+ "noProfilesYet": "No profiles saved yet. Save current config as a profile below.",
+ "activate": "Activate",
+ "deleteProfile": "Delete profile",
+ "profileNamePlaceholder": "Profile name (e.g. Personal Account)",
+ "saveCurrent": "Save Current",
+ "codexAuthNotePrefix": "Codex uses",
+ "codexAuthNoteMiddle": "with",
+ "codexAuthNoteSuffix": "Click \"Apply\" to auto-configure.",
+ "claudeManualConfiguration": "Claude CLI - Manual Configuration",
+ "codexManualConfiguration": "Codex CLI - Manual Configuration",
+ "droidManualConfiguration": "Factory Droid - Manual Configuration",
+ "openClawManualConfiguration": "Open Claw - Manual Configuration",
+ "clineManualConfiguration": "Cline Manual Configuration",
+ "kiloManualConfiguration": "Kilo Code Manual Configuration",
+ "toolDescriptions": {
+ "antigravity": "Google Antigravity IDE with MITM",
+ "claude": "Anthropic Claude Code CLI",
+ "codex": "OpenAI Codex CLI",
+ "droid": "Factory Droid AI Assistant",
+ "openclaw": "Open Claw AI Assistant",
+ "cline": "Cline AI Coding Assistant CLI",
+ "kilo": "Kilo Code AI Assistant CLI",
+ "cursor": "Cursor AI Code Editor",
+ "continue": "Continue AI Assistant"
+ },
+ "guides": {
+ "cursor": {
+ "notes": {
+ "0": "Requires Cursor Pro account to use this feature.",
+ "1": "Cursor routes requests through its own server, so local endpoint is not supported. Please enable Cloud Endpoint in Settings."
+ },
+ "steps": {
+ "1": {
+ "title": "Open Settings",
+ "desc": "Go to Settings -> Models"
+ },
+ "2": {
+ "title": "Enable OpenAI API",
+ "desc": "Enable \"OpenAI API key\" option"
+ },
+ "3": {
+ "title": "Base URL"
+ },
+ "4": {
+ "title": "API Key"
+ },
+ "5": {
+ "title": "Add Custom Model",
+ "desc": "Click \"View All Model\" -> \"Add Custom Model\""
+ },
+ "6": {
+ "title": "Select Model"
+ }
+ }
+ },
+ "continue": {
+ "steps": {
+ "1": {
+ "title": "Open Config",
+ "desc": "Open Continue configuration file"
+ },
+ "2": {
+ "title": "API Key"
+ },
+ "3": {
+ "title": "Select Model"
+ },
+ "4": {
+ "title": "Add Model Config",
+ "desc": "Add the following configuration to your models array:"
+ }
+ }
+ }
+ }
},
"combos": {
"title": "Combos",
@@ -390,10 +595,23 @@
"disabling": "Disabling...",
"cloudConnectedVerified": "Cloud Proxy connected and verified!",
"connectedVerificationPending": "Connected \u2014 verification pending",
+ "connectedVerificationPendingWithError": "Connected \u2014 verification pending: {error}",
"cloudDisabledSuccess": "Cloud disabled successfully",
"syncedSuccess": "Synced successfully",
"failedDisable": "Failed to disable cloud",
- "failedEnable": "Failed to enable cloud"
+ "failedEnable": "Failed to enable cloud",
+ "cloudRequestTimeout": "Cloud request timeout",
+ "cloudRequestFailed": "Cloud request failed",
+ "cloudWorkerUnreachable": "Could not reach cloud worker. Make sure the cloud service is running (npm run dev in /cloud).",
+ "connectionFailed": "Connection failed",
+ "syncFailed": "Failed to sync cloud data",
+ "providerModelsTitle": "{provider} \u2014 Models",
+ "noModelsForProvider": "No models available for this provider.",
+ "chat": "Chat",
+ "embedding": "Embedding",
+ "image": "Image",
+ "custom": "custom",
+ "modelsCount": "{count, plural, one {# model} other {# models}}"
},
"health": {
"title": "System Health",
@@ -419,7 +637,13 @@
"retry": "Retry",
"allOperational": "All systems operational",
"issuesDetected": "System issues detected",
+ "updatedAt": "Updated {time}",
"latency": "Latency",
+ "latencyP50": "p50",
+ "latencyP95": "p95",
+ "latencyP99": "p99",
+ "millisecondsShort": "{value}ms",
+ "notAvailable": "—",
"totalRequests": "Total requests",
"noDataYet": "No data yet",
"promptCache": "Prompt Cache",
@@ -427,10 +651,18 @@
"hitRate": "Hit Rate",
"hitsMisses": "Hits / Misses",
"signatureCache": "Signature Cache",
+ "signatureDefaults": "Defaults",
+ "signatureTool": "Tool",
+ "signatureFamily": "Family",
+ "signatureSession": "Session",
"recovering": "Recovering",
"noCBData": "No circuit breaker data available. Make some requests first.",
+ "providerHealthStatusAria": "Provider health status",
"issuesLabel": "Issues Detected",
"operational": "Operational",
+ "providers": "Providers",
+ "healthyCount": "{count} healthy",
+ "nodeVersion": "Node {version}",
"failures": "{count} failure",
"failuresPlural": "{count} failures",
"lastFailure": "Last",
@@ -438,9 +670,13 @@
"activeLimiters": "{count} active limiter",
"activeLimitersPlural": "{count} active limiters",
"queued": "Queued",
+ "queuedCount": "{count} queued",
"running": "running",
+ "runningCount": "{count} running",
+ "ok": "OK",
"activeLockouts": "Active Lockouts",
"resetConfirm": "Reset all circuit breakers to healthy state? This will clear all failure counts and restore all providers to operational status.",
+ "resetAllTitle": "Reset all circuit breakers to healthy state",
"resetting": "Resetting...",
"resetAll": "Reset All",
"until": "Until {time}"
@@ -464,12 +700,21 @@
"refresh": "Refresh",
"filterByAction": "Filter by action...",
"filterByActor": "Filter by actor...",
+ "filterEntriesAria": "Filter audit log entries",
+ "filterByActionTypeAria": "Filter by action type",
+ "filterByActorAria": "Filter by actor",
+ "refreshAuditLogAria": "Refresh audit log",
+ "tableAria": "Audit log entries",
+ "failedFetchAuditLog": "Failed to fetch audit log",
+ "showing": "Showing {count} entries (offset {offset})",
"search": "Search",
"timestamp": "Timestamp",
"action": "Action",
"actor": "Actor",
"target": "Target",
"details": "Details",
+ "ipAddress": "IP Address",
+ "notAvailable": "—",
"noEntries": "No audit log entries found",
"previous": "Previous",
"next": "Next"
@@ -1206,6 +1451,51 @@
"scenarioThinking": "Thinking",
"scenarioSystemPrompt": "System Prompt",
"scenarioStreaming": "Streaming",
+ "templateNames": {
+ "simple-chat": "Simple Chat",
+ "tool-calling": "Tool Calling",
+ "multi-turn": "Multi-turn",
+ "thinking": "Thinking",
+ "system-prompt": "System Prompt",
+ "streaming": "Streaming"
+ },
+ "templateDescriptions": {
+ "simple-chat": "Basic text message",
+ "tool-calling": "Function/tool invocation",
+ "multi-turn": "Conversation with history",
+ "thinking": "Extended thinking / reasoning",
+ "system-prompt": "Complex system instructions",
+ "streaming": "SSE streaming request"
+ },
+ "templatePayloads": {
+ "simpleChat": {
+ "system": "You are a helpful assistant.",
+ "userGreeting": "Hello! How are you today?"
+ },
+ "toolCalling": {
+ "userWeather": "What's the weather in São Paulo?",
+ "toolDescription": "Get current weather for a location",
+ "cityNameDescription": "City name"
+ },
+ "multiTurn": {
+ "system": "You are a coding assistant.",
+ "userInitial": "Write a function to sort an array in Python.",
+ "assistantExample": "Here's a simple sort function:\n\n```python\ndef sort_array(arr):\n return sorted(arr)\n```",
+ "userFollowUp": "Now make it sort in descending order."
+ },
+ "thinking": {
+ "question": "What is the sum of the first 100 prime numbers?"
+ },
+ "systemPrompt": {
+ "systemInstruction": "You are a senior software engineer specializing in distributed systems. Answer questions concisely using industry best practices. Always provide code examples when relevant. Format your responses using markdown.",
+ "question": "How do I implement a circuit breaker pattern?"
+ },
+ "streaming": {
+ "prompt": "Tell me a short story about a robot learning to paint."
+ }
+ },
+ "openaiCompatibleLabel": "OpenAI Compatible",
+ "anthropicCompatibleLabel": "Anthropic Compatible",
"noTemplateForFormat": "No template for this format",
"translationFailed": "Translation failed: {error}",
"pipelineDebugger": "Pipeline Debugger",
@@ -1270,6 +1560,9 @@
"totalRequests": "Total requests",
"noDataYet": "No data yet",
"latency": "Latency",
+ "latencyP50": "p50",
+ "latencyP95": "p95",
+ "latencyP99": "p99",
"promptCache": "Prompt Cache",
"systemHealth": "System Health",
"entries": "Entries",
@@ -1457,7 +1750,30 @@
"enterPassword": "Enter your password to continue",
"password": "Password",
"unifiedProxy": "Unified AI API Proxy",
+ "unifiedAiApiProxy": "Unified AI API Proxy",
+ "unifiedAiApiProxyDesc": "Route requests to multiple AI providers through a single endpoint. Load balancing, failover, and usage tracking built in.",
"passwordNotEnabled": "Password protection is not enabled",
+ "loading": "Loading...",
+ "invalidPassword": "Invalid password",
+ "errorOccurredRetry": "An error occurred. Please try again.",
+ "configureInstance": "Let's get your OmniRoute instance configured",
+ "runOnboardingWizard": "Run the onboarding wizard to set up your password and connect your first AI provider.",
+ "startOnboarding": "Start Onboarding",
+ "secureYourInstance": "Secure Your Instance",
+ "setPasswordDescription": "Set a password to protect your dashboard and secure your API endpoints from unauthorized access.",
+ "configurePassword": "Configure Password",
+ "continue": "Continue",
+ "windowWillClose": "This window will close automatically...",
+ "closeTabNow": "You can close this tab now.",
+ "copyUrlManual": "Please copy the URL from the address bar and paste it in the application.",
+ "accessDeniedDescription": "You don't have permission to access this resource. Check your API key or contact the administrator.",
+ "goToDashboard": "Go to Dashboard",
+ "featureMultiProviderTitle": "Multi-Provider",
+ "featureMultiProviderDesc": "OpenAI, Anthropic, Google, and more",
+ "featureLoadBalancingTitle": "Load Balancing",
+ "featureLoadBalancingDesc": "Distribute requests intelligently",
+ "featureUsageTrackingTitle": "Usage Tracking",
+ "featureUsageTrackingDesc": "Monitor costs and tokens",
"resetPassword": "Reset Password",
"resetDescription": "Choose a method to recover access to your dashboard",
"stopServer": "Stop the OmniRoute server",
@@ -1678,6 +1994,7 @@
"termsMetadataDescription": "Terms of service for the OmniRoute AI API proxy router.",
"backToHome": "Back to home",
"lastUpdated": "Last updated: {date}",
+ "policyLastUpdatedDate": "February 13, 2026",
"listSeparator": "-",
"questionsVisit": "Questions? Visit our",
"githubRepository": "GitHub repository",
diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json
index e7fff896ef..47d4dde010 100644
--- a/src/i18n/messages/pt-BR.json
+++ b/src/i18n/messages/pt-BR.json
@@ -117,13 +117,13 @@
"quickStartDesc": "Comece em 4 passos. Conecte provedores, roteie modelos, monitore tudo.",
"fullDocs": "Docs Completa",
"step1Title": "1. Criar chave de API",
- "step1Desc": "Vá em {endpoint} → Chaves Registradas. Gere uma chave por ambiente.",
+ "step1Desc": "Vá em
Endpoint -> Chaves Registradas. Gere uma chave por ambiente.",
"step2Title": "2. Conectar provedores",
- "step2Desc": "Adicione contas em {providers}. Suporta OAuth, API Key e planos gratuitos.",
+ "step2Desc": "Adicione contas em
Provedores. Suporta OAuth, API Key e planos gratuitos.",
"step3Title": "3. Apontar seu cliente",
"step3Desc": "Defina a URL base como {url} no seu IDE ou cliente de API.",
"step4Title": "4. Monitorar e otimizar",
- "step4Desc": "Acompanhe tokens, custos e erros em {logs} e {analytics}.",
+ "step4Desc": "Acompanhe tokens, custos e erros em
Logs de Requisições e
Análises.",
"providersOverview": "Visão Geral dos Provedores",
"configuredOf": "{configured} configurados de {total} provedores disponíveis",
"noModelsAvailable": "Nenhum modelo disponível para este provedor.",
@@ -137,7 +137,13 @@
"documentation": "Documentação",
"healthMonitor": "Monitor de Saúde",
"reportIssue": "Reportar problema",
- "activeError": "{active} ativo · {errors} erro"
+ "activeError": "{active} ativo · {errors} erro",
+ "oauthLabel": "OAuth",
+ "apiKeyLabel": "Chave de API",
+ "requestsShort": "{count} reqs",
+ "providerModelsTitle": "{provider} - Modelos",
+ "copiedModel": "Copiado: {model}",
+ "aliasLabel": "alias"
},
"analytics": {
"title": "Análises",
@@ -243,6 +249,13 @@
"noEntries": "Nenhum registro de auditoria",
"filterByAction": "Filtrar por ação...",
"filterByActor": "Filtrar por autor...",
+ "filterEntriesAria": "Filtrar entradas do log de auditoria",
+ "filterByActionTypeAria": "Filtrar por tipo de ação",
+ "filterByActorAria": "Filtrar por autor",
+ "refreshAuditLogAria": "Atualizar log de auditoria",
+ "tableAria": "Entradas do log de auditoria",
+ "failedFetchAuditLog": "Falha ao carregar log de auditoria",
+ "notAvailable": "—",
"description": "Ações administrativas e eventos de segurança",
"showing": "Mostrando {count} entradas (offset {offset})",
"previous": "Anterior"
@@ -258,7 +271,199 @@
"instructions": "Instruções",
"modelMapping": "Mapeamento de Modelos",
"baseUrl": "URL Base",
- "apiKey": "Chave de API"
+ "apiKey": "Chave de API",
+ "configured": "Configurado",
+ "notConfigured": "Não configurado",
+ "notInstalled": "Não instalado",
+ "custom": "Customizado",
+ "unknown": "Desconhecido",
+ "lastSavedAt": "Último salvamento: {date}",
+ "never": "Nunca",
+ "justNow": "agora mesmo",
+ "minutesAgoShort": "{count} min atrás",
+ "hoursAgoShort": "{count} h atrás",
+ "daysAgoShort": "{count} d atrás",
+ "monthsAgoShort": "{count} mês(es) atrás",
+ "yearsAgoShort": "{count} ano(s) atrás",
+ "runtimeCheckFailed": "Falha ao verificar runtime",
+ "yourApiKeyPlaceholder": "sua-api-key",
+ "modelPlaceholder": "provedor/modelo-id",
+ "configurationSaved": "Configuração salva com sucesso.",
+ "failedToSave": "Falha ao salvar configuração.",
+ "noApiKeysCreateOne": "Sem chaves de API - crie uma na página Chaves",
+ "defaultOmnirouteKey": "sk_omniroute (padrão)",
+ "selectModel": "Selecionar Modelo",
+ "selectModelForAlias": "Selecionar modelo para {alias}",
+ "selectModelForTool": "Selecionar Modelo para {tool}",
+ "select": "Selecionar",
+ "clear": "Limpar",
+ "comingSoon": "Em breve",
+ "checkingRuntime": "Verificando status de runtime...",
+ "guideOnlyIntegration": "Integração apenas por guia (não requer runtime local)",
+ "cliRuntimeDetected": "Runtime de CLI detectado e pronto",
+ "cliFoundNotRunnable": "CLI encontrado, mas não executável{reason}",
+ "cliRuntimeNotDetected": "Runtime de CLI não detectado",
+ "binary": "Binário",
+ "configPath": "Caminho de config",
+ "configPathShort": "Config",
+ "failedCheckRuntimeStatus": "Falha ao verificar status de runtime.",
+ "copy": "Copiar",
+ "copied": "Copiado",
+ "copyConfig": "Copiar Config",
+ "saveConfig": "Salvar Config",
+ "selectionSaved": "Seleção salva",
+ "guide": "Guia",
+ "detected": "Detectado",
+ "notReady": "Não pronto",
+ "active": "Ativo",
+ "inactive": "Inativo",
+ "startMitm": "Iniciar MITM",
+ "stopMitm": "Parar MITM",
+ "mitmStarted": "MITM iniciado com sucesso!",
+ "mitmStopped": "MITM parado com sucesso!",
+ "failedStart": "Falha ao iniciar MITM",
+ "failedStop": "Falha ao parar MITM",
+ "saveMappings": "Salvar Mapeamentos",
+ "mappingsSaved": "Mapeamentos salvos!",
+ "failedSaveMappings": "Falha ao salvar mapeamentos",
+ "howItWorks": "Como funciona:",
+ "antigravityHowWorksDesc": "O Antigravity envia requisições para o endpoint do Google. O MITM intercepta e redireciona para o OmniRoute.",
+ "antigravityStep1": "1. Inicie o MITM para rotear as requisições pelo OmniRoute.",
+ "antigravityStep2Prefix": "2. Adicione",
+ "antigravityStep2Suffix": "ao arquivo hosts como 127.0.0.1.",
+ "antigravityStep3": "3. Abra o Antigravity e as requisições serão proxyadas.",
+ "sudoPasswordRequiredTitle": "Senha sudo necessária",
+ "sudoPasswordHint": "A senha de administrador é necessária para modificar hosts e configurações de proxy do sistema.",
+ "enterSudoPassword": "Digite a senha sudo",
+ "sudoPasswordRequiredError": "A senha sudo é obrigatória.",
+ "cancel": "Cancelar",
+ "confirm": "Confirmar",
+ "settingsApplied": "Configurações aplicadas com sucesso!",
+ "failedApplySettings": "Falha ao aplicar configurações",
+ "settingsReset": "Configurações resetadas com sucesso!",
+ "failedResetSettings": "Falha ao resetar configurações",
+ "backupRestored": "Backup restaurado!",
+ "failedRestore": "Falha ao restaurar",
+ "checkingCli": "Verificando CLI {tool}...",
+ "cliNotRunnable": "CLI {tool} instalado, mas não executável",
+ "cliNotInstalled": "CLI {tool} não instalado",
+ "cliNotDetected": "CLI {tool} não detectado",
+ "cliDetectedReady": "CLI {tool} detectado e pronto",
+ "cliFoundFailedHealthcheck": "CLI {tool} foi encontrado, mas falhou no healthcheck de runtime{reason}.",
+ "installCliPrompt": "Instale o CLI {tool} para usar este recurso.",
+ "installCodexPrompt": "Instale o Codex CLI para usar a aplicação automática.",
+ "hide": "Ocultar",
+ "howToInstall": "Como instalar",
+ "installationGuide": "Guia de instalação",
+ "platforms": "macOS / Linux / Windows:",
+ "afterInstallationRun": "Após a instalação, execute",
+ "toVerify": "para verificar.",
+ "current": "Atual",
+ "baseUrlPlaceholder": "https://.../v1",
+ "resetToDefault": "Redefinir para padrão",
+ "providerModelPlaceholder": "provedor/modelo-id",
+ "apply": "Aplicar",
+ "reset": "Resetar",
+ "manualConfig": "Configuração manual",
+ "backups": "Backups",
+ "configBackups": "Backups de configuração",
+ "noBackupsYet": "Ainda não há backups. Backups são criados automaticamente antes de cada Aplicar ou Resetar.",
+ "restore": "Restaurar",
+ "backupRestoredReloading": "Backup restaurado! Recarregando status...",
+ "failedRestoreBackup": "Falha ao restaurar backup",
+ "applied": "Aplicado!",
+ "failed": "Falhou",
+ "resetDone": "Resetado!",
+ "omnirouteConfiguredOpenAiCompatible": "OmniRoute está configurado como provedor compatível com OpenAI",
+ "provider": "Provedor",
+ "model": "Modelo",
+ "providers": "Provedores",
+ "auth": "Autenticação",
+ "noApiKeysAvailable": "Nenhuma chave de API disponível",
+ "usingDefaultOmniroute": "Usando padrão: sk_omniroute",
+ "updateConfig": "Atualizar config",
+ "applyConfig": "Aplicar config",
+ "noBackupsAvailable": "Nenhum backup disponível.",
+ "profileSaved": "Perfil \"{name}\" salvo!",
+ "failedSaveProfile": "Falha ao salvar perfil",
+ "profileActivated": "Perfil ativado!",
+ "failedActivateProfile": "Falha ao ativar perfil",
+ "profiles": "Perfis",
+ "savedProfiles": "Perfis salvos",
+ "noProfilesYet": "Nenhum perfil salvo ainda. Salve a configuração atual como perfil abaixo.",
+ "activate": "Ativar",
+ "deleteProfile": "Excluir perfil",
+ "profileNamePlaceholder": "Nome do perfil (ex: Conta Pessoal)",
+ "saveCurrent": "Salvar atual",
+ "codexAuthNotePrefix": "Codex usa",
+ "codexAuthNoteMiddle": "com",
+ "codexAuthNoteSuffix": "Clique em \"Aplicar\" para configurar automaticamente.",
+ "claudeManualConfiguration": "Claude CLI - Configuração manual",
+ "codexManualConfiguration": "Codex CLI - Configuração manual",
+ "droidManualConfiguration": "Factory Droid - Configuração manual",
+ "openClawManualConfiguration": "Open Claw - Configuração manual",
+ "clineManualConfiguration": "Configuração manual do Cline",
+ "kiloManualConfiguration": "Configuração manual do Kilo Code",
+ "toolDescriptions": {
+ "antigravity": "Google Antigravity IDE com MITM",
+ "claude": "CLI Claude Code da Anthropic",
+ "codex": "CLI Codex da OpenAI",
+ "droid": "Assistente de IA Factory Droid",
+ "openclaw": "Assistente de IA Open Claw",
+ "cline": "CLI assistente de codificação Cline",
+ "kilo": "CLI assistente de IA Kilo Code",
+ "cursor": "Editor de código com IA Cursor",
+ "continue": "Assistente de IA Continue"
+ },
+ "guides": {
+ "cursor": {
+ "notes": {
+ "0": "Requer conta Cursor Pro para usar este recurso.",
+ "1": "O Cursor roteia requisições pelo próprio servidor, então endpoint local não é suportado. Ative o Cloud Endpoint em Configurações."
+ },
+ "steps": {
+ "1": {
+ "title": "Abrir Configurações",
+ "desc": "Vá em Configurações -> Modelos"
+ },
+ "2": {
+ "title": "Ativar OpenAI API",
+ "desc": "Ative a opção \"OpenAI API key\""
+ },
+ "3": {
+ "title": "URL Base"
+ },
+ "4": {
+ "title": "Chave de API"
+ },
+ "5": {
+ "title": "Adicionar Modelo Customizado",
+ "desc": "Clique em \"View All Model\" -> \"Add Custom Model\""
+ },
+ "6": {
+ "title": "Selecionar Modelo"
+ }
+ }
+ },
+ "continue": {
+ "steps": {
+ "1": {
+ "title": "Abrir Config",
+ "desc": "Abra o arquivo de configuração do Continue"
+ },
+ "2": {
+ "title": "Chave de API"
+ },
+ "3": {
+ "title": "Selecionar Modelo"
+ },
+ "4": {
+ "title": "Adicionar Config de Modelo",
+ "desc": "Adicione a configuração abaixo ao array de modelos:"
+ }
+ }
+ }
+ }
},
"combos": {
"title": "Combos",
@@ -390,10 +595,23 @@
"disabling": "Desativando...",
"cloudConnectedVerified": "Proxy na Nuvem conectado e verificado!",
"connectedVerificationPending": "Conectado — verificação pendente",
+ "connectedVerificationPendingWithError": "Conectado — verificação pendente: {error}",
"cloudDisabledSuccess": "Nuvem desativada com sucesso",
"syncedSuccess": "Sincronizado com sucesso",
"failedDisable": "Falha ao desativar nuvem",
- "failedEnable": "Falha ao ativar nuvem"
+ "failedEnable": "Falha ao ativar nuvem",
+ "cloudRequestTimeout": "Tempo limite da requisição em nuvem",
+ "cloudRequestFailed": "Falha na requisição em nuvem",
+ "cloudWorkerUnreachable": "Não foi possível alcançar o worker de nuvem. Verifique se o serviço cloud está rodando (npm run dev em /cloud).",
+ "connectionFailed": "Falha na conexão",
+ "syncFailed": "Falha ao sincronizar dados da nuvem",
+ "providerModelsTitle": "{provider} — Modelos",
+ "noModelsForProvider": "Nenhum modelo disponível para este provedor.",
+ "chat": "Chat",
+ "embedding": "Embedding",
+ "image": "Imagem",
+ "custom": "custom",
+ "modelsCount": "{count, plural, one {# modelo} other {# modelos}}"
},
"health": {
"title": "Saúde do Sistema",
@@ -419,7 +637,13 @@
"retry": "Tentar Novamente",
"allOperational": "Todos os sistemas operacionais",
"issuesDetected": "Problemas detectados no sistema",
+ "updatedAt": "Atualizado {time}",
"latency": "Latência",
+ "latencyP50": "p50",
+ "latencyP95": "p95",
+ "latencyP99": "p99",
+ "millisecondsShort": "{value}ms",
+ "notAvailable": "—",
"totalRequests": "Total de requisições",
"noDataYet": "Sem dados ainda",
"promptCache": "Cache de Prompt",
@@ -427,10 +651,18 @@
"hitRate": "Taxa de Acerto",
"hitsMisses": "Acertos / Erros",
"signatureCache": "Cache de Assinatura",
+ "signatureDefaults": "Padrões",
+ "signatureTool": "Ferramenta",
+ "signatureFamily": "Família",
+ "signatureSession": "Sessão",
"recovering": "Recuperando",
"noCBData": "Nenhum dado de circuit breaker disponível. Faça algumas requisições primeiro.",
+ "providerHealthStatusAria": "Status de saúde dos provedores",
"issuesLabel": "Problemas Detectados",
"operational": "Operacional",
+ "providers": "Provedores",
+ "healthyCount": "{count} saudáveis",
+ "nodeVersion": "Node {version}",
"failures": "{count} falha",
"failuresPlural": "{count} falhas",
"lastFailure": "Última",
@@ -438,9 +670,13 @@
"activeLimiters": "{count} limitador ativo",
"activeLimitersPlural": "{count} limitadores ativos",
"queued": "Na Fila",
+ "queuedCount": "{count} na fila",
"running": "executando",
+ "runningCount": "{count} executando",
+ "ok": "OK",
"activeLockouts": "Bloqueios Ativos",
"resetConfirm": "Resetar todos os circuit breakers para estado saudável? Isso limpará todos os contadores de falha e restaurará todos os provedores ao status operacional.",
+ "resetAllTitle": "Resetar todos os circuit breakers para estado saudável",
"resetting": "Resetando...",
"resetAll": "Resetar Tudo",
"until": "Até {time}"
@@ -464,12 +700,21 @@
"refresh": "Atualizar",
"filterByAction": "Filtrar por ação...",
"filterByActor": "Filtrar por ator...",
+ "filterEntriesAria": "Filtrar entradas do log de auditoria",
+ "filterByActionTypeAria": "Filtrar por tipo de ação",
+ "filterByActorAria": "Filtrar por ator",
+ "refreshAuditLogAria": "Atualizar log de auditoria",
+ "tableAria": "Entradas do log de auditoria",
+ "failedFetchAuditLog": "Falha ao carregar log de auditoria",
+ "showing": "Mostrando {count} entradas (offset {offset})",
"search": "Buscar",
"timestamp": "Data/Hora",
"action": "Ação",
"actor": "Ator",
"target": "Alvo",
"details": "Detalhes",
+ "ipAddress": "Endereço IP",
+ "notAvailable": "—",
"noEntries": "Nenhuma entrada de log de auditoria encontrada",
"previous": "Anterior",
"next": "Próximo"
@@ -1206,6 +1451,51 @@
"scenarioThinking": "Raciocínio",
"scenarioSystemPrompt": "Prompt de Sistema",
"scenarioStreaming": "Streaming",
+ "templateNames": {
+ "simple-chat": "Chat Simples",
+ "tool-calling": "Chamada de Ferramenta",
+ "multi-turn": "Multiturno",
+ "thinking": "Raciocínio",
+ "system-prompt": "Prompt de Sistema",
+ "streaming": "Streaming"
+ },
+ "templateDescriptions": {
+ "simple-chat": "Mensagem de texto básica",
+ "tool-calling": "Invocação de função/ferramenta",
+ "multi-turn": "Conversa com histórico",
+ "thinking": "Raciocínio estendido",
+ "system-prompt": "Instruções de sistema complexas",
+ "streaming": "Requisição de streaming SSE"
+ },
+ "templatePayloads": {
+ "simpleChat": {
+ "system": "Você é um assistente prestativo.",
+ "userGreeting": "Olá! Como você está hoje?"
+ },
+ "toolCalling": {
+ "userWeather": "Como está o tempo em São Paulo?",
+ "toolDescription": "Obtém o clima atual para uma localidade",
+ "cityNameDescription": "Nome da cidade"
+ },
+ "multiTurn": {
+ "system": "Você é um assistente de programação.",
+ "userInitial": "Escreva uma função para ordenar um array em Python.",
+ "assistantExample": "Aqui está uma função simples de ordenação:\n\n```python\ndef sort_array(arr):\n return sorted(arr)\n```",
+ "userFollowUp": "Agora faça para ordenar em ordem decrescente."
+ },
+ "thinking": {
+ "question": "Qual é a soma dos 100 primeiros números primos?"
+ },
+ "systemPrompt": {
+ "systemInstruction": "Você é um engenheiro de software sênior especializado em sistemas distribuídos. Responda de forma concisa usando boas práticas de mercado. Sempre forneça exemplos de código quando relevante. Formate suas respostas usando markdown.",
+ "question": "Como implemento o padrão circuit breaker?"
+ },
+ "streaming": {
+ "prompt": "Conte uma história curta sobre um robô aprendendo a pintar."
+ }
+ },
+ "openaiCompatibleLabel": "Compatível com OpenAI",
+ "anthropicCompatibleLabel": "Compatível com Anthropic",
"noTemplateForFormat": "Sem modelo para este formato",
"translationFailed": "Falha na tradução: {error}",
"pipelineDebugger": "Depurador de Pipeline",
@@ -1270,6 +1560,9 @@
"totalRequests": "Total de requisições",
"noDataYet": "Sem dados ainda",
"latency": "Latência",
+ "latencyP50": "p50",
+ "latencyP95": "p95",
+ "latencyP99": "p99",
"promptCache": "Cache de Prompt",
"systemHealth": "Saúde do Sistema",
"entries": "Entradas",
@@ -1457,7 +1750,30 @@
"enterPassword": "Digite sua senha para continuar",
"password": "Senha",
"unifiedProxy": "Proxy Unificado de API de IA",
+ "unifiedAiApiProxy": "Proxy Unificado de API de IA",
+ "unifiedAiApiProxyDesc": "Roteie requisições para múltiplos provedores de IA por um único endpoint. Balanceamento de carga, failover e rastreamento de uso integrados.",
"passwordNotEnabled": "Proteção por senha não está ativada",
+ "loading": "Carregando...",
+ "invalidPassword": "Senha inválida",
+ "errorOccurredRetry": "Ocorreu um erro. Tente novamente.",
+ "configureInstance": "Vamos configurar sua instância OmniRoute",
+ "runOnboardingWizard": "Execute o assistente de onboarding para definir sua senha e conectar seu primeiro provedor de IA.",
+ "startOnboarding": "Iniciar Onboarding",
+ "secureYourInstance": "Proteja sua Instância",
+ "setPasswordDescription": "Defina uma senha para proteger seu painel e garantir que seus endpoints de API não sejam acessados sem autorização.",
+ "configurePassword": "Configurar Senha",
+ "continue": "Continuar",
+ "windowWillClose": "Esta janela será fechada automaticamente...",
+ "closeTabNow": "Você já pode fechar esta aba.",
+ "copyUrlManual": "Copie a URL da barra de endereços e cole no aplicativo.",
+ "accessDeniedDescription": "Você não tem permissão para acessar este recurso. Verifique sua chave de API ou contate o administrador.",
+ "goToDashboard": "Ir para o Painel",
+ "featureMultiProviderTitle": "Multi-Provedor",
+ "featureMultiProviderDesc": "OpenAI, Anthropic, Google e outros",
+ "featureLoadBalancingTitle": "Balanceamento de Carga",
+ "featureLoadBalancingDesc": "Distribua requisições de forma inteligente",
+ "featureUsageTrackingTitle": "Rastreamento de Uso",
+ "featureUsageTrackingDesc": "Monitore custos e tokens",
"resetPassword": "Redefinir Senha",
"resetDescription": "Escolha um método para recuperar acesso ao painel",
"stopServer": "Pare o servidor OmniRoute",
@@ -1678,6 +1994,7 @@
"termsMetadataDescription": "Termos de serviço do roteador proxy de API de IA OmniRoute.",
"backToHome": "Voltar para a home",
"lastUpdated": "Última atualização: {date}",
+ "policyLastUpdatedDate": "13 de fevereiro de 2026",
"listSeparator": "-",
"questionsVisit": "Dúvidas? Visite nosso",
"githubRepository": "repositório no GitHub",