From 744a5606e4f174538c23544efc59b5bf2ace723a Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sun, 26 Apr 2026 11:43:51 -0300 Subject: [PATCH] feat(i18n): expand locale coverage with nine new language packs Add Bengali, Persian, Gujarati, Indonesian alt, Marathi, Swahili, Tamil, Telugu, and Urdu message bundles to the app's locale configuration. Extend RTL locale support for Persian and Urdu and update project docs to reflect the broader 40+ language availability. --- AGENTS.md | 2 +- README.md | 8 +- llm.txt | 8 +- src/i18n/config.ts | 24 +- src/i18n/messages/bn.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/fa.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/gu.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/in.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/mr.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/sw.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/ta.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/te.json | 4710 +++++++++++++++++++++++++++++++++++++ src/i18n/messages/ur.json | 4710 +++++++++++++++++++++++++++++++++++++ 13 files changed, 42420 insertions(+), 12 deletions(-) create mode 100644 src/i18n/messages/bn.json create mode 100644 src/i18n/messages/fa.json create mode 100644 src/i18n/messages/gu.json create mode 100644 src/i18n/messages/in.json create mode 100644 src/i18n/messages/mr.json create mode 100644 src/i18n/messages/sw.json create mode 100644 src/i18n/messages/ta.json create mode 100644 src/i18n/messages/te.json create mode 100644 src/i18n/messages/ur.json diff --git a/AGENTS.md b/AGENTS.md index 2c21baf7ec..77c697f3b3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,7 +15,7 @@ with **MCP Server** (29 tools), **A2A v0.3 Protocol**, and **Electron desktop ap - **Database**: better-sqlite3 (SQLite) — `DATA_DIR` configurable, default `~/.omniroute/` - **Streaming**: SSE via `open-sse` internal workspace package - **Styling**: Tailwind CSS v4 -- **i18n**: next-intl with 30 languages +- **i18n**: next-intl with 40+ languages - **Desktop**: Electron (cross-platform: Windows, macOS, Linux) - **Schemas**: Zod v4 for all API / MCP input validation diff --git a/README.md b/README.md index 0733888979..1b7e440391 100644 --- a/README.md +++ b/README.md @@ -420,9 +420,9 @@ Teams in non-English-speaking countries, especially in Latin America, Asia, and **How OmniRoute solves it:** -- **Dashboard i18n — 30 Languages** — All 500+ keys translated including Arabic, Bulgarian, Danish, German, Spanish, Finnish, French, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Malay, Dutch, Norwegian, Polish, Portuguese (PT/BR), Romanian, Russian, Slovak, Swedish, Thai, Ukrainian, Vietnamese, Chinese, Filipino, English -- **RTL Support** — Right-to-left support for Arabic and Hebrew -- **Multi-Language READMEs** — 30 complete documentation translations +- **Dashboard i18n — 40+ Languages** — All 500+ keys translated including Arabic, Bengali, Bulgarian, Czech, Danish, German, Spanish, Persian, Finnish, French, Gujarati, Hebrew, Hindi, Hungarian, Indonesian, Italian, Japanese, Korean, Marathi, Malay, Dutch, Norwegian, Polish, Portuguese (PT/BR), Romanian, Russian, Slovak, Swedish, Swahili, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Vietnamese, Chinese, Filipino, English +- **RTL Support** — Right-to-left support for Arabic, Persian, Hebrew, and Urdu +- **Multi-Language READMEs** — 40+ complete documentation translations - **Language Selector** — Globe icon in header for real-time switching @@ -1511,7 +1511,7 @@ OmniRoute v3.6 is built as an operational platform, not just a relay proxy. | 🔧 **CLI Tools Dashboard** | One-click setup for popular coding tools | | 🎮 **Model Playground** | Test any provider/model/endpoint from the dashboard | | 🔏 **CLI Fingerprint Toggle** | Per-provider fingerprint matching in Settings > Security | -| 🌐 **i18n (30 languages)** | Full dashboard + docs language support with RTL coverage | +| 🌐 **i18n (40+ languages)** | Full dashboard + docs language support with RTL coverage | | 🧹 **Clear All Models** | One-click model list clearing in provider details | | 👁️ **Sidebar Controls** 🆕 | Hide components and integrations from Appearance Settings | | 📋 **Issue Templates** | Standardized GitHub templates for bugs and features | diff --git a/llm.txt b/llm.txt index d7f874c5f4..af50c62ffa 100644 --- a/llm.txt +++ b/llm.txt @@ -22,7 +22,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo - **Background jobs:** Custom token health check scheduler, 24h model auto-sync - **Streaming:** Server-Sent Events (SSE) for real-time proxy responses - **Proxy engine:** Custom pipeline with format translation, circuit breaker, rate limiting, auto-combo engine -- **i18n:** next-intl with 30 languages +- **i18n:** next-intl with 40+ languages - **Desktop:** Electron (cross-platform: Windows, macOS, Linux) - **Package:** Published on npm (`omniroute`) and Docker Hub (`diegosouzapw/omniroute`) @@ -94,7 +94,7 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo │ │ ├── configAudit.ts # Configuration auditing │ │ └── responses.ts # Domain response types │ ├── i18n/ # Internationalization -│ │ └── messages/ # 30 language JSON files +│ │ └── messages/ # 40+ language JSON files │ ├── lib/ # Core libraries │ │ ├── a2a/ # Agent-to-Agent v0.3 protocol server │ │ │ ├── skills/ # A2A skills (quotaManagement, smartRouting) @@ -370,8 +370,8 @@ OmniRoute solves the problem of managing multiple AI provider subscriptions, quo **Custom Providers:** OpenAI-compatible (`openai-compatible-*`) and Anthropic-compatible (`anthropic-compatible-*`) with custom base URLs ### Internationalization -- 30 languages for UI (all dashboard pages) -- 30 translated documentation sets in docs/i18n/ +- 40+ languages for UI (all dashboard pages) +- 40 translated documentation sets in docs/i18n/ - Language switcher in documentation ## Key Architectural Decisions diff --git a/src/i18n/config.ts b/src/i18n/config.ts index b71bdf9db3..0a180c714d 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,20 +1,25 @@ export const LOCALES = [ "ar", "bg", + "bn", "cs", "da", "de", "en", "es", + "fa", "fi", "fr", + "gu", "he", + "hi", "hu", "id", - "hi", + "in", "it", "ja", "ko", + "mr", "ms", "nl", "no", @@ -26,9 +31,13 @@ export const LOCALES = [ "ru", "sk", "sv", + "sw", + "ta", + "te", "th", "tr", "uk-UA", + "ur", "vi", "zh-CN", ] as const; @@ -43,20 +52,25 @@ export const LANGUAGES: readonly { }[] = [ { code: "ar", label: "AR", name: "العربية", flag: "🇸🇦" }, { code: "bg", label: "BG", name: "Български", flag: "🇧🇬" }, + { code: "bn", label: "BN", name: "বাংলা", flag: "🇧🇩" }, { code: "cs", label: "CS", name: "Čeština", flag: "🇨🇿" }, { code: "da", label: "DA", name: "Dansk", flag: "🇩🇰" }, { code: "de", label: "DE", name: "Deutsch", flag: "🇩🇪" }, { code: "en", label: "EN", name: "English", flag: "🇺🇸" }, { code: "es", label: "ES", name: "Español", flag: "🇪🇸" }, + { code: "fa", label: "FA", name: "فارسی", flag: "🇮🇷" }, { code: "fi", label: "FI", name: "Suomi", flag: "🇫🇮" }, { code: "fr", label: "FR", name: "Français", flag: "🇫🇷" }, + { code: "gu", label: "GU", name: "ગુજરાતી", flag: "🇮🇳" }, { code: "he", label: "HE", name: "עברית", flag: "🇮🇱" }, + { code: "hi", label: "HI", name: "हिन्दी", flag: "🇮🇳" }, { code: "hu", label: "HU", name: "Magyar", flag: "🇭🇺" }, { code: "id", label: "ID", name: "Bahasa Indonesia", flag: "🇮🇩" }, - { code: "hi", label: "HI", name: "हिन्दी", flag: "🇮🇳" }, + { code: "in", label: "IN", name: "Bahasa Indonesia (Alt)", flag: "🇮🇩" }, { code: "it", label: "IT", name: "Italiano", flag: "🇮🇹" }, { code: "ja", label: "JA", name: "日本語", flag: "🇯🇵" }, { code: "ko", label: "KO", name: "한국어", flag: "🇰🇷" }, + { code: "mr", label: "MR", name: "मराठी", flag: "🇮🇳" }, { code: "ms", label: "MS", name: "Bahasa Melayu", flag: "🇲🇾" }, { code: "nl", label: "NL", name: "Nederlands", flag: "🇳🇱" }, { code: "no", label: "NO", name: "Norsk", flag: "🇳🇴" }, @@ -68,13 +82,17 @@ export const LANGUAGES: readonly { { code: "ru", label: "RU", name: "Русский", flag: "🇷🇺" }, { code: "sk", label: "SK", name: "Slovenčina", flag: "🇸🇰" }, { code: "sv", label: "SV", name: "Svenska", flag: "🇸🇪" }, + { code: "sw", label: "SW", name: "Kiswahili", flag: "🇰🇪" }, + { code: "ta", label: "TA", name: "தமிழ்", flag: "🇮🇳" }, + { code: "te", label: "TE", name: "తెలుగు", flag: "🇮🇳" }, { code: "th", label: "TH", name: "ไทย", flag: "🇹🇭" }, { code: "tr", label: "TR", name: "Türkçe", flag: "🇹🇷" }, { code: "uk-UA", label: "UK-UA", name: "Українська", flag: "🇺🇦" }, + { code: "ur", label: "UR", name: "اردو", flag: "🇵🇰" }, { code: "vi", label: "VI", name: "Tiếng Việt", flag: "🇻🇳" }, { code: "zh-CN", label: "ZH-CN", name: "中文 (简体)", flag: "🇨🇳" }, ] as const; -export const RTL_LOCALES = ["ar", "he"] as const; +export const RTL_LOCALES = ["ar", "fa", "he", "ur"] as const; export const LOCALE_COOKIE = "NEXT_LOCALE"; diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/bn.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/fa.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/gu.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/in.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/mr.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/sw.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/ta.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/te.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +} diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json new file mode 100644 index 0000000000..438b59b055 --- /dev/null +++ b/src/i18n/messages/ur.json @@ -0,0 +1,4710 @@ +{ + "common": { + "save": "Save", + "cancel": "Cancel", + "delete": "Delete", + "loading": "Loading...", + "error": "An error occurred", + "success": "Success", + "confirm": "Are you sure?", + "refresh": "Refresh", + "close": "Close", + "add": "Add", + "edit": "Edit", + "search": "Search", + "back": "Back", + "next": "Next", + "submit": "Submit", + "reset": "Reset", + "copy": "Copy", + "copied": "Copied!", + "enabled": "Enabled", + "disabled": "Disabled", + "active": "Active", + "inactive": "Inactive", + "noData": "No data available", + "nothingHere": "Nothing here yet", + "configure": "Configure", + "manage": "Manage", + "name": "Name", + "actions": "Actions", + "status": "Status", + "type": "Type", + "model": "Model", + "models": "models", + "provider": "Provider", + "account": "Account", + "time": "Time", + "details": "Details", + "created": "Created", + "lastUsed": "Last Refreshed", + "loadMore": "Load More", + "noResults": "No results found", + "reloadPage": "Reload Page", + "connected": "Connected", + "disconnected": "Disconnected", + "notConfigured": "Not configured", + "testConnection": "Test Connection", + "enable": "Enable", + "disable": "Disable", + "columns": "Columns", + "newest": "Newest", + "oldest": "Oldest", + "all": "All", + "none": "None", + "yes": "Yes", + "no": "No", + "warning": "Warning", + "note": "Note", + "free": "Free", + "skipToContent": "Skip to content", + "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", + "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", + "accept": "Accept", + "accountId": "Account ID", + "alias": "Alias", + "apiKeyId": "API Key ID", + "apiKeyName": "API Key Name", + "apiKeySecret": "API Key Secret", + "authorization": "Authorization", + "content-type": "Content Type", + "content-length": "Content Length", + "cookie": "Cookie", + "file": "File", + "host": "Host", + "id": "ID", + "import": "Import", + "limit": "Limit", + "offset": "Offset", + "open": "Open", + "origin": "Origin", + "promptTokens": "Prompt Tokens", + "completionTokens": "Completion Tokens", + "totalTokens": "Total Tokens", + "rawModel": "Raw Model", + "scope": "Scope", + "skill": "Skill", + "sortBy": "Sort By", + "sortOrder": "Sort Order", + "tab": "Tab", + "text": "Text", + "textarea": "Textarea", + "tool": "Tool", + "toolId": "Tool ID", + "web": "Web", + "whereUsed": "Where Used", + "whitelist": "Whitelist", + "blacklist": "Blacklist", + "resolve": "Resolve", + "force": "Force", + "base64url": "Base64 URL", + "hex": "Hex", + "range": "Range", + "component": "Component", + "redirect_uri": "Redirect URI", + "idempotency-key": "Idempotency Key", + "error_description": "Error Description", + "code": "Code", + "compatible": "Compatible", + "chat-completions": "Chat Completions", + "oauth": "OAuth", + "auth_token": "Auth Token", + "crypto": "Crypto", + "hours": "Hours", + "selfsigned": "Self-signed", + "proxy_id": "Proxy ID", + "proxyId": "Proxy ID", + "connectionId": "Connection ID", + "resolveConnectionId": "Resolve Connection ID", + "resolve_connection_id": "Resolve Connection ID", + "scope_id": "Scope ID", + "scopeId": "Scope ID", + "jwtSecret": "JWT Secret", + "keytar": "Keytar", + "better-sqlite3": "better-sqlite3", + "undici": "undici", + "builder-id": "Builder ID", + "musicDesc": "Music Description", + "musicGeneration": "Music Generation", + "idc": "IDC", + "cloud-status-changed": "Cloud status changed", + "where_used": "Where Used", + "windowMs": "Window (ms)", + "social-github": "GitHub", + "social-google": "Google", + "TOOL_ALLOWLIST": "Tool Allowlist", + "TOOL_DENYLIST": "Tool Denylist", + "Failed to save pricing": "Failed to save pricing", + "Failed to reset pricing": "Failed to reset pricing", + "apikey": "API Key", + "http": "HTTP", + "goToDashboard": "Go to Dashboard", + "checkSystemStatus": "Check System Status", + "selectModel": "Select Model", + "combos": "Combos", + "noModelsFound": "No models found", + "clear": "Clear", + "done": "Done", + "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", + "minutesAgo": "Minutes Ago", + "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", + "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", + "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", + "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", + "compatibleLabel": "Compatible Label", + "cloudDisabledSuccess": "Cloud Disabled Success", + "deleteConfirm": "Delete Confirm", + "check": "Check", + "safeSearch": "Safe Search", + "protocolLastActivity": "Protocol Last Activity", + "openMcpDashboard": "Open Mcp Dashboard", + "testBenchTab": "Test Bench", + "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", + "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", + "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", + "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", + "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", + "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", + "chatTesterTab": "Chat Tester", + "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", + "anthropic": "Anthropic", + "syncingData": "Syncing Data", + "cloudBenefitPorts": "Cloud Benefit Ports", + "compatibleProviders": "Compatible Providers", + "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", + "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" + }, + "sidebar": { + "home": "Home", + "dashboard": "Dashboard", + "providers": "Providers", + "combos": "Combos", + "usage": "Usage", + "analytics": "Analytics", + "costs": "Costs", + "health": "Health", + "limits": "Limits & Quotas", + "cliTools": "CLI Tools", + "media": "Media", + "settings": "Settings", + "translator": "Translator", + "playground": "Playground", + "searchTools": "Search Tools", + "agents": "Agents", + "memory": "Memory", + "skills": "Skills", + "docs": "Docs", + "issues": "Issues", + "endpoints": "Endpoints", + "apiManager": "API Manager", + "logs": "Logs", + "auditLog": "Audit Log", + "shutdown": "Shutdown", + "restart": "Restart", + "shutdownConfirm": "Shut down OmniRoute?", + "restartConfirm": "Restart OmniRoute?", + "version": "v{version}", + "debug": "Debug", + "system": "System", + "help": "Help", + "primarySection": "Main", + "cliSection": "CLI", + "debugSection": "Debug", + "systemSection": "System", + "helpSection": "Help", + "serverDisconnected": "Server Disconnected", + "serverDisconnectedMsg": "The proxy server has been stopped or is restarting.", + "expandSidebar": "Expand sidebar", + "collapseSidebar": "Collapse sidebar", + "themes": "Themes", + "presetColors": "Popular colors", + "createTheme": "Create theme", + "chooseColor": "Pick one color", + "themeCoral": "Coral", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "cliToolsShort": "Tools", + "cache": "Cache", + "cacheShort": "Cache", + "batch": "Batch Testing", + "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" + }, + "themesPage": { + "title": "Themes", + "description": "Choose a preset theme or create your own with a single color", + "presetColors": "Popular colors", + "customTheme": "Custom theme", + "customThemeDesc": "Click create theme and pick one color", + "createTheme": "Create theme", + "activePreset": "Active theme" + }, + "header": { + "logout": "Logout", + "language": "Language", + "providers": "Providers", + "providerDescription": "Manage your AI provider connections", + "combos": "Combos", + "comboDescription": "Model combos with fallback", + "usage": "Usage & Analytics", + "usageDescription": "Monitor your API usage, token consumption, and request logs", + "analytics": "Analytics", + "analyticsDescription": "Charts, trends, and evaluation insights", + "cliTools": "CLI Tools", + "cliToolsDescription": "Configure CLI tools", + "home": "Home", + "homeDescription": "Welcome to OmniRoute", + "endpoint": "Endpoints", + "endpointDescription": "Manage proxy endpoints, MCP, A2A, and API endpoints", + "mcp": "MCP", + "mcpDescription": "Model Context Protocol server management and tools", + "a2a": "A2A", + "a2aDescription": "Agent-to-Agent protocol tasks and observability", + "settings": "Settings", + "settingsDescription": "Manage your preferences", + "openaiCompatible": "OpenAI Compatible", + "anthropicCompatible": "Anthropic Compatible", + "media": "Media", + "mediaDescription": "Generate images, videos, and music", + "themes": "Themes", + "themesDescription": "Choose a color theme for the whole dashboard panel" + }, + "home": { + "quickStart": "Quick Start", + "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.", + "step2Title": "2. Connect providers", + "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 Request Logs and Analytics.", + "providersOverview": "Providers Overview", + "configuredOf": "{configured} configured of {total} available providers", + "noModelsAvailable": "No models available for this provider.", + "configureFirst": "Configure a connection first in {providers}", + "configureProvider": "Configure Provider", + "modelAvailable": "{count} model available", + "modelsAvailable": "{count} models available", + "connectionsActive": "{count} connection active", + "connectionsActivePlural": "{count} connections active", + "copyModelName": "Copy model name", + "documentation": "Documentation", + "healthMonitor": "Health Monitor", + "reportIssue": "Report issue", + "activeError": "{active} active · {errors} error", + "oauthLabel": "OAuth", + "apiKeyLabel": "API Key", + "requestsShort": "{count} reqs", + "providerModelsTitle": "{provider} - Models", + "copiedModel": "Copied: {model}", + "aliasLabel": "alias", + "updateNow": "Update Now", + "updating": "Updating...", + "updateAvailableDesc": "A new version is available. Click to update.", + "updateStarted": "Update started..." + }, + "analytics": { + "title": "Analytics", + "overviewDescription": "Monitor your API usage patterns, token consumption, costs, and activity trends across all providers and models.", + "evalsDescription": "Run evaluation suites to test and validate your LLM endpoints. Compare model quality, detect regressions, and benchmark latency.", + "overview": "Overview", + "evals": "Evals", + "utilization": "Utilization", + "utilizationDescription": "Provider quota usage trends and rate limit tracking", + "modelStatus": "Model Status", + "modelStatusCooldown": "Cooldown", + "modelStatusUnavailable": "Unavailable", + "modelStatusError": "Error", + "comboHealth": "Combo Health", + "comboHealthDescription": "Combo-level quota, usage distribution, and performance metrics" + }, + "apiManager": { + "title": "API Keys", + "createKey": "Create API Key", + "key": "Key", + "revokeKey": "Revoke Key", + "revokeConfirm": "Are you sure you want to revoke this API key?", + "noKeys": "No API keys yet", + "noKeysDesc": "Create your first API key to authenticate requests to your endpoint", + "keyLabel": "Key Label", + "permissions": "Permissions", + "expiresAt": "Expires", + "never": "Never", + "revoke": "Revoke", + "showKey": "Show Key", + "hideKey": "Hide Key", + "copyKey": "Copy API Key", + "allModels": "All models", + "selectedModels": "Selected Models", + "readOnly": "Read Only", + "fullAccess": "Full Access", + "keyManagement": "API Key Management", + "keyManagementDesc": "Create and manage API keys for authenticating requests to your endpoint", + "totalKeys": "Total Keys", + "restricted": "Restricted", + "totalRequests": "Total Requests", + "modelsAvailable": "Models Available", + "registeredKeys": "Registered Keys", + "keysRegistered": "{count} keys registered", + "keyRegistered": "{count} key registered", + "keysSecurityNote": "Each key isolates usage tracking and can be revoked independently. Keys are masked after creation for security.", + "createFirstKey": "Create Your First Key", + "name": "Name", + "usage": "Usage", + "created": "Created", + "actions": "Actions", + "reqs": "reqs", + "neverUsed": "Never used", + "deleteConfirm": "Delete this API key?", + "usageTips": "Usage Tips", + "tipAuth": "Use API keys in the Authorization header as Bearer YOUR_KEY", + "tipSecure": "Keys are only shown once during creation — store them securely", + "tipSeparate": "Create separate keys for different clients or environments", + "tipRestrict": "Restrict keys to specific models for better security and cost control", + "keyName": "Key Name", + "keyNamePlaceholder": "e.g., Production Key, Development Key", + "keyNameDesc": "Choose a descriptive name to identify this key's purpose", + "keyCreated": "API Key Created", + "keyCreatedSuccess": "Key created successfully!", + "keyCreatedNote": "Copy and store this key now — it won't be shown again.", + "done": "Done", + "savePermissions": "Save Permissions", + "autoResolve": "Auto-Resolve", + "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", + "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", + "allowAll": "Allow All", + "restrict": "Restrict", + "allowAllInfo": "This key can access all available models.", + "restrictInfo": "This key can access {selected} of {total} models.", + "selected": "{count} selected", + "all": "All", + "clear": "Clear", + "searchModels": "Search models by name or provider...", + "noModelsFound": "No models found", + "keyNameRequired": "Key name is required", + "keyNameTooLong": "Key name must be {max} characters or less", + "keyNameInvalid": "Key name can only contain letters, numbers, spaces, hyphens, and underscores", + "invalidKeyName": "Invalid key name", + "failedCreateKey": "Failed to create key", + "failedCreateKeyRetry": "Failed to create key. Please try again.", + "invalidKeyId": "Invalid key ID", + "failedDeleteKey": "Failed to delete key", + "failedDeleteKeyRetry": "Failed to delete key. Please try again.", + "invalidModelsSelection": "Invalid models selection", + "cannotSelectMoreThanModels": "Cannot select more than {max} models", + "failedUpdatePermissions": "Failed to update permissions", + "failedUpdatePermissionsRetry": "Failed to update permissions. Please try again.", + "unknownProvider": "unknown", + "copyMaskedKey": "Copy masked key", + "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "lastUsedOn": "Last: {date}", + "editPermissions": "Edit permissions", + "deleteKey": "Delete key", + "model": "{count} model", + "models": "{count} models", + "permissionsTitle": "Permissions: {name}", + "allowAllDesc": "This key can access all available models.", + "restrictDesc": "This key can access {selectedCount} of {totalModels} models.", + "selectedCount": "{count} selected" + }, + "auditLog": { + "title": "Audit Log", + "searchPlaceholder": "Search actions...", + "action": "Action", + "actor": "Actor", + "target": "Target", + "ipAddress": "IP Address", + "timestamp": "Timestamp", + "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" + }, + "media": { + "title": "Media Playground", + "subtitle": "Generate images, videos, and music", + "model": "Model", + "prompt": "Prompt", + "generate": "Generate", + "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." + }, + "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)", + "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", + "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" + }, + "cliTools": { + "title": "CLI Tools", + "noActiveProviders": "No active providers", + "noActiveProvidersDesc": "Please add and connect providers first to configure CLI tools.", + "mapModels": "Map Models", + "testConnection": "Test Connection", + "connectionStatus": "Connection Status", + "configureEndpoint": "Configure Endpoint", + "instructions": "Instructions", + "modelMapping": "Model Mapping", + "baseUrl": "Base URL", + "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.", + "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.", + "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", + "whenToUseLabel": "When to use", + "openToolDocs": "Open tool docs", + "toolUseCases": { + "claude": "Use when you want strong planning workflows and long multi-file refactors with Claude Code.", + "codex": "Use when your team is standardized on OpenAI Codex CLI flows and profile-based auth.", + "droid": "Use when you need a lightweight terminal agent focused on fast coding and command execution loops.", + "openclaw": "Use when you want an Open Claw style coding agent but routed through OmniRoute policies.", + "cline": "Use when you configure coding agents inside editors and want guided setup with OmniRoute models.", + "kilo": "Use when your workflow depends on Kilo Code commands and fast iterative edits.", + "cursor": "Use when coding in Cursor and you need custom OpenAI-compatible models through OmniRoute.", + "continue": "Use when running Continue in IDEs and you need portable JSON-based provider configuration.", + "opencode": "Use when you prefer terminal-native agent runs and scripted automation via OpenCode.", + "kiro": "Use when integrating Kiro and controlling model routing centrally from OmniRoute.", + "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", + "antigravity": "Use when Antigravity/Kiro traffic must be intercepted through MITM and routed to OmniRoute.", + "copilot": "Use when you want Copilot chat style UX while enforcing OmniRoute keys and routing rules.", + "amp": "Use when you want Amp shorthand workflows but still need OmniRoute alias and routing rules enforcement.", + "qwen": "Use when you need Alibaba Qwen Code CLI for coding tasks.", + "hermes": "Use when you need a lightweight terminal-native AI assistant for quick tasks.", + "custom": "Use for custom tool implementations or generic OpenAI-compatible configurations." + }, + "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", + "opencode": "OpenCode AI coding agent (Terminal)", + "kiro": "Amazon Kiro — AI-powered IDE", + "windsurf": "Windsurf AI Code Editor", + "copilot": "GitHub Copilot AI Assistant", + "qwen": "Alibaba Qwen Code CLI", + "amp": "Sourcegraph Amp coding assistant CLI", + "hermes": "Hermes AI Terminal Assistant", + "custom": "Generic OpenAI-compatible CLI or SDK configuration generator" + }, + "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:" + } + }, + "notes": { + "0": "Continue uses JSON config file." + } + }, + "opencode": { + "steps": { + "1": { + "title": "Install OpenCode", + "desc": "Install via npm: npm install -g opencode-ai" + }, + "2": { + "title": "API Key" + }, + "3": { + "title": "Set Base URL", + "desc": "opencode config set baseUrl {{baseUrl}}" + }, + "4": { + "title": "Select Model" + }, + "5": { + "title": "Use Thinking Variant", + "desc": "For thinking models, run with --variant high/low/max (example command below)." + } + }, + "notes": { + "0": "OpenCode requires API key configuration.", + "1": "Set the base URL to your OmniRoute endpoint." + } + }, + "kiro": { + "steps": { + "1": { + "title": "Open Kiro Settings", + "desc": "Go to Settings → AI Provider" + }, + "2": { + "title": "Base URL", + "desc": "Paste your OmniRoute endpoint URL" + }, + "3": { + "title": "API Key" + }, + "4": { + "title": "Select Model" + } + }, + "notes": { + "0": "Kiro requires Amazon account." + } + }, + "windsurf": { + "steps": { + "1": { + "title": "Open AI Settings", + "desc": "Click the AI Settings icon in Windsurf or go to Settings" + }, + "2": { + "title": "Add Custom Provider", + "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + }, + "3": { + "title": "Base URL", + "desc": "http://127.0.0.1:20128/v1" + }, + "4": { + "title": "API Key", + "desc": "Select your OmniRoute API key" + }, + "5": { + "title": "Select Model", + "desc": "Choose a model from the dropdown" + } + } + } + }, + "autoConfiguredTab": "Auto-Configured", + "toolCategoriesDesc": "Configure AI coding assistants to route through OmniRoute", + "allToolsTab": "All Tools", + "guidedClientsTab": "Guided Clients", + "mitmClientsTab": "MITM Clients", + "toolCategories": "Tool Categories", + "visibleToolsCount": "{count} tools available" + }, + "combos": { + "title": "Combos", + "description": "Create model combos with weighted routing and fallback support", + "createCombo": "Create Combo", + "editCombo": "Edit Combo", + "deleteCombo": "Delete Combo", + "noModels": "No models", + "noModelsYet": "No models added yet", + "addModel": "Add Model", + "addModelToCombo": "Add Model to Combo", + "routingStrategy": "Routing Strategy", + "maxRetries": "Max Retries", + "timeout": "Timeout (ms)", + "healthcheck": "Healthcheck", + "priority": "Priority", + "fallback": "Fallback", + "roundRobin": "Round Robin", + "random": "Random", + "leastLatency": "Least Latency", + "comboName": "Combo Name", + "comboNamePlaceholder": "my-combo", + "deleteConfirm": "Delete this combo?", + "noCombosYet": "No combos yet", + "comboCreated": "Combo created successfully", + "comboUpdated": "Combo updated successfully", + "comboDeleted": "Combo deleted", + "failedCreate": "Failed to create combo", + "failedUpdate": "Failed to update combo", + "errorCreating": "Error creating combo", + "errorUpdating": "Error updating combo", + "errorDeleting": "Error deleting combo", + "testFailed": "Test request failed", + "failedToggle": "Failed to toggle combo", + "testResults": "Test Results — {name}", + "resolvedBy": "Resolved by:", + "more": "+{count} more", + "reqs": "reqs", + "success": "success", + "proxyConfigured": "Proxy configured", + "copyComboName": "Copy combo name", + "enableCombo": "Enable combo", + "disableCombo": "Disable combo", + "testCombo": "Test combo", + "duplicate": "Duplicate", + "proxyConfig": "Proxy configuration", + "nameRequired": "Name is required", + "nameInvalid": "Only letters, numbers, -, _, / and . allowed", + "nameHint": "Letters, numbers, -, _, / and . allowed", + "priorityDesc": "Sequential fallback: tries model 1 first, then 2, etc.", + "weightedDesc": "Distributes traffic by weight percentage with fallback", + "roundRobinDesc": "Circular distribution: each request goes to the next model in rotation", + "contextRelay": "Context Relay", + "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", + "randomDesc": "Uniform random selection, then fallback to remaining models", + "leastUsedDesc": "Picks the model with fewest requests, balancing load over time", + "costOptimizedDesc": "Routes to the cheapest model first based on pricing", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", + "models": "Models", + "autoBalance": "Auto-balance", + "advancedSettings": "Advanced Settings", + "retryDelay": "Retry Delay (ms)", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (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.", + "advancedHint": "Leave empty to use global defaults. These override per-provider settings.", + "moveUp": "Move up", + "moveDown": "Move down", + "removeModel": "Remove", + "saving": "Saving...", + "weighted": "Weighted", + "leastUsed": "Least-Used", + "costOpt": "Cost-Opt", + "strategyGuideTitle": "How to use this strategy", + "strategyGuideWhen": "When to use", + "strategyGuideAvoid": "Avoid when", + "strategyGuideExample": "Example", + "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." + }, + "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." + }, + "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." + }, + "random": { + "when": "You want simple distribution with minimal setup.", + "avoid": "You need strict traffic guarantees.", + "example": "Quick prototyping with equivalent models." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "when": "Use when you want to fully exhaust one provider's quota before moving to the next.", + "avoid": "Avoid when you need request-level load balancing across providers.", + "example": "Example: Use all $200 Deepgram credits before falling back to Groq." + }, + "auto": { + "when": "Use when you need multi-factor scoring routing based on cost, latency, and quality.", + "avoid": "Avoid when you need strict priority ordering or historical persistence.", + "example": "Example: Balance requests across models with different strengths." + }, + "lkgp": { + "when": "Use when you want to route based on historical success rates and performance.", + "avoid": "Avoid when historical data is limited or unreliable.", + "example": "Example: Route to models with a good track record on specific tasks." + }, + "context-optimized": { + "when": "Use when you need to optimize context window usage across models.", + "avoid": "Avoid when models have similar context lengths or tasks are simple.", + "example": "Example: Distribute long conversations across models with larger context windows." + } + }, + "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." + }, + "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", + "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.", + "readinessTitle": "Ready to save?", + "readinessDescription": "Review the checklist before creating or updating this combo.", + "readinessCheckName": "Combo name is valid", + "readinessCheckModels": "At least one model is selected", + "readinessCheckWeights": "Weighted total is 100%", + "readinessCheckWeightsOptional": "Weight rule not required", + "readinessCheckPricing": "Pricing data is available", + "readinessCheckPricingOptional": "Pricing rule not required", + "saveBlockedTitle": "Save is blocked until the following items are fixed:", + "saveBlockName": "Define a combo name.", + "saveBlockModels": "Add at least one model.", + "saveBlockWeighted": "Set weights to 100% (current: {total}%).", + "saveBlockPricing": "Add pricing for at least one model or choose a different strategy.", + "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.", + "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", + "weightQuota": "Quota", + "weightHealth": "Health", + "weightCostInv": "Cost", + "weightLatencyInv": "Latency", + "weightTaskFit": "Task Fit", + "weightStability": "Stability", + "weightTierPriority": "Tier", + "reviewIntelligentTitle": "Intelligent Routing Config", + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "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." + }, + "fill-first": { + "description": "Exhaust provider quotas sequentially before falling back.", + "tip1": "Use for quota-based routing with clear fallback chains.", + "tip2": "Set quotas accurately to avoid premature fallback.", + "tip3": "Works best with providers offering free tiers or credit buckets.", + "title": "Quota Exhaustion" + }, + "auto": { + "description": "Route based on real-time scoring for cost, latency, quality, and health.", + "tip1": "Let the engine balance multiple factors automatically.", + "tip2": "Monitor which factors drive routing decisions in logs.", + "tip3": "Use for complex workloads where no single factor dominates.", + "title": "Multi-Factor Optimization" + }, + "lkgp": { + "description": "Route based on historical performance and success patterns.", + "tip1": "Requires sufficient request history for accurate predictions.", + "tip2": "Good for workloads with consistent model performance patterns.", + "tip3": "Monitor prediction accuracy and adjust weights as needed.", + "title": "History-Based Routing" + }, + "context-optimized": { + "description": "Optimize routing based on context window usage and token efficiency.", + "tip1": "Route long conversations to models with larger context windows.", + "tip2": "Monitor context utilization to avoid token waste.", + "tip3": "Best for conversational AI requiring extensive context retention.", + "title": "Context Optimization" + }, + "context-relay": { + "description": "Best when account rotation is expected and the next account must inherit a simplified task summary.", + "tip1": "Use with providers rotating accounts for the same model family.", + "tip2": "Set handoff threshold below hard quota cutoffs for summary generation time.", + "tip3": "Only set a dedicated summary model if the primary is too expensive or unstable.", + "title": "Session Continuity Priority" + }, + "p2c": { + "description": "Route to the provider with the lowest current load based on real-time metrics.", + "tip1": "Monitor provider health metrics for accurate load assessment.", + "tip2": "Works best with homogeneous provider pools.", + "tip3": "Adjust sensitivity to avoid oscillation during traffic spikes.", + "title": "Power of Two Choices" + } + }, + "templateFreeStack": "Free Stack ($0)", + "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding.", + "auto": "Intelligent Auto", + "autoDesc": "Self-healing smart routing pool with multi-factor scoring", + "lkgp": "LKGP Mode", + "lkgpDesc": "Prioritizes the last provider that successfully completed a request", + "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", + "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", + "builderStage": { + "basics": { + "label": "Basics", + "description": "Name and starting template" + }, + "steps": { + "label": "Steps", + "description": "Provider, model, and account selection" + }, + "strategy": { + "label": "Strategy", + "description": "Routing behavior and advanced settings" + }, + "intelligent": { + "label": "Smart Routing", + "description": "Auto-routing candidate pool, presets, and scoring" + }, + "review": { + "label": "Review", + "description": "Final validation before saving" + } + }, + "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", + "builderDuplicateExact": "This exact provider/model/account step is already in the 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", + "builderStagesDescription": "Complete each stage in order to define combos, build steps, select routing strategy, and review results.", + "builderStepsDescription": "Build each combo step in order: provider, model, then account. This allows reusing the same provider and model across different accounts.", + "selectProvider": "Select Provider", + "selectProviderPlaceholder": "Select a provider", + "selectModel": "Select Model", + "selectModelPlaceholder": "Select a provider first", + "selectAccount": "Select Account", + "selectComboToReference": "Select combo to reference", + "comboReference": "Combo Reference", + "addComboReference": "Add Combo Reference", + "addStepBeforeContinue": "Please add at least one step before proceeding to the next stage.", + "previewNextStep": "Preview next step", + "autoSelectAccount": "Automatically select account at runtime", + "modePackBalanced": "Balanced", + "modePackBudget": "Budget", + "modePackPerformance": "Performance", + "modePackCustom": "Custom", + "browseLegacyCatalog": "Browse legacy combo catalog", + "agentFeaturesTitle": "Agent Features", + "agentFeaturesDescription": "Enable advanced features for agents using this combo", + "agentFeaturesSystemMessageOverride": "Override system message", + "agentFeaturesSystemMessagePlaceholder": "You are an expert assistant...", + "agentFeaturesSystemMessageHint": "System message override for agents", + "agentFeaturesToolFilterRegex": "/regex-pattern/", + "agentFeaturesToolFilterHint": "Tool filter regex for agents", + "agentFeaturesContextCacheHint": "Enable in-context cache for agent tools", + "agentFeaturesContextCacheProtection": "Protect cache from agent tool mutations" + }, + "costs": { + "title": "Costs", + "pageDescription": "Track spending, analyze trends, and manage your AI budget across all providers", + "overview": "Overview", + "budget": "Budget", + "totalCost": "Total Cost", + "breakdown": "Cost Breakdown", + "noData": "No cost data", + "byModel": "By Model", + "byProvider": "By Provider", + "range7d": "7 Days", + "range30d": "30 Days", + "range90d": "90 Days", + "rangeAll": "All Time", + "spend30d": "Spend 30D", + "activeModels": "Active Models", + "selectedWindow": "Selected Window", + "activeProviders": "Active Providers", + "overviewTitle": "Cost Overview", + "spend7d": "Spend 7D", + "avgCostPerRequest": "Avg Cost / Request", + "noCostDataDescription": "Start making requests to see cost data appear here. Costs are tracked automatically for all providers.", + "spendToday": "Spend Today", + "overviewLoadFailed": "Failed to load cost overview", + "overviewDescription": "Real-time spending breakdown across all connected providers and models", + "providerShare": "Provider Share", + "topProviders": "Top Providers", + "costTrend": "Cost Trend", + "noCostDataTitle": "No cost data yet", + "topModels": "Top Models", + "requestsInWindow": "Requests in Window" + }, + "endpoint": { + "title": "API Endpoint", + "available": "Available Endpoints", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "Are you sure you want to disable cloud proxy?", + "baseUrl": "Base URL", + "apiKeyLabel": "API Key", + "registeredKeys": "Registered Keys", + "chatCompletions": "Chat Completions", + "responses": "Responses", + "listModels": "List Models", + "usingCloudProxy": "Using Cloud Proxy", + "usingLocalServer": "Using Local Server", + "machineId": "Machine ID: {id}...", + "disableCloud": "Disable Cloud", + "enableCloud": "Enable Cloud", + "modelsAcrossEndpoints": "{models} models across {endpoints} endpoints", + "chatDesc": "Streaming & non-streaming chat with all providers", + "embeddings": "Embeddings", + "embeddingsDesc": "Text embeddings for search & RAG pipelines", + "imageGeneration": "Image Generation", + "imageDesc": "Generate images from text prompts", + "rerank": "Rerank", + "rerankDesc": "Rerank documents by relevance to a query", + "audioTranscription": "Audio Transcription", + "audioTranscriptionDesc": "Transcribe audio files to text (Whisper)", + "textToSpeech": "Text to Speech", + "textToSpeechDesc": "Convert text to natural-sounding speech", + "musicGeneration": "Music Generation", + "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "moderations": "Moderations", + "moderationsDesc": "Content moderation and safety classification", + "responsesDesc": "OpenAI Responses API for Codex and advanced agentic workflows", + "listModelsDesc": "List all available models across all connected providers", + "settingsApiDesc": "Read and modify OmniRoute configuration via API", + "settingsApi": "Settings API", + "categoryCore": "Core APIs", + "categoryMedia": "Media & Multi-Modal", + "categorySearch": "Search & Discovery", + "categoryUtility": "Utility & Management", + "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.", + "enableCloudTitle": "Enable Cloud Proxy", + "whatYouGet": "What you will get", + "cloudBenefitAccess": "Access your API from anywhere in the world", + "cloudBenefitShare": "Share endpoint with your team easily", + "cloudBenefitPorts": "No need to open ports or configure firewall", + "cloudBenefitEdge": "Fast global edge network", + "cloudSessionNote": "Cloud will keep your auth session for 1 day. If not used, it will be automatically deleted.", + "cloudUnstableNote": "Cloud is currently unstable with Claude Code OAuth in some cases.", + "cloudConnected": "Cloud Proxy connected!", + "connectingToCloud": "Connecting to cloud...", + "verifyingConnection": "Verifying connection...", + "connecting": "Connecting...", + "verifying": "Verifying...", + "connected": "Connected!", + "disableCloudTitle": "Disable Cloud Proxy", + "disableWarning": "All auth sessions will be deleted from cloud.", + "syncingData": "Syncing latest data...", + "disablingCloud": "Disabling cloud...", + "syncing": "Syncing...", + "disabling": "Disabling...", + "cloudConnectedVerified": "Cloud Proxy connected and verified!", + "connectedVerificationPending": "Connected — verification pending", + "connectedVerificationPendingWithError": "Connected — verification pending: {error}", + "cloudDisabledSuccess": "Cloud disabled successfully", + "syncedSuccess": "Synced successfully", + "failedDisable": "Failed to disable 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", + "cloudflaredTitle": "Cloudflare Quick Tunnel", + "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. The URL changes after every 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", + "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after every restart.", + "cloudflaredUnsupportedNote": "This platform is not supported for managed installs. Install cloudflared manually or point CLOUDFLARED_BIN to an existing binary.", + "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", + "cloudflaredLastError": "Last error: {error}", + "providerModelsTitle": "{provider} — Models", + "noModelsForProvider": "No models available for this provider.", + "chat": "Chat", + "embedding": "Embedding", + "image": "Image", + "custom": "custom", + "modelsCount": "{count, plural, one {# model} other {# models}}", + "sectionTitle": "Integration Surface", + "sectionDescription": "OpenAI-compatible APIs and operational protocol endpoints", + "tabApis": "OpenAI-compatible 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", + "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.", + "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", + "tailscaleSudoLabel": "Sudo Password (required on macOS/Linux)" + }, + "endpoints": { + "tabProxy": "Endpoint Proxy", + "tabApiEndpoints": "API Endpoints", + "apiEndpointsTitle": "API Endpoints", + "apiEndpointsDescription": "Backend API endpoints that can be consumed by other applications and services. This section will list all available REST APIs with documentation and testing capabilities.", + "comingSoon": "Coming Soon", + "plannedFeatures": "Planned Features", + "featureRestApi": "REST API endpoint catalog with interactive documentation", + "featureWebhooks": "Webhook configuration and event subscriptions", + "featureSwagger": "OpenAPI / Swagger spec auto-generation", + "featureAuth": "API key and OAuth scope management per 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", + "online": "Online", + "offline": "Offline", + "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", + "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" + }, + "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}).", + "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", + "state": { + "submitted": "submitted", + "working": "working", + "completed": "completed", + "failed": "failed", + "cancelled": "cancelled" + }, + "agentCard": "Agent card", + "version": "Version", + "url": "URL", + "capabilities": "Capabilities", + "agentCardNotAvailable": "Agent card not available.", + "quickValidation": "Quick validation", + "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.", + "runMessageSend": "Run message/send", + "runMessageStream": "Run message/stream", + "taskManagement": "Task management", + "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", + "artifacts": "Artifacts", + "tablePhase": "Table Phase", + "offset": "Offset", + "limit": "Limit", + "skill": "Skill" + }, + "memory": { + "title": "Memory Management", + "description": "View and manage stored memory entries", + "memories": "Memories", + "totalEntries": "Total Entries", + "tokensUsed": "Tokens Used", + "hitRate": "Hit Rate", + "loading": "Loading memories...", + "noMemories": "No memories found", + "search": "Search memories...", + "allTypes": "All Types", + "export": "Export", + "import": "Import", + "addMemory": "Add Memory", + "type": "Type", + "key": "Key", + "content": "Content", + "created": "Created", + "actions": "Actions", + "delete": "Delete", + "factual": "Factual", + "episodic": "Episodic", + "procedural": "Procedural", + "semantic": "Semantic", + "a": "A" + }, + "skills": { + "title": "Skills", + "description": "Manage and monitor AI skills", + "skillsTab": "Skills", + "executionsTab": "Executions", + "sandboxTab": "Sandbox", + "loading": "Loading skills...", + "noSkills": "No skills found", + "noExecutions": "No executions found", + "enabled": "Enabled", + "disabled": "Disabled", + "version": "Version", + "tableDescription": "Description", + "skill": "Skill", + "status": "Status", + "duration": "Duration", + "time": "Time", + "sandboxConfig": "Sandbox Configuration", + "cpuLimit": "CPU Limit", + "cpuLimitDesc": "Maximum execution time per skill", + "memoryLimit": "Memory Limit", + "memoryLimitDesc": "Maximum memory allocation", + "timeout": "Timeout", + "timeoutDesc": "Maximum wait time for response", + "networkAccess": "Network Access", + "networkAccessDesc": "Allow outbound network requests", + "mode": "Mode", + "q": "Q" + }, + "health": { + "title": "System Health", + "description": "Real-time monitoring of your OmniRoute instance", + "healthy": "Healthy", + "degraded": "Degraded", + "down": "Down", + "uptime": "Uptime", + "memory": "Memory", + "memoryRss": "Memory (RSS)", + "heap": "Heap", + "cpu": "CPU", + "database": "Database", + "version": "Version", + "lastCheck": "Last Check", + "providerHealth": "Provider Health", + "systemMetrics": "System Metrics", + "tokenHealth": "Token Health", + "refreshAll": "Refresh All", + "checkNow": "Check Now", + "loadingHealth": "Loading health data...", + "failedToLoad": "Failed to load health data: {error}", + "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", + "entries": "Entries", + "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", + "configuredProvidersLabel": "Configured in dashboard", + "configuredProvidersHint": "Providers with credentials saved in /dashboard/providers, regardless of runtime state.", + "activeProviders": "{count} active", + "activeProvidersHint": "Configured providers currently enabled for routing requests.", + "monitoredProviders": "{count} monitored", + "monitoredProvidersHint": "Providers currently tracked by circuit-breaker health monitors.", + "healthyCount": "{count} healthy", + "nodeVersion": "Node {version}", + "failures": "{count} failure", + "failuresPlural": "{count} failures", + "lastFailure": "Last", + "rateLimitStatus": "Rate Limit Status", + "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}", + "limitExhausted": "Exhausted", + "learnedFromHeaders": "Learned from headers", + "remainingOfLimit": "{remaining}/{limit} remaining", + "throttleStatus": "Throttle: {value}", + "lastHeaderUpdate": "Header update: {age}" + }, + "limits": { + "title": "Limits & Quotas", + "rateLimit": "Rate Limit", + "remaining": "Remaining", + "requestsPerMinute": "Requests/min", + "tokensPerMinute": "Tokens/min", + "dailyLimit": "Daily Limit" + }, + "logs": { + "title": "Logs", + "requestLogs": "Request Logs", + "proxyLogs": "Proxy Logs", + "auditLog": "Audit Log", + "console": "Console", + "auditLogDesc": "Administrative actions and security events", + "loading": "Loading...", + "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", + "providerWarningTitle": "Provider Warnings", + "viewDetails": "View Details", + "eventMetadata": "Event Metadata", + "eventPayload": "Event Payload", + "requestId": "Request Id", + "providerWarningDesc": "Some providers returned warnings during request processing", + "a": "A", + "offset": "Offset", + "limit": "Limit", + "status": "Status", + "resourceType": "Resource Type", + "totalEntries": "Total Entries", + "tab": "Tab", + "auditModalSubtitle": "Event details and metadata", + "close": "Close", + "runningRequests": "Active Requests", + "runningRequestsDesc": "Real-time view of currently running upstream requests", + "model": "Model", + "provider": "Provider", + "account": "Account", + "elapsed": "Elapsed", + "count": "Count", + "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}" + }, + "onboarding": { + "welcome": "Welcome", + "security": "Security", + "test": "Test", + "ready": "Ready!", + "setPassword": "Set Password", + "addProvider": "Add your first provider", + "getStarted": "Get Started", + "skip": "Skip", + "skipWizard": "Skip wizard entirely", + "skipPassword": "Skip password setup", + "skipAndContinue": "Skip & Continue", + "passwordLabel": "Password", + "confirmPassword": "Confirm Password", + "enterPassword": "Enter password", + "confirmPasswordPlaceholder": "Confirm password", + "passwordsMismatch": "Passwords do not match", + "setupComplete": "Setup Complete!", + "goToDashboard": "Go to Dashboard →", + "welcomeDesc": "OmniRoute is your local AI API proxy. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "multiProvider": "Multi-Provider", + "usageTracking": "Usage Tracking", + "apiKeyMgmt": "API Key Mgmt", + "securityDesc": "Set a password to protect your dashboard, or skip for now.", + "providerDesc": "Connect your first AI provider. You can add more later.", + "apiKeyRequired": "API Key (required)", + "customUrlOptional": "Custom URL (optional)", + "testDesc": "Let's verify your provider connection works.", + "runTest": "Run Connection Test", + "testingConnection": "Testing connection...", + "connectionSuccessful": "Connection successful! Your provider is ready.", + "noProviderFound": "No provider found. You can add one from the dashboard later.", + "testFailed": "Test failed, but you can configure this later.", + "couldNotTest": "Could not test right now. You can test from the dashboard.", + "doneDesc": "You're all set! Your OmniRoute instance is configured and ready to proxy AI requests.", + "yourEndpoint": "Your endpoint:", + "continue": "Continue", + "retry": "Retry", + "failedSetPassword": "Failed to set password. Try again.", + "failedAddProvider": "Failed to add provider. Try again.", + "connectionError": "Connection error. Please try again.", + "provider": "Provider" + }, + "providers": { + "title": "Providers", + "addProvider": "Add Provider", + "editProvider": "Edit Provider", + "deleteProvider": "Delete Provider", + "noProviders": "No providers configured", + "modelAvailability": "Model Availability", + "accounts": "Accounts", + "newAccount": "New Account", + "deleteConfirm": "Are you sure you want to delete this provider?", + "testing": "Testing...", + "testConnection": "Test Connection", + "testSuccess": "Connection successful", + "testFailed": "Connection failed", + "available": "Available", + "cooldown": "Cooldown", + "unavailable": "Unavailable", + "unknown": "Unknown", + "oauthLabel": "OAuth", + "compatibleLabel": "Compatible", + "chat": "Chat", + "responses": "Responses", + "messages": "Messages", + "oauthProviders": "OAuth Providers", + "freeProviders": "Free Providers", + "apiKeyProviders": "API Key Providers", + "compatibleProviders": "API Key Compatible Providers", + "testAll": "Test All", + "testAllOAuth": "Test all OAuth connections", + "testAllFree": "Test all Free connections", + "testAllApiKey": "Test all API Key connections", + "testAllCompatible": "Test all Compatible connections", + "connected": "{count} Connected", + "errorCount": "{count} Error ({code})", + "errorCountNoCode": "{count} Error", + "noConnections": "No connections", + "disabled": "Disabled", + "enableProvider": "Enable provider", + "disableProvider": "Disable provider", + "testResults": "Test Results", + "noCompatibleYet": "No compatible providers added yet", + "compatibleHint": "Use the buttons above to add OpenAI or Anthropic compatible endpoints", + "addOpenAICompatible": "Add OpenAI Compatible", + "addAnthropicCompatible": "Add Anthropic Compatible", + "addNewProvider": "Add New Provider", + "backToProviders": "Back to Providers", + "configureNewProvider": "Configure a new AI provider to use with your applications.", + "providerLabel": "Provider", + "selectProvider": "Select a provider", + "selectedProvider": "Selected provider", + "authMethod": "Authentication Method", + "apiKeyLabel": "API Key", + "apiKeyRequired": "API Key is required", + "selectProviderRequired": "Please select a provider", + "enterApiKey": "Enter your API key", + "apiKeySecure": "Your API key will be encrypted and stored securely.", + "oauth2Connect": "Connect with OAuth2", + "oauth2Label": "OAuth2", + "oauth2Desc": "Connect your account using OAuth2 authentication.", + "displayName": "Display Name", + "displayNamePlaceholder": "e.g., Production API, Dev Environment", + "displayNameHint": "Optional. A friendly name to identify this configuration.", + "active": "Active", + "activeDescription": "Enable this provider for use in your applications", + "cancel": "Cancel", + "createProvider": "Create Provider", + "failedCreate": "Failed to create provider", + "errorOccurred": "An error occurred. Please try again.", + "modelStatus": "Model Status", + "showConfiguredOnly": "Configured only", + "allModelsOperational": "All models operational", + "modelsWithIssues": "{count} model(s) with issues", + "allModelsNormal": "All models are responding normally.", + "cooldownCleared": "Cooldown cleared for {model}", + "failedClearCooldown": "Failed to clear cooldown", + "loadingAvailability": "Loading model availability...", + "clearCooldown": "Clear", + "clearing": "Clearing...", + "until": "Until {time}", + "providerTestFailed": "Provider test failed", + "providerTestTimeout": "Provider test timed out — too many connections to test at once", + "modeTest": "{mode} Test", + "passedCount": "{count} passed", + "failedCount": "{count} failed", + "testedCount": "{count} tested", + "millisecondsAbbr": "{value}ms", + "okShort": "OK", + "errorShort": "ERROR", + "noActiveConnectionsInGroup": "No active connections found for this group.", + "allTestsPassed": "All {total} tests passed", + "testSummary": "{passed}/{total} passed, {failed} failed", + "nameLabel": "Name", + "prefixLabel": "Prefix", + "baseUrlLabel": "Base URL", + "apiTypeLabel": "API Type", + "prefixHint": "Required. Unique prefix for model names.", + "nameHint": "Required. A friendly label for this node.", + "baseUrlHint": "Required.  Provider API base URL.", + "anthropicPrefixPlaceholder": "ac-prod", + "openaiPrefixPlaceholder": "oc-prod", + "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", + "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", + "validateConnection": "Validate Connection", + "validating": "Validating...", + "connectionValid": "Connection is valid!", + "connectionFailed": "Connection failed. Check URL and key.", + "testKeyLabel": "Test API Key", + "testKeyPlaceholder": "sk-... (for validation only)", + "providerNotFound": "Provider not found", + "deleteConnectionConfirm": "Delete this connection?", + "failedSetAlias": "Failed to set alias", + "failedSaveConnection": "Failed to save connection", + "failedSaveConnectionRetry": "Failed to save connection. Please try again.", + "failedRetestConnection": "Failed to retest connection", + "deleteCompatibleNodeConfirm": "Delete this {type} Compatible node?", + "anthropicCompatibleDetails": "Anthropic Compatible Details", + "openaiCompatibleDetails": "OpenAI Compatible Details", + "messagesApi": "Messages API", + "responsesApi": "Responses API", + "embeddings": "Embeddings", + "audioTranscriptions": "Audio Transcriptions", + "audioSpeech": "Audio Speech", + "imagesGenerations": "Images Generations", + "chatCompletions": "Chat Completions", + "importingModels": "Importing...", + "importFromModels": "Import from /models", + "modelsImported": "{count} models imported", + "allModelsAlreadyImported": "All models already imported", + "noNewModelsToImport": "No new models to import — all models are already in the registry or custom models list", + "skippingExistingModels": "Skipping {count} existing models", + "autoSync": "Auto-Sync", + "autoSyncTooltip": "Automatically refresh model list every 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Auto-sync enabled — models will refresh periodically", + "autoSyncDisabled": "Auto-sync disabled", + "autoSyncToggleFailed": "Failed to toggle auto-sync", + "clearAllModels": "Clear All Models", + "clearAllModelsConfirm": "Are you sure you want to remove all models for this provider? This cannot be undone.", + "clearAllModelsSuccess": "All models cleared", + "clearAllModelsFailed": "Failed to clear models", + "addConnectionToImport": "Add a connection to enable importing.", + "noModelsConfigured": "No models configured", + "connectionCount": "{count} connection(s)", + "fetchingModels": "Fetching available models...", + "failedFetchModels": "Failed to fetch models", + "noModelsFound": "No models found", + "importFailed": "Import failed", + "noNewModelsAdded": "No new models were added.", + "adding": "Adding...", + "close": "Close", + "importingModelsTitle": "Importing Models", + "copyModel": "Copy model", + "filterModels": "Filter models...", + "modelsActive": "Active", + "showModel": "Show model", + "hideModel": "Hide model", + "removeModel": "Remove model", + "rateLimitProtected": "Protected", + "rateLimitUnprotected": "Unprotected", + "enableRateLimitProtection": "Click to enable rate limit protection", + "disableRateLimitProtection": "Click to disable rate limit protection", + "productionKey": "Production Key", + "enterNewApiKey": "Enter new API key", + "optional": "Optional", + "anthropicCompatibleName": "Anthropic Compatible", + "openaiCompatibleName": "OpenAI Compatible", + "failedImportModels": "Failed to import models", + "noModelsReturnedFromEndpoint": "No models returned from /models endpoint.", + "importingModelsProgress": "Importing {current} of {total} models...", + "foundModelsStartingImport": "Found {count} models. Starting import...", + "importingModelById": "Importing {modelId}...", + "importSuccessCount": "Successfully imported {count, plural, one {# model} other {# models}}!", + "noNewModelsAddedExisting": "No new models were added (all already exist).", + "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", + "unexpectedErrorOccurred": "An unexpected error occurred", + "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Only one connection is allowed per compatible node. Add another node if you need more connections.", + "connections": "Connections", + "providerProxyTitleConfigured": "Provider proxy: {host}", + "configured": "configured", + "providerProxyConfigureHint": "Configure proxy for all connections of this provider", + "providerProxy": "Provider Proxy", + "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", + "noConnectionsYet": "No connections yet", + "addFirstConnectionHint": "Add your first connection to get started", + "addConnection": "Add Connection", + "availableModels": "Available Models", + "builtInModels": "Built-in models", + "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", + "pageAutoRefresh": "Page will refresh automatically...", + "statusDisabled": "disabled", + "statusConnected": "connected", + "statusRuntimeIssue": "runtime issue", + "statusAuthFailed": "auth failed", + "statusRateLimited": "rate limited", + "statusNetworkIssue": "network issue", + "statusTestUnsupported": "test unsupported", + "statusUnavailable": "unavailable", + "statusFailed": "failed", + "statusError": "error", + "oauthAccount": "OAuth Account", + "errorTypeRuntime": "Local runtime", + "errorTypeUpstreamAuth": "Upstream auth", + "errorTypeMissingCredential": "Missing credential", + "errorTypeRefreshFailed": "Refresh failed", + "errorTypeTokenExpired": "Token expired", + "errorTypeRateLimited": "Rate limited", + "errorTypeUpstreamUnavailable": "Upstream unavailable", + "errorTypeNetworkError": "Network error", + "errorTypeTestUnsupported": "Test unsupported", + "errorTypeUpstreamError": "Upstream error", + "proxySourceGlobal": "Global", + "proxySourceProvider": "Provider", + "proxySourceKey": "Key", + "proxyConfiguredBySource": "Proxy ({source}): {host}", + "autoPriority": "Auto: {priority}", + "proxy": "Proxy", + "retestAuthentication": "Retest authentication", + "retest": "Retest", + "disableConnection": "Disable connection", + "enableConnection": "Enable connection", + "reauthenticateConnection": "Re-authenticate this connection", + "proxyConfig": "Proxy config", + "aliasExistsAlert": "Alias \"{alias}\" already exists. Please use a different model or edit existing alias.", + "openRouterAnyModelHint": "OpenRouter supports any model. Add models and create aliases for quick access.", + "modelIdFromOpenRouter": "Model ID (from OpenRouter)", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", + "customModels": "Custom Models", + "customModelsHint": "Add model IDs not in the default list. These will be available for routing.", + "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", + "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).", + "compatProtocolOpenAI": "OpenAI Chat Completions", + "compatProtocolOpenAIResponses": "OpenAI Responses API", + "compatProtocolClaude": "Anthropic Messages", + "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", + "perModelQuotaLabel": "Per-Model Quota", + "perModelQuotaDescription": "When enabled, 429/404 errors only lock the specific model, not the entire connection. Use for providers with per-model rate limits (e.g., ModelScope).", + "perModelQuotaToggle": "Per-Model Quota Toggle", + "modelId": "Model ID", + "customModelPlaceholder": "e.g. gpt-4.5-turbo", + "loading": "Loading...", + "removeCustomModel": "Remove custom model", + "noCustomModels": "No custom models added yet.", + "allSuggestedAliasesExist": "All suggested aliases already exist. Please choose a different model or remove conflicting aliases.", + "failedSaveCustomModel": "Failed to save custom model", + "modelAddedSuccess": "Model {modelId} added successfully", + "failedAddModelTryAgain": "Failed to add model. Please try again.", + "failedSaveImportedModel": "Failed to save imported model to custom database", + "failedImportModelsTryAgain": "Failed to import models. Please try again.", + "failedRemoveModelFromDatabase": "Failed to remove model from database", + "modelRemovedSuccess": "Model removed successfully", + "failedDeleteModelTryAgain": "Failed to delete model. Please try again.", + "compatibleModelsDescription": "Add {type}-compatible models manually or import them from the /models endpoint.", + "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", + "openaiCompatibleModelPlaceholder": "gpt-4o", + "apiKeyValidationFailed": "API key validation failed. Please check your key and try again.", + "addProviderApiKeyTitle": "Add {provider} API Key", + "checking": "Checking...", + "check": "Check", + "valid": "Valid", + "invalid": "Invalid", + "creating": "Creating...", + "validationChecksAnthropicCompatible": "Validation checks {provider} by verifying the API key.", + "validationChecksOpenAiCompatible": "Validation checks {provider} via /models on your base URL.", + "priorityLabel": "Priority", + "saving": "Saving...", + "save": "Save", + "editConnection": "Edit Connection", + "accountName": "Account name", + "email": "Email", + "healthCheckMinutes": "Health Check (min)", + "healthCheckHint": "Proactive token refresh interval. 0 = disabled.", + "selectAllModels": "Select all", + "deselectAllModels": "Deselect all", + "modelsActiveCount": "{active}/{total} active", + "noModelsMatch": "No models match \"{filter}\"", + "groupLabel": "Environment", + "groupPlaceholder": "e.g. eKaizen, Personal", + "failedTestConnection": "Failed to test connection", + "failed": "Failed", + "leaveBlankKeepCurrentApiKey": "Leave blank to keep the current API key.", + "editCompatibleTitle": "Edit {type} Compatible", + "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", + "apiKeyForCheck": "API Key (for Check)", + "compatibleProdPlaceholder": "{type} Compatible (Prod)", + "tokenRefreshed": "Token refreshed successfully", + "tokenRefreshFailed": "Token refresh failed", + "applyCodexAuthLocal": "Apply auth", + "exportCodexAuthFile": "Export auth", + "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", + "advancedSettings": "Advanced Settings", + "chatPathLabel": "Chat Endpoint Path", + "chatPathPlaceholder": "/chat/completions", + "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", + "modelsPathLabel": "Models Endpoint Path", + "modelsPathPlaceholder": "/models", + "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", + "statusDeactivated": "Deactivated (Manual)", + "statusBanned": "Banned / Sandbox Violation", + "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", + "showEmails": "Show all emails", + "hideEmails": "Hide all 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", + "addCcCompatible": "Add Cc Compatible", + "aggregatorsGateways": "Aggregators Gateways", + "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", + "audioShortLabel": "Audio Short Label", + "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", + "bailianBaseUrlHint": "Bailian Base Url Hint", + "blackboxWebCookieHint": "Blackbox Web Cookie Hint", + "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", + "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description", + "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label", + "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", + "ccCompatibleDetailsTitle": "Cc Compatible Details Title", + "ccCompatibleLabel": "Cc Compatible Label", + "ccCompatibleModelsDescription": "Cc Compatible Models Description", + "ccCompatibleNameHint": "Cc Compatible Name Hint", + "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", + "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", + "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", + "ccCompatibleValidationHint": "Cc Compatible Validation Hint", + "claudeExtraUsageShort": "Claude Extra Usage Short", + "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", + "codex5hToggleTitle": "Codex5H Toggle Title", + "codexFastServiceTierDescription": "Codex Fast Service Tier Description", + "codexFastServiceTierLabel": "Codex Fast Service Tier Label", + "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", + "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": "Default Thinking Strength Hint", + "defaultThinkingStrengthLabel": "Default Thinking Strength Label", + "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": "Extra Api Key Masked", + "extraApiKeysHint": "Extra Api Keys Hint", + "extraApiKeysLabel": "Extra Api Keys Label", + "googlePseInfo": "Google Pse Info", + "grokWebCookieHint": "Grok Web Cookie Hint", + "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", + "herokuBaseUrlHint": "Heroku Base Url Hint", + "hideEmail": "Hide Email", + "imageProviders": "Image Providers", + "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", + "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", + "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", + "oauth": "Oauth", + "openCliTools": "Open Cli Tools", + "openSettings": "Open Settings", + "openaiResponsesStoreDescription": "Openai Responses Store Description", + "openaiResponsesStoreLabel": "Openai Responses Store Label", + "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", + "perplexityWebCookieHint": "Perplexity Web Cookie Hint", + "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", + "personalAccessTokenLabel": "Personal Access Token Label", + "qoderPatHint": "Qoder Pat Hint", + "qoderPatPlaceholder": "Qoder Pat Placeholder", + "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", + "searchProviders": "Search Providers", + "searchProvidersHeading": "Search Providers Heading", + "searxngBaseUrlHint": "Searxng Base Url Hint", + "searxngInfo": "Searxng Info", + "sessionCookieLabel": "Session Cookie Label", + "showEmail": "Show Email", + "snowflakeBaseUrlHint": "Snowflake Base Url Hint", + "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", + "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": "Total Keys Rotating", + "unhideModel": "Unhide Model", + "upstreamProxyProviders": "Upstream Proxy Providers", + "validationModelIdHint": "Validation Model Id Hint", + "validationModelIdLabel": "Validation Model Id Label", + "validationModelIdPlaceholder": "Validation Model Id Placeholder", + "vertexServiceAccountPlaceholder": "Vertex Service Account Placeholder", + "webCookieProviders": "Web Cookie Providers", + "weeklyShort": "Weekly Short", + "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", + "zedImportButton": "Zed Import Button", + "zedImportFailed": "Zed Import Failed", + "zedImportHint": "Zed Import Hint", + "zedImportNetworkError": "Zed Import Network Error", + "zedImportNone": "Zed Import None", + "zedImportSuccess": "Zed Import Success", + "zedImporting": "Zed Importing" + }, + "settings": { + "title": "Settings", + "general": "General", + "security": "Security", + "appearance": "Appearance", + "routing": "Routing", + "cache": "Cache", + "resilience": "Resilience", + "systemPrompt": "System Prompt", + "thinkingBudget": "Thinking Budget", + "proxy": "Proxy", + "pricing": "Pricing", + "storage": "Storage", + "policies": "Policies", + "ipFilter": "IP Filter", + "comboDefaults": "Combo Defaults", + "fallbackChains": "Fallback Chains", + "changePassword": "Change Password", + "enablePassword": "Enable Password", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", + "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", + "justNow": "Just now", + "modelsDevStats": "Sync Statistics", + "modelsDevStatsDesc": "Current models.dev data coverage", + "providers": "Providers", + "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", + "systemTheme": "System Theme", + "debugToggle": "Enable Debug Mode", + "sidebarVisibilityToggle": "Show Sidebar Items", + "enableCache": "Enable Cache", + "cacheTTL": "Cache TTL", + "maxCacheSize": "Max Cache Size", + "clearCache": "Clear Cache", + "cacheCleared": "Cache cleared successfully", + "clearCacheFailed": "Failed to clear cache", + "cacheHits": "Cache Hits", + "cacheMisses": "Cache Misses", + "hitRate": "Hit Rate", + "cacheEntries": "Cache Entries", + "cacheSettings": "Cache Settings", + "semanticCache": "Semantic Cache", + "maxEntries": "Max Entries", + "ttlMinutes": "TTL (minutes)", + "promptCache": "Prompt Cache", + "strategy": "Strategy", + "preserveClientCache": "Preserve Client Cache", + "enabled": "Enabled", + "loading": "Loading...", + "saving": "Saving...", + "save": "Save", + "circuitBreaker": "Circuit Breaker", + "retryPolicy": "Retry Policy", + "maxRetries": "Max Retries", + "retryDelay": "Retry Delay", + "timeoutMs": "Timeout (ms)", + "enableSystemPrompt": "Enable System Prompt", + "systemPromptText": "System Prompt Text", + "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", + "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", + "autoDisableThreshold": "Ban Threshold", + "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", + "enableThinking": "Enable Thinking", + "maxThinkingTokens": "Max Thinking Tokens", + "enableProxy": "Enable Proxy", + "proxyUrl": "Proxy URL", + "pricingRates": "Pricing Rates Format", + "currentPricing": "Current Pricing Overview", + "loadingPricing": "Loading pricing data...", + "noPricing": "No pricing data available", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "customPricing": "Custom Pricing", + "databaseSize": "Database Size", + "backupDb": "Backup Database", + "restoreDb": "Restore Database", + "exportData": "Export Data", + "importData": "Import Data", + "clearData": "Clear All Data", + "clearDataConfirm": "This will permanently delete all data. Are you sure?", + "enableRequestLogs": "Enable Request Logs", + "logRetention": "Log Retention", + "ipWhitelist": "IP Whitelist", + "ipBlacklist": "IP Blacklist", + "addIP": "Add IP", + "savedSuccessfully": "Settings saved successfully", + "ai": "AI", + "advanced": "Advanced", + "localMode": "Local Mode — All data stored on your machine", + "settingsSectionsAria": "Settings sections", + "switchThemes": "Switch between light and dark themes", + "themeSelectionAria": "Theme selection", + "themeLight": "Light", + "themeDark": "Dark", + "themeSystem": "System", + "sidebarVisibility": "Hide sidebar items", + "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter without disabling any features", + "sidebarVisibilityHint": "Any sidebar section is hidden automatically when all of its entries are hidden", + "hideHealthLogs": "Hide Health Check Logs", + "hideHealthLogsDesc": "When ON, suppress [HealthCheck] messages in server console", + "themeAccent": "Theme color", + "themeAccentDesc": "Choose a preset color or create your own theme with one color", + "themeCreate": "Create theme", + "themeCustom": "Custom theme", + "themeBlue": "Blue", + "themeRed": "Red", + "themeGreen": "Green", + "themeViolet": "Violet", + "themeOrange": "Orange", + "themeCyan": "Cyan", + "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", + "flushCache": "Flush Cache", + "flushing": "Flushing…", + "size": "Size", + "hits": "Hits", + "evictions": "Evictions", + "loadingCacheStats": "Loading cache stats…", + "globalProxy": "Global Proxy", + "globalProxyDesc": "Configure a global outbound proxy for all API calls. Individual providers, combos, and keys can override this.", + "noGlobalProxy": "No global proxy configured", + "globalLabel": "Global", + "configure": "Configure", + "globalSystemPrompt": "Global System Prompt", + "systemPromptDesc": "Injected into all requests at proxy level", + "saved": "Saved", + "systemPromptPlaceholder": "Enter system prompt to inject into all requests...", + "systemPromptHint": "This prompt is prepended to the system message of every request. Use for global instructions, safety guidelines, or response formatting rules.", + "chars": "{count} chars", + "thinkingBudgetTitle": "Thinking Budget", + "thinkingBudgetDesc": "Control AI reasoning token usage across all requests", + "passthrough": "Passthrough", + "passthroughDesc": "No changes — client controls thinking budget", + "auto": "Auto Combo", + "autoDesc": "Self-healing smart routing pool (Performance optimized)", + "custom": "Custom", + "customDesc": "Set a fixed token budget for all requests", + "adaptive": "Adaptive", + "adaptiveDesc": "Scale budget based on request complexity", + "effortNone": "None (0 tokens)", + "effortLow": "Low (1K tokens)", + "effortMedium": "Medium (10K tokens)", + "effortHigh": "High (128K tokens)", + "tokenBudget": "Token Budget", + "tokens": "tokens", + "baseEffortLevel": "Base Effort Level", + "adaptiveHint": "Adaptive mode scales from this base level based on message count, tool usage, and prompt length.", + "requireLogin": "Require login", + "requireLoginDesc": "When ON, dashboard requires password. When OFF, access without login.", + "currentPassword": "Current Password", + "enterCurrentPassword": "Enter current password", + "newPassword": "New Password", + "enterNewPassword": "Enter new password", + "confirmPassword": "Confirm New Password", + "confirmPasswordPlaceholder": "Confirm new password", + "passwordsNoMatch": "Passwords do not match", + "passwordUpdated": "Password updated successfully", + "failedUpdatePassword": "Failed to update password", + "errorOccurred": "An error occurred", + "updatePassword": "Update Password", + "setPassword": "Set Password", + "apiEndpointProtection": "API Endpoint Protection", + "requireAuthModels": "Require API key for /models", + "requireAuthModelsDesc": "When ON, the /v1/models endpoint returns 404 for unauthenticated requests. Prevents model discovery by unauthorized users.", + "blockedProviders": "Blocked Providers", + "blockedProvidersDesc": "Hide specific providers from the /v1/models response. Blocked providers will not appear in model listings.", + "providersBlocked": "{count} provider(s) blocked from /models", + "blockProviderTitle": "Block {provider}", + "unblockProviderTitle": "Unblock {provider}", + "cliFingerprint": "CLI Fingerprint Matching", + "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}", + "routingStrategy": "Routing Strategy", + "routingAdvancedGuideTitle": "Advanced routing guidance", + "routingAdvancedGuideHint1": "Use Fill First for predictable priority, Round Robin for fairness, and P2C for latency resilience.", + "routingAdvancedGuideHint2": "If providers vary in quality/cost, start with Cost Opt for background work and Least Used for balanced wear.", + "fillFirst": "Fill First", + "fillFirstDesc": "Use accounts in priority order", + "roundRobin": "Round Robin", + "roundRobinDesc": "Cycle through all accounts", + "p2c": "P2C", + "p2cDesc": "Pick 2 random, use the healthier one", + "random": "Random", + "randomDesc": "Random account each request", + "leastUsed": "Least Used", + "leastUsedDesc": "Pick least recently used account", + "costOpt": "Cost Opt", + "costOptDesc": "Prefer cheapest available account", + "strictRandom": "Strict Random", + "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", + "stickyLimit": "Sticky Limit", + "stickyLimitDesc": "Calls per account before switching", + "modelAliases": "Model Aliases", + "modelAliasesTitle": "Model Aliases", + "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", + "addCustomAlias": "Add Custom Alias", + "deprecatedModelId": "Deprecated model ID", + "newModelId": "New model ID", + "customAliases": "Custom Aliases", + "builtInAliases": "Built-in Aliases", + "backgroundDegradationTitle": "Background Task Degradation", + "backgroundDegradationDesc": "Auto-detect background tasks (titles, summaries) and route to cheaper models", + "enableDegradation": "Enable Background Degradation", + "enableDegradationHint": "When enabled, background tasks like title generation and summarization are routed to cheaper models automatically", + "tasksDetected": "Tasks detected", + "degradationMap": "Model Degradation Map", + "premiumModel": "Premium model", + "cheapModel": "Cheap model", + "detectionPatterns": "Detection Patterns", + "newPattern": "e.g. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", + "pattern": "Pattern", + "targetModel": "Target Model", + "add": "+ Add", + "session": "Session", + "sessionDetailsAria": "Session details", + "status": "Status", + "authenticated": "Authenticated", + "guest": "Guest", + "loginTime": "Login Time", + "sessionAge": "Session Age", + "browser": "Browser", + "clearLocalData": "Clear Local Data", + "logout": "Logout", + "clearLocalDataConfirm": "Clear all local data? This will reset your preferences.", + "unknown": "Unknown", + "systemActor": "system", + "ipAccessControl": "IP Access Control", + "ipAccessControlDesc": "Block or allow specific IP addresses", + "ipModeDisabled": "Disabled", + "ipModeBlacklist": "Blacklist", + "ipModeWhitelist": "Whitelist", + "ipModeWhitelistPriority": "WL Priority", + "addIpAddress": "Add IP Address", + "ipAddressPlaceholder": "192.168.1.0/24 or 10.0.*.*", + "block": "+ Block", + "allow": "+ Allow", + "blocked": "Blocked ({count})", + "allowed": "Allowed ({count})", + "temporaryBans": "Temporary Bans ({count})", + "minLeft": "{min}m left", + "auditLog": "Audit Log", + "searchAuditLogs": "Search audit logs...", + "failedLoadAuditLog": "Failed to load audit log", + "noAuditEvents": "No audit events found", + "action": "Action", + "actor": "Actor", + "details": "Details", + "time": "Time", + "fallbackChainsTitle": "Fallback Chains", + "fallbackChainsDesc": "Define provider fallback order per model", + "addChain": "+ Add Chain", + "modelName": "Model Name", + "modelNamePlaceholder": "claude-sonnet-4-20250514", + "providersCommaSeparated": "Providers (comma-separated, in priority order)", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", + "createChain": "Create Chain", + "noFallbackChains": "No Fallback Chains", + "noFallbackChainsDesc": "Create a chain to define provider fallback order for a model.", + "loadingFallbackChains": "Loading fallback chains...", + "deleteChainConfirm": "Delete fallback chain for \"{model}\"?", + "chainCreated": "Chain created for {model}", + "chainDeleted": "Chain deleted for {model}", + "failedCreateChain": "Failed to create chain", + "failedDeleteChain": "Failed to delete chain", + "deleteChain": "Delete chain", + "fillModelAndProviders": "Please fill model name and providers", + "addAtLeastOneProvider": "Add at least one provider", + "comboDefaultsTitle": "Combo Defaults", + "comboDefaultsGuideTitle": "How to tune combo defaults", + "comboDefaultsGuideHint1": "Keep retries low in low-latency flows; increase timeout only for long generation tasks.", + "comboDefaultsGuideHint2": "Use provider overrides when one provider needs different timeout/retry behavior than global defaults.", + "globalComboConfig": "Global combo configuration", + "defaultStrategy": "Default Strategy", + "defaultStrategyDesc": "Applied to new combos without explicit strategy", + "comboStrategyAria": "Combo strategy", + "priority": "Priority", + "weighted": "Weighted", + "contextRelay": "Context Relay", + "contextRelayDesc": "Priority-style routing with automatic context handoffs when account rotation happens", + "maxRetriesLabel": "Max Retries", + "retryDelayLabel": "Retry Delay (ms)", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Health Check", + "healthCheckDesc": "Pre-check provider availability", + "trackMetrics": "Track Metrics", + "trackMetricsDesc": "Record per-combo request metrics", + "providerOverrides": "Provider Overrides", + "providerOverridesDesc": "Override timeout and retries per provider. Provider settings override global defaults.", + "providerMaxRetriesAria": "{provider} max retries", + "providerTimeoutAria": "{provider} timeout ms", + "removeProviderOverrideAria": "Remove {provider} override", + "newProviderNamePlaceholder": "e.g. google, openai...", + "newProviderNameAria": "New provider name", + "retries": "retries", + "ms": "ms", + "saveComboDefaults": "Save Combo Defaults", + "maxNestingDepth": "Max Nesting Depth", + "concurrencyPerModel": "Concurrency / Model", + "queueTimeout": "Queue Timeout (ms)", + "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.", + "providerProfiles": "Provider Profiles", + "providerProfilesDesc": "Separate resilience settings for OAuth (session-based) and API Key (metered) providers. OAuth providers have stricter thresholds due to lower rate limits.", + "oauthProviders": "OAuth Providers", + "apiKeyProviders": "API Key Providers", + "transientCooldown": "Transient Cooldown", + "rateLimitCooldown": "Rate Limit Cooldown", + "maxBackoffLevel": "Max Backoff Level", + "cbThreshold": "CB Threshold", + "cbResetTime": "CB Reset Time", + "rateLimiting": "Rate Limiting", + "rateLimitingDesc": "API Key providers are automatically rate-limited with safe defaults. Limits are learned from response headers and adapt over time.", + "defaultSafetyNet": "Default Safety Net", + "rpm": "RPM", + "minGap": "Min Gap", + "maxConcurrent": "Max Concurrent", + "activeLimiters": "Active Limiters", + "noActiveLimiters": "No active rate limiters yet.", + "reservoir": "Reservoir", + "running": "Running", + "queued": "Queued", + "circuitBreakers": "Circuit Breakers", + "breakerStateClosed": "Closed", + "breakerStateOpen": "Open", + "breakerStateHalfOpen": "Half-Open", + "tripped": "{count} tripped", + "healthy": "{count} healthy", + "resetAll": "Reset All", + "noCircuitBreakers": "No circuit breakers active yet. They are created automatically when requests flow through the combo pipeline.", + "failures": "{count} failure(s)", + "policiesLocked": "Policies & Locked Identifiers", + "allOperational": "All systems operational — no lockouts or tripped breakers", + "loadingPolicies": "Loading policies...", + "lockedIdentifiers": "Locked Identifiers", + "unlockedIdentifier": "Unlocked: {identifier}", + "sinceDate": "since {date}", + "forceUnlock": "Force Unlock", + "unlocking": "Unlocking...", + "failedUnlock": "Failed to unlock", + "failedLoadWithStatus": "Failed to load: {status}", + "failedLoadResilience": "Failed to load resilience status", + "saveFailed": "Save failed", + "resetFailed": "Reset failed", + "loadingResilience": "Loading resilience status...", + "retry": "Retry", + "systemStorage": "System & Storage", + "allDataLocal": "All data stored locally on your machine", + "databasePath": "Database Path", + "exportDatabase": "Export Database", + "exportAll": "Export All (.tar.gz)", + "importDatabase": "Import Database", + "confirmDbImport": "Confirm Database Import", + "confirmDbImportDesc": "This will replace all current data with the content from {file}. A backup will be created automatically before the import.", + "yesImport": "Yes, Import", + "lastBackup": "Last Backup", + "noBackupYet": "No backup yet", + "backupNow": "Backup Now", + "backupRestore": "Backup & Restore", + "viewBackups": "View Backups", + "hide": "Hide", + "backupRetentionDesc": "Database snapshots are created automatically before restore and every 15 minutes when data changes. Retention: 24 hourly + 30 daily backups with smart rotation.", + "loadingBackups": "Loading backups...", + "noBackupsYet": "No backups available yet. Backups will be created automatically when data changes.", + "backupsAvailable": "{count} backup(s) available", + "refresh": "Refresh", + "confirm": "Confirm?", + "yes": "Yes", + "no": "No", + "restore": "Restore", + "invalidFileType": "Invalid file type. Only .sqlite files are accepted.", + "exportFailed": "Export failed", + "exportFailedWithError": "Export failed: {error}", + "fullExportFailedWithError": "Full export failed: {error}", + "backupCreated": "Backup created: {file}", + "restoreSuccess": "Restored! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "importSuccess": "Database imported! {connections} connections, {nodes} nodes, {combos} combos, {apiKeys} API keys.", + "minutesAgo": "{count}m ago", + "hoursAgo": "{count}h ago", + "daysAgo": "{count}d ago", + "backupReasonManual": "manual", + "backupReasonPreRestore": "pre-restore", + "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "noChangesSinceBackup": "No changes since last backup", + "backupFailed": "Backup failed", + "restoreFailed": "Restore failed", + "importFailed": "Import failed", + "errorDuringRestore": "An error occurred during restore", + "errorDuringImport": "An error occurred during import", + "modelPricing": "Model Pricing", + "modelPricingDesc": "Configure cost rates per model • All rates in $/1M tokens", + "registry": "Registry", + "priced": "Priced", + "searchProvidersModels": "Search providers or models...", + "showAll": "Show All", + "noProvidersMatch": "No providers match your search.", + "howPricingWorks": "How Pricing Works", + "cacheWrite": "Cache Write", + "unsaved": "unsaved", + "resetDefaults": "Reset Defaults", + "saveProvider": "Save Provider", + "model": "Model", + "models": "models", + "moreProviders": "{count} more providers", + "withPricing": "with pricing configured", + "policiesCircuitBreakers": "Policies & Circuit Breakers", + "activeIssuesDetected": "Active issues detected", + "off": "Off", + "resetPricingConfirm": "Reset all pricing for {provider} to defaults?", + "pricingDescInput": "Input: tokens sent to the model", + "pricingDescOutput": "Output: tokens generated", + "pricingDescCached": "Cached: reused input (~50% of input rate)", + "pricingDescReasoning": "Reasoning: thinking tokens (falls back to Output)", + "pricingDescCacheWrite": "Cache Write: creating cache entries (falls back to Input)", + "pricingDescFormula": "Cost = (input × input_rate) + (output × output_rate) + (cached × cached_rate) per million tokens.", + "pricingSettingsTitle": "Pricing Settings", + "totalModels": "Total Models", + "active": "Active", + "costCalculation": "Cost Calculation", + "costCalculationDesc": "Costs are calculated based on token usage and pricing rates configured for each model.", + "pricingFormat": "Pricing Format", + "pricingFormatDesc": "All rates are in $/1M tokens (dollars per million tokens).", + "tokenTypes": "Token Types", + "inputTokenDesc": "Standard prompt tokens", + "outputTokenDesc": "Completion/response tokens", + "cachedTokenDesc": "Cached input tokens (typically 50% of input rate)", + "reasoningTokenDesc": "Special reasoning/thinking tokens (fallback to output rate)", + "cacheCreationTokenDesc": "Tokens used to create cache entries (fallback to input rate)", + "customPricingNote": "You can override default pricing for specific models. Custom overrides take priority over auto-detected pricing.", + "editPricing": "Edit Pricing", + "viewFullDetails": "View Full Details", + "themeCoral": "Coral", + "adaptiveVolumeRouting": "Adaptive Volume Routing", + "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", + "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.", + "clearLkgpCache": "Clear LKGP Cache", + "lkgpCacheCleared": "LKGP cache cleared successfully", + "lkgpCacheClearFailed": "Failed to clear LKGP cache", + "days": "Days", + "lkgp": "LKGP Mode", + "lkgpDesc": "Last Known Good Provider (Predictable resilience)", + "maintenance": "Maintenance", + "purgeExpiredLogs": "Purge Expired Logs", + "purgeLogsFailed": "Failed to purge logs", + "contextOpt": "Context Optimized", + "contextOptDesc": "Routes based on context window requirements and conversation length", + "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", + "pricingSourceLiteLLM": "LiteLLM (Community)", + "clearSyncedPricingConfirm": "Clear all synced pricing data? Provider defaults will be used instead.", + "clearSyncedPricingFailed": "Failed to clear synced pricing", + "pricingSourceUser": "User Override", + "pageDescription": "Manage application settings, model aliases, pricing, and routing rules", + "pricingSyncStatus": "Sync Status", + "whitelist": "Whitelist", + "syncDisabled": "Sync Disabled", + "pricingLoadFailed": "Failed to load pricing data", + "pricingSyncDescription": "Automatically sync model pricing from external sources to keep cost calculations accurate", + "clearSyncedPricingSuccess": "Synced pricing data cleared", + "clearSyncedPricingFailedWithReason": "Failed to clear pricing: {reason}", + "pricingSourceDefault": "Built-in Default", + "pricingSyncSuccess": "Pricing synced successfully", + "enableSyncError": "Failed to toggle pricing sync", + "syncEnabled": "Sync Enabled", + "blacklist": "Blacklist", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Synced Models", + "budget": "Budget", + "pricingSyncTitle": "Pricing Sync", + "pricingResetFailedWithReason": "Failed to reset pricing: {reason}", + "tab": "Tab", + "pricingSavedProvider": "Pricing saved for {provider}", + "pricingSyncFailed": "Pricing sync failed", + "pricingSaveFailedWithReason": "Failed to save pricing: {reason}", + "pricingResetProvider": "Pricing reset for {provider}", + "nextSync": "Next Sync", + "pricingSyncFailedWithReason": "Pricing sync failed: {reason}", + "clearSyncedPricing": "Clear Synced Pricing" + }, + "translator": { + "title": "Translator", + "metaTitle": "Translator Playground | OmniRoute", + "metaDescription": "Debug, test, and visualize API format translations between providers", + "playgroundTitle": "Translator Playground", + "playground": "Playground", + "realtime": "Real-Time Translation Activity", + "chatTester": "Chat Tester", + "testBench": "Test Bench", + "liveMonitor": "Live Monitor", + "modeDescriptionPlayground": "Paste any API request body and see how OmniRoute translates it between provider formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Send real chat requests through OmniRoute and inspect the full round-trip: input, translated request, provider response, and translated output.", + "modeDescriptionTestBench": "Run predefined scenarios and compare compatibility across providers and models.", + "modeDescriptionLiveMonitor": "Watch translation events in real time as requests flow through OmniRoute.", + "modeDescriptionFallback": "Debug, test, and visualize how OmniRoute translates API requests between providers.", + "recentTranslations": "Recent Translations", + "noTranslations": "No translations yet", + "source": "Source", + "target": "Target", + "time": "Time", + "model": "Model", + "status": "Status", + "latency": "Latency", + "totalTranslations": "Total Translations", + "successful": "Successful", + "errors": "Errors", + "avgLatency": "Avg Latency", + "millisecondsShort": "{value}ms", + "notAvailableSymbol": "—", + "liveAutoRefreshing": "Live — Auto-refreshing", + "paused": "Paused", + "eventsAppearHint": "Translation events appear here as requests flow through OmniRoute. Use any of these methods to generate events:", + "chatTesterTab": "Chat Tester", + "testBenchTab": "Test Bench", + "externalApiCalls": "External API calls", + "ideCliIntegrations": "IDE/CLI integrations", + "inMemoryNote": "Note: Events are stored in-memory and reset when the server restarts.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Format Converter", + "formatConverterDescription": "Paste or type a JSON request body. The translator will auto-detect the source format and convert it to the target format. Use this to debug how OmniRoute translates requests between formats (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", + "input": "Input", + "output": "Output", + "auto": "Auto", + "swapFormats": "Swap formats", + "translateAction": "Translate", + "clear": "Clear", + "inputPlaceholder": "Paste a request body here or select a template below...", + "exampleTemplates": "Example Templates", + "exampleTemplatesHint": "— Click to load", + "templateLoadHint": "Template loads the request in {format} format. Change Source Format to load in a different format.", + "compatibilityTester": "Compatibility Tester", + "compatibilityReport": "Compatibility Report", + "testBenchDescription": "Run predefined scenarios (Simple Chat, Tool Calling, etc.) to verify translation and provider compatibility. Select a source format and target provider, then run all tests to see a compatibility percentage. Use this to find which features work across providers.", + "targetProvider": "Target Provider", + "runAllTests": "Run All Tests", + "runTest": "Run Test", + "reRun": "Re-run", + "running": "Running...", + "passed": "passed", + "failed": "failed", + "passedIconLabel": "✅ Passed", + "chunks": "chunks", + "scenarioSimpleChat": "Simple Chat", + "scenarioToolCalling": "Tool Calling", + "scenarioMultiTurn": "Multi-turn", + "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", + "translationPipeline": "Translation Pipeline", + "pipelineVisualization": "Pipeline visualization", + "pipelineVisualizationHint": "Send a message to see how your request flows through detection → translation → provider call.", + "chatTesterDescription": "Send messages as a specific client format and inspect each step of the translation pipeline.", + "chatTesterFlow": "Client Request → Format Detection → OpenAI Intermediate → Provider Format → Response", + "clickStepToInspect": "Click any step to inspect the data at that stage.", + "clientFormat": "Client Format", + "provider": "Provider", + "modelPlaceholder": "Select or type a model name...", + "sendMessageToSeePipeline": "Send a message to see the translation pipeline", + "chatMessageHintPrefix": "Your message will be formatted as a", + "chatMessageHintSuffix": "request, translated through the pipeline, and sent to the selected provider.", + "youWithFormat": "You ({format})", + "assistant": "Assistant", + "typeMessage": "Type a message...", + "send": "Send", + "clientRequest": "Client Request", + "clientRequestDescription": "The request body as your client would send it", + "formatDetected": "Format Detected", + "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "openaiIntermediate": "OpenAI Intermediate", + "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "providerFormat": "Provider Format", + "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerResponse": "Provider Response", + "providerResponseRawDescription": "The raw response from the provider API", + "providerResponseSseDescription": "The raw SSE stream from the provider API", + "unexpectedError": "An unexpected error occurred", + "error": "Error", + "errorMessage": "Error: {message}", + "requestFailed": "Request failed", + "noTextExtracted": "(No text extracted)", + "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). Use", + "liveMonitorDescriptionSuffix": ", or external API calls to generate events." + }, + "usage": { + "title": "Usage", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Budget Management", + "budgetSaved": "Budget limits saved", + "budgetSaveFailed": "Failed to save budget", + "loadingBudgetData": "Loading budget data...", + "noApiKeysTitle": "No API Keys", + "noApiKeysDescription": "Add API keys first to set up budget limits.", + "apiKey": "API Key", + "todaysSpend": "Today's Spend", + "thisMonth": "This Month", + "setLimits": "Set Limits", + "dailyLimitUsd": "Daily Limit (USD)", + "monthlyLimitUsd": "Monthly Limit (USD)", + "warningThresholdPercent": "Warning Threshold (%)", + "dailyLimitPlaceholder": "e.g. 5.00", + "monthlyLimitPlaceholder": "e.g. 50.00", + "warningThresholdPlaceholder": "80", + "saveLimits": "Save Limits", + "budgetOk": "Budget OK — {remaining} remaining", + "budgetExceeded": "Budget exceeded — requests may be blocked", + "totalRequests": "Total requests", + "noDataYet": "No data yet", + "latency": "Latency", + "latencyP50": "p50", + "latencyP95": "p95", + "latencyP99": "p99", + "promptCache": "Prompt Cache", + "systemHealth": "System Health", + "entries": "Entries", + "activeCount": "{count} active", + "openCircuitBreakersDetected": "Open circuit breakers detected", + "hitRate": "Hit Rate", + "hitsMisses": "Hits / Misses", + "circuitBreakers": "Circuit Breakers", + "lockedIPs": "Locked IPs", + "lockoutsAutoRefreshHint": "Per-model rate limit locks • Auto-refresh 10s", + "lockedCount": "{count, plural, one {# locked} other {# locked}}", + "timeLeft": "{time} left", + "howItWorks": "How It Works", + "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "define": "Define", + "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", + "run": "Run", + "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Each case is sent as a real API request.", + "evaluate": "Evaluate", + "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "evalSuites": "Evaluation Suites", + "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalsLoading": "Loading eval suites...", + "noEvalSuitesFound": "No Eval Suites Found", + "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", + "columnCase": "Case", + "columnStatus": "Status", + "columnLatency": "Latency", + "columnDetails": "Details", + "columnModel": "Model", + "columnStrategy": "Strategy", + "columnExpected": "Expected", + "statsSuites": "Suites", + "statsTestCases": "Test Cases", + "statsModels": "Models", + "statsCoverage": "Coverage", + "statsStrategiesCount": "{count} strategies", + "evaluationStrategies": "Evaluation Strategies", + "modelsUnderTest": "Models Under Test", + "searchSuitesPlaceholder": "Search suites...", + "passSuffix": "pass", + "casesCount": "{count, plural, one {# case} other {# cases}}", + "runEval": "Run Eval", + "runningProgress": "Running {current}/{total}...", + "passRate": "pass rate", + "summaryBreakdown": "{passed} passed · {failed} failed · {total} total", + "passedIconLabel": "✅ Passed", + "failedIconLabel": "❌ Failed", + "detailsContains": "Contains: \"{term}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Expected: \"{expected}\"", + "noResultsYet": "No results yet", + "testCasesCount": "Test Cases ({count})", + "noTestCasesDefined": "No test cases defined", + "runEvalHint": "Click \"Run Eval\" to execute all cases against your LLM endpoint. Each test sends a real request through OmniRoute.", + "notifyNoTestCases": "No test cases defined for this suite", + "notifyAllCasesPassed": "All {total} cases passed ✅", + "notifySomeCasesFailed": "{passed}/{total} passed, {failed} failed", + "notifyEvalRunFailed": "Eval run failed", + "notifyEvalTitle": "Eval: {name}", + "modelEvals": "Model Evaluations", + "evalsHeroDescription": "Test and validate your LLM endpoints by running predefined evaluation suites. Each suite contains test cases that send real prompts through OmniRoute and compare responses against expected criteria — helping you detect regressions, compare models, and ensure response quality across providers.", + "qualityValidation": "Quality Validation", + "modelComparison": "Model Comparison", + "regressionDetection": "Regression Detection", + "latencyBenchmarks": "Latency Benchmarks", + "modelLockouts": "Model Lockouts", + "noLockouts": "No models currently locked", + "activeSessions": "Active Sessions", + "noSessions": "No active sessions", + "sessionsHint": "Sessions appear as requests flow through the proxy", + "sessionsTrackedHint": "Tracked via request fingerprinting • Auto-refresh 5s", + "session": "Session", + "age": "Age", + "requests": "Requests", + "connection": "Connection", + "durationMillisecondsShort": "{value}ms", + "durationSecondsShort": "{value}s", + "durationMinutesShort": "{value}m", + "durationHoursShort": "{value}h", + "reasonSeparator": " - ", + "notAvailableSymbol": "-", + "providerLimits": "Provider Limits", + "noProviders": "No Providers Connected", + "connectProvidersForQuota": "Connect to providers with OAuth to track your API quota limits and usage.", + "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "filteredFromCount": "(filtered from {count})", + "autoRefresh": "Auto-refresh", + "refreshAll": "Refresh All", + "loadingQuotas": "Loading...", + "account": "Account", + "modelQuotas": "Model Quotas", + "lastUsed": "Last Refreshed", + "actions": "Actions", + "refreshQuota": "Refresh quota", + "today": "Today", + "tomorrow": "Tomorrow", + "dayTimeFormat": "{day}, {time}", + "inDuration": "in {duration}", + "notApplicable": "N/A", + "rawPlanWithValue": "Raw plan: {plan}", + "noPlanFromProvider": "No plan from provider", + "noQuotaData": "No quota data", + "ungrouped": "Ungrouped", + "viewFlat": "Flat", + "viewByEnvironment": "By Environment", + "noQuotaDataAvailable": "No quota data available", + "noAccountsForTierFilter": "No accounts found for tier filter", + "tierAll": "All", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", + "tierUltra": "Ultra", + "tierPro": "Pro", + "tierPlus": "Plus", + "tierFree": "Free", + "tierUnknown": "Unknown", + "suiteBuilderSaveFailed": "Failed to save suite", + "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", + "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", + "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", + "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" + }, + "modals": { + "waitingAuth": "Waiting for Authorization", + "verificationUrl": "Verification URL", + "yourCode": "Your Code", + "remoteAccess": "Remote access:", + "connectedSuccess": "Connected Successfully!", + "connectionFailed": "Connection Failed", + "chooseAuthMethod": "Choose your authentication method:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", + "googleAccount": "Google Account", + "githubAccount": "GitHub Account", + "importToken": "Import Token", + "pasteToken": "Paste refresh token from Kiro IDE.", + "awsRegion": "AWS Region", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCache": "Reading from AWS SSO cache", + "readingFromCursor": "Reading from Cursor IDE database", + "initializing": "Initializing...", + "pricingConfig": "Pricing Configuration", + "loadingPricing": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "noPricingData": "No pricing data available", + "noModelsFound": "No models found" + }, + "loggers": { + "allProviders": "All Providers", + "allModels": "All Models", + "allAccounts": "All Accounts", + "allApiKeys": "All API Keys", + "allTypes": "All Types", + "allLevels": "All Levels", + "modelAZ": "Model A-Z", + "modelZA": "Model Z-A", + "loadingLogs": "Loading logs...", + "loadingProxyLogs": "Loading proxy logs...", + "noLogEntries": "No log entries found", + "noPayloadData": "No payload data available for this log entry.", + "proxyEvent": "Proxy Event", + "proxy": "Proxy", + "level": "Level", + "directNative": "Direct (native)", + "combo": "Combo", + "inputTokens": "I:", + "outputTokens": "O:" + }, + "stats": { + "usageOverview": "Usage Overview", + "outputTokens": "Output Tokens", + "totalCost": "Total Cost", + "usageByModel": "Usage by Model", + "usageByAccount": "Usage by Account", + "failedToLoad": "Failed to load usage statistics.", + "tokenHealth": "Token Health", + "totalOAuth": "Total OAuth", + "healthy": "Healthy", + "warning": "Warning", + "errored": "Errored", + "lastCheck": "Last check", + "noData": "No data", + "share": "Share", + "unableToLoad": "Unable to load system metrics", + "product": "Product", + "resources": "Resources", + "company": "Company" + }, + "auth": { + "welcome": "Welcome", + "signIn": "Sign in", + "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", + "processing": "Processing...", + "pleaseWait": "Please wait while we complete the authorization.", + "authSuccess": "Authorization Successful!", + "copyUrl": "Copy This URL", + "accessDenied": "Access Denied", + "methodCliTitle": "Method 1: CLI Reset", + "methodCliDescription": "Run the following command on the server where OmniRoute is running:", + "methodCliHint": "This will prompt you to set a new password. The server must be stopped first.", + "methodManualTitle": "Method 2: Manual Reset", + "methodManualDescription": "Delete the password from the database and set a new one on startup:", + "setPasswordInYour": "Set a new password in your", + "fileLabelSuffix": "file:", + "newPasswordPlaceholder": "your_new_password", + "deleteSettingsFile": "Delete", + "orRemovePasswordHashField": "or remove the passwordHash field", + "restartServerWithNewPassword": "Restart the server - it will use the new password", + "backToLogin": "Back to Login", + "forgotPassword": "Forgot password?", + "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "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 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + }, + "landing": { + "brandName": "OmniRoute", + "navigateHome": "Navigate to home", + "toggleMenu": "Toggle menu", + "featuresLink": "Features", + "docsLink": "Docs", + "github": "GitHub", + "versionLive": "v1.0 is now live", + "oneEndpoint": "One Endpoint for", + "allProviders": "All AI Providers", + "heroDescription": "AI endpoint proxy with web dashboard - A JavaScript port of CLIProxyAPI. Works seamlessly with Claude Code, OpenAI Codex, Cline, RooCode, and other CLI tools.", + "getStarted": "Get Started", + "viewOnGithub": "View on GitHub", + "powerfulFeatures": "Powerful Features", + "featuresSubtitle": "Everything you need to manage your AI infrastructure in one place, built for scale.", + "featureUnifiedEndpointTitle": "Unified Endpoint", + "featureUnifiedEndpointDesc": "Access all providers via a single standard API URL.", + "featureEasySetupTitle": "Easy Setup", + "featureEasySetupDesc": "Get up and running in minutes with npx command.", + "featureModelFallbackTitle": "Model Fallback", + "featureModelFallbackDesc": "Automatically switch providers on failure or high latency.", + "featureUsageTrackingTitle": "Usage Tracking", + "featureUsageTrackingDesc": "Detailed analytics and cost monitoring across all models.", + "featureOAuthApiKeysTitle": "OAuth & API Keys", + "featureOAuthApiKeysDesc": "Securely manage credentials in one vault.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncDesc": "Sync your configurations across devices instantly.", + "featureCliSupportTitle": "CLI Support", + "featureCliSupportDesc": "Works with Claude Code, Codex, Cline, Cursor, and more.", + "featureDashboardTitle": "Dashboard", + "featureDashboardDesc": "Visual dashboard for real-time traffic analysis.", + "howItWorks": "How OmniRoute Works", + "howItWorksDescription": "Data flows seamlessly from your application through our intelligent routing layer to the best provider for the job.", + "howItWorksStep1Title": "1. CLI & SDKs", + "howItWorksStep1Description": "Your requests start from your favorite tools or our unified SDK. Just change the base URL.", + "howItWorksStep2Title": "2. OmniRoute Hub", + "howItWorksStep2Description": "Our engine analyzes the prompt, checks provider health, and routes for lowest latency or cost.", + "howItWorksStep3Title": "3. AI Providers", + "howItWorksStep3Description": "The request is fulfilled by OpenAI, Anthropic, Gemini, or others instantly.", + "getStartedIn30Seconds": "Get Started in 30 Seconds", + "getStartedDescription": "Install OmniRoute, configure your providers via web dashboard, and start routing AI requests.", + "installOmniRoute": "Install OmniRoute", + "installStepDescription": "Run npx command to start the server instantly", + "openDashboard": "Open Dashboard", + "openDashboardStepDescription": "Configure providers and API keys via web interface", + "routeRequests": "Route Requests", + "routeRequestsStepDescription": "Point your CLI tools to {endpoint}", + "terminal": "terminal", + "copy": "Copy", + "copied": "✓ Copied", + "startingOmniRoute": "Starting OmniRoute...", + "serverRunningOnLabel": "Server running on", + "dashboardLabel": "Dashboard", + "readyToRoute": "Ready to route! ✓", + "configureProvidersNote": "📝 Configure providers in dashboard or use environment variables", + "dataLocation": "Data Location:", + "dataLocationMacLinux": " macOS/Linux:", + "dataLocationWindows": " Windows:", + "product": "Product", + "dashboardLink": "Dashboard", + "changelog": "Changelog", + "resources": "Resources", + "documentation": "Documentation", + "npm": "NPM", + "legal": "Legal", + "mitLicense": "MIT License", + "footerTagline": "The unified endpoint for AI generation. Connect, route, and manage your AI providers with ease.", + "copyright": "© {year} OmniRoute. All rights reserved.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", + "flowToolCursor": "Cursor", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Interactive diagram visible on desktop", + "ctaTitle": "Ready to Simplify Your AI Infrastructure?", + "ctaDescription": "Join developers who are streamlining their AI integrations with OmniRoute. Open source and free to start.", + "startFree": "Start Free", + "readDocumentation": "Read Documentation" + }, + "docs": { + "title": "Documentation", + "quickStart": "Quick Start", + "features": "Features", + "supportedProviders": "Supported Providers", + "supportedProvidersToc": "Providers", + "commonUseCases": "Common Use Cases", + "clientCompatibility": "Client Compatibility", + "protocolsToc": "Protocols", + "apiReference": "API Reference", + "managementApiReference": "Management API Reference", + "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "method": "Method", + "path": "Path", + "notes": "Notes", + "modelPrefixes": "Model Prefixes", + "prefix": "Prefix", + "troubleshooting": "Troubleshooting", + "supportsChat": "Supports both chat and responses endpoints.", + "oauthAutoRefresh": "OAuth connection with automatic token refresh.", + "fullStreaming": "Full streaming support for all models.", + "docsLabel": "Docs", + "docsHeroDescription": "AI gateway for multi-provider LLMs. One endpoint for OpenAI, Anthropic, Gemini, DeepSeek, GitHub Copilot, Claude Code, Cursor, and 100+ more providers.", + "openDashboard": "Open Dashboard", + "endpointPage": "Endpoint Page", + "github": "GitHub", + "reportIssue": "Report Issue", + "onThisPage": "On this page", + "documentationVersion": "Documentation - v{version}", + "quickStartStep1Title": "1. Install and run", + "quickStartStep1Prefix": "Run", + "quickStartStep1Middle": "or clone from GitHub and run", + "quickStartStep2Title": "2. Create API key", + "quickStartStep2Text": "Go to Endpoint -> Registered Keys. Generate one key per environment.", + "quickStartStep3Title": "3. Connect providers", + "quickStartStep3Text": "Add provider accounts via OAuth login, API key, or free-tier auto-connect.", + "quickStartStep4Title": "4. Set client base URL", + "quickStartStep4Prefix": "Point your IDE or API client to", + "quickStartStep4Suffix": "Use provider prefix, for example", + "featureRoutingTitle": "Multi-Provider Routing", + "featureRoutingText": "Route requests to 30+ AI providers through a single OpenAI-compatible endpoint. Supports chat, responses, audio, and image APIs.", + "featureCombosTitle": "Combos and Balancing", + "featureCombosText": "Create model combos with fallback chains and balancing strategies: round-robin, priority, random, least-used, and cost-optimized.", + "featureUsageTitle": "Usage and Cost Tracking", + "featureUsageText": "Real-time token counting, cost calculation per provider/model, and detailed usage breakdown by API key and account.", + "featureAnalyticsTitle": "Analytics Dashboard", + "featureAnalyticsText": "Visual analytics with charts for requests, tokens, errors, latency, costs, and model popularity over time.", + "featureHealthTitle": "Health Monitoring", + "featureHealthText": "Live health checks, provider status, circuit breaker states, and automatic rate limit detection with exponential backoff.", + "featureCliTitle": "CLI Tools", + "featureCliText": "Manage IDE configurations, export/import backups, discover codex profiles, and configure settings from the dashboard.", + "featureSecurityTitle": "Security and Policies", + "featureSecurityText": "API key authentication, IP filtering, prompt injection guard, domain policies, session management, and audit logging.", + "featureCloudSyncTitle": "Cloud Sync", + "featureCloudSyncText": "Sync your configuration to Cloudflare Workers for remote access with encrypted credentials and automatic failover.", + "providersAcrossConnectionTypes": "{count} providers across three connection types.", + "manageProviders": "Manage Providers", + "providersCount": "{count} providers", + "providerTypeFree": "Free Tier", + "providerTypeOAuth": "OAuth", + "providerTypeApiKey": "API Key", + "useCaseSingleEndpointTitle": "Single endpoint for many providers", + "useCaseSingleEndpointText": "Point clients to one base URL and route by model prefix (for example: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback and model switching with combos", + "useCaseFallbackText": "Create combo models in Dashboard and keep client config stable while providers rotate internally.", + "useCaseUsageVisibilityTitle": "Usage, cost and debug visibility", + "useCaseUsageVisibilityText": "Track tokens and cost by provider, account, and API key in Usage and Analytics tabs.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "Base URL", + "chatEndpointLabel": "Chat endpoint", + "modelRecommendationLabel": "Model recommendation: explicit prefix", + "clientCodexTitle": "Codex / GitHub Copilot Models", + "clientCodexBullet1": "Use model IDs with", + "clientCodexBullet2": "Codex-family models auto-route to", + "clientCodexBullet3": "Non-Codex models continue on", + "clientCursorTitle": "Cursor IDE", + "clientCursorBullet1": "Use", + "clientCursorBullet1Suffix": "prefix for Cursor models.", + "clientCursorBullet2": "OAuth connection - login from the Providers page.", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Use", + "clientClaudeBullet1Middle": "(Claude) or", + "clientClaudeBullet1Suffix": "(Antigravity) prefix.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute as an OpenAI-compatible base URL and keep explicit provider prefixes for deterministic routing.", + "clientWindsurfBullet2": "Point models to `/v1/chat/completions` for general traffic and preserve `/v1/responses` for Codex-style flows.", + "clientWindsurfBullet3": "Use Dashboard -> CLI Tools for a ready-made Windsurf configuration guide.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline works best with explicit provider/model prefixes so the router never has to guess the backend.", + "clientClineBullet2": "Use `/v1/chat/completions` for general models and reuse the same OmniRoute base URL across different accounts.", + "clientClineBullet3": "Use the Providers dashboard to validate OAuth/API key before debugging Cline runtime issues.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute as a stable base URL while rotating accounts or provider combos underneath.", + "clientKimiBullet2": "Prefer prefixed models in coding flows so fallback and audit trail remain explicit.", + "clientKimiBullet3": "Use `/v1/responses` when you want native Responses-style routing for tool-using clients.", + "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.", + "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.", + "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.", + "endpointChatNote": "OpenAI-compatible chat endpoint (default).", + "endpointResponsesNote": "Responses API endpoint (Codex, o-series).", + "endpointModelsNote": "Model catalog for all connected providers.", + "endpointAudioNote": "Audio transcription (Deepgram, AssemblyAI).", + "endpointSpeechNote": "Text-to-speech generation (ElevenLabs, OpenAI TTS).", + "endpointEmbeddingsNote": "Text embedding generation (OpenAI, Cohere, Voyage).", + "endpointImagesNote": "Image generation (NanoBanana).", + "endpointRewriteChatNote": "Rewrite helper for clients without /v1.", + "endpointRewriteResponsesNote": "Rewrite helper for Responses without /v1.", + "endpointRewriteModelsNote": "Rewrite helper for model discovery without /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.", + "modelPrefixesDescriptionStart": "Use the provider prefix before the model name to route to a specific provider. Example:", + "modelPrefixesDescriptionEnd": "routes to GitHub Copilot.", + "provider": "Provider", + "type": "Type", + "troubleshootingModelRouting": "If the client fails with model routing, use explicit provider/model (for example: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "If you receive ambiguous model errors, pick a provider prefix instead of a bare model ID.", + "troubleshootingCodexFamily": "For GitHub Codex-family models, keep model as gh/codex-model; router selects /responses automatically.", + "troubleshootingTestConnection": "Use Dashboard > Providers > Test Connection before testing from IDEs or external clients.", + "troubleshootingCircuitBreaker": "If a provider shows circuit breaker open, wait for the cooldown or check Health page for details.", + "troubleshootingOAuth": "For OAuth providers, re-authenticate if tokens expire. Check the provider card status indicator.", + "endpointCompletionsNote": "Legacy completions endpoint for text generation.", + "endpointModerationsNote": "Content moderation and safety classification.", + "endpointRerankNote": "Document reranking for retrieval-augmented generation (Cohere, Jina).", + "endpointSearchNote": "Web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity).", + "endpointSearchAnalyticsNote": "Analytics and metrics for search requests.", + "endpointVideoNote": "Video generation (ComfyUI, SD WebUI workflows).", + "endpointMusicNote": "Music generation via ComfyUI workflows.", + "endpointMessagesNote": "Anthropic-native messages endpoint.", + "endpointCountTokensNote": "Count tokens for a given message payload.", + "endpointFilesNote": "File upload for multimodal inputs.", + "endpointBatchesNote": "Batch processing for bulk API requests.", + "endpointWsNote": "WebSocket endpoint for real-time streaming.", + "mgmtProvidersListNote": "List all registered provider connections.", + "mgmtProvidersCreateNote": "Create a new provider connection.", + "mgmtProvidersUpdateNote": "Update an existing provider connection.", + "mgmtProvidersDeleteNote": "Delete a provider connection.", + "mgmtProvidersTestNote": "Test connectivity and authentication for a provider.", + "mgmtProvidersModelsNote": "List available models for a specific provider.", + "mgmtSettingsGetNote": "Retrieve current application settings.", + "mgmtSettingsUpdateNote": "Update application settings.", + "mgmtPayloadRulesGetNote": "Get payload transformation rules.", + "mgmtPayloadRulesUpdateNote": "Update payload transformation rules.", + "mcpToolsTitle": "MCP Tools", + "mcpToolsDescription": "OmniRoute exposes {count} tools via Model Context Protocol for agent orchestration.", + "mcpToolsCount": "{count} tools", + "mcpToolsToc": "MCP Tools", + "mcpToolsRoutingTitle": "Routing & Discovery", + "mcpToolsRoutingDesc": "Health checks, combo management, quota monitoring, cost reporting, and model catalog access.", + "mcpToolsOperationsTitle": "Operations & Strategy", + "mcpToolsOperationsDesc": "Route simulation, budget guards, strategy switching, resilience profiles, and provider metrics.", + "mcpToolsCacheTitle": "Cache Management", + "mcpToolsCacheDesc": "View cache statistics and flush semantic or signature caches.", + "mcpToolsMemoryTitle": "Memory", + "mcpToolsMemoryDesc": "Search, add, and clear persistent conversational memory entries.", + "mcpToolsSkillsTitle": "Skills", + "mcpToolsSkillsDesc": "List, enable, execute, and monitor custom skill executions.", + "featureAutoComboTitle": "Auto-Combo", + "featureAutoComboText": "Automatically create optimized combos based on your connected providers, usage patterns, and model capabilities.", + "featureSearchTitle": "Web Search", + "featureSearchText": "Integrated web search with 5 providers (Serper, Brave, Exa, Tavily, Perplexity) including analytics and cost tracking.", + "featureMemoryTitle": "Memory System", + "featureMemoryText": "Persistent conversational memory with extraction, injection, retrieval, and summarization across sessions.", + "featureSkillsTitle": "Skills Framework", + "featureSkillsText": "Extensible skill system with built-in and custom skills, sandbox execution, request interception, and context injection.", + "featureAcpTitle": "Agent Communication", + "featureAcpText": "Agent Communication Protocol (ACP) registry for managing agent-to-agent workflows and tool orchestration.", + "protocolAcpTitle": "ACP (Agent Communication)", + "protocolAcpDesc": "Register and manage agents via the ACP registry for inter-agent communication and tool sharing.", + "protocolAcpStep1": "Navigate to Dashboard → Agents to view registered ACP agents.", + "protocolAcpStep2": "Register new agents with capabilities and endpoint configuration.", + "protocolAcpStep3": "Use CLI Tools to configure agent communication channels." + }, + "legal": { + "privacyPolicy": "Privacy Policy", + "termsOfService": "Terms of Service", + "providerConfigurations": "Provider configurations", + "apiKeys": "API keys", + "usageLogs": "Usage logs", + "applicationSettings": "Application settings", + "viewExportAnalytics": "View and export usage analytics", + "clearHistory": "Clear usage history at any time", + "configureRetention": "Configure log retention policies", + "backupRestore": "Back up and restore your database", + "privacyMetadataTitle": "Privacy Policy | OmniRoute", + "privacyMetadataDescription": "Privacy policy for the OmniRoute AI API proxy router.", + "termsMetadataTitle": "Terms of Service | OmniRoute", + "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", + "privacySection1Title": "1. Local-First Architecture", + "privacySection1Text": "OmniRoute is designed as a local-first application. All data processing and storage occurs entirely on your machine. There is no centralized server collecting your information.", + "privacySection2Title": "2. Data We Store", + "privacyDataStoredIn": "The following data is stored locally in", + "privacyDataProviderConfigurationsDesc": "connection URLs, provider types, and priority settings", + "privacyDataApiKeysDesc": "encrypted and stored locally for authenticating with AI providers", + "privacyDataUsageLogsDesc": "request counts, token usage, model names, timestamps, and response times", + "privacyDataApplicationSettingsDesc": "theme preferences, routing strategy, and combo configurations", + "privacySection3Title": "3. No Telemetry", + "privacySection3Text": "OmniRoute does not collect telemetry, analytics, or crash reports. No data is sent to us or any third party. Your usage patterns, API calls, and configurations remain entirely private.", + "privacySection4Title": "4. Third-Party AI Providers", + "privacySection4Text": "When you make API calls through OmniRoute, your requests are forwarded to the AI providers you have configured (for example: OpenAI, Anthropic, Google). These providers have their own privacy policies that govern how they handle your data. Please review:", + "privacyOpenAiPolicy": "OpenAI Privacy Policy", + "privacyAnthropicPolicy": "Anthropic Privacy Policy", + "privacyGooglePolicy": "Google Privacy Policy", + "privacySection5Title": "5. Cloud Sync (Optional)", + "privacySection5Text": "If you enable the optional cloud sync feature, provider configurations and API keys may be transmitted to a configured cloud endpoint. This feature is disabled by default and requires explicit opt-in.", + "privacySection6Title": "6. Logging", + "privacyLoggingIntro": "Request logs can be configured through the dashboard settings. You can:", + "privacySection7Title": "7. Your Rights", + "privacySection7TextStart": "Since all data is stored locally, you have full control. You can delete your data at any time by removing the", + "privacySection7TextEnd": "directory or using the database backup and restore features in the dashboard.", + "termsSection1Title": "1. Overview", + "termsSection1Text": "OmniRoute is a local-first AI API proxy router that operates entirely on your machine. It routes requests to multiple AI providers with load balancing, failover, and usage tracking.", + "termsSection2Title": "2. User Responsibilities", + "termsResponsibilityApiKeys": "You are solely responsible for managing your own API keys and credentials for third-party AI providers (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "You must comply with the terms of service of each AI provider whose API you access through OmniRoute.", + "termsResponsibilitySecurity": "You are responsible for the security of your local OmniRoute installation, including setting a password and restricting network access.", + "termsSection3Title": "3. How It Works", + "termsSection3Text": "OmniRoute acts as an intermediary proxy. API calls sent to OmniRoute are translated and forwarded to your configured AI providers. OmniRoute does not modify the content of your requests or responses beyond the necessary protocol translation.", + "termsSection4Title": "4. Data Handling", + "termsDataStoredLocally": "All data is stored locally on your machine in a SQLite database.", + "termsNoTransmission": "OmniRoute does not transmit any data to external servers unless you explicitly enable cloud sync features.", + "termsDataLocationText": "Usage logs, API keys, and configuration are stored in", + "termsSection5Title": "5. Disclaimer", + "termsSection5Text": "OmniRoute is provided \"as is\" without warranty of any kind. We are not responsible for any costs incurred through API usage, service disruptions, or data loss. Always maintain backups of your configuration.", + "termsSection6Title": "6. Open Source", + "termsSection6Text": "OmniRoute is open-source software. You are free to inspect, modify, and distribute it under the terms of its license." + }, + "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.", + "cliToolsRedirectTitle": "Cli Tools Redirect Title", + "cliToolsRedirectDesc": "Cli Tools Redirect Desc", + "spawnArgsPlaceholder": "Spawn Args Placeholder", + "binaryNamePlaceholder": "Binary Name Placeholder", + "versionCommandPlaceholder": "Version Command Placeholder", + "architectureTitle": "Architecture Title", + "flowLocalBinary": "Flow Local Binary", + "flowOmniRoute": "Flow Omni Route", + "agentNamePlaceholder": "Agent Name Placeholder", + "architectureDescription": "Architecture Description", + "flowExecute": "Flow Execute", + "flowSpawn": "Flow Spawn", + "cliToolsRedirectCta": "Cli Tools Redirect Cta" + }, + "templateNames": { + "simple-chat": "Simple Chat", + "streaming": "Streaming", + "system-prompt": "System Prompt", + "thinking": "Thinking", + "tool-calling": "Tool Calling", + "multi-turn": "Multi-turn" + }, + "templateDescriptions": { + "simple-chat": "Basic chat template with system message", + "streaming": "Template for streaming responses", + "system-prompt": "Template with custom system prompt", + "thinking": "Template with reasoning/thinking budget", + "tool-calling": "Template for tool/function calling", + "multi-turn": "Template for multi-turn conversations" + }, + "templatePayloads": { + "simpleChat": { + "system": "You are a helpful AI assistant.", + "userGreeting": "Hello! How can I help you today?" + }, + "streaming": { + "prompt": "Write a story about" + }, + "systemPrompt": { + "question": "What is the meaning of life?", + "systemInstruction": "Provide a thoughtful, philosophical answer." + }, + "thinking": { + "question": "Explain quantum computing" + }, + "toolCalling": { + "cityNameDescription": "The name of the city to get weather for", + "toolDescription": "Get current weather for a location", + "userWeather": "What's the weather in Tokyo?" + }, + "multiTurn": { + "system": "You are a helpful assistant.", + "assistantExample": "I'd be happy to help you with that.", + "userInitial": "I need help with", + "userFollowUp": "Can you elaborate on that?" + } + }, + "cache": { + "title": "Cache Management", + "description": "Monitor provider prompt cache efficiency and local semantic response reuse.", + "refresh": "Refresh", + "clearAll": "Clear Semantic Cache", + "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", + "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", + "clearSuccess": "Semantic cache cleared. {count} entries removed.", + "clearError": "Failed to clear cache.", + "unavailable": "Cache unavailable", + "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "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", + "cachedTokens": "Cache Read Tokens", + "cacheCreationTokens": "Cache Write Tokens", + "cacheMetrics": "Prompt Cache Metrics", + "withCacheControl": "With Cache Control", + "cachedTokensRead": "Read from cache", + "cacheCreationWrite": "Written to cache", + "cacheReuseRatio": "Cache Reuse Ratio", + "cacheReuseRatioDesc": "Cache read 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", + "inputTokens": "Total Input Tokens", + "cachedTokensCol": "Cache Read", + "cacheCreation": "Cache Write", + "trend24h": "Cache Trend (24h)", + "peakCached": "Peak cached", + "cached": "Cached", + "overview": "Overview", + "entries": "Entries", + "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", + "deduplicatedRequests": "Deduplicated Requests", + "savedCalls": "Saved API Calls", + "totalProcessed": "Total Requests Processed", + "disabled": "Disabled", + "totalRequests": "Total Requests" + }, + "proxyConfigModal": { + "levelGlobal": "Global", + "levelProvider": "Provider", + "levelCombo": "Combo", + "levelKey": "Key", + "levelDirect": "Direct (no proxy)", + "titleGlobal": "Global Proxy Configuration", + "titleLevel": "{level} Proxy — {label}", + "loading": "Loading proxy configuration...", + "inheritingFrom": "Inheriting from", + "source": "Source", + "savedProxy": "Saved Proxy", + "custom": "Custom", + "selectSavedProxyPlaceholder": "Select saved proxy...", + "proxyType": "Proxy Type", + "host": "Host", + "hostPlaceholder": "1.2.3.4 or proxy.example.com", + "port": "Port", + "authOptional": "Authentication (optional)", + "username": "Username", + "usernamePlaceholder": "Username", + "password": "Password", + "passwordPlaceholder": "Password", + "connected": "Connected", + "ip": "IP:", + "connectionFailed": "Connection failed", + "testConnection": "Test connection", + "clear": "Clear", + "cancel": "Cancel", + "save": "Save", + "errorSelectSavedProxy": "Please select a saved proxy first.", + "errorSelectProxyFirst": "Please select a proxy first.", + "errorProxyNotFound": "Selected proxy not found.", + "errorClearSavedProxy": "Failed to clear saved proxy", + "errorSaveProxy": "Failed to save proxy configuration", + "errorClearProxy": "Failed to clear proxy configuration", + "errorSocks5Hidden": "SOCKS5 is configured but hidden because NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false." + }, + "oauthModal": { + "title": "Connect {providerName}", + "waiting": "Waiting for authorization", + "completeAuthInPopup": "Complete authorization in popup.", + "popupClosedHint": "If the popup closed without redirecting back (e.g. Qoder), this dialog will auto-switch to manual URL entry mode.", + "popupBlocked": "Popup blocked? Enter URL manually", + "deviceCodeVisitUrl": "Visit the URL below and enter code:", + "deviceCodeVerificationUrl": "Verification URL", + "deviceCodeYourCode": "Your code", + "deviceCodeWaiting": "Waiting for authorization...", + "googleOAuthWarning": "Remote access + Google OAuth: Default credentials only accept redirects to localhost. After authorizing, your browser will try to open localhost — copy that full URL and paste it below. For fully remote use without this manual step, configure your own OAuth credentials.", + "remoteAccessInfo": "Remote access: Since you're accessing OmniRoute remotely, after authorization you'll see an error page (localhost not found). This is normal — just copy the full URL from your browser address bar and paste it below.", + "step1OpenUrl": "Step 1: Open this URL in your browser", + "copy": "Copy", + "step2PasteCallback": "Step 2: Paste callback URL or authorization code here", + "step2Hint": "After authorization, paste the full callback URL. For Claude Code and Cline, you can also paste the authentication code directly, e.g. code#state.", + "connect": "Connect", + "cancel": "Cancel", + "success": "Connection successful!", + "successMessage": "Your {providerName} account has been connected.", + "done": "Done", + "error": "Connection failed", + "tryAgain": "Try again" + }, + "cursorAuthModal": { + "title": "Connect Cursor IDE", + "autoDetecting": "Auto-detecting tokens...", + "readingFromCursor": "Reading from Cursor IDE or cursor-agent", + "tokensAutoDetected": "Tokens successfully auto-detected from Cursor IDE!", + "cursorNotDetected": "Cursor IDE not detected. Please manually paste your token.", + "accessToken": "Access Token", + "required": "*", + "accessTokenPlaceholder": "Access token will auto-populate...", + "machineId": "Machine ID", + "optional": "(optional)", + "machineIdPlaceholder": "Machine ID will auto-populate...", + "importing": "Importing...", + "importToken": "Import Token", + "cancel": "Cancel", + "errorAutoDetect": "Unable to auto-detect tokens", + "errorAutoDetectFailed": "Auto-detect tokens failed", + "errorEnterToken": "Please enter access token", + "errorImportFailed": "Import failed" + }, + "pricingModal": { + "title": "Pricing Configuration", + "loading": "Loading pricing data...", + "pricingRatesFormat": "Pricing Rates Format", + "ratesDescription": "All rates are in dollars per million tokens ($/1M tokens). Example: Input rate of 2.50 means $2.50 per 1,000,000 input tokens.", + "model": "Model", + "input": "Input", + "output": "Output", + "cached": "Cached", + "reasoning": "Reasoning", + "cacheCreation": "Cache Creation", + "noPricingData": "No pricing data available", + "resetToDefaults": "Reset to defaults", + "cancel": "Cancel", + "saving": "Saving...", + "saveChanges": "Save changes", + "resetConfirm": "Reset all pricing to defaults? This cannot be undone.", + "errorSaveFailed": "Failed to save pricing", + "errorResetFailed": "Failed to reset pricing" + }, + "proxyRegistry": { + "title": "Proxy Registry", + "description": "Store reusable proxies and track assignments.", + "importLegacy": "Import Legacy", + "bulkAssign": "Bulk Assign", + "addProxy": "Add Proxy", + "loading": "Loading proxies...", + "noProxies": "No saved proxies yet.", + "tableName": "Name", + "tableEndpoint": "Endpoint", + "tableStatus": "Status", + "tableHealth": "Health (24h)", + "tableUsage": "Usage", + "tableActions": "Actions", + "test": "Test", + "edit": "Edit", + "delete": "Delete", + "modalCreateTitle": "Create Proxy", + "modalEditTitle": "Edit Proxy", + "labelName": "Name", + "labelType": "Type", + "labelHost": "Host", + "labelPort": "Port", + "labelUsername": "Username", + "labelPassword": "Password", + "labelRegion": "Region", + "labelStatus": "Status", + "labelNotes": "Notes", + "usernamePlaceholderEdit": "Leave blank to keep current username", + "passwordPlaceholderEdit": "Leave blank to keep current password", + "statusActive": "Active", + "statusInactive": "Inactive", + "cancel": "Cancel", + "save": "Save", + "bulkModalTitle": "Bulk Proxy Assignment", + "bulkLabelScope": "Scope", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Clear assignment)", + "bulkLabelScopeIds": "Scope IDs (comma or newline separated)", + "bulkScopeIdsPlaceholder": "provider-openai,provider-anthropic", + "bulkApply": "Apply", + "errorLoadFailed": "Failed to load proxy registry", + "errorNameHostRequired": "Name and host are required", + "errorSaveFailed": "Failed to save proxy", + "errorDeleteFailed": "Failed to delete proxy", + "errorForceDeleteConfirm": "This proxy is still assigned. Force delete and remove all assignments?", + "errorMigrateFailed": "Failed to migrate legacy proxy config", + "errorBulkFailed": "Failed to execute bulk assignment", + "success": "✓", + "failure": "✗", + "failed": "Failed", + "successRate": "{rate}% success", + "avgLatency": "{latency}ms average", + "assignmentsCount": "{count} assignments", + "noData": "—", + "testSuccess": "✓ {ip}", + "testLatency": "{latency}ms", + "testFailure": "✗ {error}" + }, + "playground": { + "title": "Model Playground", + "description": "Test any model directly from the dashboard. Select provider, model, and endpoint type, then send a request to see the raw response.", + "endpoint": "Endpoint", + "provider": "Provider", + "model": "Model", + "accountKey": "Account / Key", + "autoAccounts": "Auto ({count} accounts)", + "noAccounts": "No accounts", + "send": "Send", + "cancel": "Cancel", + "audioFile": "Audio File", + "attachImages": "Attach Images (Vision)", + "multipartFormData": "multipart/form-data", + "upToImages": "Up to 4 images", + "selectAudioFile": "Select audio file for transcription (mp3, wav, m4a, ogg, flac…)", + "clearAll": "Clear All", + "request": "Request", + "response": "Response", + "transcription": "Transcription", + "copy": "Copy", + "resetToDefault": "Reset to default", + "downloadAudio": "Download audio", + "copyText": "Copy text", + "transcriptionHint": "Transcription uses multipart/form-data. Upload the audio file above — the JSON below controls extra parameters (model, language).", + "imagesGenerated": "Generated {count} images", + "generatedImage": "Generated image {index}", + "save": "Save", + "endpointOptions": { + "chat": "Chat completions", + "responses": "Responses", + "images": "Image generation", + "embeddings": "Embeddings", + "speech": "Text-to-speech", + "transcription": "Audio transcription", + "video": "Video generation", + "music": "Music generation", + "rerank": "Rerank", + "search": "Web search" + } + }, + "requestLogger": { + "recording": "Recording", + "paused": "Paused", + "pipelineLogsOn": "Pipeline logs on", + "pipelineLogsOff": "Pipeline logs off", + "updatingPipelineLogs": "Updating pipeline logs...", + "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", + "allProviders": "All providers", + "allModels": "All models", + "allAccounts": "All accounts", + "allApiKeys": "All API keys", + "total": "Total", + "ok": "Success", + "err": "Error", + "combo": "Combo", + "keys": "Keys", + "shown": "Shown", + "sortNewest": "Newest", + "sortOldest": "Oldest", + "sortTokensDesc": "Tokens ↓", + "sortTokensAsc": "Tokens ↑", + "sortDurationDesc": "Duration ↓", + "sortDurationAsc": "Duration ↑", + "sortStatusDesc": "Status ↓", + "sortStatusAsc": "Status ↑", + "sortModelAsc": "Model A-Z", + "sortModelDesc": "Model Z-A", + "statusFilters": { + "all": "All", + "error": "Error", + "success": "Success", + "combo": "Combo" + }, + "columns": { + "status": "Status", + "cacheSource": "Cache Source", + "model": "Model", + "requested": "Requested", + "provider": "Provider", + "protocol": "Request Protocol", + "account": "Account", + "apiKey": "API Key", + "combo": "Combo", + "tokens": "Tokens", + "tps": "TPS", + "duration": "Duration", + "time": "Time" + }, + "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}." + }, + "endpointOptions": { + "speech": "Speech", + "search": "Search", + "images": "Images", + "chat": "Chat", + "music": "Music", + "responses": "Responses", + "rerank": "Rerank", + "video": "Video", + "embeddings": "Embeddings", + "transcription": "Transcription" + }, + "toolDescriptions": { + "cline": "Cline", + "openclaw": "Openclaw", + "droid": "Droid", + "codex": "Codex", + "claude": "Claude", + "kilo": "Kilo" + } +}