{
  "common": {
    "save": "Tallenna",
    "cancel": "Peruuta",
    "delete": "Poista",
    "loading": "Ladataan...",
    "error": "Tapahtui virhe",
    "success": "Menestystä",
    "confirm": "Oletko varma?",
    "refresh": "Päivitä",
    "close": "Sulje",
    "add": "Lisää",
    "edit": "Muokkaa",
    "search": "Etsi",
    "back": "Takaisin",
    "next": "Seuraavaksi",
    "submit": "Lähetä",
    "reset": "Nollaa",
    "copy": "Kopioi",
    "copied": "Kopioitu!",
    "enabled": "Käytössä",
    "disabled": "Ei käytössä",
    "active": "Aktiivinen",
    "inactive": "Ei-aktiivinen",
    "noData": "Tietoja ei ole saatavilla",
    "nothingHere": "Nothing here yet",
    "configure": "Määritä",
    "manage": "Hallitse",
    "name": "Nimi",
    "actions": "Toiminnot",
    "status": "Tila",
    "type": "Kirjoita",
    "model": "Malli",
    "models": "mallit",
    "provider": "Palveluntarjoaja",
    "account": "Tili",
    "time": "Aika",
    "details": "Yksityiskohdat",
    "created": "Luotu",
    "lastUsed": "Last Refreshed",
    "loadMore": "Lataa lisää",
    "noResults": "Tuloksia ei löytynyt",
    "reloadPage": "Lataa sivu uudelleen",
    "connected": "Yhdistetty",
    "disconnected": "Yhteys katkaistu",
    "notConfigured": "Ei määritetty",
    "testConnection": "Testaa yhteys",
    "enable": "Ota käyttöön",
    "disable": "Poista käytöstä",
    "columns": "Sarakkeet",
    "newest": "Uusin",
    "oldest": "Vanhin",
    "all": "Kaikki",
    "none": "Ei mitään",
    "yes": "Kyllä",
    "no": "Ei",
    "on": "__MISSING__:ON",
    "off": "__MISSING__:OFF",
    "warning": "Varoitus",
    "note": "Huom",
    "free": "Ilmainen",
    "skipToContent": "Siirry sisältöön",
    "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
    "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
    "accept": "Hyväksy",
    "accountId": "Tilin tunnus",
    "alias": "Alias",
    "apiKeyId": "API-avaimen tunnus",
    "apiKeyName": "API-avaimen nimi",
    "apiKeySecret": "API-avaimen salaisuus",
    "authorization": "Valtuutus",
    "content-type": "Sisältötyyppi",
    "content-length": "Sisällön pituus",
    "cookie": "Eväste",
    "file": "Tiedosto",
    "host": "Isäntä",
    "id": "ID",
    "import": "Tuo",
    "limit": "Raja",
    "offset": "Offset",
    "open": "Avaa",
    "origin": "Alkuperä",
    "promptTokens": "Kehotusmerkit",
    "completionTokens": "Päättymismerkit",
    "totalTokens": "Tokeneja yhteensä",
    "rawModel": "Raaka malli",
    "scope": "Laajuus",
    "skill": "Taito",
    "sortBy": "Lajitteluperuste",
    "sortOrder": "Lajittelujärjestys",
    "tab": "Tab",
    "text": "Teksti",
    "textarea": "Textarea",
    "tool": "Työkalu",
    "toolId": "Työkalun tunnus",
    "web": "Web",
    "whereUsed": "Missä käytetty",
    "whitelist": "Valkoinen lista",
    "blacklist": "Musta lista",
    "resolve": "Ratkaise",
    "force": "Voimaa",
    "base64url": "Base64 URL",
    "hex": "Hex",
    "range": "Alue",
    "component": "Komponentti",
    "redirect_uri": "Uudelleenohjaus URI",
    "idempotency-key": "Idempotenssiavain",
    "error_description": "Virheen kuvaus",
    "code": "Koodi",
    "compatible": "Yhteensopiva",
    "chat-completions": "Chatin loppuun saattaminen",
    "oauth": "OAuth",
    "auth_token": "Auth Token",
    "crypto": "Krypto",
    "hours": "Tuntia",
    "selfsigned": "Itse allekirjoitettu",
    "proxy_id": "Välityspalvelimen tunnus",
    "proxyId": "Välityspalvelimen tunnus",
    "connectionId": "Yhteystunnus",
    "resolveConnectionId": "Ratkaise yhteystunnus",
    "resolve_connection_id": "Ratkaise yhteystunnus",
    "scope_id": "Laajuustunnus",
    "scopeId": "Laajuustunnus",
    "jwtSecret": "JWT Secret",
    "keytar": "Keytar",
    "better-sqlite3": "parempi-sqlite3",
    "undici": "undici",
    "builder-id": "Rakentajan tunnus",
    "musicDesc": "Musiikki Kuvaus",
    "musicGeneration": "Musiikin sukupolvi",
    "idc": "IDC",
    "cloud-status-changed": "Pilven tila muuttunut",
    "where_used": "Missä käytetty",
    "windowMs": "Ikkuna (ms)",
    "social-github": "GitHub",
    "social-google": "Google",
    "TOOL_ALLOWLIST": "Työkalujen sallittu luettelo",
    "TOOL_DENYLIST": "Tool Denylist",
    "Failed to save pricing": "Hinnoittelun tallentaminen epäonnistui",
    "Failed to reset pricing": "Hinnoittelun nollaaminen epäonnistui",
    "apikey": "API-avain",
    "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",
    "cloudAgentProviders": "Pilviagenttipalveluntarjoajat",
    "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 Tab",
    "chatPathLabel": "Chat Path Label",
    "retryDelay": "Retry Delay",
    "errorUpdating": "Error Updating",
    "ideCliIntegrations": "Ide Cli Integrations",
    "imageGeneration": "Image Generation",
    "apiKeyRequired": "Api Key Required",
    "resetAllTitle": "Reset All Title",
    "connectionError": "Connection Error",
    "modelName": "Model Name",
    "apiKeyForCheck": "Api Key For Check",
    "cloudRequestTimeout": "Cloud Request Timeout",
    "showConfiguredOnly": "Show Configured Only",
    "showFreeOnly": "Vain ilmainen",
    "addFirstProvider": "Lisää ensimmäinen palveluntarjoajasi",
    "addFirstProviderDesc": "Yhdistä AI-palveluntarjoaja aloittaaksesi pyyntöjen reitittämisen OmniRouten kautta. Voit käyttää ilmaisia ​​palveluntarjoajia, API-avaimia tai OAuth-tilejä.",
    "learnMore": "Lue lisää",
    "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 Tab",
    "queued": "Queued",
    "domainPlaceholder": "Domain Placeholder",
    "durationMinutesShort": "Duration Minutes Short",
    "verifyingConnection": "Verifying Connection",
    "imageProviders": "Image Providers",
    "protocolToolsLabel": "Protocol Tools Label",
    "queryPlaceholder": "Query Placeholder",
    "videoGeneration": "Video Generation",
    "timeRangeWeek": "Time Range Week",
    "limitExhausted": "Limit Exhausted",
    "failedDisable": "Failed Disable",
    "inMemoryNote": "In Memory Note",
    "compatibleHint": "Compatible Hint",
    "errorShort": "Error Short",
    "advancedHint": "Advanced Hint",
    "restoreFailed": "Restore Failed",
    "searchProvidersHeading": "Search Providers Heading",
    "comboName": "Combo Name",
    "autoDisableDescription": "Auto Disable Description",
    "embeddingsDesc": "Embeddings Desc",
    "operational": "Operational",
    "testAllApiKey": "Test All Api Key",
    "backupCreated": "Backup Created",
    "errorDuringImport": "Error During Import",
    "comboDefaultsGuideHint2": "Combo Defaults Guide Hint2",
    "connecting": "Connecting",
    "fillModelAndProviders": "Fill Model And Providers",
    "syncing": "Syncing",
    "resetConfirm": "Reset Confirm",
    "trackMetrics": "Track Metrics",
    "successful": "Successful",
    "recovering": "Recovering",
    "autoDisableThreshold": "Auto Disable Threshold",
    "anthropic": "Anthropic",
    "syncingData": "Syncing Data",
    "cloudBenefitPorts": "Cloud Benefit Ports",
    "compatibleProviders": "Compatible Providers",
    "freeTierProviders": "Ilmaiset tason tarjoajat",
    "freeTierLabel": "Ilmainen taso saatavilla",
    "freeTierProvidersDesc": "Palveluntarjoajat, joilla on ilmaisia tasoja – jotkut vaativat API-avaimen rekisteröitymisen, toiset eivät tarvitse kirjautumistietoja ollenkaan.",
    "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",
    "gamificationAdmin": "Gamification Admin",
    "monitorAnomaliesAndHealth": "Tarkkaile poikkeavuuksia ja järjestelmän kuntoa",
    "flaggedAnomalies": "Ilmoitetut poikkeavuudet",
    "noAnomaliesDetected": "Ei havaittu poikkeavuuksia",
    "apiKey": "API-avain",
    "xpLastHour": "XP (1h)",
    "zScore": "Z-pisteet",
    "tokensCommunityServers": "Yhteisön palvelimet",
    "tokensServerNamePlaceholder": "Palvelimen nimi",
    "tokensApiKeyPlaceholder": "API-avain",
    "tokensTokenBalance": "Token-saldo",
    "tokensSendTokens": "Lähetä Tokeneita",
    "tokensRecipientApiKeyId": "Vastaanottajan API-avaimen tunnus",
    "tokensRecipientApiKeyIdPlaceholder": "Anna vastaanottajan API-avaimen tunnus",
    "tokensReasonOptional": "Syy (valinnainen)",
    "tokensReasonPlaceholder": "esim. bonus, palkinto",
    "tokensTransactionHistory": "Tapahtumahistoria",
    "tokensNoTransactionsYet": "Ei vielä tapahtumia",
    "tokensInviteCodes": "Kutsukoodit",
    "tokensMaxUses": "Max käyttöjä",
    "tokensRedeemCode": "Lunasta koodi",
    "tokensRedeemCodePlaceholder": "Anna kutsukoodi",
    "tokensYourActiveInvites": "Aktiiviset kutsusi",
    "tierCoverageTitle": "Tason kattavuus",
    "tierCoverageSubtitle": "Palveluntarjoajat määritetty varatason mukaan",
    "batchDetailCopyId": "Kopioi tunnus",
    "batchDetailClose": "Sulje",
    "batchDetailEndpoint": "Päätepiste",
    "batchDetailModel": "Malli",
    "batchDetailWindow": "Ikkuna",
    "batchDetailCreated": "Luotu",
    "providerTopologyEmpty": "Palveluntarjoajia ei ole vielä yhdistetty",
    "badgeToastUnlocked": "Merkki avattu!",
    "batchListSearchPlaceholder": "Hae tunnuksen, päätepisteen, mallin mukaan…",
    "batchListDeleteAllCompletedTitle": "Poista kaikki valmiit erät",
    "batchListBatchesTable": "Erät",
    "changelogViewerLoading": "Ladataan muutoslokia GitHubista...",
    "profileLoading": "Ladataan profiilia...",
    "profileHowToEarn": "Kuinka ansaita",
    "bootstrapBannerDismiss": "Hylkää",
    "batchListDeleteBatchTitle": "Poista erä ja sen tiedostot",
    "leaderboardYourRank": "Sijoituksesi",
    "leaderboardLoading": "Ladataan tulostaulukkoa...",
    "batchFileDetailCopyId": "Kopioi tunnus",
    "batchFileDetailClose": "Sulje",
    "batchFileDetailFailedToLoad": "Tiedoston sisällön lataaminen epäonnistui",
    "batchFilesListSearchPlaceholder": "Hae tunnuksella tai tiedostonimellä…",
    "batchFilesListFilesTable": "Tiedostot",
    "batchPageLoadingMore": "Ladataan lisää…",
    "recommended": "__MISSING__:Recommended",
    "batchConceptTitle": "Batch processing",
    "batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.",
    "batchConceptHowItWorks": "How it works",
    "batchConceptBenefit50pct": "50% discount on input + output tokens",
    "batchConceptAsync24h": "Async with a 24h completion window",
    "batchConceptUseCases": "Best for bulk classification, evaluations, and embeddings",
    "filesConceptTitle": "Batch files",
    "filesConceptSubtitle": "JSONL files used by batches: input requests, results, and errors.",
    "filesConceptInput": "Input — your JSONL with one request per line",
    "filesConceptOutput": "Output — results from completed requests",
    "filesConceptError": "Errors — requests that failed",
    "filesConceptRetention": "Retention: 30 days by default (29 days on Anthropic)",
    "wizardTitle": "New batch",
    "wizardClose": "Close",
    "wizardNext": "Next",
    "wizardBack": "Back",
    "wizardCancel": "Cancel",
    "wizardCreate": "Create batch",
    "wizardCreating": "Creating…",
    "wizardStep1Destination": "Destination",
    "wizardStep2Input": "Input",
    "wizardStep3Validate": "Validate",
    "wizardStep4Cost": "Cost & create",
    "wizardProviderLabel": "Provider",
    "wizardEndpointLabel": "Endpoint",
    "wizardModelLabel": "Model",
    "wizardInputKindJsonl": "JSONL",
    "wizardInputKindCsv": "CSV (we'll convert)",
    "wizardDropOrPick": "Drop a file or click to pick",
    "wizardCsvMappingTitle": "Map CSV columns → request fields",
    "wizardCsvMappingAddField": "Add field",
    "wizardValidationOk": "All lines valid",
    "wizardValidationErrors": "Validation errors",
    "wizardValidationPreview": "Preview (first 5 requests)",
    "wizardValidationSamplingNote": "File is large — validated by sampling (first 1000 + last 100 lines). Full validation runs server-side.",
    "wizardCostSync": "Sync cost",
    "wizardCostBatch": "Batch cost (-50%)",
    "wizardCostSavings": "Savings",
    "wizardCostEstimatedNotice": "Estimated cost — real billing may vary.",
    "wizardErrorUpload": "Failed to upload file. Try again.",
    "wizardErrorCreate": "Failed to create batch. Try again.",
    "wizardEmptyProviders": "Connect a provider with batch support (OpenAI, Anthropic, or Gemini) to create a batch.",
    "uploadModalTitle": "Upload batch file",
    "uploadModalDropOrPick": "Drop a .jsonl file or click to pick",
    "uploadModalUpload": "Upload",
    "uploadModalCancel": "Cancel",
    "uploadModalError": "Upload failed. Try again.",
    "uploadModalSuccess": "Uploaded",
    "uploadModalSizeLimit": "Max 512 MB",
    "batchListNewButton": "New batch",
    "batchListAutoRefresh": "Auto-refresh 30s",
    "batchListCostColumn": "Cost",
    "batchActionCancel": "Cancel",
    "batchActionDownloadOutput": "Download output",
    "batchActionDownloadErrors": "Download errors",
    "batchActionRetry": "Retry failed",
    "batchActionRetryConfirm": "Retry {n} failed request(s)? Final cost depends on actual tokens consumed.",
    "expirationBadgeCritical": "Critical",
    "expirationBadgeWarning": "Soon",
    "expirationBadgeNormal": "Pending",
    "expirationBadgeExpired": "Expired",
    "filesListUploadButton": "Upload",
    "filesListUsedByColumn": "Used by",
    "filesListUsedByNone": "None",
    "filesListDelete": "Delete",
    "filesListDownload": "Download",
    "batchDetailActionCancel": "Cancel batch",
    "batchDetailActionRetry": "Retry failed requests",
    "batchDetailCancelling": "Cancelling…",
    "batchDetailRetrying": "Preparing retry…",
    "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.",
    "batchActionCancelError": "Failed to cancel batch. Try again.",
    "batchActionRetryError": "Failed to retry failed requests. Try again.",
    "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)",
    "filesListUsedByRoleInput": "input",
    "filesListUsedByRoleOutput": "output",
    "filesListUsedByRoleError": "error",
    "batchListProgressPartial": "(partial)",
    "filesListSizeColumn": "Size",
    "batchListProviderColumn": "Provider",
    "batchListProviderUnknown": "—",
    "batchListBatchCreated": "Batch {id} created — refreshing list…",
    "batchListBatchCreatedDismiss": "Dismiss",
    "batchListRefreshing": "Refreshing…",
    "batchListRefresh": "Refresh",
    "uploadFileModalRemove": "Remove",
    "uploadFileModalUploading": "Uploading…",
    "wizardInputReading": "Reading file…",
    "wizardInputReady": "Ready",
    "wizardInputLargeFileLabel": "Large file — sampling validation",
    "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.",
    "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.",
    "wizardCostWindow24h": "24h completion window",
    "wizardValidationFieldsOk": "required fields valid",
    "batchListProviderOther": "Other",
    "batchListTitle": "Batches",
    "batchListCount": "{count} batches",
    "batchListRemovingCompleted": "Removing…",
    "batchListRemoveCompleted": "Remove completed",
    "batchListTableStatus": "Status",
    "batchListTableId": "ID",
    "batchListTableEndpoint": "Endpoint",
    "batchListTableModel": "Model",
    "batchListTableProgress": "Progress",
    "batchListTableCreated": "Created",
    "batchListTableExpires": "Expires",
    "batchListLoading": "Loading…",
    "batchListEmpty": "No batches found",
    "batchListValidating": "Validating…",
    "batchStatusAll": "All statuses",
    "batchStatusInProgress": "In progress",
    "batchStatusValidating": "Validating",
    "batchStatusFinalizing": "Finalizing",
    "batchStatusCompleted": "Completed",
    "batchStatusFailed": "Failed",
    "batchStatusCancelled": "Cancelled",
    "batchStatusCancelling": "Cancelling",
    "batchStatusExpired": "Expired",
    "batchStatusCompletedWithFailures": "completed with failures",
    "batchStatusInProgressWithFailures": "in progress (with failures)",
    "batchStatusFinalizingWithFailures": "finalizing (with failures)",
    "batchStatusCancelledWithFailures": "cancelled with failures",
    "batchStatusExpiredWithFailures": "expired (partial)",
    "wizardCostEstimating": "Estimating cost…",
    "wizardCostRequests": "Requests",
    "wizardCostInputTok": "input tok",
    "wizardCostOutputTok": "output tok",
    "wizardCostWindow": "Window",
    "wizardDestinationSelectProvider": "Select a provider…",
    "wizardDestinationSelectModel": "Select a model…",
    "wizardDestinationConnectProvider": "Connect a provider"
  },
  "sidebar": {
    "home": "Kotiin",
    "dashboard": "Kojelauta",
    "providers": "Palveluntarjoajat",
    "combos": "Yhdistelmät",
    "usage": "Käyttö",
    "analytics": "Analytics",
    "costs": "Kustannukset",
    "health": "Terveys",
    "proxy": "Välityspalvelin",
    "limits": "Rajoitukset ja kiintiöt",
    "cliTools": "CLI-työkalut",
    "media": "Media",
    "settings": "Asetukset",
    "translator": "Kääntäjä",
    "playground": "Leikkipaikka",
    "searchTools": "Search Tools",
    "agents": "Agentit",
    "cloudAgents": "Pilviagentit",
    "memory": "Memory",
    "skills": "Skills",
    "omniSkills": "OmniSkills",
    "agentSkills": "AgentSkills",
    "docs": "Asiakirjat",
    "issues": "Ongelmat",
    "endpoints": "Päätepisteet",
    "endpointsSubtitle": "AI-yhteytesi URL-osoitteet",
    "apiManager": "API Key Manager",
    "apiManagerSubtitle": "Hallinnoi API-avaimia ja käyttöoikeuksia",
    "embeddedServices": "__MISSING__:Embedded Services",
    "embeddedServicesSubtitle": "__MISSING__:Manage local proxy services",
    "logs": "Lokit",
    "webhooks": "Webhooks",
    "webhooksSubtitle": "Saat ilmoituksen tapahtumista",
    "combosSubtitle": "Ryhmäpalveluntarjoajat vikasietoa varten",
    "batchSubtitle": "Käsittele useita pyyntöjä",
    "contextCavemanSubtitle": "Nopea pakkaus",
    "contextRtkSubtitle": "Lähtösuodatus",
    "auditLog": "Tarkastusloki",
    "shutdown": "Sammutus",
    "restart": "Käynnistä uudelleen",
    "shutdownConfirm": "Suljetaanko OmniRoute?",
    "restartConfirm": "Käynnistetäänkö OmniRoute uudelleen?",
    "version": "v{version}",
    "debug": "Debug",
    "system": "Järjestelmä",
    "help": "Apua",
    "primarySection": "Main",
    "cliSection": "CLI",
    "debugSection": "Debug",
    "systemSection": "System",
    "helpSection": "Help",
    "serverDisconnected": "Palvelin yhteys katkaistu",
    "serverDisconnectedMsg": "Välityspalvelin on pysäytetty tai käynnistyy uudelleen.",
    "expandSidebar": "Laajenna sivupalkki",
    "collapseSidebar": "Tiivistä sivupalkki",
    "themes": "Teemat",
    "presetColors": "Suosittuja värejä",
    "createTheme": "Luo teema",
    "chooseColor": "Valitse yksi väri",
    "themeCoral": "koralli",
    "themeBlue": "Sininen",
    "themeRed": "Punainen",
    "themeGreen": "Vihreä",
    "themeViolet": "Violetti",
    "themeOrange": "Oranssi",
    "themeCyan": "Syaani",
    "cliToolsShort": "Työkalut",
    "cache": "Cache",
    "cacheShort": "Cache",
    "batch": "Batch Jobs",
    "themeSystem": "Theme System",
    "whitelabelingDesc": "Whitelabeling Desc",
    "switchThemes": "Switch Themes",
    "themeAccentDesc": "Theme Accent Desc",
    "uploadFavicon": "Upload Favicon",
    "themeDark": "Theme Dark",
    "customLogoDesc": "Custom Logo Desc",
    "sidebarVisibilityToggle": "Sidebar Visibility Toggle",
    "themeAccent": "Theme Accent",
    "resetFavicon": "Reset Favicon",
    "whitelabeling": "Whitelabeling",
    "darkMode": "Dark Mode",
    "uploadLogo": "Upload Logo",
    "themeLight": "Theme Light",
    "appName": "App Name",
    "appNameDesc": "App Name Desc",
    "resetLogo": "Reset Logo",
    "customFavicon": "Custom Favicon",
    "hideHealthLogs": "Hide Health Logs",
    "customLogo": "Custom Logo",
    "appearance": "Appearance",
    "themeSelectionAria": "Theme Selection Aria",
    "themeCreate": "Theme Create",
    "customFaviconDesc": "Custom Favicon Desc",
    "logoPreview": "Logo Preview",
    "themeCustom": "Theme Custom",
    "hideHealthLogsDesc": "Hide Health Logs Desc",
    "faviconPreview": "Favicon Preview",
    "changelog": "Changelog",
    "contextSection": "Context & Cache",
    "contextCaveman": "Caveman",
    "contextRtk": "RTK",
    "contextCombos": "Engine Combos",
    "routingSection": "Routing",
    "protocolsSection": "Protocols",
    "agentsAiSection": "Agents & AI",
    "cacheContextSection": "Cache & Context",
    "analyticsSection": "Analytics",
    "costsSection": "Costs",
    "monitoringSection": "Monitoring",
    "auditSecuritySection": "Audit & Security",
    "devtoolsSection": "Dev Tools",
    "configurationSection": "Configuration",
    "aiFeaturesSection": "AI Features",
    "mcp": "MCP",
    "a2a": "A2A",
    "apiEndpoints": "API Endpoints",
    "batchFiles": "Files",
    "analyticsEvals": "Evals",
    "analyticsSearch": "Search",
    "analyticsUtilization": "Utilization",
    "analyticsComboHealth": "Combo Health",
    "analyticsCompression": "Compression",
    "costsBudget": "Budget",
    "costsQuotaShare": "Quota Sharing",
    "costsPricing": "Pricing",
    "logsProxy": "Proxy Logs",
    "logsConsole": "Console",
    "logsActivity": "Activity",
    "auditMcp": "MCP Audit",
    "auditA2a": "A2A Audit",
    "settingsGeneral": "General",
    "settingsAppearance": "Appearance",
    "settingsAi": "AI Settings",
    "settingsSecurity": "Security",
    "settingsFeatureFlags": "Ominaisuusliput",
    "settingsAuthz": "__MISSING__:Authz",
    "settingsRouting": "Routing",
    "settingsResilience": "Resilience",
    "settingsAdvanced": "Advanced",
    "omniProxySection": "OmniProxy",
    "quotaTracker": "Provider Quota",
    "providerQuota": "Provider Quota",
    "runtime": "Runtime",
    "consoleLogs": "Console Logs",
    "globalRouting": "Global Routing",
    "mitmProxy": "MITM Proxy",
    "oneProxy": "1Proxy",
    "agenticFeaturesSection": "Agentic Features",
    "otherFeaturesSection": "Other Features",
    "compressionContextGroup": "Compression Context",
    "toolsGroup": "Tools",
    "integrationsGroup": "Integrations",
    "proxyGroup": "Proxy",
    "costsParametersGroup": "Costs Parameters",
    "auditGroup": "Audit",
    "batchGroup": "Batch",
    "homeSubtitle": "Dashboard overview",
    "providersSubtitle": "Manage AI providers",
    "quotaTrackerSubtitle": "Track usage limits",
    "providerQuotaSubtitle": "Track provider usage limits",
    "runtimeSubtitle": "Realtime resilience & sessions",
    "contextCombosSubtitle": "Combine compression engines",
    "cliToolsSubtitle": "Configure CLI runtimes",
    "agentsSubtitle": "Manage local agents",
    "cloudAgentsSubtitle": "Manage cloud-based agents",
    "apiEndpointsSubtitle": "Expose custom endpoints",
    "proxySubtitle": "HTTP proxy settings",
    "mitmProxySubtitle": "MITM interception",
    "oneProxySubtitle": "Public proxy gateway",
    "leaderboard": "Leaderboard",
    "profile": "Profile",
    "tokens": "Tokens",
    "leaderboardSubtitle": "Rankings and achievements",
    "profileSubtitle": "Account and preferences",
    "tokensSubtitle": "Token usage and budgets",
    "usageSubtitle": "Traffic and usage stats",
    "analyticsComboHealthSubtitle": "Combo target reliability",
    "analyticsUtilizationSubtitle": "Provider utilization",
    "costsSubtitle": "Spend breakdown",
    "cacheSubtitle": "Cache hit rates",
    "analyticsCompressionSubtitle": "Token savings stats",
    "analyticsSearchSubtitle": "Search tool analytics",
    "analyticsEvalsSubtitle": "Eval suite results",
    "logsSubtitle": "Application logs",
    "logsProxySubtitle": "Proxy traffic logs",
    "consoleLogsSubtitle": "Console output",
    "logsActivitySubtitle": "User activity log",
    "healthSubtitle": "System health check",
    "costsPricingSubtitle": "Per-model pricing rules",
    "costsBudgetSubtitle": "Budget limits",
    "costsQuotaShareSubtitle": "Share provider quotas across keys",
    "auditLogSubtitle": "Authorization audit",
    "auditMcpSubtitle": "MCP server audit",
    "auditA2aSubtitle": "A2A protocol audit",
    "translatorSubtitle": "Format conversion",
    "playgroundSubtitle": "Test prompts live",
    "searchToolsSubtitle": "Search tool registry",
    "memorySubtitle": "Persistent agent memory",
    "omniSkillsSubtitle": "Sandbox skill registry",
    "agentSkillsSubtitle": "A2A skill registry",
    "mcpSubtitle": "MCP server controls",
    "a2aSubtitle": "A2A protocol server",
    "mediaSubtitle": "Cached media files",
    "batchFilesSubtitle": "Batch input/output files",
    "settingsSubtitle": "All settings",
    "settingsGeneralSubtitle": "App basics",
    "settingsAppearanceSubtitle": "Theme and layout",
    "settingsAiSubtitle": "AI behavior defaults",
    "globalRoutingSubtitle": "Global routing rules",
    "settingsResilienceSubtitle": "Retries and breakers",
    "settingsAdvancedSubtitle": "Power user options",
    "settingsSecuritySubtitle": "Auth and encryption",
    "settingsFeatureFlagsSubtitle": "Vaihda järjestelmän ominaisuuksia",
    "settingsSidebar": "Sidebar",
    "settingsSidebarSubtitle": "Customize sidebar layout",
    "settingsAuthzSubtitle": "__MISSING__:Route inventory and bypass policy",
    "docsSubtitle": "Documentation",
    "issuesSubtitle": "Report a bug",
    "changelogSubtitle": "Release notes"
  },
  "webhooks": {
    "title": "Webhooks",
    "description": "Määritä HTTP-puhelut järjestelmätapahtumille.",
    "configuredWebhooks": "Määritetyt Webhookit",
    "configuredWebhooksDesc": "Hallitse toimituspäätepisteitä, tilattuja tapahtumia, tilaa ja testilähetyksiä.",
    "addWebhook": "Lisää Webhook",
    "editWebhook": "Muokkaa Webhookia",
    "name": "Nimi",
    "namePlaceholder": "Tuotannon seuranta",
    "unnamedWebhook": "Nimetön webhook",
    "url": "Päätepisteen URL-osoite",
    "events": "Tapahtumat",
    "allEvents": "Kaikki tapahtumat",
    "secret": "Salaisuus",
    "secretPlaceholder": "Jätä tyhjäksi luodaksesi salaisuuden automaattisesti",
    "secretEditPlaceholder": "Jätä tyhjäksi säilyttääksesi nykyisen salaisuuden",
    "status": "Tila",
    "active": "Aktiivinen",
    "inactive": "Ei-aktiivinen",
    "errored": "Virheellinen",
    "total": "Yhteensä",
    "lastTriggered": "Viimeksi käynnistetty",
    "actions": "Toiminnot",
    "enabled": "Käytössä",
    "enabledDesc": "Käytöstä poistetut webhookit säilyvät tallennettuina, mutta eivät vastaanota toimituksia.",
    "refresh": "Päivitä",
    "loading": "Ladataan webhookeja...",
    "never": "Ei koskaan",
    "failureCount": "{count, plural, =0 {no failures} one {# failure} other {# failures}}",
    "testWebhook": "Lähetä testi",
    "testSuccess": "Testi webhookin lähetys onnistui.",
    "testFailed": "Webhookin testaus epäonnistui.",
    "saveSuccess": "Webhook tallennettu onnistuneesti.",
    "saveFailed": "Webhookin tallentaminen epäonnistui.",
    "loadFailed": "Webhookien lataaminen epäonnistui.",
    "delete": "Poista",
    "deleteConfirm": "Haluatko varmasti poistaa tämän webhookin?",
    "deleteSuccess": "Webhookin poistaminen onnistui.",
    "deleteFailed": "Webhookin poistaminen epäonnistui.",
    "edit": "Muokkaa",
    "enable": "Ota käyttöön",
    "disable": "Poista käytöstä",
    "noWebhooks": "Webhookeja ei ole vielä määritetty.",
    "signatureTitle": "Webhook-allekirjoitukset",
    "signatureDescription": "Jokainen toimitus sisältää X-Webhook-Signature-otsikon, joka on allekirjoitettu HMAC-SHA256:lla käyttämällä webhook-salaisuutta. Tarkista allekirjoitus ennen kuin luotat hyötykuormaan.",
    "wizard": {
      "cancel": "__MISSING__:Cancel",
      "step1Title": "__MISSING__:Select Integration",
      "step2Title": "__MISSING__:Configure Target",
      "step3Title": "__MISSING__:Events & Test",
      "back": "__MISSING__:Back",
      "next": "__MISSING__:Next",
      "finish": "__MISSING__:Finish",
      "step1Desc": "__MISSING__:Select the target integration system for this webhook."
    },
    "howItWorks": {
      "step1": "__MISSING__:Choose an integration provider (e.g. Slack, Discord, custom webhook) and set up the connection details.",
      "step2": "__MISSING__:Configure system events to subscribe to (e.g. completion errors, model fallbacks, or usage limits).",
      "step3": "__MISSING__:Verify the configuration by sending a test payload to make sure the endpoint receives it.",
      "step4": "__MISSING__:Secure your endpoint by validating the X-Webhook-Signature HMAC-SHA256 header using the webhook's secret.",
      "title": "__MISSING__:How Webhooks Work",
      "customOnly": "__MISSING__:Only applicable for custom endpoint integrations.",
      "hmacRecipeTitle": "__MISSING__:HMAC Verification Recipe",
      "hmacRecipe": "__MISSING__:To verify webhook payloads in Node.js, compute the HMAC-SHA256 of the raw request body using your secret key. Compare it to the X-Webhook-Signature header using timingSafeEqual.",
      "timeoutNote": "__MISSING__:Webhook deliveries have a timeout of 10 seconds.",
      "retryNote": "__MISSING__:Failed deliveries are retried up to 5 times with exponential backoff.",
      "docsLink": "__MISSING__:Read the full Webhooks developer guide",
      "hmacRecipePython": "__MISSING__:Python HMAC verification: hmac.new(secret, body, hashlib.sha256).hexdigest()",
      "hmacRecipeBash": "__MISSING__:Bash HMAC verification: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\""
    },
    "deliveries": {
      "title": "__MISSING__:Delivery Logs",
      "loadFailed": "__MISSING__:Failed to load webhook delivery logs.",
      "empty": "__MISSING__:No deliveries recorded yet. Trigger an event or send a test payload.",
      "status": "__MISSING__:Status",
      "event": "__MISSING__:Event",
      "latency": "__MISSING__:Latency",
      "at": "__MISSING__:Sent At"
    },
    "kinds": {
      "comingSoon": "__MISSING__:Coming Soon",
      "slack": "__MISSING__:Slack",
      "slackDesc": "__MISSING__:Post system events directly into a Slack channel",
      "telegram": "__MISSING__:Telegram",
      "telegramDesc": "__MISSING__:Send event messages using a Telegram bot",
      "discord": "__MISSING__:Discord",
      "discordDesc": "__MISSING__:Deliver real-time updates directly to a Discord server",
      "custom": "__MISSING__:Custom Webhook",
      "customDesc": "__MISSING__:Deliver system event payloads to any HTTPS endpoint",
      "email": "__MISSING__:Email Notification",
      "emailDesc": "__MISSING__:Receive summary updates via email",
      "pagerduty": "__MISSING__:PagerDuty",
      "pagerdutyDesc": "__MISSING__:Trigger alerts on PagerDuty for critical system issues",
      "teams": "__MISSING__:Microsoft Teams",
      "teamsDesc": "__MISSING__:Forward system notifications to Microsoft Teams channels"
    },
    "testPayloadSent": "__MISSING__:Test Payload Sent",
    "testResponse": "__MISSING__:Test Response",
    "validateUrl": {
      "checking": "__MISSING__:Checking URL...",
      "ok": "__MISSING__:URL is valid",
      "blockedPrivate": "__MISSING__:URL is a blocked private address",
      "invalidUrl": "__MISSING__:Invalid URL format"
    },
    "custom": {
      "endpointUrl": "__MISSING__:Endpoint URL",
      "endpointUrlPlaceholder": "__MISSING__:https://api.yourdomain.com/webhook",
      "secretKey": "__MISSING__:Secret Key",
      "secretKeyPlaceholder": "__MISSING__:Enter secret key or leave blank to auto-generate",
      "secretKeyHint": "__MISSING__:Used to sign the payload header for authentication."
    },
    "discord": {
      "webhookUrl": "__MISSING__:Discord Webhook URL",
      "webhookUrlPlaceholder": "__MISSING__:https://discord.com/api/webhooks/...",
      "webhookUrlHint": "__MISSING__:The webhook URL copied from your Discord channel integration settings.",
      "tutorial": "__MISSING__:How to create a Discord webhook:"
    },
    "slack": {
      "webhookUrl": "__MISSING__:Slack Webhook URL",
      "webhookUrlPlaceholder": "__MISSING__:https://hooks.slack.com/services/...",
      "webhookUrlHint": "__MISSING__:The webhook URL copied from your Slack Incoming Webhooks integration.",
      "tutorial": "__MISSING__:How to create a Slack webhook:"
    },
    "telegram": {
      "botToken": "__MISSING__:Telegram Bot Token",
      "botTokenPlaceholder": "__MISSING__:123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ",
      "botTokenHint": "__MISSING__:The HTTP API token received from @BotFather when creating your bot.",
      "chatId": "__MISSING__:Telegram Chat ID / Channel",
      "chatIdPlaceholder": "__MISSING__:-100123456789 or @channelname",
      "chatIdHint": "__MISSING__:The unique numerical identifier or public username of the chat/channel.",
      "tutorial": "__MISSING__:How to configure Telegram webhook:"
    }
  },
  "compliance": {
    "auditTitle": "Audit",
    "auditDescription": "Tarkista vaatimustenmukaisuustapahtumat ja MCP-työkalukutsut yhdestä toimintanäkymästä.",
    "complianceTab": "Vaatimustenmukaisuus",
    "mcpTab": "MCP-tarkastus",
    "title": "Vaatimustenmukaisuuden tarkastus",
    "description": "Käytäntö-, käyttö-, palveluntarjoaja- ja turvallisuustapahtumat, jotka on tallennettu vaatimustenmukaisuuden tarkastuslokiin.",
    "eventType": "Tapahtuman tyyppi",
    "eventTypePlaceholder": "Suodata toiminnon tai tapahtumatyypin mukaan",
    "severity": "Vakavuus",
    "allSeverities": "Kaikki vakavuusasteet",
    "info": "Tietoja",
    "warning": "Varoitus",
    "critical": "Kriittinen",
    "sourceIp": "Lähteen IP",
    "userOrKey": "Käyttäjä / avain",
    "action": "Toiminta",
    "result": "Tulos",
    "details": "Yksityiskohdat",
    "timestamp": "Aikaleima",
    "from": "From",
    "to": "Vastaanottaja",
    "refresh": "Päivitä",
    "export": "Vie",
    "clearFilters": "Selkeät suodattimet",
    "loading": "Ladataan tarkastustapahtumia...",
    "showing": "Näytetään {count} / {total} tapahtumaa",
    "policyViolation": "Käytännön rikkominen",
    "accessDenied": "Pääsy kielletty",
    "injectionBlocked": "Injektio estetty",
    "noEvents": "Ei tallennettuja vaatimustenmukaisuustapahtumia.",
    "failedFetch": "Vaatimustenmukaisuuden tarkastuslokin nouto epäonnistui.",
    "viewDetails": "Näytä tiedot",
    "closeDetails": "Sulje tiedot",
    "notAvailable": "—",
    "system": "järjestelmä",
    "previous": "Edellinen",
    "next": "Seuraavaksi",
    "mcpAudit": "MCP-tarkastus",
    "mcpAuditDesc": "MCP-palvelimen tallentamat työkalukutsun tarkastusmerkinnät.",
    "failedFetchMcpAudit": "MCP-tarkastuslokin nouto epäonnistui.",
    "tool": "Työkalu",
    "toolPlaceholder": "Suodata työkalun nimen mukaan",
    "duration": "Kesto",
    "apiKey": "API-avain",
    "output": "Lähtö",
    "allResults": "Kaikki tulokset",
    "success": "Menestystä",
    "failure": "Epäonnistuminen",
    "noMcpEvents": "Ei tallennettu MCP-tarkastustapahtumia.",
    "a2aAudit": "A2A Audit",
    "a2aAuditDesc": "A2A-palvelimen tallentama tehtävien suorittamisen seurantaketju.",
    "a2aShowingTasks": "Näytetään {count}/{total} tehtävää",
    "a2aSkill": "Taito",
    "a2aSkillPlaceholder": "Suodata taidon nimen mukaan",
    "a2aState": "osavaltio",
    "a2aAllStates": "Kaikki osavaltiot",
    "a2aStateSubmitted": "Lähetetty",
    "a2aStateWorking": "Työskentely",
    "a2aStateCompleted": "Valmis",
    "a2aStateFailed": "Epäonnistui",
    "a2aStateCancelled": "Peruutettu",
    "a2aTaskId": "Tehtävän tunnus",
    "a2aEvents": "Tapahtumat",
    "a2aArtifacts": "Artefaktit",
    "a2aNoTasks": "Ei tallennettuja A2A-tehtäviä.",
    "a2aLoadingTasks": "Ladataan A2A-tehtäviä..."
  },
  "themesPage": {
    "title": "Teemat",
    "description": "Valitse esiasetettu teema tai luo oma yhdellä värillä",
    "presetColors": "Suosittuja värejä",
    "customTheme": "Mukautettu teema",
    "customThemeDesc": "Napsauta Luo teema ja valitse yksi väri",
    "createTheme": "Luo teema",
    "activePreset": "Aktiivinen teema"
  },
  "header": {
    "logout": "Kirjaudu ulos",
    "language": "Kieli",
    "providers": "Palveluntarjoajat",
    "providerDescription": "Hallinnoi AI-palveluntarjoajan yhteyksiä",
    "combos": "Yhdistelmät",
    "comboDescription": "Malliyhdistelmät varaosilla",
    "usage": "Käyttö ja analytiikka",
    "usageDescription": "Valvo API-käyttöäsi, tunnuksesi kulutusta ja pyyntölokeja",
    "analytics": "Analytics",
    "analyticsDescription": "Kaavioita, trendejä ja arviointitietoja",
    "cliTools": "CLI-työkalut",
    "cliToolsDescription": "Määritä CLI-työkalut",
    "home": "Kotiin",
    "homeDescription": "Tervetuloa OmniRouteen",
    "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": "Asetukset",
    "settingsDescription": "Hallinnoi asetuksiasi",
    "openaiCompatible": "OpenAI-yhteensopiva",
    "anthropicCompatible": "Antrooppinen yhteensopiva",
    "media": "Media",
    "mediaDescription": "Luo kuvia, videoita ja musiikkia",
    "themes": "Teemat",
    "themesDescription": "Valitse väriteema koko kojelautapaneelille",
    "costsDescription": "Track spending, analyze trends, and manage your AI budget across all providers",
    "cacheDescription": "Monitor provider prompt cache efficiency and local semantic response reuse.",
    "limitsDescription": "Configure rate limits and quotas per API key and provider",
    "runtimeDescription": "Live runtime observability — circuit breakers, cooldowns, model lockouts, sessions and quota alerts",
    "apiManagerDescription": "Manage API keys and access control for your OmniRoute instance",
    "batchDescription": "Process large volumes of requests asynchronously with batched API calls",
    "contextCavemanDescription": "Rule-based message compression, language packs, analytics and output mode controls.",
    "contextRtkDescription": "Command-aware compression for tool output, terminal logs and build results.",
    "contextCombosDescription": "Define how engines are combined for different routing scenarios.",
    "changelogDescription": "Stay up to date with the latest platform features and announcements.",
    "agentsDescription": "Manage and configure AI agent tools: Codex, Devin, Jules, and custom agents",
    "cloudAgentsDescription": "Orchestrate cloud-based AI agents with live task tracking and plan approval",
    "memoryDescription": "Persistent conversational memory with semantic search and FTS5 full-text indexing",
    "skillsDescription": "Install and manage sandbox skills for automated prompt and tool execution",
    "agentSkillsDescription": "Agent-ready skills catalog with one-click URL copy for AI client integration",
    "translatorDescription": "Translate and test prompts across API formats: OpenAI ↔ Claude ↔ Gemini",
    "playgroundDescription": "Test prompts interactively with live provider responses and format inspection",
    "searchToolsDescription": "Search analytics, provider breakdown, cache hit rates, and cost tracking",
    "logsDescription": "Real-time request logs, error traces, and streaming event inspector",
    "auditDescription": "Compliance audit trail of API key usage, MCP tool calls, and policy events",
    "webhooksDescription": "Configure webhook endpoints to receive real-time event notifications",
    "healthDescription": "System health overview: providers, circuit breakers, rate limits, and database",
    "proxyDescription": "Configure upstream proxy settings for outbound provider connections",
    "apiEndpointsDescription": "Manage custom API endpoint configurations and routing overrides",
    "batchFilesDescription": "Browse and manage batch job output files and results",
    "analyticsEvalsDescription": "Model evaluation results and performance benchmarks",
    "analyticsSearchDescription": "Search query analytics, cache hit rates, and cost tracking",
    "analyticsUtilizationDescription": "Provider utilization metrics and capacity planning",
    "analyticsComboHealthDescription": "Real-time health and performance of combo routing configurations",
    "analyticsCompressionDescription": "Context compression analytics and token savings",
    "costsBudgetDescription": "Budget limits and spending alerts per API key and provider",
    "costsPricingDescription": "Custom pricing configuration for token cost calculations",
    "logsProxyDescription": "Upstream proxy request logs and traffic inspection",
    "logsConsoleDescription": "Application console output and debug logs",
    "logsActivityDescription": "Audit trail of user actions and system events",
    "auditMcpDescription": "MCP tool invocation audit trail and compliance records",
    "auditA2a": "A2A Audit",
    "auditA2aDescription": "A2A-tehtävän suorittamisen kirjausketju, tilasiirtymät ja taitojen kutsutietueet",
    "settingsGeneralDescription": "Storage, database, and general instance configuration",
    "settingsAppearanceDescription": "Theme, branding, and visual customization",
    "settingsAiDescription": "AI behaviors, thinking budgets, vision, and memory settings",
    "settingsSecurityDescription": "Authentication, authorization, and access control settings",
    "featureFlags": "Ominaisuusliput",
    "featureFlagsDescription": "Ohjausjärjestelmän ominaisuudet ja kokeelliset ominaisuudet",
    "featureFlagsActive": "{count} aktiivinen",
    "featureFlagsInactive": "{count} ei-aktiivinen",
    "featureFlagsOverrides": "{count} DB ohittaa",
    "featureFlagsSearch": "Etsi lippuja...",
    "featureFlagsCategoryAll": "Kaikki",
    "featureFlagsCategorySecurity": "Turvallisuus",
    "featureFlagsCategoryNetwork": "Verkko",
    "featureFlagsCategoryPolicies": "Käytännöt",
    "featureFlagsCategoryRuntime": "Suoritusaika",
    "featureFlagsCategoryCli": "CLI",
    "featureFlagsCategoryHealth": "Terveys",
    "featureFlagsSourceDb": "DB",
    "featureFlagsSourceEnv": "ENV",
    "featureFlagsSourceDefault": "DEF",
    "featureFlagsReset": "Nollaa",
    "featureFlagsResetAll": "Nollaa kaikki ohitukset",
    "featureFlagsResetAllConfirm": "Haluatko varmasti nollata kaikki ominaisuuslippujen ohitukset? Tämä palauttaa kaikki liput ENV- tai oletusarvoihinsa.",
    "featureFlagsRestartRequired": "Hakeminen vaatii uudelleenkäynnistyksen",
    "featureFlagsNoResults": "Yksikään lippu ei vastaa hakuasi",
    "featureFlagsSaved": "Lippu päivitetty",
    "featureFlagsError": "Lipun päivittäminen epäonnistui",
    "settingsRoutingDescription": "Routing rules, model aliases, combo defaults, and degradation settings",
    "settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration",
    "settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings",
    "mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging",
    "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining"
  },
  "home": {
    "quickStart": "Pika-aloitus",
    "quickStartDesc": "Pääset liikkeelle neljässä vaiheessa. Yhdistä palveluntarjoajat, reittimallit, tarkkaile kaikkea.",
    "fullDocs": "Täydelliset asiakirjat",
    "step1Title": "1. Luo API-avain",
    "step1Desc": "Siirry kohtaan <endpoint>Endpoint</endpoint> -> Rekisteröidyt avaimet. Luo yksi avain ympäristöä kohden.",
    "step2Title": "2. Yhdistä palveluntarjoajat",
    "step2Desc": "Lisää tilejä palveluun <providers>Providers</providers>. Tukee OAuthia, API-avainta ja ilmaisia ​​tasoja.",
    "step3Title": "3. Osoita asiakkaasi",
    "step3Desc": "Aseta perus-URL-osoitteeksi {url} IDE- tai API-asiakkaassasi.",
    "step4Title": "4. Valvo ja optimoi",
    "step4Desc": "Seuraa tunnuksia, kustannuksia ja virheitä <logs>Pyyntölokeissa</logs> ja <analytics>Analytics</analytics>.",
    "providersOverview": "Palveluntarjoajien yleiskatsaus",
    "configuredOf": "{configured} määritetty {total} käytettävissä olevasta palveluntarjoajasta",
    "noModelsAvailable": "Tälle tarjoajalle ei ole saatavilla malleja.",
    "noProvidersConfigured": "Palveluntarjoajia ei ole vielä määritetty",
    "addProvider": "Lisää palveluntarjoaja",
    "configureFirst": "Määritä yhteys ensin kohteessa {providers}",
    "configureProvider": "Määritä Provider",
    "modelAvailable": "{count} malli saatavilla",
    "modelsAvailable": "{count} malleja saatavilla",
    "connectionsActive": "{count} yhteys aktiivinen",
    "connectionsActivePlural": "{count} yhteydet aktiivisia",
    "copyModelName": "Kopioi mallin nimi",
    "documentation": "Dokumentaatio",
    "healthMonitor": "Terveysmittari",
    "reportIssue": "Ilmoita ongelmasta",
    "activeError": "{active} aktiivinen · {errors} virhe",
    "oauthLabel": "OAuth",
    "apiKeyLabel": "API-avain",
    "requestsShort": "{count} vaatimus",
    "providerModelsTitle": "{provider} - Mallit",
    "copiedModel": "Kopioitu: {model}",
    "aliasLabel": "alias",
    "updateNow": "Päivitä nyt",
    "updating": "Päivitetään...",
    "updateAvailableDesc": "Uusi versio on saatavilla. Päivitä napsauttamalla.",
    "updateStarted": "Päivitys aloitettu...",
    "reloadingPageAutomatically": "Ladataan sivua automaattisesti uudelleen...",
    "providerTopology": "Palveluntarjoajan topologia"
  },
  "analytics": {
    "title": "Analytics",
    "usageAnalyticsTitle": "__MISSING__:Usage Analytics",
    "diversityScoreTitle": "Tarjoajan monimuotoisuus",
    "diversityScoreDesc": "__MISSING__:Provider concentration snapshot for the recent traffic window.",
    "diversityShannonEntropy": "__MISSING__:Shannon entropy",
    "diversityWindow": "__MISSING__:Window: {count} reqs · Last {mins} mins",
    "diversityHealthy": "__MISSING__:Healthy Distribution",
    "diversityRiskHigh": "__MISSING__:High Vendor Lock-in Risk",
    "diversityRiskModerate": "__MISSING__:Moderate Distribution",
    "diversityScoreLabel": "__MISSING__:score",
    "diversityHigherExplanation": "__MISSING__:Higher values mean traffic is spread across multiple providers.",
    "diversityNoData": "__MISSING__:No recent usage data available.",
    "chartRequests": "__MISSING__:Requests",
    "chartInput": "__MISSING__:Input",
    "chartOutput": "__MISSING__:Output",
    "chartTotal": "__MISSING__:Total",
    "chartCost": "__MISSING__:Cost",
    "chartShare": "__MISSING__:Share",
    "chartServiceTier": "__MISSING__:Service Tier",
    "chartServiceTierSplit": "__MISSING__:Fast / Standard cost split",
    "chartCostPct": "__MISSING__:{pct}% of cost",
    "chartUsageDetail": "__MISSING__:Usage Detail",
    "chartCacheRead": "__MISSING__:Cache read",
    "chartCostByProvider": "__MISSING__:Cost by Provider",
    "chartNoCostData": "__MISSING__:No cost data",
    "chartModelUsageOverTime": "__MISSING__:Model Usage Over Time",
    "chartNoData": "__MISSING__:No data",
    "chartWeekly": "__MISSING__:Weekly",
    "chartModelBreakdown": "__MISSING__:Model Breakdown",
    "chartModel": "__MISSING__:Model",
    "chartProvider": "__MISSING__:Provider",
    "chartProviderBreakdown": "__MISSING__:Provider Breakdown",
    "filterAllKeys": "__MISSING__:All Keys",
    "filterSearchKeys": "__MISSING__:Search keys…",
    "filterNoKeysMatch": "__MISSING__:No keys match",
    "filterOneKey": "__MISSING__:1 key",
    "filterMultipleKeys": "__MISSING__:{count} keys",
    "rangeToday": "__MISSING__:Today",
    "rangeYesterday": "__MISSING__:Yesterday",
    "rangeLast3Days": "__MISSING__:Last 3 days",
    "rangeThisWeek": "__MISSING__:This week",
    "rangeLast14Days": "__MISSING__:Last 14 days",
    "rangeThisMonth": "__MISSING__:This month",
    "rangeQuickSelect": "__MISSING__:Quick Select",
    "rangeStart": "__MISSING__:Start",
    "rangeEnd": "__MISSING__:End",
    "rangeCancel": "__MISSING__:Cancel",
    "rangeApply": "__MISSING__:Apply",
    "rangeErrorInvalid": "__MISSING__:Start must be before end",
    "period1D": "__MISSING__:1D",
    "period7D": "__MISSING__:7D",
    "period30D": "__MISSING__:30D",
    "period90D": "__MISSING__:90D",
    "periodYTD": "__MISSING__:YTD",
    "periodAll": "__MISSING__:All",
    "totalTokens": "__MISSING__:Total Tokens",
    "inputTokens": "__MISSING__:Input Tokens",
    "outputTokens": "__MISSING__:Output Tokens",
    "estCost": "__MISSING__:Est. Cost",
    "infraTitle": "__MISSING__:Infrastructure",
    "infraAccounts": "__MISSING__:Accounts",
    "infraProviders": "__MISSING__:Providers",
    "infraApiKeys": "__MISSING__:API Keys",
    "infraModels": "__MISSING__:Models",
    "perfTitle": "__MISSING__:Performance",
    "perfAvgTokens": "__MISSING__:Avg Tokens/Req",
    "perfCostReq": "__MISSING__:Cost/Req",
    "perfIoRatio": "__MISSING__:I/O Ratio",
    "perfFastReq": "__MISSING__:Fast Requests",
    "highlightsTitle": "__MISSING__:Highlights",
    "highlightsTopModel": "__MISSING__:Top Model",
    "highlightsTopProvider": "__MISSING__:Top Provider",
    "highlightsBusiestDay": "__MISSING__:Busiest Day",
    "highlightsDiversity": "__MISSING__:Diversity",
    "highlightsFallbackRate": "__MISSING__:Fallback Rate",
    "customRange": "__MISSING__:Custom",
    "overviewDescription": "Tarkkaile sovellusliittymän käyttötapoja, tunnuksen kulutusta, kustannuksia ja toimintatrendejä kaikilla palveluntarjoajilla ja malleilla.",
    "evalsDescription": "Testaa ja vahvista LLM-päätepisteesi suorittamalla arviointipaketteja. Vertaile mallin laatua, havaitse regressiot ja vertaile viivettä.",
    "overview": "Yleiskatsaus",
    "evals": "Evals",
    "utilization": "Käyttöaste",
    "utilizationDescription": "Palveluntarjoajan kiintiön käyttötrendit ja nopeusrajoitusten seuranta",
    "modelStatus": "Mallin tila",
    "modelStatusCooldown": "Jäähdytys",
    "modelStatusUnavailable": "Ei saatavilla",
    "modelStatusError": "Virhe",
    "comboHealth": "Yhdistelmän kunto",
    "comboHealthDescription": "Yhdistelmätason kiintiö, käytön jakautuminen ja suorituskykymittarit",
    "compressionAnalyticsTitle": "Compression Analytics",
    "compressionAnalyticsDescription": "Compression analytics — token savings, mode breakdown, and provider stats.",
    "autoRoutingTotalAutoRequests": "Automaattiset pyynnöt yhteensä",
    "autoRoutingAvgSelectionScore": "Keskimääräinen valintapiste",
    "autoRoutingExplorationRate": "Tutkimusaste",
    "autoRoutingLkgpHitRate": "LKGP osumaprosentti",
    "autoRoutingRequestsByVariant": "Variantin pyynnöt",
    "autoRoutingTopRoutedProviders": "Parhaat reititetyt palveluntarjoajat",
    "comboHealthWorstQuotaLeft": "Huonoin kiintiö jäljellä",
    "comboHealthUsageSkew": "Käyttövirhe",
    "comboHealthSuccessRate": "Menestysprosentti",
    "comboHealthQuotaHealth": "Kiintiön terveys",
    "comboHealthRequests": "Pyynnöt",
    "comboHealthTokens": "Tokenit",
    "comboHealthAvgLatency": "Keskimääräinen viive",
    "comboHealthTotalRequests": "Pyyntöjä yhteensä",
    "comboHealthExecutionTargets": "Toteutustavoitteet",
    "comboHealthSuccess": "Menestystä",
    "comboHealthLatency": "Latenssi",
    "comboHealthQuota": "Kiintiö",
    "comboHealthTitle": "Yhdistelmä terveys",
    "comboHealthUnableToLoad": "Yhdistelmän kuntoa ei voi ladata",
    "comboHealthGettingStarted": "Aloitus",
    "compressionAnalyticsTotalRequests": "Pyyntöjä yhteensä",
    "compressionAnalyticsTokensSaved": "Tokenit tallennettu",
    "compressionAnalyticsAvgSavings": "Keskimääräiset säästöt",
    "compressionAnalyticsAvgDuration": "Keskimääräinen kesto",
    "compressionAnalyticsReceipts": "Kuitit",
    "compressionAnalyticsFallbacks": "Varmuuksia",
    "compressionAnalyticsPromptTokens": "Kehotusmerkit",
    "compressionAnalyticsCompletionTokens": "Suoritusmerkit",
    "compressionAnalyticsTotalTokens": "Tokeneja yhteensä",
    "compressionAnalyticsCacheTokens": "Välimuistin tunnukset",
    "compressionAnalyticsNoDataYet": "Ei vielä pakkaustietoja",
    "searchAnalyticsTotalSearches": "Haut yhteensä",
    "searchAnalyticsCacheHitRate": "Välimuistin osumaprosentti",
    "searchAnalyticsTotalCost": "Kokonaiskustannukset",
    "searchAnalyticsAvgResponse": "Keskimääräinen vastaus",
    "searchAnalyticsNoSearchesYet": "Ei hakuja vielä",
    "providerUtilizationTitle": "Palveluntarjoajan käyttö",
    "providerUtilizationFailedToLoad": "Käyttötietojen lataus epäonnistui",
    "providerUtilizationNoData": "Käyttötietoja ei ole saatavilla",
    "providerUtilizationGettingStarted": "Aloittaminen",
    "providerUtilizationLatestSnapshot": "Viimeisin kiintiön tilannekuva",
    "providerUtilizationRemainingCapacity": "Jäljellä oleva kapasiteetti"
  },
  "apiManager": {
    "title": "API-avaimet",
    "createKey": "Luo API-avain",
    "key": "Avain",
    "revokeKey": "Peruuta avain",
    "revokeConfirm": "Haluatko varmasti peruuttaa tämän API-avaimen?",
    "noKeys": "Ei vielä API-avaimia",
    "noKeysDesc": "Luo ensimmäinen API-avain päätepisteellesi tulevien pyyntöjen todentamiseksi",
    "keyLabel": "Avaimen etiketti",
    "permissions": "Käyttöoikeudet",
    "expiresAt": "Vanhenee",
    "never": "Ei koskaan",
    "revoke": "Peruuta",
    "showKey": "Näytä avain",
    "hideKey": "Piilota avain",
    "copyKey": "Kopioi API-avain",
    "allModels": "Kaikki mallit",
    "selectedModels": "Valitut mallit",
    "readOnly": "Vain luku",
    "fullAccess": "Täysi pääsy",
    "keyManagement": "API-avainten hallinta",
    "keyManagementDesc": "Luo ja hallitse API-avaimia päätepisteesi pyyntöjen todentamiseksi",
    "totalKeys": "Avaimet yhteensä",
    "restricted": "Rajoitettu",
    "totalRequests": "Pyyntöjä yhteensä",
    "modelsAvailable": "Mallit saatavilla",
    "registeredKeys": "Rekisteröity avaimet",
    "keysRegistered": "{count} avaimet rekisteröity",
    "keyRegistered": "{count} avain rekisteröity",
    "keysSecurityNote": "Jokainen avain eristää käytön seurannan ja voidaan peruuttaa itsenäisesti. Avaimet peitetään luomisen jälkeen turvallisuuden vuoksi.",
    "createFirstKey": "Luo ensimmäinen avaimesi",
    "name": "Nimi",
    "usage": "Käyttö",
    "created": "Luotu",
    "actions": "Toiminnot",
    "reqs": "vaatimukset",
    "neverUsed": "Ei koskaan käytetty",
    "deleteConfirm": "Poistetaanko tämä API-avain?",
    "usageTips": "Käyttövinkkejä",
    "tipAuth": "Käytä API-avaimia Authorization-otsikossa siirtotienä YOUR_KEY",
    "tipSecure": "Avaimet näkyvät vain kerran luomisen aikana – säilytä ne turvallisesti",
    "tipSeparate": "Luo erilliset avaimet eri asiakkaille tai ympäristöille",
    "tipRestrict": "Rajoita avaimet tiettyihin malleihin parantaaksesi turvallisuutta ja kustannusten hallintaa",
    "keyName": "Avaimen nimi",
    "keyNamePlaceholder": "esim. tuotantoavain, kehitysavain",
    "keyNameDesc": "Valitse kuvaava nimi tämän avaimen tarkoituksen tunnistamiseksi",
    "managementAccessDesc": "Salli tämän API-avaimen hallita OmniRoute-määrityksiä.",
    "selfServiceVisibility": "Itsepalvelun näkyvyys",
    "selfServiceVisibilityDesc": "Määrittää, mitä tämä avain voi nähdä omasta käytöstään ja jaetusta upstream-kiintiöstä.",
    "ownUsageVisibility": "Omat kustannukset ja tokenien käyttö",
    "ownUsageVisibilityDesc": "Salli tämän avaimen kutsua omaa tila-endpointiaan nähdäkseen oman USD-käytön, budjettiprosentin ja tokenien kokonaismäärät.",
    "sharedAccountQuotaVisibility": "Jaettu tilikiintiö",
    "sharedAccountQuotaVisibilityDesc": "Salli tämän avaimen nähdä jaettu upstream-tilikiintiö, kun yksi eksplisiittinen yhteys on määritetty.",
    "keyCreated": "API-avain luotu",
    "keyCreatedSuccess": "Avain luotu onnistuneesti!",
    "keyCreatedNote": "Kopioi ja tallenna tämä avain nyt – sitä ei näytetä uudelleen.",
    "done": "Valmis",
    "savePermissions": "Tallenna käyttöoikeudet",
    "endpointRestrictions": "__MISSING__:Allowed Endpoints",
    "allEndpointsAllowed": "__MISSING__:This key can access all API endpoints.",
    "endpointsRestricted": "__MISSING__:Restricted to {count} endpoint{count, plural, one {} other {s}}.",
    "autoResolve": "Auto-Resolve",
    "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.",
    "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": "Salli kaikki",
    "restrict": "Rajoita",
    "allowAllInfo": "Tällä avaimella pääsee kaikkiin saatavilla oleviin malleihin.",
    "restrictInfo": "Tällä avaimella voi käyttää {selected}/{total} mallia.",
    "selected": "{count} valittu",
    "all": "Kaikki",
    "clear": "Selkeä",
    "searchModels": "Hae malleja nimen tai toimittajan mukaan...",
    "noModelsFound": "Malleja ei löytynyt",
    "keyNameRequired": "Avaimen nimi vaaditaan",
    "keyNameTooLong": "Avaimen nimessä saa olla enintään {max} merkkiä",
    "keyNameInvalid": "Avaimen nimi voi sisältää vain kirjaimia, numeroita, välilyöntejä, yhdysmerkkejä ja alaviivoja",
    "invalidKeyName": "Virheellinen avaimen nimi",
    "failedCreateKey": "Avaimen luominen epäonnistui",
    "failedCreateKeyRetry": "Avaimen luominen epäonnistui. Yritä uudelleen.",
    "invalidKeyId": "Virheellinen avaintunnus",
    "failedDeleteKey": "Avaimen poistaminen epäonnistui",
    "failedDeleteKeyRetry": "Avaimen poistaminen epäonnistui. Yritä uudelleen.",
    "invalidModelsSelection": "Virheellinen mallivalinta",
    "cannotSelectMoreThanModels": "Ei voi valita enempää kuin {max} mallia",
    "failedUpdatePermissions": "Käyttöoikeuksien päivittäminen epäonnistui",
    "failedUpdatePermissionsRetry": "Käyttöoikeuksien päivittäminen epäonnistui. Yritä uudelleen.",
    "unknownProvider": "tuntematon",
    "copyMaskedKey": "Kopioi peitetty avain",
    "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key",
    "modelsCount": "{count, plural, one {# model} other {# models}}",
    "lastUsedOn": "Viimeisin: {date}",
    "editPermissions": "Muokkaa käyttöoikeuksia",
    "deleteKey": "Poista avain",
    "regenerateKey": "Luo avain uudelleen",
    "regenerateConfirm": "Haluatko varmasti luoda tämän API-avaimen uudelleen? Vanha avain mitätöityy välittömästi.",
    "failedRegenerateKey": "API-avaimen luominen uudelleen epäonnistui",
    "failedRegenerateKeyRetry": "API-avaimen luominen uudelleen epäonnistui. Yritä uudelleen.",
    "model": "{count} malli",
    "models": "{count} mallit",
    "permissionsTitle": "Luvat: {name}",
    "allowAllDesc": "Tällä avaimella pääsee kaikkiin saatavilla oleviin malleihin.",
    "restrictDesc": "Tällä avaimella voi käyttää {selectedCount}/{totalModels} mallia.",
    "selectedCount": "{count} valittu",
    "maxActiveSessions": "Aktiivisten istuntojen enimmäismäärä",
    "apiManagerCustomRateLimits": "Mukautetut hintarajat",
    "apiManagerCustomRateLimitsDesc": "Ohita globaalit oletusrajat. Jätä tyhjäksi, jos haluat käyttää oletusasetuksia.",
    "apiManagerRateLimitRequestsPlaceholder": "Pyynnöt",
    "apiManagerRateLimitReqPer": "req /",
    "apiManagerRateLimitSecondsPlaceholder": "Sekuntia",
    "apiManagerRemoveLimitTitle": "Poista raja",
    "apiManagerTimezonePlaceholder": "Amerikka / Sao_Paulo",
    "noLogPayloadPrivacy": "No-Log Payload Privacy",
    "bannedStatus": "Kielletty tila",
    "managementApiAccess": "Management API -käyttöoikeus",
    "expirationDate": "Viimeinen voimassaolopäivä",
    "managementAccess": "Hallintaoikeudet",
    "allowedConnections": "Sallitut yhteydet",
    "searchPlaceholder": "__MISSING__:Search by name or token...",
    "activeOnly": "__MISSING__:Active only",
    "filterStatus": "__MISSING__:STATUS",
    "filterType": "__MISSING__:TYPE",
    "filterAll": "__MISSING__:All",
    "filterStatusActive": "__MISSING__:Active",
    "filterStatusDisabled": "__MISSING__:Disabled",
    "filterStatusBanned": "__MISSING__:Banned",
    "filterStatusExpired": "__MISSING__:Expired",
    "filterTypeStandard": "__MISSING__:Standard",
    "filterTypeManage": "__MISSING__:Manage",
    "filterTypeRestricted": "__MISSING__:Restricted",
    "shownOf": "__MISSING__:{shown} of {total} shown",
    "emptyFilterTitle": "__MISSING__:No keys match your filters",
    "emptyFilterClear": "__MISSING__:Clear filters",
    "endpointRestrictions": "Allowed Endpoints",
    "allEndpointsAllowed": "This key can access all API endpoints.",
    "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}."
  },
  "auditLog": {
    "title": "Tarkastusloki",
    "searchPlaceholder": "Hakutoiminnot...",
    "action": "Toiminta",
    "actor": "näyttelijä",
    "target": "Kohde",
    "ipAddress": "IP-osoite",
    "timestamp": "Aikaleima",
    "noEntries": "Tarkastusmerkintöjä ei löytynyt",
    "filterByAction": "Suodata toiminnon mukaan...",
    "filterByActor": "Suodata näyttelijän mukaan...",
    "filterEntriesAria": "Suodata tarkastuslokin merkinnät",
    "filterByActionTypeAria": "Suodata toimintotyypin mukaan",
    "filterByActorAria": "Suodata näyttelijän mukaan",
    "refreshAuditLogAria": "Päivitä tarkastusloki",
    "tableAria": "Tarkastuslokimerkinnät",
    "failedFetchAuditLog": "Valvontalokin nouto epäonnistui",
    "notAvailable": "—",
    "description": "Hallinnolliset toimet ja turvallisuustapahtumat",
    "showing": "Näytetään {count} merkintää (poikkeama {offset})",
    "previous": "Edellinen"
  },
  "media": {
    "title": "Mediatyöpaja",
    "subtitle": "Luo kuvia, videoita ja musiikkia",
    "model": "Model",
    "prompt": "Prompt",
    "generate": "Luo",
    "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.",
    "kinds": {
      "embedding": "__MISSING__:Embedding",
      "image": "__MISSING__:Image",
      "imageToText": "__MISSING__:Image to Text",
      "tts": "__MISSING__:Text to Speech",
      "stt": "__MISSING__:Speech to Text",
      "webSearch": "__MISSING__:Web Search",
      "webFetch": "__MISSING__:Web Fetch",
      "video": "__MISSING__:Video",
      "music": "__MISSING__:Music"
    },
    "noProviders": "__MISSING__:No providers configured for this kind yet.",
    "addConnection": "__MISSING__:Add Connection",
    "backToProviders": "__MISSING__:Back to Providers",
    "connections": "__MISSING__:{count} Connections",
    "noConnections": "__MISSING__:No connections yet — add one from the provider page.",
    "loading": "__MISSING__:Loading..."
  },
  "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",
    "copy": "Kopioi",
    "resetToDefault": "Palauta oletusarvo",
    "tabSearch": "Search",
    "tabScrape": "Scrape",
    "tabCompare": "Compare",
    "modalitiesGuide": "Modalities guide",
    "searchConceptTitle": "Search",
    "searchConceptDesc": "Search = fetches a list of web results (title, URL, snippet, relevance score)",
    "scrapeConceptTitle": "Scrape",
    "scrapeConceptDesc": "Scrape = extracts the full content of a URL (markdown, text or HTML)",
    "compareConceptTitle": "Compare",
    "compareConceptDesc": "Compare = runs the same query across N providers side-by-side to compare latency, cost and result overlap",
    "rerankConceptTitle": "Rerank",
    "rerankConceptDesc": "Rerank = reorders results via LLM to improve relevance based on the query",
    "autoConceptTitle": "Auto (cheapest)",
    "autoConceptDesc": "Auto (cheapest) = automatically picks the cheapest available provider with configured credentials",
    "providerCatalogTitle": "Provider Catalog",
    "kindSearch": "Search",
    "kindFetch": "Fetch/Scrape",
    "statusConfigured": "Configured",
    "statusMissing": "No credential",
    "statusRateLimited": "Rate limited",
    "configureProvider": "Configure in Providers",
    "loadingProviders": "Loading providers…",
    "failedToLoadProviders": "Failed to load providers",
    "costPerQuery": "Cost/query",
    "freeQuota": "Free quota/mo",
    "scrapeUrl": "URL to scrape",
    "scrapeUrlPlaceholder": "https://example.com",
    "scrapeExtract": "Extract",
    "scrapeExtracting": "Extracting…",
    "scrapeFullPage": "Full page",
    "scrapeFormat": "Format",
    "formatMarkdown": "Markdown",
    "formatHtml": "HTML",
    "formatText": "Text",
    "scrapePreview": "Preview",
    "scrapeRaw": "Raw",
    "scrapeContentTruncated": "(truncated, view raw)",
    "scrapeMetadata": "Metadata",
    "scrapeProvider": "Provider",
    "scrapeSize": "Size",
    "compareRun": "Compare",
    "compareRunning": "Comparing…",
    "autoProvider": "Auto (cheapest)",
    "configuredStatus": "Configured",
    "rateLimitedStatus": "Rate limited",
    "noCredential": "No credential",
    "searchTypeLabel": "Type",
    "rerankModelLabel": "Rerank model",
    "noneOption": "None",
    "size": "Size"
  },
  "cliTools": {
    "title": "CLI-työkalut",
    "noActiveProviders": "Ei aktiivisia palveluntarjoajia",
    "noActiveProvidersDesc": "Lisää ja yhdistä ensin palveluntarjoajat määrittääksesi CLI-työkalut.",
    "mapModels": "Karttamallit",
    "testConnection": "Testaa yhteys",
    "connectionStatus": "Yhteyden tila",
    "configureEndpoint": "Määritä päätepiste",
    "instructions": "Ohjeet",
    "modelMapping": "Mallin kartoitus",
    "baseUrl": "Perus-URL-osoite",
    "apiKey": "API-avain",
    "configured": "Määritetty",
    "notConfigured": "Ei määritetty",
    "notInstalled": "Ei asennettu",
    "custom": "Mukautettu",
    "unknown": "Tuntematon",
    "lastSavedAt": "Viimeksi tallennettu: {date}",
    "never": "Ei koskaan",
    "justNow": "juuri nyt",
    "minutesAgoShort": "{count}min sitten",
    "hoursAgoShort": "{count}h sitten",
    "daysAgoShort": "{count}pv sitten",
    "monthsAgoShort": "{count}kk sitten",
    "yearsAgoShort": "{count}v sitten",
    "runtimeCheckFailed": "Ajonaikainen tarkistus epäonnistui",
    "yourApiKeyPlaceholder": "sinun-api-avain",
    "modelPlaceholder": "toimittaja/mallitunnus",
    "configurationSaved": "Määritykset tallennettu onnistuneesti.",
    "failedToSave": "Määrityksen tallentaminen epäonnistui.",
    "noApiKeysCreateOne": "Ei API-avaimia – Luo yksi Avaimet-sivulla",
    "defaultOmnirouteKey": "sk_omniroute (oletus)",
    "selectModel": "Valitse Malli",
    "selectModelForAlias": "Valitse malli kohteelle {alias}",
    "selectModelForTool": "Valitse malli kohteelle {tool}",
    "select": "Valitse",
    "clear": "Selkeä",
    "comingSoon": "Tulossa pian",
    "checkingRuntime": "Tarkistetaan ajonaikaista tilaa...",
    "guideOnlyIntegration": "Vain ohjeellinen integrointi (ei vaadi paikallista suoritusaikaa)",
    "cliRuntimeDetected": "CLI-ajoaika havaittu ja valmis",
    "cliFoundNotRunnable": "CLI löytyi, mutta ei ajettavissa{reason}",
    "cliRuntimeNotDetected": "CLI-ajoaikaa ei havaittu",
    "binary": "Binääri",
    "configPath": "Konfigurointipolku",
    "configPathShort": "Konfig",
    "failedCheckRuntimeStatus": "Ajonaikaisen tilan tarkistaminen epäonnistui.",
    "copy": "Kopioi",
    "copied": "Kopioitu",
    "copyConfig": "Kopioi kokoonpano",
    "saveConfig": "Tallenna kokoonpano",
    "selectionSaved": "Valinta tallennettu",
    "guide": "Opas",
    "detected": "Havaittu",
    "notReady": "Ei valmis",
    "active": "Aktiivinen",
    "inactive": "Ei-aktiivinen",
    "startMitm": "Käynnistä MITM",
    "stopMitm": "Lopeta MITM",
    "mitmStarted": "MITM alkoi onnistuneesti!",
    "mitmStopped": "MITM pysähtyi onnistuneesti!",
    "failedStart": "MITM:n käynnistäminen epäonnistui",
    "failedStop": "MITM:n pysäyttäminen epäonnistui",
    "saveMappings": "Tallenna kartoitukset",
    "mappingsSaved": "Kartaukset tallennettu!",
    "failedSaveMappings": "Kartoitusten tallentaminen epäonnistui",
    "howItWorks": "Miten se toimii:",
    "antigravityHowWorksDesc": "Antigravity lähettää pyyntöjä Googlen päätepisteeseen. MITM sieppaa ja ohjaa ne OmniRouteen.",
    "antigravityStep1": "1. Käynnistä MITM reitittääksesi pyynnöt OmniRouten kautta.",
    "antigravityStep2Prefix": "2. Lisää",
    "antigravityStep2Suffix": "hosts-tiedostoon muodossa 127.0.0.1.",
    "antigravityStep3": "3. Avaa Antigravity ja pyynnöt välitetään.",
    "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-salasana vaaditaan",
    "sudoPasswordHint": "Järjestelmänvalvojan salasana tarvitaan hosts-tiedoston ja järjestelmän välityspalvelimen asetusten muokkaamiseen.",
    "enterSudoPassword": "Anna sudo-salasana",
    "sudoPasswordRequiredError": "Sudo-salasana vaaditaan.",
    "cancel": "Peruuta",
    "confirm": "Vahvista",
    "settingsApplied": "Asetukset otettu käyttöön onnistuneesti!",
    "failedApplySettings": "Asetusten käyttöönotto epäonnistui",
    "settingsReset": "Asetusten nollaus onnistui!",
    "failedResetSettings": "Asetusten nollaus epäonnistui",
    "backupRestored": "Varmuuskopio palautettu!",
    "failedRestore": "Palauttaminen epäonnistui",
    "checkingCli": "Tarkistetaan {tool} CLI...",
    "cliNotRunnable": "{tool} CLI asennettu, mutta ei ajettavissa",
    "cliNotInstalled": "{tool} CLI:tä ei ole asennettu",
    "cliNotDetected": "{tool} CLI:tä ei havaittu",
    "cliDetectedReady": "{tool} CLI havaittu ja valmis",
    "cliFoundFailedHealthcheck": "{tool} CLI löydettiin, mutta ajonaikainen kuntotarkastus epäonnistui{reason}.",
    "installCliPrompt": "Asenna {tool} CLI käyttääksesi tätä ominaisuutta.",
    "installCodexPrompt": "Asenna Codex CLI käyttääksesi automaattista käyttöönottoa.",
    "hide": "Piilota",
    "howToInstall": "Kuinka asentaa",
    "installationGuide": "Asennusopas",
    "platforms": "macOS / Linux / Windows:",
    "afterInstallationRun": "Suorita asennuksen jälkeen",
    "toVerify": "varmistaaksesi.",
    "current": "Nykyinen",
    "baseUrlPlaceholder": "https://.../v1",
    "resetToDefault": "Palauta oletusarvo",
    "providerModelPlaceholder": "toimittaja/mallitunnus",
    "apply": "Käytä",
    "reset": "Nollaa",
    "manualConfig": "Manuaalinen konfigurointi",
    "backups": "Varmuuskopiot",
    "configBackups": "Määritysten varmuuskopiot",
    "noBackupsYet": "Ei vielä varmuuskopioita. Varmuuskopiot luodaan automaattisesti ennen jokaista käyttöönottoa tai nollausta.",
    "restore": "Palauta",
    "backupRestoredReloading": "Varmuuskopio palautettu! Ladataan tilaa uudelleen...",
    "failedRestoreBackup": "Varmuuskopion palauttaminen epäonnistui",
    "applied": "Sovellettu!",
    "failed": "Epäonnistui",
    "resetDone": "Nollaa!",
    "omnirouteConfiguredOpenAiCompatible": "OmniRoute on määritetty OpenAI-yhteensopivaksi palveluntarjoajaksi",
    "provider": "Palveluntarjoaja",
    "model": "Malli",
    "providers": "Palveluntarjoajat",
    "auth": "Tod",
    "noApiKeysAvailable": "API-avaimia ei ole saatavilla",
    "usingDefaultOmniroute": "Oletuksena: sk_omniroute",
    "updateConfig": "Päivitä Config",
    "applyConfig": "Käytä konfiguraatiota",
    "noBackupsAvailable": "Varmuuskopioita ei ole saatavilla.",
    "profileSaved": "Profiili \"{name}\" tallennettu!",
    "failedSaveProfile": "Profiilin tallennus epäonnistui",
    "profileActivated": "Profiili aktivoitu!",
    "failedActivateProfile": "Profiilin aktivointi epäonnistui",
    "profiles": "Profiilit",
    "savedProfiles": "Tallennetut profiilit",
    "noProfilesYet": "Ei vielä tallennettuja profiileja. Tallenna nykyinen konfiguraatio alla olevaksi profiiliksi.",
    "activate": "Aktivoi",
    "deleteProfile": "Poista profiili",
    "profileNamePlaceholder": "Profiilin nimi (esim. henkilökohtainen tili)",
    "saveCurrent": "Tallenna nykyinen",
    "codexAuthNotePrefix": "Codex käyttää",
    "codexAuthNoteMiddle": "kanssa",
    "codexAuthNoteSuffix": "Napsauta \"Käytä\" määrittääksesi automaattisesti.",
    "claudeManualConfiguration": "Claude CLI - Manuaalinen konfigurointi",
    "codexManualConfiguration": "Codex CLI - Manuaalinen konfigurointi",
    "droidManualConfiguration": "Tehdasdroidi - manuaalinen konfigurointi",
    "openClawManualConfiguration": "Open Claw - Manuaalinen konfigurointi",
    "clineManualConfiguration": "Cline Manuaalinen konfigurointi",
    "kiloManualConfiguration": "Kilo Code Manuaalinen konfigurointi",
    "whenToUseLabel": "Milloin käyttää",
    "openToolDocs": "Avaa työkaludokumentit",
    "toolUseCases": {
      "claude": "Käytä, kun haluat vahvoja suunnittelutyönkulkuja ja pitkiä monitiedostoisia refraktoreita Claude Coden avulla.",
      "codex": "Käytä, kun tiimisi on standardoitu OpenAI Codex CLI -virtojen ja profiilipohjaisen todennuksen kanssa.",
      "droid": "Käytä, kun tarvitset kevyen pääteagentin, joka keskittyy nopeaan koodaukseen ja komentojen suoritussilmukoihin.",
      "openclaw": "Käytä, kun haluat Open Claw -tyyppisen koodausagentin, mutta reititetyn OmniRoute-käytäntöjen kautta.",
      "cline": "Käytä, kun määrität koodausagentteja editorien sisällä ja haluat ohjatun asennuksen OmniRoute-malleilla.",
      "kilo": "Käytä, kun työnkulkusi riippuu Kilo Code -komennoista ja nopeista iteratiivisista muokkauksista.",
      "cursor": "Käytä koodattaessa Cursorissa ja tarvitset mukautettuja OpenAI-yhteensopivia malleja OmniRouten kautta.",
      "continue": "Käytä, kun käytät Continuea IDE:issä ja tarvitset kannettavan JSON-pohjaisen palveluntarjoajan määrityksen.",
      "opencode": "Käytä, kun haluat käyttää päätealustaisia ​​agentteja ja komentosarjottua automaatiota OpenCoden kautta.",
      "kiro": "Käytä integroitaessa Kiroa ja ohjattaessa mallin reititystä keskitetysti OmniRoutesta.",
      "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.",
      "antigravity": "Käytä, kun Antigravity/Kiro-liikenne on siepattava MITM:n kautta ja ohjattava OmniRouteen.",
      "copilot": "Käytä, kun haluat Copilot-chat-tyylisen UX:n ja pakota OmniRoute-avaimia ja reitityssääntöjä.",
      "amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.",
      "qwen": "Use when you want Qwen Code CLI with OmniRoute-managed provider settings and multi-provider model access.",
      "hermes": "Käytä, kun tarvitset kevyen pääte-alkuperäisen AI-avustajan nopeisiin tehtäviin.",
      "hermes-agent": "__MISSING__:Use when you need Hermes Agent (by Nousresearch) with default, delegation, vision and auxiliary models routed through OmniRoute.",
      "custom": "Käytä mukautettuihin työkalutoteutuksiin tai yleisiin OpenAI-yhteensopiviin kokoonpanoihin."
    },
    "toolDescriptions": {
      "antigravity": "Google Antigravity IDE ja MITM",
      "claude": "Antrooppinen Claude Code CLI",
      "codex": "OpenAI Codex CLI",
      "droid": "Tehdas Droid AI Assistant",
      "openclaw": "Avaa Claw AI Assistant",
      "cline": "Cline AI Coding Assistant CLI",
      "kilo": "Kilo Code AI Assistant CLI",
      "cursor": "Cursor AI Code Editor",
      "continue": "Jatka AI Assistantia",
      "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",
      "hermes-agent": "__MISSING__:Hermes Agent (by Nousresearch) - Advanced terminal AI with multi-model support (delegation, vision, compression, etc.)",
      "custom": "Yleinen OpenAI-yhteensopiva CLI- tai SDK-konfiguraatiogeneraattori"
    },
    "guides": {
      "cursor": {
        "notes": {
          "0": "Tämän ominaisuuden käyttäminen vaatii Cursor Pro -tilin.",
          "1": "Kohdistin reitittää pyynnöt oman palvelimensa kautta, joten paikallista päätepistettä ei tueta. Ota Cloud Endpoint käyttöön asetuksista."
        },
        "steps": {
          "1": {
            "title": "Avaa Asetukset",
            "desc": "Siirry kohtaan Asetukset -> Mallit"
          },
          "2": {
            "title": "Ota OpenAI API käyttöön",
            "desc": "Ota käyttöön \"OpenAI API-avain\" -vaihtoehto"
          },
          "3": {
            "title": "Perus-URL-osoite"
          },
          "4": {
            "title": "API-avain"
          },
          "5": {
            "title": "Lisää mukautettu malli",
            "desc": "Napsauta \"Näytä kaikki mallit\" -> \"Lisää mukautettu malli\""
          },
          "6": {
            "title": "Valitse Malli"
          }
        }
      },
      "continue": {
        "steps": {
          "1": {
            "title": "Avaa Config",
            "desc": "Avaa Jatka määritystiedosto"
          },
          "2": {
            "title": "API-avain"
          },
          "3": {
            "title": "Valitse Malli"
          },
          "4": {
            "title": "Lisää mallin kokoonpano",
            "desc": "Lisää seuraavat kokoonpanot mallien matriisiisi:"
          }
        },
        "notes": {
          "0": "Jatka käyttää JSON-määritystiedostoa."
        }
      },
      "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 vaatii API-avaimen määrityksen.",
          "1": "Aseta perus-URL-osoite OmniRoute-päätepisteellesi."
        }
      },
      "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 vaatii Amazon-tilin."
        }
      },
      "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 Tab",
    "toolCategoriesDesc": "Tool Categories Desc",
    "allToolsTab": "All Tools Tab",
    "guidedClientsTab": "Guided Clients Tab",
    "mitmClientsTab": "Mitm Clients Tab",
    "customCliTab": "Mukautettu CLI",
    "toolCategories": "Tool Categories",
    "visibleToolsCount": "{count} työkalua saatavilla",
    "customCliBuilderTitle": "OpenAI-yhteensopiva CLI-muodostin",
    "customCliBuilderDescription": "Luo env vars- ja JSON-katkelmia mille tahansa CLI:lle tai SDK:lle, joka hyväksyy OpenAI-yhteensopivan perus-URL-osoitteen, API-avaimen ja mallitunnuksen.",
    "customCliNoModels": "Yhdistä vähintään yksi palveluntarjoaja täyttääksesi mallivalitsijat.",
    "customCliNameLabel": "CLI-nimi",
    "customCliNamePlaceholder": "esim. Oma tiimini CLI",
    "customCliDefaultModelLabel": "Oletusmalli",
    "customCliDefaultModelHelp": "Käytä mitä tahansa OmniRoute-mallin tunnusta tai yhdistelmää. Useimmat OpenAI-yhteensopivat CLI:t tarvitsevat vain /v1-perus-URL-osoitteen ja mallimerkkijonon.",
    "customCliKeyHelper": "Paikallisissa asennuksissa OmniRoute voi käyttää sk_omniroutea. Valitse pilvitilassa yksi hallinnan API-avaimista.",
    "customCliAliasMappingsLabel": "Alias-kartoitukset",
    "customCliAliasMappingsHelp": "Valinnaiset apualiakset kääreskripteille tai konfiguraatiotiedostoille, jotka haluavat vakaita lyhennettyjä nimiä.",
    "customCliAddAlias": "Lisää alias",
    "customCliNoMappings": "Ei vielä aliaskartoituksia. Lisää yksi, jos kääre- tai ryhmäkomentosarjasi käyttävät vakaita lyhyitä nimiä.",
    "customCliAliasPlaceholder": "esim. arvostelu",
    "customCliTargetModelLabel": "Kohdemalli",
    "customCliEndpointHintLabel": "Kuinka kytkeä päätepiste",
    "customCliEndpointHint": "Osoita mikä tahansa OpenAI-yhteensopiva asiakas OmniRoute /v1 -perus-URL-osoitteeseen. Raaka keskustelun loppuunsaattamisen päätepiste on {endpoint}. Käytä JSON-lohkoa, kun työkalu haluaa toimittajaobjektin, tai env-skriptiä, kun se lukee OPENAI_*-muuttujia.",
    "customCliEnvBlockTitle": "Env / shell katkelma",
    "customCliJsonBlockTitle": "Palveluntarjoajan JSON-esto",
    "copilotConfigGenerator": "GitHub Copilot Config Generator",
    "copilotApiKey": "API-avain",
    "copilotFilterModelsPlaceholder": "Suodata mallit...",
    "copilotMaxInputTokens": "Enimmäissyöttötunnukset",
    "copilotMaxOutputTokens": "Enimmäistulostusmerkit",
    "copilotToolCalling": "Työkalun kutsuminen",
    "copilotPasteInto": "Liitä kohteeseen: ",
    "wireApiChatCompletions": "Keskustelun päättymiset (/chat/completions)",
    "wireApiResponses": "Responses API (/responses)"
  },
  "combos": {
    "title": "Yhdistelmät",
    "description": "Luo mallikomboja painotetulla reitityksellä ja varatuella",
    "autoCatalogTitle": "Automaattinen reititysluettelo",
    "autoCatalogTemplateCount": "{count} malleja",
    "autoCatalogDescription": "Sisäänrakennetut auto/*-yhdistelmät, jotka on ratkaistu dynaamisesti yhdistettyjen palveluntarjoajien kautta. Käytä mitä tahansa näistä tunnuksista mallikenttänä – asetusta ei tarvita.",
    "autoCatalogExpand": "Laajenna automaattisen reitityksen luettelo",
    "autoCatalogCollapse": "Kutista automaattisen reitityksen luettelo",
    "createCombo": "Luo yhdistelmä",
    "editCombo": "Muokkaa yhdistelmää",
    "deleteCombo": "Poista yhdistelmä",
    "noModels": "Ei malleja",
    "noModelsYet": "Malleja ei ole vielä lisätty",
    "addModel": "Lisää malli",
    "addModelToCombo": "Lisää malli yhdistelmään",
    "routingStrategy": "Reititysstrategia",
    "maxRetries": "Max Uudelleenyritykset",
    "timeout": "Aikakatkaisu (ms)",
    "healthcheck": "Terveystarkastus",
    "priority": "Prioriteetti",
    "fallback": "Varaa",
    "roundRobin": "Round Robin",
    "random": "Satunnainen",
    "leastLatency": "Pienin latenssi",
    "comboName": "Yhdistelmänimi",
    "comboNamePlaceholder": "minun yhdistelmäni",
    "deleteConfirm": "Poistetaanko tämä yhdistelmä?",
    "noCombosYet": "Ei komboja vielä",
    "comboCreated": "Yhdistelmä luotiin onnistuneesti",
    "comboUpdated": "Yhdistelmän päivitys onnistui",
    "comboDeleted": "Yhdistelmä poistettu",
    "failedCreate": "Yhdistelmän luominen epäonnistui",
    "failedUpdate": "Yhdistelmän päivittäminen epäonnistui",
    "errorCreating": "Virhe yhdistelmän luomisessa",
    "errorUpdating": "Virhe yhdistelmän päivityksessä",
    "errorDeleting": "Virhe yhdistelmän poistamisessa",
    "testFailed": "Testipyyntö epäonnistui",
    "failedToggle": "Yhdistelmän vaihto epäonnistui",
    "testResults": "Testitulokset – {name}",
    "resolvedBy": "Ratkaisi:",
    "more": "+{count} lisää",
    "reqs": "vaatimukset",
    "success": "menestystä",
    "proxyConfigured": "Välityspalvelin määritetty",
    "copyComboName": "Kopioi yhdistelmänimi",
    "enableCombo": "Ota yhdistelmä käyttöön",
    "disableCombo": "Poista yhdistelmä käytöstä",
    "testCombo": "Testiyhdistelmä",
    "duplicate": "Kopioi",
    "proxyConfig": "Välityspalvelimen määritys",
    "nameRequired": "Nimi vaaditaan",
    "nameInvalid": "Vain kirjaimet, numerot, -, _, / ja . sallittu",
    "nameHint": "Kirjaimet, numerot, -, _, / ja . sallittu",
    "priorityDesc": "Peräkkäinen palautus: kokeilee ensin mallia 1, sitten 2 jne.",
    "weightedDesc": "Jakaa liikenteen painoprosentin mukaan varauksella",
    "roundRobinDesc": "Pyöreä jakelu: jokainen pyyntö siirtyy seuraavaan kiertoon malliin",
    "contextRelay": "Context Relay",
    "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate",
    "randomDesc": "Yhtenäinen satunnainen valinta, sitten takaisin muihin malleihin",
    "leastUsedDesc": "Valitsee mallin, jolla on vähiten pyyntöjä ja tasapainottaa kuormitusta ajan myötä",
    "costOptimizedDesc": "Reitit edullisimpaan malliin ensin hinnoittelun perusteella",
    "resetAware": "Reset-Aware RR",
    "resetAwareDesc": "Tasaa jäljellä olevan kiintiön 5 tuntia ja viikoittaisia nollauksia vastaan ja kierrättää sitten samanlaiset pisteet",
    "strictRandom": "Strict Random",
    "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling",
    "models": "Mallit",
    "autoBalance": "Automaattinen tasapainotus",
    "advancedSettings": "Lisäasetukset",
    "retryDelay": "Uudelleenyrityksen viive (ms)",
    "concurrencyPerModel": "Samanaikaisuus / malli",
    "queueTimeout": "Jonon aikakatkaisu (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": "Jätä tyhjäksi, jos haluat käyttää yleisiä oletusasetuksia. Nämä ohittavat palveluntarjoajakohtaiset asetukset.",
    "failoverBeforeRetry": "Vika ennen uudelleenyritystä",
    "maxSetRetries": "Uudelleenyritysten enimmäismäärä",
    "setRetryDelayMs": "Aseta uudelleenyritysviive (ms)",
    "moveUp": "Siirrä ylös",
    "moveDown": "Siirry alas",
    "removeModel": "Poista",
    "saving": "Tallennetaan...",
    "weighted": "Painotettu",
    "leastUsed": "Vähiten käytetty",
    "costOpt": "Kustannus-opt",
    "strategyGuideTitle": "Kuinka käyttää tätä strategiaa",
    "strategyGuideWhen": "Milloin käyttää",
    "strategyGuideAvoid": "Vältä milloin",
    "strategyGuideExample": "Esimerkki",
    "strategyGuide": {
      "priority": {
        "when": "Sinulla on yksi ensisijainen malli ja haluat varautua vain epäonnistumisen yhteydessä.",
        "avoid": "Tarvitset pyynnön jakelun eri malleihin.",
        "example": "Ensisijainen koodausmalli, jossa on halvempi varmuuskopio katkosten varalta."
      },
      "weighted": {
        "when": "Tarvitset ohjattua liikennettä jaettuna malleihin.",
        "avoid": "Et voi säilyttää tarkkoja painoja ajan mittaan.",
        "example": "80% vakaa malli + 20% kanarian mallin käyttöönotto."
      },
      "round-robin": {
        "when": "Haluat ennakoitavan ja tasaisen jakelun.",
        "avoid": "Mallit eroavat liikaa latenssista tai hinnasta.",
        "example": "Sama malli useilla tileillä suorituskyvyn levittämiseksi."
      },
      "random": {
        "when": "Haluat yksinkertaisen jakelun minimaalisella asennuksella.",
        "avoid": "Tarvitset tiukat liikennetakuut.",
        "example": "Nopea prototyyppien tekeminen vastaavilla malleilla."
      },
      "least-used": {
        "when": "Haluat mukautuvan tasapainotuksen live-kysynnän perusteella.",
        "avoid": "Liikenne on liian vähäistä hyötyäkseen käytön tasapainotuksesta.",
        "example": "Sekalaiset työmäärät, joissa yksi malli usein ylikuormitetaan."
      },
      "cost-optimized": {
        "when": "Kustannusten vähentäminen on tärkein prioriteettisi.",
        "avoid": "Hinnoittelutiedot puuttuvat tai ovat vanhentuneet.",
        "example": "Tausta- tai erätyöt, joissa edullisemmat kustannukset ovat paremmat."
      },
      "reset-aware": {
        "when": "Reitit useiden tilien välillä kiintiötelemetrialla ja erilaisilla palautusikkunoilla.",
        "avoid": "Kiintiötelemetria ei ole käytettävissä useimmilla tileillä.",
        "example": "Mieluummin 60 % viikoittainen tilin nollaus huomenna kuin 80 % tilin nollaus myöhemmin."
      },
      "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": "Käytä, kun haluat käyttää yhden palveluntarjoajan kiintiön kokonaan loppuun ennen siirtymistä seuraavaan.",
        "avoid": "Vältä, kun tarvitset pyyntötason kuormituksen tasausta palveluntarjoajien välillä.",
        "example": "Esimerkki: Käytä kaikki 200 dollarin Deepgram-krediitit ennen kuin palaat Groqiin."
      },
      "auto": {
        "when": "Käytä, kun tarvitset monitekijäistä pisteytysreititystä, joka perustuu hintaan, latenssiin ja laatuun.",
        "avoid": "Vältä, kun tarvitset tiukkaa prioriteettijärjestystä tai historiallista pysyvyyttä.",
        "example": "Esimerkki: Tasapainota pyynnöt eri vahvuuksilla omaavien mallien välillä."
      },
      "lkgp": {
        "when": "Käytä, kun haluat reitittää historiallisen onnistumisprosentin ja suorituskyvyn perusteella.",
        "avoid": "Vältä, kun historialliset tiedot ovat rajallisia tai epäluotettavia.",
        "example": "Esimerkki: Reititä malleihin, joilla on hyvä kokemus tietyistä tehtävistä."
      },
      "context-optimized": {
        "when": "Käytä, kun sinun on optimoitava kontekstiikkunan käyttö eri malleissa.",
        "avoid": "Vältä, kun malleilla on samanlainen kontekstin pituus tai tehtävät ovat yksinkertaisia.",
        "example": "Esimerkki: Jaa pitkät keskustelut malleihin, joissa on suuremmat kontekstiikkunat."
      }
    },
    "advancedHelp": {
      "maxRetries": "Kuinka monta uudelleenyritystä yritetään ennen kuin pyyntö epäonnistuu.",
      "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.",
      "failoverBeforeRetry": "Kun tämä on käytössä, kaikki ylävirran virheet laukaisevat välittömän vikasietoisuuden seuraavaan yhdistelmäkohteeseen ohittaen kaikki uudelleenyritykset ja vara-URL-osoitteet.",
      "maxSetRetries": "Kuinka monta kertaa koko tavoitejoukkoa yritetään uudelleen, kun jokainen tavoite epäonnistuu. 0 = ei asetustason uudelleenyritystä.",
      "setRetryDelayMs": "Viive asetustason uudelleenyritysten välillä, mikä antaa ohimeneville ongelmille aikaa ratkaista."
    },
    "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": "Vähiten käytetty reititys kysynnän hajauttamiseksi ajan mittaan.",
    "usageGuideHide": "Piilottaa",
    "usageGuideDontShowAgain": "Älä näytä uudelleen",
    "usageGuideShow": "Näytä opas",
    "quickTestTitle": "Yhdistelmä valmis tarkistettavaksi",
    "quickTestDescription": "Suorita testi nyt varmistaaksesi vara- ja latenssitoiminnan.",
    "testNow": "Testaa nyt",
    "pricingCoverage": "Hinnoittelun kattavuus",
    "pricingCoverageHint": "Kustannusoptimointi toimii parhaiten, kun kaikissa yhdistelmämalleissa on hinnoittelu.",
    "pricingAvailable": "Hinnoittelu saatavilla",
    "pricingMissing": "Ei hinnoittelua",
    "pricingAvailableShort": "hinnoiteltu",
    "pricingMissingShort": "ei-hintaa",
    "warningRoundRobinSingleModel": "Round-robin on hyödyllisin vähintään kahdella mallilla.",
    "warningCostOptimizedPartialPricing": "Vain {priced} {total}-malleista on hinnoiteltu. Reititys voi olla osittain kustannustietoinen.",
    "warningCostOptimizedNoPricing": "Tälle yhdistelmälle ei löytynyt hintatietoja. Kustannusoptimoitu voi reitittää odottamatta.",
    "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": "Oletko valmis säästämään?",
    "readinessDescription": "Tarkista tarkistuslista ennen tämän yhdistelmän luomista tai päivittämistä.",
    "readinessCheckName": "Yhdistelmänimi on kelvollinen",
    "readinessCheckModels": "Ainakin yksi malli on valittu",
    "readinessCheckWeights": "Painotettu kokonaismäärä on 100 %",
    "readinessCheckWeightsOptional": "Painosääntöä ei vaadita",
    "readinessCheckPricing": "Hintatiedot ovat saatavilla",
    "readinessCheckPricingOptional": "Hinnoittelusääntöä ei vaadita",
    "saveBlockedTitle": "Tallennus on estetty, kunnes seuraavat kohteet on korjattu:",
    "saveBlockName": "Määritä yhdistelmänimi.",
    "saveBlockModels": "Lisää vähintään yksi malli.",
    "saveBlockWeighted": "Aseta painot 100 %:iin (nykyinen: {total}%).",
    "saveBlockPricing": "Lisää hinnoittelu vähintään yhdelle mallille tai valitse toinen strategia.",
    "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.",
    "configOnlyStatus": "__MISSING__:Configuration View",
    "configOnlyHint": "__MISSING__:This panel shows routing inputs only. Live breaker state is available on the Health page.",
    "routingInputs": "__MISSING__:Routing Inputs",
    "routingInputsHint": "__MISSING__:Mode pack and weighting stay here; breaker runtime state stays on the Health page.",
    "emailVisibilityHint": "__MISSING__:Account emails here follow the global privacy toggle.",
    "emailVisibilityTooltip": "__MISSING__:Use the eye icon to reveal or hide account emails globally across combos, providers and quota screens.",
    "manualModel": "__MISSING__:Manual model",
    "manualModelInvalid": "__MISSING__:Enter a model as provider/model.",
    "manualModelUnknownProvider": "__MISSING__:Unknown provider prefix.",
    "builderDynamicAccountShort": "__MISSING__:Dynamic account",
    "builderNeedValidName": "__MISSING__:Define a valid combo name before continuing.",
    "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."
      },
      "reset-aware": {
        "title": "Nollaa tietoinen tilin kierto",
        "description": "Tasaa jäljellä olevan palveluntarjoajan kiintiön nollausajoitusta vastaan.",
        "tip1": "Käytä tarkkoja tilivaiheita tai tilitunnisteen reititystä tarjoajille, joilla on kiintiötelemetria.",
        "tip2": "Viritä istunto vs. viikoittaiset painot, kun lyhytaikainen uupumus on riskialtisempaa.",
        "tip3": "Pidä sidenauha pienenä, jotta vastaavat tilit pyörivät edelleen tasaisesti."
      },
      "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": "Tyhjennä pakokaasuntoimittajan kiintiöt peräkkäin ennen palautumista.",
        "tip1": "Käytä kiintiöpohjaiseen reititykseen selkeillä varaketjuilla.",
        "tip2": "Aseta kiintiöt tarkasti välttääksesi ennenaikaiset palautukset.",
        "tip3": "Toimii parhaiten palveluntarjoajien kanssa, jotka tarjoavat ilmaisia tasoja tai luottoja.",
        "title": "Kiintiön loppuminen"
      },
      "auto": {
        "description": "Reitti perustuu reaaliaikaiseen kustannusten, viiveen, laadun ja terveyden pisteytykseen.",
        "tip1": "Anna moottorin tasapainottaa useita tekijöitä automaattisesti.",
        "tip2": "Tarkkaile, mitkä tekijät vaikuttavat reitityspäätöksiin lokeissa.",
        "tip3": "Käytä monimutkaisiin työkuormiin, joissa mikään yksittäinen tekijä ei hallitse.",
        "title": "Monitekijäinen optimointi"
      },
      "lkgp": {
        "description": "Reitti perustuu historialliseen suorituskykyyn ja menestysmalleihin.",
        "tip1": "Tarkkoja ennusteita varten tarvitaan riittävä pyyntöhistoria.",
        "tip2": "Sopii hyvin työkuormiin, joissa mallin suorituskyky on johdonmukainen.",
        "tip3": "Tarkkaile ennusteen tarkkuutta ja säädä painoja tarpeen mukaan.",
        "title": "Historiaan perustuva reititys"
      },
      "context-optimized": {
        "description": "Optimoi reititys kontekstiikkunan käytön ja tunnuksen tehokkuuden perusteella.",
        "tip1": "Ohjaa pitkät keskustelut malleihin, joissa on suuremmat kontekstiikkunat.",
        "tip2": "Seuraa kontekstin käyttöä välttääksesi merkkien tuhlauksen.",
        "tip3": "Paras keskustelulliseen tekoälyyn, joka vaatii laajaa kontekstin säilyttämistä.",
        "title": "Kontekstin optimointi"
      },
      "context-relay": {
        "description": "Parasta, kun tilin kierto on odotettavissa ja seuraavan tilin on perittävä yksinkertaistettu tehtäväyhteenveto.",
        "tip1": "Käytä palveluntarjoajien kanssa, jotka kiertävät tilejä samalle malliperheelle.",
        "tip2": "Aseta kanavanvaihdon kynnys kovien kiintiöiden raja-arvojen alapuolelle yhteenvedon luontiajalle.",
        "tip3": "Aseta erillinen yhteenvetomalli vain, jos ensisijainen on liian kallis tai epävakaa.",
        "title": "Istunnon jatkuvuuden prioriteetti"
      },
      "p2c": {
        "description": "Reititä palveluntarjoajalle, jolla on pienin nykyinen kuormitus reaaliaikaisten mittareiden perusteella.",
        "tip1": "Tarkkaile palveluntarjoajan terveysmittareita tarkan kuormituksen arvioimiseksi.",
        "tip2": "Toimii parhaiten homogeenisten toimittajapoolien kanssa.",
        "tip3": "Säädä herkkyyttä välttääksesi heilahtelun liikennepiikkien aikana.",
        "title": "Kahden valinnan voima"
      }
    },
    "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": "Auto Combo",
    "autoDesc": "Self-healing smart routing pool (Performance optimized)",
    "lkgp": "LKGP Mode",
    "lkgpDesc": "Last Known Good Provider (Predictable resilience)",
    "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": "Tämä tarkka toimittaja/malli/tilivaihe on jo yhdistelmässä.",
    "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": "Suorita jokainen vaihe, jotta voit määrittää komboja, rakentaa vaiheita, valita reititysstrategian ja tarkastella tuloksia.",
    "builderStepsDescription": "Rakenna jokainen yhdistelmävaihe järjestyksessä: toimittaja, malli ja sitten tili. Tämä mahdollistaa saman palveluntarjoajan ja mallin uudelleenkäytön eri tileillä.",
    "selectProvider": "Valitse Palveluntarjoaja",
    "selectProviderPlaceholder": "Valitse palveluntarjoaja",
    "selectModel": "Valitse Malli",
    "selectModelPlaceholder": "Valitse ensin palveluntarjoaja",
    "selectAccount": "Valitse Tili",
    "selectComboToReference": "Valitse viiteyhdistelmä",
    "comboReference": "Yhdistelmäviite",
    "addComboReference": "Lisää yhdistelmäviite",
    "addStepBeforeContinue": "Lisää vähintään yksi vaihe ennen kuin siirryt seuraavaan vaiheeseen.",
    "previewNextStep": "Esikatsele seuraava vaihe",
    "autoSelectAccount": "Valitse tili automaattisesti suorituksen aikana",
    "modePackBalanced": "Tasapainoinen",
    "modePackBudget": "Budjetti",
    "modePackPerformance": "Suorituskyky",
    "modePackCustom": "Mukautettu",
    "browseLegacyCatalog": "Selaa vanhaa yhdistelmäluetteloa",
    "agentFeaturesTitle": "Agentin ominaisuudet",
    "agentFeaturesDescription": "Ota lisäominaisuudet käyttöön tätä yhdistelmää käyttäville agenteille",
    "agentFeaturesSystemMessageOverride": "Ohita järjestelmäviesti",
    "agentFeaturesSystemMessagePlaceholder": "Olet asiantuntija-assistentti...",
    "agentFeaturesSystemMessageHint": "Järjestelmäviestien ohitus agenteille",
    "agentFeaturesToolFilterRegex": "/regex-pattern/",
    "agentFeaturesToolFilterHint": "Työkalusuodatin regex agenteille",
    "agentFeaturesContextCacheHint": "Ota agenttityökalujen kontekstivälimuisti käyttöön",
    "agentFeaturesContextCacheProtection": "Suojaa välimuisti agenttityökalun mutaatioilta",
    "agentFeaturesContextLength": "Kontekstin pituus",
    "agentFeaturesContextLengthPlaceholder": "esim. 128 000",
    "agentFeaturesContextLengthHint": "Määrittää konteksti-ikkunan tälle yhdistelmälle /v1/models.",
    "agentFeaturesContextLengthErrorInteger": "Kontekstin pituuden on oltava kelvollinen kokonaisluku",
    "agentFeaturesContextLengthErrorRange": "Kontekstin pituuden on oltava välillä 1000–2000000",
    "compressionOverride": "Pakkauksen ohitus",
    "modePack": "Mode Pack"
  },
  "costs": {
    "title": "Kustannukset",
    "pageDescription": "Seuraa kuluja, analysoi trendejä ja hallitse tekoälybudjettiasi kaikilla palveluntarjoajilla",
    "overview": "Yleiskatsaus",
    "budget": "Budjetti",
    "totalCost": "Kokonaiskustannukset",
    "breakdown": "Kustannusten erittely",
    "noData": "Ei hintatietoja",
    "byModel": "Mallin mukaan",
    "byProvider": "Palveluntarjoajan toimesta",
    "range7d": "7 päivää",
    "range30d": "30 päivää",
    "range90d": "90 päivää",
    "rangeAll": "Kaikki aika",
    "spend30d": "Spend30D",
    "activeModels": "Active Models",
    "selectedWindow": "Selected Window",
    "activeProviders": "Active Providers",
    "overviewTitle": "Overview Title",
    "spend7d": "Spend7D",
    "avgCostPerRequest": "Avg Cost Per Request",
    "noCostDataDescription": "No Cost Data Description",
    "spendToday": "Spend Today",
    "overviewLoadFailed": "Overview Load Failed",
    "overviewDescription": "Overview Description",
    "providerShare": "Provider Share",
    "topProviders": "Top Providers",
    "costTrend": "Cost Trend",
    "noCostDataTitle": "No Cost Data Title",
    "topModels": "Top Models",
    "requestsInWindow": "Requests In Window",
    "tokenUsage": "Tokenin käyttö",
    "totalTokens": "Tokeneja yhteensä",
    "inputTokens": "Input Tokens",
    "outputTokens": "Tulostustunnukset",
    "inputOutputRatio": "Tulo/lähtösuhde",
    "tokens": "rahakkeita",
    "routingEfficiency": "Reitityksen tehokkuus",
    "fallbackCount": "Varapyynnöt",
    "fallbackRate": "Varausprosentti",
    "modelCoverage": "Mallin kattavuus",
    "modelCoverageDesc": "% pyynnöistä, joissa on selkeä malli",
    "outOfRequests": "/ {total} pyyntöä",
    "costByApiKey": "Hinta API-avaimen mukaan",
    "costByAccount": "Hinta tilikohtaisesti",
    "apiKeyName": "API-avain",
    "account": "Tili",
    "requests": "Pyynnöt",
    "cost": "Kustannukset",
    "dayStreak": "päivän putki",
    "weeklyUsagePattern": "Viikoittainen käyttömalli",
    "activityHeatmap": "Toiminta (365 päivää)",
    "less": "Vähemmän",
    "more": "Lisää",
    "monthlyForecast": "Kuukauden ennuste",
    "forecastBasis": "Perustuu viimeisiin {days} päivään",
    "avgDailyCost": "Keskim. päivittäinen hinta",
    "daysRemaining": "{days} päivää jäljellä",
    "periodComparison": "Jakson vertailu",
    "previousPeriod": "Edellinen puolisko",
    "currentPeriod": "Nykyinen puolikas",
    "exportCSV": "Vie CSV-muodossa",
    "exportJSON": "Vie JSON-muodossa",
    "legacyFreeLabel": "__MISSING__:Legacy / Free",
    "costExplorerTitle": "Kustannusten tarkastelu",
    "costExplorerDescription": "Tutki kulutusta palveluntarjoajan, mallin, API-avaimen, tilin tai palvelutason mukaan.",
    "groupProvider": "Palveluntarjoaja",
    "groupModel": "Malli",
    "groupApiKey": "API-avain",
    "groupAccount": "Tili",
    "groupServiceTier": "Palvelutaso",
    "serviceTierFast": "__MISSING__:Fast",
    "serviceTierFlex": "__MISSING__:Flex",
    "serviceTierStandard": "__MISSING__:Standard",
    "serviceTierBreakdownTitle": "__MISSING__:Service Tier",
    "serviceTierBreakdownSubtitle": "__MISSING__:Fast / Flex / Standard split",
    "serviceTierUsageSaved": "__MISSING__:usage saved",
    "serviceTierCostSaved": "__MISSING__:saved",
    "serviceTierCostShareSuffix": "__MISSING__:of cost",
    "dimension": "Ulottuvuus",
    "share": "Osuus",
    "legacyOrFree": "Vanha / ilmainen",
    "filterRows": "Suodata rivejä…",
    "filterCostExplorerRows": "Suodata kustannusten tarkastelun rivejä",
    "noMatchingCostRows": "Ei vastaavia kustannusrivejä",
    "noMatchingCostRowsDescription": "Muokkaa hakutekstiä, ryhmittelyä tai valittua aikaikkunaa.",
    "showingCostRows": "Näytetään {shown}/{total} vastaavaa riviä.",
    "showingTopCostRows": "Näytetään {shown}/{total} vastaavaa riviä (50 parasta)."
  },
  "endpoint": {
    "title": "API-päätepiste",
    "available": "Käytettävissä olevat päätepisteet",
    "cloudProxy": "Pilvivälityspalvelin",
    "disableConfirm": "Haluatko varmasti poistaa pilvivälityspalvelimen käytöstä?",
    "baseUrl": "Perus-URL-osoite",
    "apiKeyLabel": "API-avain",
    "registeredKeys": "Rekisteröity avaimet",
    "chatCompletions": "Chatin loppuun saattaminen",
    "responses": "Vastaukset",
    "listModels": "Listaa mallit",
    "usingCloudProxy": "Cloud Proxyn käyttäminen",
    "usingLocalServer": "Paikallisen palvelimen käyttö",
    "machineId": "Koneen tunnus: {id}...",
    "disableCloud": "Poista Cloud käytöstä",
    "enableCloud": "Ota Cloud käyttöön",
    "modelsAcrossEndpoints": "{models} mallit {endpoints} päätepisteen välillä",
    "loadingModels": "Loading available models...",
    "chatDesc": "Suoratoisto ja ei-striimaus chat kaikkien palveluntarjoajien kanssa",
    "embeddings": "Upotukset",
    "embeddingsDesc": "Tekstin upotukset haku- ja RAG-putkistoja varten",
    "imageGeneration": "Kuvan luominen",
    "imageDesc": "Luo kuvia tekstikehotteista",
    "rerank": "Järjestä uudelleen",
    "rerankDesc": "Järjestä asiakirjat uudelleen kyselyn osuvuuden mukaan",
    "audioTranscription": "Äänen transkriptio",
    "audioTranscriptionDesc": "Literoi äänitiedostot tekstiksi (kuiskaus)",
    "textToSpeech": "Tekstistä puheeksi",
    "textToSpeechDesc": "Muunna teksti luonnolliselta kuulostavaksi puheeksi",
    "musicGeneration": "Music Generation",
    "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)",
    "moderations": "Moderaatiot",
    "moderationsDesc": "Sisällön moderointi ja turvallisuusluokitus",
    "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": "Ydin-API:t",
    "categoryMedia": "Media & Monimuotoinen",
    "categorySearch": "Search & Discovery",
    "categoryUtility": "Apuohjelmat & Hallinta",
    "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": "Ota Cloud Proxy käyttöön",
    "whatYouGet": "Mitä saat",
    "cloudBenefitAccess": "Käytä sovellusliittymääsi mistä päin maailmaa tahansa",
    "cloudBenefitShare": "Jaa päätepiste tiimisi kanssa helposti",
    "cloudBenefitPorts": "Ei tarvitse avata portteja tai määrittää palomuuria",
    "cloudBenefitEdge": "Nopea maailmanlaajuinen reunaverkko",
    "cloudSessionNote": "Cloud säilyttää todennusistunnon 1 päivän ajan. Jos sitä ei käytetä, se poistetaan automaattisesti.",
    "cloudUnstableNote": "Pilvi on tällä hetkellä epävakaa Claude Code OAuthin kanssa joissakin tapauksissa.",
    "cloudConnected": "Cloud Proxy yhdistetty!",
    "connectingToCloud": "Yhdistetään pilveen...",
    "verifyingConnection": "Vahvistetaan yhteyttä...",
    "connecting": "Yhdistetään...",
    "verifying": "Vahvistetaan...",
    "connected": "Yhdistetty!",
    "disableCloudTitle": "Poista Cloud Proxy käytöstä",
    "disableWarning": "Kaikki todennusistunnot poistetaan pilvestä.",
    "syncingData": "Synkronoidaan uusimpia tietoja...",
    "disablingCloud": "Poistetaan pilvi käytöstä...",
    "syncing": "Synkronoidaan...",
    "disabling": "Poistetaan käytöstä...",
    "cloudConnectedVerified": "Cloud Proxy yhdistetty ja vahvistettu!",
    "connectedVerificationPending": "Yhdistetty — vahvistus odottaa",
    "connectedVerificationPendingWithError": "Yhdistetty – vahvistus odottaa: {error}",
    "cloudDisabledSuccess": "Pilvi poistettu käytöstä onnistuneesti",
    "syncedSuccess": "Synkronointi onnistui",
    "failedDisable": "Pilven poistaminen käytöstä epäonnistui",
    "failedEnable": "Pilven käyttöönotto epäonnistui",
    "cloudRequestTimeout": "Pilvipyynnön aikakatkaisu",
    "cloudRequestFailed": "Pilvipyyntö epäonnistui",
    "cloudWorkerUnreachable": "Pilvityöntekijää ei tavoitettu. Varmista, että pilvipalvelu on käynnissä (npm run dev in /cloud).",
    "connectionFailed": "Yhteys epäonnistui",
    "syncFailed": "Pilvitietojen synkronointi epäonnistui",
    "cloudflaredTitle": "Cloudflare Quick Tunnel",
    "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint to make it accessible from the internet without configuring DNS.",
    "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. URLs change after restart.",
    "cloudflaredEnable": "Enable Tunnel",
    "cloudflaredInstallAndEnable": "Install & Enable",
    "cloudflaredDisable": "Stop Tunnel",
    "cloudflaredRunning": "Running",
    "cloudflaredStarting": "Starting",
    "cloudflaredStoppedState": "Stopped",
    "cloudflaredNotInstalled": "Not installed",
    "cloudflaredUnsupported": "Unsupported",
    "cloudflaredError": "Error",
    "cloudflaredStarted": "Cloudflare tunnel started",
    "cloudflaredStopped": "Cloudflare tunnel stopped",
    "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel",
    "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after restart.",
    "cloudflaredUnsupportedNote": "This platform is not supported for managed installation.",
    "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.",
    "cloudflaredLastError": "Last error: {error}",
    "providerModelsTitle": "{provider} – Mallit",
    "noModelsForProvider": "Tälle tarjoajalle ei ole saatavilla malleja.",
    "chat": "Chat",
    "embedding": "Upottaminen",
    "image": "Kuva",
    "custom": "mukautettu",
    "modelsCount": "{count, plural, one {# model} other {# models}}",
    "sectionTitle": "Integrointipinta",
    "sectionDescription": "OpenAI-yhteensopivat API:t ja toimintaprotokollan päätepisteet",
    "tabApis": "OpenAI-yhteensopivat sovellusliittymät",
    "tabProtocols": "Protokollat",
    "tabsAria": "Päätepisteen osat",
    "protocolsTitle": "Protokollat",
    "protocolsDescription": "MCP ja A2A ovat ensiluokkaisia päätepisteitä, joissa on omistettu tarkkailtavuus ja hallinta.",
    "mcpCardTitle": "MCP-palvelin",
    "mcpCardDescription": "Model Context Protocol over stdio",
    "a2aCardTitle": "A2A palvelin",
    "a2aCardDescription": "Agent2Agent JSON-RPC -päätepiste",
    "protocolToolsLabel": "Työkalut",
    "protocolTasksLabel": "Tehtävät",
    "protocolActiveStreamsLabel": "Aktiiviset streamit",
    "protocolLastActivity": "Last activity",
    "quickStart": "Pika-aloitus",
    "openMcpDashboard": "Avaa MCP-hallinta",
    "openA2aDashboard": "Avaa A2A-hallinta",
    "mcpQuickStartTitle": "MCP Quick Start",
    "mcpQuickStartStep1": "Suorita MCP-palvelin `omniroute --mcp`:n kautta.",
    "mcpQuickStartStep2": "Määritä MCP-asiakas muodostamaan yhteys stdio-siirron kautta.",
    "mcpQuickStartStep3": "Kutsu työkaluja, kuten `omniroute_get_health` ja `omniroute_list_combos`.",
    "a2aQuickStartTitle": "A2A Pikaopas",
    "a2aQuickStartStep1": "Tutustu agenttikorttiin osoitteessa `/.well-known/agent.json`.",
    "a2aQuickStartStep2": "Lähetä JSON-RPC-pyynnöt osoitteeseen `POST /a2a` käyttämällä `message/send` tai `message/stream`.",
    "a2aQuickStartStep3": "Seuraa ja ohjaa tehtäviä käyttämällä `tasks/get` ja `tasks/cancel`.",
    "completionsLegacy": "Completions (Legacy)",
    "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
    "messagesApi": "Viestit",
    "messagesApiDesc": "Alkuperäinen Anthropic Messages API -muoto Claude-yhteensopiville palveluntarjoajille",
    "imageEdits": "Kuvan muokkaukset",
    "imageEditsDesc": "Muokkaa ja muokkaa olemassa olevia kuvia tekoälyllä (inpainting, outpainting, variaatiot)",
    "batchApi": "Erä-API",
    "batchApiDesc": "Käsittele suuria pyyntöeriä asynkronisesti (OpenAI-yhteensopiva)",
    "filesApi": "Tiedostojen API",
    "filesApiDesc": "Lataa ja hallitse tiedostoja eräkäsittelyä varten",
    "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-salasana (pakollinen macOS/Linuxissa)",
    "ngrokTitle": "ngrok tunneli",
    "ngrokRunning": "Juoksemassa",
    "ngrokStarting": "Alkaa",
    "ngrokStoppedState": "Pysähtynyt",
    "ngrokNeedsAuth": "Tarvitsee todennusta",
    "ngrokNotInstalled": "Ei asennettu",
    "ngrokUnsupported": "Ei tuettu",
    "ngrokError": "Virhe",
    "ngrokEnable": "Ota tunneli käyttöön",
    "ngrokDisable": "Pysäytä tunneli",
    "ngrokUrlNotice": "Luo julkisen ngrok-tunnelin.",
    "ngrokAuthTokenLabel": "Authttoken (pakollinen, jos NGROK_AUTHTOKEN ei ole asetettu)",
    "ngrokAuthTokenPlaceholder": "Syötä ngrok-authtokeni",
    "ngrokLastError": "Viimeisin virhe: {error}",
    "ngrokStarted": "ngrok tunneli alkoi",
    "ngrokStopped": "ngrok tunneli pysähtyi",
    "ngrokRequestFailed": "ngrok-tunnelin päivittäminen epäonnistui",
    "tokenSaverSubtitle": "Käytä vähemmän rahakkeita jokaiseen pyyntöön.",
    "tokenSaverToolOutput": "Työkalun ulostulo",
    "tokenSaverLlmOutput": "LLM-lähtö",
    "tokenSaverInputCompression": "Syöttöpakkaus",
    "apiEndpointsCatalogUnavailable": "API-luettelo ei ole saatavilla",
    "apiEndpointsSearchPlaceholder": "Hae päätepisteitä...",
    "apiEndpointsRequiresAuth": "Edellyttää todennusta",
    "apiEndpointsNoMatch": "Yksikään päätepiste ei vastaa suodatinta",
    "localServer": "Paikallinen palvelin",
    "cloudOmniroute": "Pilvi OmniRoute",
    "copyUrl": "Kopioi URL-osoite",
    "badgeLoopbackTooltip": "__MISSING__:This endpoint is only accessible locally (loopback only)",
    "badgeAlwaysProtectedTooltip": "__MISSING__:This endpoint is always protected and requires authorization",
    "badgeInternalTooltip": "__MISSING__:This is an internal system endpoint",
    "tierAll": "__MISSING__:All",
    "tierAuth": "__MISSING__:Authenticated",
    "tierLoopback": "__MISSING__:Loopback",
    "tierAlwaysProtected": "__MISSING__:Always Protected",
    "tierPublic": "__MISSING__:Public",
    "hideInternal": "__MISSING__:Hide Internal",
    "showInternal": "__MISSING__:Show Internal"
  },
  "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": "Ladataan MCP-hallintapaneelia...",
    "activate": "aktivoida",
    "deactivate": "deaktivoida",
    "confirmSwitchCombo": "Vahvista {action}-yhdistelmä \"{combo}\"?",
    "switchComboFailed": "Yhdistelmätilan vaihtaminen epäonnistui.",
    "switchComboSuccess": "Yhdistelmä \"{combo}\" päivitetty.",
    "confirmApplyProfile": "Otetaanko joustavuusprofiili käyttöön \"{profile}\"?",
    "applyProfileFailed": "Resilienssiprofiilin käyttäminen epäonnistui.",
    "applyProfileSuccess": "Profiilia \"{profile}\" on käytetty.",
    "confirmResetBreakers": "Nollataanko kaikki katkaisijat?",
    "resetBreakersFailed": "Katkaisijoiden nollaus epäonnistui.",
    "resetBreakersSuccess": "Katkaisijat nollattu.",
    "processStatus": "Prosessin tila",
    "online": "verkossa",
    "offline": "Offline-tilassa",
    "disableLabel": "__MISSING__:Disable {label}",
    "enableLabel": "__MISSING__:Enable {label}",
    "transportMode": "__MISSING__:Transport Mode",
    "transportStdioDesc": "__MISSING__:Local — IDE spawns process via omniroute --mcp",
    "transportSseDesc": "__MISSING__:Remote — Server-Sent Events over HTTP",
    "transportStreamableHttpDesc": "__MISSING__:Remote — Modern bidirectional HTTP",
    "copy": "__MISSING__:Copy",
    "mcpDashboardCopyUrl": "Kopioi URL-osoite",
    "mcpDisabledTitle": "__MISSING__:MCP is disabled",
    "mcpDisabledDesc": "__MISSING__:Enable MCP above to configure transport mode and view server telemetry.",
    "mcpIntro": "__MISSING__:Model Context Protocol — {tools} tools across {scopes} scopes, {transports} transports (stdio / SSE / Streamable HTTP).",
    "mcpStep1": "__MISSING__:Run via {code}",
    "mcpStep2": "__MISSING__:Configure your MCP client to connect over stdio transport.",
    "mcpStep3": "__MISSING__:Invoke tools like {code1} and {code2}.",
    "pid": "PID",
    "sessionUptime": "Istunnon käyttöaika",
    "lastHeartbeat": "Viimeinen sydämenlyönti",
    "activity24h": "Aktiviteetti (24h)",
    "totalCalls": "Puhelut yhteensä",
    "successRate": "Menestysprosentti",
    "avgLatency": "Keskimääräinen viive",
    "topTools": "Huipputyökalut",
    "noToolCalls24h": "Ei työkalukutsuja viimeisen 24 tunnin aikana.",
    "runtimeDetails": "Kestoajan tiedot",
    "transport": "Kuljetus",
    "scopesEnforced": "Laajuudet pannaan täytäntöön",
    "yes": "kyllä",
    "no": "ei",
    "lastCall": "Viimeinen puhelu",
    "heartbeatPath": "Sydämen sykkeen polku",
    "operationalControls": "Toiminnalliset ohjaimet",
    "switchCombo": "Kytkinyhdistelmä",
    "inactive": "ei-aktiivinen",
    "active": "aktiivinen",
    "activateCombo": "Aktivoi yhdistelmä",
    "deactivateCombo": "Poista yhdistelmä käytöstä",
    "applyResilienceProfile": "Käytä joustavuusprofiilia",
    "profileAggressive": "aggressive",
    "profileBalanced": "tasapainoinen",
    "profileConservative": "konservatiivinen",
    "applyProfile": "Käytä profiilia",
    "resetCircuitBreakers": "Nollaa katkaisijat",
    "resetCircuitBreakersHelp": "Tyhjentää nykyisen katkaisijatilan ja palveluntarjoajien vikalaskurin.",
    "resetAllBreakers": "Nollaa kaikki katkaisijat",
    "toolsAndScopes": "Työkaluja ja tähtäimet",
    "tableTool": "Työkalu",
    "tableScopes": "Soveltamisalat",
    "tablePhase": "Vaihe",
    "tableAudit": "Audit",
    "auditLog": "Tarkastusloki",
    "auditSummary": "Puhelut: {total} | sivu {page} / {totalPages}",
    "allTools": "Kaikki työkalut",
    "allResults": "Kaikki tulokset",
    "success": "Menestystä",
    "failure": "Epäonnistuminen",
    "apiKeyIdPlaceholder": "apiKeyId",
    "loadingAuditEntries": "Ladataan tarkastusmerkintöjä...",
    "noAuditEntriesForFilters": "Nykyisille suodattimille ei löytynyt tarkastusmerkintöjä.",
    "tableTimestamp": "Aikaleima",
    "tableDuration": "Kesto",
    "tableResult": "Tulos",
    "tableApiKey": "API-avain",
    "failed": "epäonnistunut",
    "previous": "Edellinen",
    "next": "Seuraavaksi",
    "apiKeyId": "Api Key Id",
    "offset": "Offset",
    "limit": "Limit",
    "tool": "Tool"
  },
  "a2aDashboard": {
    "loading": "Ladataan A2A-hallintapaneelia...",
    "confirmCancelTask": "Peruutetaanko tehtävä {taskId}?",
    "cancelTaskFailed": "Tehtävän peruuttaminen epäonnistui.",
    "cancelTaskSuccess": "Tehtävä {taskId} peruutettu.",
    "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": "Aktiiviset streamit",
    "lastTask": "Last task",
    "taskStateOverview": "Task state overview",
    "state": {
      "submitted": "submitted",
      "working": "working",
      "completed": "valmiiksi",
      "failed": "epäonnistunut",
      "cancelled": "peruutettu"
    },
    "agentCard": "Agenttikortti",
    "agentCardPath": "__MISSING__:/.well-known/agent.json",
    "version": "Versio",
    "url": "URL-osoite",
    "capabilities": "Ominaisuudet",
    "agentCardNotAvailable": "Agenttikorttia ei ole saatavilla.",
    "quickValidation": "Nopea vahvistus",
    "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": "Päivitetty",
    "tableActions": "Toiminnot",
    "view": "Näytä",
    "cancel": "Peruuttaa",
    "previous": "Edellinen",
    "next": "Seuraavaksi",
    "taskDetail": "Tehtävän yksityiskohdat",
    "close": "Lähellä",
    "metadata": "Metatiedot",
    "events": "Tapahtumat",
    "artifacts": "Artefaktit",
    "tablePhase": "Table Phase",
    "offset": "Offset",
    "limit": "Limit",
    "skill": "Skill",
    "rpcEndpoint": "POSTITUS /a2a",
    "rpcMethodSend": "viesti/lähetä",
    "rpcMethodStream": "viesti/stream",
    "rpcMethodGet": "tehtäviä/saa",
    "rpcMethodCancel": "tehtävät/peruuta",
    "serviceLabel": "A2A",
    "online": "__MISSING__:Online",
    "offline": "__MISSING__:Offline",
    "disableLabel": "__MISSING__:Disable {label}",
    "enableLabel": "__MISSING__:Enable {label}",
    "a2aDisabledTitle": "__MISSING__:A2A is disabled",
    "a2aDisabledDesc": "__MISSING__:Enable A2A above to view task telemetry, agent details, and validation tools.",
    "a2aIntro": "__MISSING__:Agent2Agent JSON-RPC 2.0 endpoint — send tasks, stream responses, cancel in-flight jobs.",
    "a2aStep1": "__MISSING__:Discover the agent card at {code}.",
    "a2aStep2": "__MISSING__:Send JSON-RPC to {code1} using {code2} or {code3}.",
    "a2aStep3": "__MISSING__:Track and cancel tasks with {code1} and {code2}."
  },
  "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",
    "pipelineOk": "Putkilinja OK ({latencyMs}ms)",
    "pipelineError": "Putkilinjan virhe",
    "healthUnknown": "Terveys tuntematon",
    "checkingHealth": "Tarkistetaan…",
    "checkHealth": "Tarkista terveys",
    "pageInfo": "Sivu {page} / {totalPages} (yhteensä {total})",
    "previous": "Edellinen",
    "next": "Seuraavaksi",
    "cancel": "Peruuta",
    "save": "Tallenna",
    "keyPlaceholder": "esim. user.preferences.theme",
    "contentPlaceholder": "Muista arvo tai JSON-sisältö"
  },
  "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",
    "filterSkillsPlaceholder": "Suodata taidot nimen, kuvauksen tai tunnisteen mukaan",
    "allModes": "Kaikki tilat",
    "totalSkills": "__MISSING__:Total Skills",
    "enabledSkills": "__MISSING__:Enabled",
    "totalExecutions": "__MISSING__:Executions",
    "successRate": "__MISSING__:Success Rate",
    "marketplaceTab": "__MISSING__:Marketplace",
    "applyFilters": "__MISSING__:Apply filters",
    "popularDefaultsLabel": "__MISSING__:Popular by default for selected provider:",
    "onMode": "__MISSING__:ON",
    "offMode": "__MISSING__:OFF",
    "autoMode": "__MISSING__:AUTO",
    "installSkillButton": "__MISSING__:Install Skill",
    "installSkillModalTitle": "__MISSING__:Install Skill",
    "installJsonPlaceholder": "__MISSING__:Paste skill manifest JSON here...",
    "installing": "__MISSING__:Installing...",
    "installSuccess": "__MISSING__:Skill installed ({id})",
    "installError": "__MISSING__:Install failed",
    "invalidJson": "__MISSING__:Invalid JSON",
    "searchMarketplacePlaceholder": "__MISSING__:Search skills...",
    "searchMarketplace": "__MISSING__:Search Marketplace",
    "marketplaceEmpty": "__MISSING__:No skills found in marketplace",
    "marketplaceError": "__MISSING__:Search failed",
    "installingFromMarketplace": "__MISSING__:Installing from marketplace...",
    "popularSkills": "__MISSING__:Popular Skills",
    "skillsMarketplace": "Taitojen markkinapaikka",
    "searching": "__MISSING__:Searching...",
    "pageInfo": "__MISSING__:Page {page} of {totalPages} ({total} total)",
    "previous": "__MISSING__:Previous",
    "next": "__MISSING__:Next",
    "activeProvider": "__MISSING__:Active provider:",
    "changeInSettings": "__MISSING__:Change this in Settings → Memory & Skills.",
    "installs": "__MISSING__:installs",
    "marketplaceSkillsMpHint": "__MISSING__:Configure your SkillsMP API key in Settings to browse the marketplace.",
    "marketplaceSkillsShHint": "__MISSING__:Search the skills.sh open directory to discover and install agent skills.",
    "installSkillModalDesc": "__MISSING__:Paste a skill manifest JSON or upload a .json file.",
    "uploadJson": "__MISSING__:Upload JSON",
    "cancel": "__MISSING__:Cancel",
    "installSkill": "Asenna Skill"
  },
  "health": {
    "title": "Järjestelmän terveys",
    "description": "OmniRoute-instanssisi reaaliaikainen seuranta",
    "healthy": "Terve",
    "degraded": "Heikentynyt",
    "down": "Alas",
    "uptime": "Päällä",
    "memory": "Muisti",
    "memoryRss": "Muisti (RSS)",
    "heap": "Kasa",
    "cpu": "CPU",
    "database": "Tietokanta",
    "version": "Versio",
    "lastCheck": "Viimeinen tarkistus",
    "providerHealth": "Palveluntarjoajan terveys",
    "systemMetrics": "Järjestelmän mittarit",
    "tokenHealth": "Token Health",
    "refreshAll": "Päivitä kaikki",
    "checkNow": "Tarkista nyt",
    "loadingHealth": "Ladataan terveystietoja…",
    "failedToLoad": "Terveystietojen lataaminen epäonnistui: {error}",
    "retry": "Yritä uudelleen",
    "allOperational": "Kaikki järjestelmät toimivat",
    "issuesDetected": "Järjestelmäongelmia havaittu",
    "updatedAt": "Päivitetty {time}",
    "latency": "Latenssi",
    "latencyP50": "p50",
    "latencyP95": "p95",
    "latencyP99": "p99",
    "millisecondsShort": "{value}ms",
    "notAvailable": "—",
    "totalRequests": "Pyyntöjä yhteensä",
    "noDataYet": "Ei vielä dataa",
    "promptCache": "Kehotusvälimuisti",
    "entries": "merkinnät",
    "hitRate": "Osumaprosentti",
    "hitsMisses": "Osumat / Miss",
    "signatureCache": "Allekirjoitusvälimuisti",
    "signatureDefaults": "Oletukset",
    "signatureTool": "Työkalu",
    "signatureFamily": "Perhe",
    "signatureSession": "Istunto",
    "recovering": "Toipumassa",
    "noCBData": "Katkaisijatietoja ei ole saatavilla. Tee ensin pyyntöjä.",
    "providerHealthStatusAria": "Palveluntarjoajan terveydentila",
    "issuesLabel": "Ongelmia havaittu",
    "operational": "Toiminnassa",
    "providers": "Palveluntarjoajat",
    "configuredProvidersLabel": "Konfiguroitu kojelaudassa",
    "configuredProvidersHint": "Palveluntarjoajat, joiden valtuustiedot on tallennettu kansioon /dashboard/providers, suorituksen tilasta riippumatta.",
    "activeProviders": "{count} active",
    "activeProvidersHint": "Määritetyt palveluntarjoajat, jotka ovat tällä hetkellä käytössä reitityspyyntöjä varten.",
    "monitoredProviders": "{count} monitored",
    "monitoredProvidersHint": "Palveluntarjoajat, joita tällä hetkellä seurataan katkaisijoiden kuntovalvojien avulla.",
    "healthyCount": "{count} terve",
    "nodeVersion": "Solmu {version}",
    "failures": "{count} virhe",
    "failuresPlural": "{count} virheitä",
    "lastFailure": "Viimeinen",
    "rateLimitStatus": "Rate Limit Status",
    "activeLimiters": "{count} aktiivinen rajoitin",
    "activeLimitersPlural": "{count} aktiiviset rajoittimet",
    "queued": "Jonossa",
    "queuedCount": "{count} jonossa",
    "running": "käynnissä",
    "runningCount": "{count} käynnissä",
    "ok": "OK",
    "activeLockouts": "Aktiiviset lukitukset",
    "resetConfirm": "Nollataanko kaikki katkaisijat terveeseen tilaan? Tämä tyhjentää kaikki virhemäärät ja palauttaa kaikki palveluntarjoajat toimintatilaan.",
    "resetAllTitle": "Palauta kaikki katkaisijat terveeseen tilaan",
    "resetting": "Nollataan...",
    "resetAll": "Nollaa kaikki",
    "until": "{time} asti",
    "limitExhausted": "Exhausted",
    "learnedFromHeaders": "Learned from headers",
    "remainingOfLimit": "{remaining}/{limit} remaining",
    "throttleStatus": "Throttle: {value}",
    "lastHeaderUpdate": "Header update: {age}",
    "databaseHealth": "Tietokannan terveys",
    "stickyBoundSessions": "Kiinnisidotut istunnot",
    "sessionsByApiKey": "Istunnot API-avaimella",
    "noActiveSessionsTracked": "Aktiivisia istuntoja ei ole vielä seurattu.",
    "noSessionQuotaMonitorsActive": "Ei aktiivisia istuntokiintiön valvontalaitteita.",
    "gracefulDegradationStatus": "Graceful Degradation Status",
    "additionalModels": "+{count} lisää malleja",
    "providerHealthMatrixTitle": "__MISSING__:Provider Health Matrix",
    "providerHealthMatrixDescription": "__MISSING__:Provider × account × model states from breakers, cooldowns, lockouts and logs.",
    "healthMatrixRange": "__MISSING__:Health matrix range",
    "providerFilter": "__MISSING__:Provider filter",
    "onlyIssues": "__MISSING__:Only issues",
    "refresh": "__MISSING__:Refresh",
    "accounts": "__MISSING__:Accounts",
    "models": "__MISSING__:Models",
    "issues": "__MISSING__:Issues",
    "loadingProviderHealthMatrix": "__MISSING__:Loading provider health matrix...",
    "failedProviderHealthMatrix": "__MISSING__:Failed to load Provider Health Matrix: {error}",
    "noProvidersMatchedFilters": "__MISSING__:No providers matched the current filters.",
    "modelPillSummary": "__MISSING__:{requests} req · {successRate} success · {latency} avg",
    "modelLockoutSummary": "__MISSING__:{reason} · {duration} left",
    "locked": "__MISSING__:locked",
    "inferred": "__MISSING__:inferred",
    "inactive": "__MISSING__:Inactive",
    "noConnectionId": "__MISSING__:no connection id",
    "accountModelSummary": "__MISSING__:{connectionId} · {count} models",
    "cooldown": "__MISSING__:cooldown",
    "durationRemaining": "__MISSING__:{duration} remaining",
    "noSyncedModelsOrTraffic": "__MISSING__:No synced models or recent traffic yet.",
    "providerRowSummary": "__MISSING__:{active}/{total} active accounts · {requests} req · {successRate} success · {latency} avg",
    "cooldownCount": "__MISSING__:{count} cooldown",
    "lockoutCount": "__MISSING__:{count} lockouts",
    "issueCount": "__MISSING__:{count} issues",
    "score": "__MISSING__:Score",
    "lastRequest": "__MISSING__:Last request",
    "lastError": "__MISSING__:Last error"
  },
  "telemetry": {
    "title": "Järjestelmän telemetria",
    "description": "Liikkuvat pyyntö-, suoritusaika-, istunto- ja muistisignaalit tästä OmniRoute-prosessista.",
    "uptime": "Päällä",
    "totalRequests": "Pyyntöjä yhteensä",
    "avgLatency": "Keskimääräinen viive",
    "errorRate": "Virheprosentti",
    "activeConnections": "Aktiiviset yhteydet",
    "memoryUsage": "Muistin käyttö",
    "latencyTrend": "Latenssitrendi",
    "throughputTrend": "Suorituskykytrendi",
    "memoryTrend": "Muistin trendi",
    "refresh": "Päivitä",
    "updatedAt": "Päivitetty {time}",
    "loadFailed": "Telemetrian lataaminen epäonnistui.",
    "partialData": "Telemetria on osittain saatavilla: {error}"
  },
  "mitm": {
    "title": "MITM-välityspalvelin",
    "description": "Läpinäkyvä välityspalvelin asiakaspyyntöjen sieppaamiseen ja reitittämiseen.",
    "enable": "Ota MITM-välityspalvelin käyttöön",
    "enableDesc": "Käynnistä tai lopeta paikallinen sieppausprosessi ja DNS-ohitus.",
    "status": "Tila",
    "running": "Juoksemassa",
    "stopped": "Pysähtynyt",
    "start": "Aloita",
    "stop": "Pysähdy",
    "refresh": "Päivitä",
    "port": "Välityspalvelimen portti",
    "apiKey": "Reitittimen API-avain",
    "apiKeyPlaceholder": "Valinnainen; palaa paikalliseen avaimeen",
    "sudoPassword": "Sudo salasana",
    "cachedPassword": "Välimuistissa tätä prosessia varten",
    "saveSettings": "Tallenna asetukset",
    "settingsSaved": "MITM-asetukset tallennettu.",
    "startedSuccess": "MITM-välityspalvelin käynnistyi.",
    "stoppedSuccess": "MITM-välityspalvelin pysähtyi.",
    "saveFailed": "MITM-asetusten päivittäminen epäonnistui.",
    "loadFailed": "MITM-asetusten lataaminen epäonnistui.",
    "invalidPort": "Läpinäkyvä MITM-kuuntelu vaatii tällä hetkellä portin 443.",
    "certificate": "CA-sertifikaatti",
    "certificateReady": "Varmenne on saatavana asiakkaan luottamusasennukseen.",
    "certificateMissing": "Varmennetta ei ole vielä luotu.",
    "available": "Saatavilla",
    "missing": "Puuttuu",
    "downloadCert": "Lataa CA-sertifikaatti",
    "regenerateCert": "Luo sertifikaatti uudelleen",
    "regenerateConfirm": "Tämä mitätöi olemassa olevan asiakkaan luottamuksen. Jatkaa?",
    "regenerateSuccess": "MITM-sertifikaatti luotu uudelleen.",
    "regenerateFailed": "MITM-varmenteen uudelleenluonti epäonnistui.",
    "targetRoutes": "Kohdereitit",
    "interceptedRequests": "Siepatut pyynnöt",
    "activeConnections": "Aktiiviset yhteydet",
    "dnsConfigured": "DNS määritetty",
    "pid": "PID",
    "lastIntercept": "Viimeinen sieppaus",
    "target": "Kohde",
    "host": "Isäntä",
    "localPort": "Paikallinen satama",
    "endpoints": "Päätepisteet",
    "enabled": "Käytössä",
    "configured": "Määritetty",
    "yes": "Kyllä",
    "no": "Ei",
    "noTargets": "Kohdereittejä ei ole määritetty."
  },
  "limits": {
    "title": "Rajoitukset ja kiintiöt",
    "rateLimit": "Rate Limit",
    "remaining": "Jäljellä",
    "requestsPerMinute": "Pyynnöt/min",
    "tokensPerMinute": "Tokenit/min",
    "dailyLimit": "Päivittäinen raja"
  },
  "logs": {
    "title": "Lokit",
    "requestLogs": "Pyydä lokit",
    "proxyLogs": "Välityspalvelimen lokit",
    "auditLog": "Tarkastusloki",
    "console": "konsoli",
    "auditLogDesc": "Hallinnolliset toimet ja turvallisuustapahtumat",
    "loading": "Ladataan...",
    "refresh": "Päivitä",
    "filterByAction": "Suodata toiminnon mukaan...",
    "filterByActor": "Suodata näyttelijän mukaan...",
    "filterEntriesAria": "Suodata tarkastuslokin merkinnät",
    "filterByActionTypeAria": "Suodata toimintotyypin mukaan",
    "filterByActorAria": "Suodata näyttelijän mukaan",
    "refreshAuditLogAria": "Päivitä tarkastusloki",
    "tableAria": "Tarkastuslokimerkinnät",
    "failedFetchAuditLog": "Valvontalokin nouto epäonnistui",
    "showing": "Näytetään {count} merkintää (poikkeama {offset})",
    "search": "Etsi",
    "timestamp": "Aikaleima",
    "action": "Toiminta",
    "actor": "näyttelijä",
    "target": "Kohde",
    "details": "Yksityiskohdat",
    "ipAddress": "IP-osoite",
    "notAvailable": "—",
    "noEntries": "Tarkastuslokimerkintöjä ei löytynyt",
    "previous": "Edellinen",
    "next": "Seuraavaksi",
    "providerWarningTitle": "Provider Warning Title",
    "viewDetails": "View Details",
    "eventMetadata": "Event Metadata",
    "eventPayload": "Event Payload",
    "requestId": "Request Id",
    "providerWarningDesc": "Provider Warning Desc",
    "a": "A",
    "offset": "Offset",
    "limit": "Limit",
    "status": "Status",
    "resourceType": "Resource Type",
    "totalEntries": "Total Entries",
    "tab": "Tab",
    "auditModalSubtitle": "Audit Modal Subtitle",
    "close": "Close",
    "runningRequests": "Active Requests",
    "runningRequestsDesc": "Real-time view of currently running upstream requests",
    "clearAll": "Tyhjennä kaikki",
    "confirmClearActiveRequests": "Poistetaanko kaikki aktiiviset pyynnöt?",
    "model": "Model",
    "provider": "Provider",
    "account": "Account",
    "elapsed": "Elapsed",
    "activeStage": "__MISSING__:Stage",
    "activeStageUnknown": "__MISSING__:Not sent to upstream yet",
    "activeStageRegistered": "__MISSING__:Registered",
    "activeStagePayloadPrepared": "__MISSING__:Payload prepared",
    "activeStageWaitingAccountSlot": "__MISSING__:Waiting for account slot",
    "activeStageWaitingRateLimit": "__MISSING__:Waiting for rate limiter",
    "activeStageRateLimitSlotAcquired": "__MISSING__:Rate limit slot acquired",
    "activeStageSendingToProvider": "__MISSING__:Sending to upstream",
    "activeStageProviderResponseStarted": "__MISSING__:Upstream response started",
    "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}",
    "export": "Export",
    "exporting": "Exporting...",
    "exportFailed": "Export failed",
    "timeRange": "Time Range",
    "lastNHours": "Last {hours}",
    "defaultRange": "default",
    "consoleViewer": {
      "fetchFailed": "Failed to fetch logs",
      "copyFailed": "Failed to copy log entry",
      "copyLogEntry": "Copy log entry"
    }
  },
  "onboarding": {
    "welcome": "Tervetuloa",
    "security": "Turvallisuus",
    "test": "Testaa",
    "ready": "Valmis!",
    "setPassword": "Aseta salasana",
    "addProvider": "Lisää ensimmäinen palveluntarjoajasi",
    "getStarted": "Aloita",
    "skip": "Ohita",
    "skipWizard": "Ohita ohjattu toiminto kokonaan",
    "skipPassword": "Ohita salasanan asetus",
    "skipAndContinue": "Ohita ja jatka",
    "passwordLabel": "Salasana",
    "confirmPassword": "Vahvista salasana",
    "enterPassword": "Anna salasana",
    "confirmPasswordPlaceholder": "Vahvista salasana",
    "passwordsMismatch": "Salasanat eivät täsmää",
    "setupComplete": "Asennus valmis!",
    "goToDashboard": "Siirry kohtaan Dashboard →",
    "welcomeDesc": "OmniRoute on paikallinen AI API -välityspalvelin. Se reitittää pyynnöt useille tekoälypalveluntarjoajille kuormituksen tasapainottamisen, vikasietoisuuden ja käytön seurannan avulla.",
    "multiProvider": "Multi-Provider",
    "usageTracking": "Käytön seuranta",
    "securityDesc": "Aseta salasana kojelautasi suojaamiseksi tai ohita toistaiseksi.",
    "providerDesc": "Yhdistä ensimmäinen AI-palveluntarjoajasi. Voit lisätä myöhemmin lisää.",
    "apiKeyRequired": "API-avain (pakollinen)",
    "customUrlOptional": "Muokattu URL-osoite (valinnainen)",
    "testDesc": "Varmistetaan, että palveluntarjoajayhteytesi toimii.",
    "runTest": "Suorita yhteystesti",
    "testingConnection": "Testataan yhteyttä...",
    "connectionSuccessful": "Yhteys onnistui! Palveluntarjoajasi on valmis.",
    "noProviderFound": "Palveluntarjoajaa ei löydy. Voit lisätä sellaisen hallintapaneelista myöhemmin.",
    "testFailed": "Testi epäonnistui, mutta voit määrittää tämän myöhemmin.",
    "couldNotTest": "Ei pystynyt testaamaan juuri nyt. Voit testata kojelaudalta.",
    "doneDesc": "Kaikki on valmista! OmniRoute-esiintymäsi on määritetty ja valmis välittämään AI-pyyntöjä.",
    "yourEndpoint": "Päätepisteesi:",
    "continue": "Jatka",
    "retry": "Yritä uudelleen",
    "failedSetPassword": "Salasanan asettaminen epäonnistui. Yritä uudelleen.",
    "failedAddProvider": "Palveluntarjoajan lisääminen epäonnistui. Yritä uudelleen.",
    "connectionError": "Yhteysvirhe. Yritä uudelleen.",
    "provider": "Palveluntarjoaja",
    "apiKeyHelp": "API-avain on tekoälypalvelujen salasana. Hanki sellainen palveluntarjoajasi verkkosivustolta (esim. platform.openai.com, console.anthropic.com).",
    "tier": {
      "subtitle": "OmniRoute järjestää palveluntarjoajat kolmeen tasoon, joten reititys valitsee ensin luotettavimman ja edullisimman polun.",
      "tier1": {
        "label": "Premium-asiakkaat",
        "description": "Ensiluokkaiset CLI:t alkuperäisillä todennusvirroilla ja päättelymalleilla."
      },
      "tier2": {
        "label": "Kustannusoptimoitu",
        "description": "Halpoja, tehokkaita palveluntarjoajia käytetään jokapäiväiseen liikenteeseen."
      },
      "tier3": {
        "label": "Vara ja erikoisuus",
        "description": "Paikallisesti isännöidyt tai erikoispäätepisteet, joita käytetään varavaroina."
      },
      "configure": "Määritä palveluntarjoajat"
    },
    "tierFlowDiagramAlt": "OmniRoute 3-tasoinen varakaavio",
    "apiKeyMgmt": "API-avainhallinta"
  },
  "providers": {
    "title": "Palveluntarjoajat",
    "allProviders": "Kaikki palveluntarjoajat",
    "audioProviders": "Äänentarjoajat",
    "showFreeOnly": "Vain ilmainen",
    "addProvider": "Lisää palveluntarjoaja",
    "addFirstProvider": "Lisää ensimmäinen palveluntarjoajasi",
    "addFirstProviderDesc": "Yhdistä AI-palveluntarjoaja aloittaaksesi pyyntöjen reitittämisen OmniRouten kautta. Voit käyttää ilmaisia ​​palveluntarjoajia, API-avaimia tai OAuth-tilejä.",
    "learnMore": "Lue lisää",
    "editProvider": "Muokkaa toimittajaa",
    "deleteProvider": "Poista palveluntarjoaja",
    "noProviders": "Palveluntarjoajia ei ole määritetty",
    "modelAvailability": "Mallin saatavuus",
    "accounts": "Tilit",
    "newAccount": "Uusi tili",
    "deleteConfirm": "Haluatko varmasti poistaa tämän palveluntarjoajan?",
    "testing": "Testataan...",
    "testConnection": "Testaa yhteys",
    "testSuccess": "Yhteys onnistui",
    "testFailed": "Yhteys epäonnistui",
    "available": "Saatavilla",
    "cooldown": "Jäähdytys",
    "unavailable": "Ei saatavilla",
    "unknown": "Tuntematon",
    "oauthLabel": "OAuth",
    "compatibleLabel": "Yhteensopiva",
    "chat": "Chat",
    "responses": "Vastaukset",
    "messages": "Viestit",
    "oauthProviders": "OAuth-palveluntarjoajat",
    "freeProviders": "Ilmaiset palveluntarjoajat",
    "apiKeyProviders": "API-avainten tarjoajat",
    "compatibleProviders": "API Key -yhteensopivat palveluntarjoajat",
    "testAll": "Testaa kaikki",
    "testAllOAuth": "Testaa kaikki OAuth-yhteydet",
    "testAllFree": "Testaa kaikki ilmaiset yhteydet",
    "testAllApiKey": "Testaa kaikki API-avainyhteydet",
    "testAllCompatible": "Testaa kaikki yhteensopivat liitännät",
    "connected": "{count} Yhdistetty",
    "errorCount": "{count} Virhe ({code})",
    "errorCountNoCode": "{count} Virhe",
    "warningCount": "{count} Varoitus",
    "noConnections": "Ei yhteyksiä",
    "expiredBadge": "Expired",
    "expiringSoonBadge": "Expiring Soon",
    "freeTier": "Ilmainen taso",
    "freeTierAvailable": "Ilmainen taso saatavilla",
    "hasFreeTooltip": "__MISSING__:Free tier available",
    "noAuthLabel": "__MISSING__:No Auth",
    "noAuthProviders": "__MISSING__:No Auth Providers",
    "upstreamProxyLabel": "__MISSING__:Upstream Proxy",
    "freeAggregated": "__MISSING__:All providers with free tier (also shown in their native category)",
    "deprecated": "Käytöstä poistettu",
    "deprecatedProvider": "Tämä palveluntarjoaja on poistettu käytöstä",
    "riskNotice": {
      "title": "__MISSING__:Before continuing",
      "tooltip": "__MISSING__:Provider with usage caveats — click for details",
      "oauth": "__MISSING__:This provider uses your official product session/OAuth, which is not authorized for proxy/router use.\n\nWe don't recommend intensive autonomous agent usage (OpenCloud-style, long multi-step flows, large batches) — the upstream may react by restricting or banning the account.\n\nUse at your own risk.",
      "webCookie": "__MISSING__:This provider authenticates through your web session cookies. The upstream service may invalidate the session at any time, requiring you to log in again. Not recommended for long unattended operations.\n\nUse at your own risk.",
      "deprecated": "__MISSING__:This provider was discontinued by its upstream and may stop working without notice. Existing connections may continue working until the upstream fully removes access. Consider alternatives.",
      "dontShowAgain": "__MISSING__:Don't show this again for this provider",
      "understand": "__MISSING__:I understand, continue",
      "cancel": "__MISSING__:Cancel"
    },
    "disabled": "Ei käytössä",
    "enableProvider": "Ota palveluntarjoaja käyttöön",
    "disableProvider": "Poista palveluntarjoaja käytöstä",
    "testResults": "Testitulokset",
    "noCompatibleYet": "Yhteensopivia palveluntarjoajia ei ole vielä lisätty",
    "compatibleHint": "Käytä yllä olevia painikkeita lisätäksesi OpenAI- tai Anthropic-yhteensopivia päätepisteitä",
    "addOpenAICompatible": "Lisää OpenAI-yhteensopiva",
    "addAnthropicCompatible": "Lisää Anthropic Compatible",
    "addNewProvider": "Lisää uusi toimittaja",
    "backToProviders": "Takaisin palveluntarjoajiin",
    "configureNewProvider": "Määritä uusi AI-palveluntarjoaja käytettäväksi sovelluksissasi.",
    "providerLabel": "Palveluntarjoaja",
    "selectProvider": "Valitse palveluntarjoaja",
    "selectedProvider": "Valittu palveluntarjoaja",
    "authMethod": "Todennusmenetelmä",
    "apiKeyLabel": "API-avain",
    "apiKeyRequired": "API-avain vaaditaan",
    "selectProviderRequired": "Valitse palveluntarjoaja",
    "enterApiKey": "Anna API-avaimesi",
    "apiKeySecure": "API-avaimesi salataan ja tallennetaan turvallisesti.",
    "oauth2Connect": "Yhdistä OAuth2:een",
    "oauth2Label": "OAuth2",
    "oauth2Desc": "Yhdistä tilisi OAuth2-todennusta käyttämällä.",
    "displayName": "Näyttönimi",
    "displayNamePlaceholder": "esim. Production API, Dev Environment",
    "displayNameHint": "Valinnainen. Ystävällinen nimi tämän kokoonpanon tunnistamiseksi.",
    "active": "Aktiivinen",
    "activeDescription": "Ota tämä palveluntarjoaja käyttöön sovelluksissasi",
    "cancel": "Peruuta",
    "createProvider": "Luo palveluntarjoaja",
    "failedCreate": "Palveluntarjoajan luominen epäonnistui",
    "errorOccurred": "Tapahtui virhe. Yritä uudelleen.",
    "modelStatus": "Mallin tila",
    "showConfiguredOnly": "Configured only",
    "allModelsOperational": "Kaikki mallit toimivat",
    "modelsWithIssues": "{count} malli(t), joissa on ongelmia",
    "allModelsNormal": "Kaikki mallit reagoivat normaalisti.",
    "cooldownCleared": "Jäähdytys tyhjennetty kohteelle {model}",
    "failedClearCooldown": "Jäähdytyksen tyhjennys epäonnistui",
    "loadingAvailability": "Ladataan mallin saatavuutta...",
    "clearCooldown": "Selkeä",
    "clearing": "Tyhjennetään...",
    "until": "{time} asti",
    "providerTestFailed": "Palveluntarjoajan testi epäonnistui",
    "providerTestTimeout": "Provider test timed out — too many connections to test at once",
    "modeTest": "{mode} Testi",
    "passedCount": "{count} hyväksytty",
    "failedCount": "{count} epäonnistui",
    "testedCount": "{count} testattu",
    "millisecondsAbbr": "{value}ms",
    "okShort": "OK",
    "errorShort": "VIRHE",
    "noActiveConnectionsInGroup": "Tälle ryhmälle ei löytynyt aktiivisia yhteyksiä.",
    "allTestsPassed": "Kaikki {total} testit läpäisty",
    "testSummary": "{passed}/{total} hyväksytty, {failed} epäonnistui",
    "nameLabel": "Nimi",
    "prefixLabel": "Etuliite",
    "baseUrlLabel": "Perus-URL-osoite",
    "apiTypeLabel": "API-tyyppi",
    "prefixHint": "Pakollinen. Ainutlaatuinen etuliite mallien nimille.",
    "nameHint": "Pakollinen. Ystävällinen etiketti tälle solmulle.",
    "baseUrlHint": "Pakollinen.  Palveluntarjoajan API-perus-URL-osoite.",
    "anthropicPrefixPlaceholder": "ac-prod",
    "openaiPrefixPlaceholder": "oc-prod",
    "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1",
    "openaiBaseUrlPlaceholder": "https://api.openai.com/v1",
    "validateConnection": "Vahvista yhteys",
    "validating": "Vahvistetaan...",
    "connectionValid": "Yhteys on voimassa!",
    "connectionFailed": "Yhteys epäonnistui. Tarkista URL-osoite ja avain.",
    "testKeyLabel": "Testaa API-avain",
    "testKeyPlaceholder": "sk-... (vain vahvistusta varten)",
    "providerNotFound": "Palveluntarjoajaa ei löydy",
    "deleteConnectionConfirm": "Poistetaanko tämä yhteys?",
    "batchDeleteSelected": "Delete Selected ({count})",
    "batchDeleteConfirm": "Delete {count} connection(s)? This action cannot be undone.",
    "batchDeleteSuccess": "Deleted {count} connection(s)",
    "batchActivateSelected": "__MISSING__:Activate",
    "batchDeactivateSelected": "__MISSING__:Deactivate",
    "batchRetestSelected": "__MISSING__:Retest",
    "batchActivateSuccess": "__MISSING__:Activated {count} connection(s)",
    "batchDeactivateSuccess": "__MISSING__:Deactivated {count} connection(s)",
    "failedSetAlias": "Aliaksen asettaminen epäonnistui",
    "failedSaveConnection": "Yhteyden tallentaminen epäonnistui",
    "failedSaveConnectionRetry": "Yhteyden tallentaminen epäonnistui. Yritä uudelleen.",
    "failedRetestConnection": "Yhteyden uudelleentestaus epäonnistui",
    "deleteCompatibleNodeConfirm": "Poistetaanko tämä {type} Yhteensopiva solmu?",
    "anthropicCompatibleDetails": "Anthropic-yhteensopivat yksityiskohdat",
    "openaiCompatibleDetails": "OpenAI-yhteensopivat tiedot",
    "messagesApi": "Viestit API",
    "responsesApi": "Responses API",
    "embeddings": "Embeddings",
    "audioTranscriptions": "Audio Transcriptions",
    "audioSpeech": "Audio Speech",
    "imagesGenerations": "Images Generations",
    "chatCompletions": "Chatin loppuun saattaminen",
    "importingModels": "Tuodaan...",
    "importFromModels": "Tuo / mallit",
    "modelsImported": "{count} models imported",
    "allModelsAlreadyImported": "Kaikki mallit on jo tuotu",
    "noNewModelsToImport": "Ei uusia malleja tuotavaksi — kaikki mallit ovat jo rekisterissä tai mukautetulla mallilistalla",
    "skippingExistingModels": "Ohitetaan {count} olemassa olevaa mallia",
    "autoSync": "Automaattinen synkronointi",
    "autoSyncTooltip": "Päivitä malliluettelo automaattisesti 24 tunnin välein (konfiguroitavissa kohdassa MODEL_SYNC_INTERVAL_HOURS)",
    "autoSyncEnabled": "Automaattinen synkronointi käytössä – mallit päivittyvät säännöllisesti",
    "autoSyncDisabled": "Automaattinen synkronointi poistettu käytöstä",
    "autoSyncToggleFailed": "Automaattisen synkronoinnin vaihtaminen epäonnistui",
    "clearAllModels": "Tyhjennä kaikki mallit",
    "clearAllModelsConfirm": "Haluatko varmasti poistaa kaikki tämän palveluntarjoajan mallit? Tätä ei voi kumota.",
    "clearAllModelsSuccess": "Kaikki mallit tyhjennetty",
    "clearAllModelsFailed": "Mallien tyhjennys epäonnistui",
    "addConnectionToImport": "Lisää yhteys ottaaksesi tuonnin käyttöön.",
    "noModelsConfigured": "Ei malleja määritetty",
    "connectionCount": "{count} yhteyttä",
    "fetchingModels": "Haetaan saatavilla olevia malleja...",
    "failedFetchModels": "Mallien nouto epäonnistui",
    "noModelsFound": "Malleja ei löytynyt",
    "importFailed": "Tuonti epäonnistui",
    "noNewModelsAdded": "Uusia malleja ei lisätty.",
    "adding": "Lisätään...",
    "close": "Close",
    "importingModelsTitle": "Mallien tuonti",
    "copyModel": "Kopioi malli",
    "filterModels": "Suodata malleja…",
    "modelsActive": "aktiivista",
    "showModel": "Näytä malli",
    "hideModel": "Piilota malli",
    "removeModel": "Poista malli",
    "rateLimitProtected": "Suojattu",
    "rateLimitUnprotected": "Suojaamaton",
    "enableRateLimitProtection": "Ota nopeusrajoitussuoja käyttöön napsauttamalla",
    "disableRateLimitProtection": "Napsauta poistaaksesi nopeusrajoituksen suojauksen",
    "productionKey": "Tuotantoavain",
    "enterNewApiKey": "Anna uusi API-avain",
    "codexApplyModalTitle": "Hae paikalliseen Codexiin",
    "codexApplyTargetLabel": "Kohdepolku",
    "codexApplyBackupLabel": "Varmuuskopiot",
    "codexApplyWarning": "Tämä korvaa nykyisen auth.json-tiedoston. Jatkaa?",
    "codexApplyConfirmCheckbox": "Vahvistan, että haluan korvata nykyisen auth.json-tiedoston",
    "codexApply": "Käytä",
    "bulkTabSingle": "Sinkku",
    "bulkTabBulkAdd": "Joukkolisäys",
    "bulkAddFormatHint": "Yksi avain riviä kohden. Muoto: nimi|apiKey tai vain apiKey (automaattisesti nimetty indeksin mukaan).",
    "bulkValidateKeys": "Vahvista jokainen avain ennen tallennusta (hitaampi)",
    "bulkAddAllKeys": "Lisää kaikki avaimet",
    "bulkAddedCount": "{count, plural, one {# key added} other {# keys added}}",
    "bulkFailedCount": "{count, plural, one {# failed} other {# failed}}",
    "optional": "Valinnainen",
    "anthropicCompatibleName": "Antrooppinen yhteensopiva",
    "openaiCompatibleName": "OpenAI-yhteensopiva",
    "failedImportModels": "Mallien tuonti epäonnistui",
    "noModelsReturnedFromEndpoint": "Ei malleja palautettu /models-päätepisteestä.",
    "importingModelsProgress": "Tuodaan {current}/{total} mallia...",
    "foundModelsStartingImport": "Löytyi {count} mallia. Aloitetaan tuontia...",
    "importingModelById": "Tuodaan {modelId}...",
    "importSuccessCount": "{count, plural, one {# model} other {# models}} tuotu onnistuneesti!",
    "noNewModelsAddedExisting": "Uusia malleja ei lisätty (kaikki on jo olemassa).",
    "importDoneCount": "✓ Valmis! {count, plural, one {# model imported.} other {# models imported.}}",
    "unexpectedErrorOccurred": "Tapahtui odottamaton virhe",
    "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}",
    "messagesPath": "viestejä",
    "responsesPath": "vastaukset",
    "chatCompletionsPath": "chat / täydennykset",
    "add": "Lisää",
    "edit": "Muokkaa",
    "delete": "Poista",
    "anthropic": "Antrooppinen",
    "openai": "OpenAI",
    "singleConnectionPerCompatible": "Vain yksi yhteys on sallittu yhteensopivaa solmua kohden. Lisää toinen solmu, jos tarvitset lisää yhteyksiä.",
    "connections": "Liitännät",
    "providerProxyTitleConfigured": "Palveluntarjoajan välityspalvelin: {host}",
    "configured": "määritetty",
    "providerProxyConfigureHint": "Määritä välityspalvelin kaikille tämän palveluntarjoajan yhteyksille",
    "providerProxy": "Palveluntarjoajan välityspalvelin",
    "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": "Ei yhteyksiä vielä",
    "addFirstConnectionHint": "Aloita lisäämällä ensimmäinen yhteys",
    "addConnection": "Lisää yhteys",
    "availableModels": "Saatavilla olevat mallit",
    "builtInModels": "Built-in models",
    "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
    "pageAutoRefresh": "Sivu päivittyy automaattisesti...",
    "statusDisabled": "pois käytöstä",
    "statusConnected": "yhdistetty",
    "statusRuntimeIssue": "ajonaikainen ongelma",
    "statusAuthFailed": "todennus epäonnistui",
    "statusRateLimited": "hinta rajoitettu",
    "statusNetworkIssue": "verkko-ongelma",
    "statusTestUnsupported": "testiä ei tueta",
    "statusUnavailable": "ei ole saatavilla",
    "statusFailed": "epäonnistunut",
    "statusError": "virhe",
    "oauthAccount": "OAuth-tili",
    "errorTypeRuntime": "Paikallinen suoritusaika",
    "errorTypeUpstreamAuth": "Varsinainen todennus",
    "errorTypeMissingCredential": "Tunnustus puuttuu",
    "errorTypeRefreshFailed": "Päivitys epäonnistui",
    "errorTypeTokenExpired": "Tunnus on vanhentunut",
    "errorTypeRateLimited": "Hinta rajoitettu",
    "errorTypeUpstreamUnavailable": "Upstream ei saatavilla",
    "errorTypeNetworkError": "Verkkovirhe",
    "errorTypeTestUnsupported": "Testiä ei tueta",
    "errorTypeUpstreamError": "Virhe ylävirtaan",
    "proxySourceGlobal": "Maailmanlaajuinen",
    "proxySourceProvider": "Palveluntarjoaja",
    "proxySourceKey": "Avain",
    "proxyConfiguredBySource": "Välityspalvelin ({source}): {host}",
    "autoPriority": "Automaattinen: {priority}",
    "proxy": "Välityspalvelin",
    "retestAuthentication": "Testaa todennus uudelleen",
    "retest": "Testaa uudelleen",
    "disableConnection": "Poista yhteys käytöstä",
    "enableConnection": "Ota yhteys käyttöön",
    "reauthenticateConnection": "Todenna tämä yhteys uudelleen",
    "proxyConfig": "Välityspalvelimen konfigurointi",
    "aliasExistsAlert": "Alias \"{alias}\" on jo olemassa. Käytä toista mallia tai muokkaa olemassa olevaa aliasta.",
    "openRouterAnyModelHint": "OpenRouter tukee mitä tahansa mallia. Lisää malleja ja luo aliaksia nopeaa käyttöä varten.",
    "modelIdFromOpenRouter": "Mallin tunnus (OpenRouterista)",
    "openRouterModelPlaceholder": "antrooppinen/claude-3-opus",
    "customModels": "Mukautetut mallit",
    "customModelsHint": "Lisää mallitunnukset, jotka eivät ole oletusluettelossa. Nämä ovat käytettävissä reititystä varten.",
    "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 Label",
    "perModelQuotaDescription": "Per Model Quota Description",
    "perModelQuotaToggle": "Mallikohtainen kiintiökytkin",
    "modelId": "Mallin tunnus",
    "customModelPlaceholder": "esim. gpt-4.5-turbo",
    "loading": "Ladataan...",
    "removeCustomModel": "Poista mukautettu malli",
    "noCustomModels": "Mukautettuja malleja ei ole vielä lisätty.",
    "allSuggestedAliasesExist": "Kaikki ehdotetut aliakset ovat jo olemassa. Valitse toinen malli tai poista ristiriitaiset aliakset.",
    "failedSaveCustomModel": "Muokatun mallin tallentaminen epäonnistui",
    "modelAddedSuccess": "Malli {modelId} lisättiin onnistuneesti",
    "failedAddModelTryAgain": "Mallin lisääminen epäonnistui. Yritä uudelleen.",
    "failedSaveImportedModel": "Tuodun mallin tallentaminen mukautettuun tietokantaan epäonnistui",
    "failedImportModelsTryAgain": "Mallien tuonti epäonnistui. Yritä uudelleen.",
    "failedRemoveModelFromDatabase": "Mallin poistaminen tietokannasta epäonnistui",
    "modelRemovedSuccess": "Mallin poistaminen onnistui",
    "failedDeleteModelTryAgain": "Mallin poistaminen epäonnistui. Yritä uudelleen.",
    "compatibleModelsDescription": "Lisää {type}-yhteensopivia malleja manuaalisesti tai tuo ne /models-päätepisteestä.",
    "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229",
    "openaiCompatibleModelPlaceholder": "gpt-4o",
    "apiKeyValidationFailed": "API-avaimen vahvistus epäonnistui. Tarkista avaimesi ja yritä uudelleen.",
    "addProviderApiKeyTitle": "Lisää {provider} API-avain",
    "checking": "Tarkistetaan...",
    "check": "Tarkista",
    "valid": "Voimassa",
    "invalid": "Virheellinen",
    "creating": "Luodaan...",
    "validationChecksAnthropicCompatible": "Vahvistus tarkistaa {provider} vahvistamalla API-avaimen.",
    "validationChecksOpenAiCompatible": "Vahvistus tarkistaa {provider} /models-osoitteen kautta perus-URL-osoitteessasi.",
    "priorityLabel": "Prioriteetti",
    "saving": "Tallennetaan...",
    "save": "Tallenna",
    "editConnection": "Muokkaa yhteyttä",
    "accountName": "Tilin nimi",
    "email": "Sähköposti",
    "healthCheckMinutes": "Terveystarkastus (min)",
    "healthCheckHint": "Ennakoiva tunnuksen päivitysväli. 0 = pois käytöstä.",
    "selectAllModels": "Select all",
    "deselectAllModels": "Deselect all",
    "modelsActiveCount": "{active}/{total} active",
    "noModelsMatch": "No models match \"{filter}\"",
    "groupLabel": "Environment",
    "groupPlaceholder": "e.g. eKaizen, Personal",
    "failedTestConnection": "Yhteyden testaus epäonnistui",
    "failed": "Epäonnistui",
    "leaveBlankKeepCurrentApiKey": "Jätä tyhjäksi, jos haluat säilyttää nykyisen API-avaimen.",
    "editCompatibleTitle": "Muokkaa {type} Yhteensopiva",
    "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.",
    "apiKeyForCheck": "API-avain (tarkistusta varten)",
    "compatibleProdPlaceholder": "{type} Yhteensopiva (tuote)",
    "tokenRefreshed": "Token refreshed successfully",
    "tokenRefreshFailed": "Token refresh failed",
    "applyCodexAuthLocal": "Apply auth",
    "exportCodexAuthFile": "Export auth",
    "applyClaudeAuthLocal": "Käytä todennusta",
    "exportClaudeAuthFile": "Vie todennus",
    "importClaudeAuth": "Tuo todennus",
    "claudeApplyModalTitle": "Käytä paikallista Claude Codea",
    "claudeApplyTargetLabel": "Kohdepolku",
    "claudeApplyBackupLabel": "Varmuuskopiot",
    "claudeApplyMcpHint": "Nykyinen MCP OAuth -tila säilytetään.",
    "claudeApplyWarning": "Tämä korvaa nykyisen claudeAiOauth-osion. Jatkaa?",
    "claudeApplyConfirmCheckbox": "Vahvistan, että haluan korvata nykyisen claudeAiOauth-osion",
    "claudeApply": "Käytä",
    "claudeAuthAppliedLocal": "Claude-todennus sovellettu paikallisesti",
    "claudeAuthApplyFailed": "Claude-todennusta ei voitu soveltaa paikallisesti",
    "claudeAuthExported": "Claude-auth-tiedosto viety",
    "claudeAuthExportFailed": "Claude-todennustiedoston vienti epäonnistui",
    "claudeImportModalTitle": "Tuo Claude Auth",
    "claudeImportTabSingle": "Sinkku",
    "claudeImportTabBulk": "Bulkki",
    "claudeImportTabUpload": "Lataa tiedosto",
    "claudeImportTabPaste": "Liitä JSON",
    "claudeImportFileLabel": "Valitse .credentials.json",
    "claudeImportPasteLabel": "Liitä JSON-sisältö",
    "claudeImportEmailLabel": "Tilin sähköpostiosoite",
    "claudeImportNameLabel": "Yhteyden nimi (valinnainen)",
    "claudeImportOverwriteLabel": "Vaihda olemassa oleva yhteys, jos tili on jo olemassa",
    "claudeImportSubmit": "Tuo",
    "claudeImportSuccess": "Claude-yhteyden tuonti onnistui",
    "claudeImportInvalidJson": "Tiedostoa ei voitu jäsentää JSON-muodossa",
    "claudeImportInvalidShape": "Tiedosto ei ole kelvollinen .credentials.json",
    "claudeImportDuplicate": "Tili on jo olemassa – ota \"Korvaa olemassa oleva\" käyttöön korvataksesi",
    "claudeImportIdentityUnverified": "Bootstrap ei voinut vahvistaa tiliä. Ota \"Korvaa olemassa oleva\" käyttöön tai anna sähköpostiosoite.",
    "claudeImportFailed": "Claude-todennusta ei voitu tuoda",
    "claudeImportBulkModeUpload": "Lataa tiedostoja",
    "claudeImportBulkModePaste": "Liitä JSON-taulukko",
    "claudeImportBulkModeZip": "Lataa ZIP",
    "claudeImportBulkUploadHint": "Pudota tai poimi jopa 50 .credentials.json-tiedostoa (kukin 256 kt, yhteensä 10 Mt).",
    "claudeImportBulkPasteHint": "Liitä joukko objekteja: [{ json, name?, email? }, ...]",
    "claudeImportBulkZipHint": "ZIP, joka sisältää .json-merkintöjä. Enintään 50 merkintää, 10 Mt pakattuna.",
    "claudeImportBulkSubmit": "Tuo kaikki",
    "claudeImportBulkSuccess": "Tuodut {count} Claude-yhteydet",
    "claudeImportBulkFailed": "Joidenkin merkintöjen tuonti epäonnistui",
    "claudeImportBulkZipExtracting": "Puretaan ZIP-tiedostoa…",
    "claudeImportBulkZipError": "ZIP-tiedoston purkaminen epäonnistui",
    "applyGeminiAuthLocal": "Käytä todennusta",
    "exportGeminiAuthFile": "Vie todennus",
    "importGeminiAuth": "Tuo todennus",
    "geminiApplyModalTitle": "Hae Local Gemini CLI:hen",
    "geminiApplyTargetLabel": "Kohdepolku",
    "geminiApplyBackupLabel": "Varmuuskopiot",
    "geminiApplyAccountsHint": "Aktiivinen google_accounts.json-tili päivitetään vastaamaan tätä yhteyttä.",
    "geminiApplyWarning": "Tämä korvaa nykyisen oauth_creds.json-tiedoston ja päivittää google_accounts.json-tiedoston. Jatkaa?",
    "geminiApplyConfirmCheckbox": "Vahvistan, että haluan korvata olemassa olevan oauth_creds.json-tiedoston",
    "geminiApply": "Käytä",
    "geminiAuthAppliedLocal": "Gemini-todennus sovellettu paikallisesti",
    "geminiAuthApplyFailed": "Gemini-todennusta ei voitu käyttää paikallisesti",
    "geminiAuthExported": "Gemini-auth-tiedosto viety",
    "geminiAuthExportFailed": "Gemini-auth-tiedoston vienti epäonnistui",
    "geminiImportModalTitle": "Tuo Gemini Auth",
    "geminiImportTabSingle": "Sinkku",
    "geminiImportTabBulk": "Bulkki",
    "geminiImportTabUpload": "Lataa tiedosto",
    "geminiImportTabPaste": "Liitä JSON",
    "geminiImportFileLabel": "Valitse oauth_creds.json",
    "geminiImportPasteLabel": "Liitä JSON-sisältö",
    "geminiImportEmailLabel": "Tilin sähköpostiosoite",
    "geminiImportNameLabel": "Yhteyden nimi (valinnainen)",
    "geminiImportOverwriteLabel": "Vaihda olemassa oleva yhteys, jos tili on jo olemassa",
    "geminiImportSubmit": "Tuo",
    "geminiImportSuccess": "Gemini-yhteyden tuonti onnistui",
    "geminiImportInvalidJson": "Tiedostoa ei voitu jäsentää JSON-muodossa",
    "geminiImportInvalidShape": "Tiedosto ei ole kelvollinen oauth_creds.json",
    "geminiImportDuplicate": "Tili on jo olemassa – ota \"Korvaa olemassa oleva\" käyttöön korvataksesi",
    "geminiImportIdentityUnverified": "Henkilöllisyyttä ei voitu vahvistaa tunnisteesta id_token. Ota \"Korvaa olemassa oleva\" käyttöön tai anna sähköpostiosoite.",
    "geminiImportFailed": "Gemini-todennusta ei voitu tuoda",
    "geminiImportBulkModeUpload": "Lataa tiedostoja",
    "geminiImportBulkModePaste": "Liitä JSON-taulukko",
    "geminiImportBulkModeZip": "Lataa ZIP",
    "geminiImportBulkUploadHint": "Pudota tai poimi jopa 50 oauth_creds.json-tiedostoa (kukin 256 kt, yhteensä 10 Mt).",
    "geminiImportBulkPasteHint": "Liitä joukko objekteja: [{ json, name?, email? }, ...]",
    "geminiImportBulkZipHint": "ZIP, joka sisältää oauth_creds.json-merkinnät. Enintään 50 merkintää, 10 Mt pakattuna.",
    "geminiImportBulkSubmit": "Tuo kaikki",
    "geminiImportBulkSuccess": "Tuodut {count} Gemini-yhteydet",
    "geminiImportBulkFailed": "Joidenkin merkintöjen tuonti epäonnistui",
    "geminiImportBulkZipExtracting": "Puretaan ZIP-tiedostoa…",
    "geminiImportBulkZipError": "ZIP-tiedoston purkaminen epäonnistui",
    "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",
    "importCodexAuth": "Tuo todennus",
    "codexImportModalTitle": "Tuo Codex Auth",
    "codexImportTabSingle": "Sinkku",
    "codexImportTabBulk": "Bulkki",
    "codexImportTabUpload": "Lataa tiedosto",
    "codexImportTabPaste": "Liitä JSON",
    "codexImportFileLabel": "Valitse auth.json",
    "codexImportFileHint": "Valitse Codexista tai OmniRoutesta viety auth.json-tiedosto.",
    "codexImportPasteLabel": "Liitä JSON-sisältö",
    "codexImportEmailLabel": "Tilin sähköpostiosoite",
    "codexImportEmailHint": "Havaittu automaattisesti tiedostosta; muokkaa tarvittaessa.",
    "codexImportNameLabel": "Yhteyden nimi (valinnainen)",
    "codexImportOverwriteLabel": "Vaihda olemassa oleva yhteys, jos tili on jo olemassa",
    "codexImportSubmit": "Tuo",
    "codexImportSuccess": "Codex-yhteyden tuonti onnistui",
    "codexImportInvalidJson": "Tiedostoa ei voitu jäsentää JSON-muodossa",
    "codexImportInvalidShape": "Tiedosto ei ole kelvollinen Codex auth.json",
    "codexImportDuplicate": "Tili on jo olemassa – ota \"Korvaa olemassa oleva\" käyttöön korvataksesi",
    "codexImportFailed": "Codex-todennusta ei voitu tuoda",
    "codexImportDetectedEmail": "Havaittu: {email}",
    "codexImportNoEmailDetected": "Tiedostosta ei löytynyt sähköpostia",
    "codexImportBulkModeUpload": "Lataa tiedostoja",
    "codexImportBulkModePaste": "Liitä luettelo",
    "codexImportBulkModeZip": "ZIP-arkisto",
    "codexImportBulkUploadHint": "Valitse useita .json-tiedostoja tai vedä ja pudota",
    "codexImportBulkPasteHint": "JSON-taulukko [ {...}, {...} ] tai useita JSON-tiedostoja erotettuna --- omalla rivillään",
    "codexImportBulkZipHint": "Lataa auth.json-tiedostoja sisältävä .zip (enintään 50 tiedostoa, 10 Mt)",
    "codexImportBulkSubmit": "Tuo {count} tiliä",
    "codexImportBulkLimit": "Enintään 50 tiedostoa tuontia kohden",
    "codexImportBulkSuccess": "{count} tuotu",
    "codexImportBulkFailed": "{count} epäonnistui",
    "codexImportBulkZipExtracting": "Puretaan ZIP-tiedostoa…",
    "codexImportBulkZipError": "ZIP-tiedoston purkaminen epäonnistui",
    "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 or paste multiple keys",
    "addCcCompatible": "Add Cc Compatible",
    "aggregatorsGateways": "Aggregators Gateways",
    "enterpriseCloud": "Yritys ja pilvi",
    "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",
    "cloudAgentProviders": "Pilviagenttipalveluntarjoajat",
    "audioShortLabel": "Audio Short Label",
    "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint",
    "bailianBaseUrlHint": "Bailian Base Url Hint",
    "claudeWebCookieHint": "Open claude.ai → DevTools → Application → Cookies → claude.ai, copy the 'sessionKey' value. Also need cf_clearance, __cf_bm, _cfuvid for Cloudflare.",
    "claudeWebCookiePlaceholder": "sessionKey=sk-ant-...",
    "blackboxWebCookieHint": "Blackbox Web Cookie Hint",
    "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder",
    "t3ChatWebCookieHint": "Avaa t3.chat → DevTools → Sovellus → Paikallinen tallennus → https://t3.chat, kopioi 'convex-session-id'. Avaa sitten DevTools → Network, kopioi koko eväste-otsikko mistä tahansa chat-pyynnöstä. Liitä molemmat arvot alla oleviin kenttiin.",
    "t3ChatWebCookiePlaceholder": "convex-session-id=abc123...",
    "blockClaudeExtraUsageDescription": "Block Claude Extra Usage Description",
    "blockClaudeExtraUsageLabel": "Block Claude Extra Usage Label",
    "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}",
    "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}",
    "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.",
    "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": "Use the priority service tier for Codex requests when available.",
    "codexFastServiceTierLabel": "Codex fast service tier",
    "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": "Used when a request does not specify reasoning effort.",
    "defaultThinkingStrengthLabel": "Default thinking strength",
    "deleteAllExtraApiKeys": "Delete all",
    "excludedModelsHint": "Excluded Models Hint",
    "excludedModelsLabel": "Excluded Models Label",
    "excludedModelsPlaceholder": "Excluded Models Placeholder",
    "expirationBannerExpired": "Expiration Banner Expired",
    "expirationBannerExpiredDesc": "Expiration Banner Expired Desc",
    "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon",
    "expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc",
    "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}",
    "extraApiKeysHint": "Extra Api Keys Hint",
    "extraApiKeysLabel": "Extra Api Keys Label",
    "apiKeyHealthLabel": "API Key Health",
    "apiKeyStatusActive": "Active",
    "apiKeyStatusWarning": "Warning ({count} failures)",
    "apiKeyStatusInvalid": "Invalid",
    "primaryKey": "Primary Key",
    "apiKeyInvalidAlert": "{count} API key(s) marked as invalid due to authentication failures in connections: {connections}. They will be skipped in rotation. Click to review.",
    "apiKeyInvalidAlertTitle": "API Key Health Alert",
    "apiKeyWarningAlert": "{count} API key(s) in warning state due to elevated failure rate in connections: {connections}. Review to prevent rotation issues.",
    "apiKeyWarningAlertTitle": "API Key Warning",
    "googlePseInfo": "Google Pse Info",
    "geminiCliProjectIdHint": "Google Cloud Project -tunnuksesi. Vaaditaan tileille poikkeuksin. Anna GCP-projektitunnuksesi käytettäväksi Gemini CLI:n kanssa.",
    "geminiCliProjectIdLabel": "Google Cloud Project ID",
    "geminiCliProjectIdPlaceholder": "my-gcp-projektitunnus",
    "antigravityProjectIdHint": "Valinnainen ohitus Antigravity Cloud Code -pyyntöille. Jätä tyhjäksi, jos haluat käyttää Google OAuthin aikana löydettyä projektia.",
    "antigravityClientProfileLabel": "__MISSING__:Client profile",
    "antigravityClientProfileHint": "__MISSING__:Choose which Antigravity client identity OmniRoute presents to the API.",
    "antigravityClientProfileIde": "__MISSING__:IDE",
    "antigravityClientProfileHarness": "__MISSING__:Harness / CLI",
    "codexFastTierActiveChip": "__MISSING__:Codex Fast tier is active",
    "tierFast": "__MISSING__:Fast",
    "antigravityProjectIdLabel": "Google Cloud Project ID",
    "antigravityProjectIdPlaceholder": "my-gcp-projektitunnus",
    "grokWebCookieHint": "Grok Web Cookie Hint",
    "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder",
    "herokuBaseUrlHint": "Heroku Base Url Hint",
    "hideEmail": "Hide Email",
    "imageProviders": "Image Providers",
    "videoProviders": "Videon sukupolvi",
    "embeddingRerankProviders": "Upotukset ja uudelleensijoitukset",
    "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": "Allow compatible Responses API requests to preserve stored response state.",
    "openaiResponsesStoreLabel": "OpenAI Responses store",
    "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info",
    "perplexityWebCookieHint": "Perplexity Web Cookie Hint",
    "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder",
    "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": "Hae palveluntarjoajia...",
    "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": "{count, plural, one {1 key rotating} other {# 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": "Paste your Service Account JSON ({\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"}) or an OAuth access_token",
    "webCookieProviders": "Web Cookie Providers",
    "weeklyShort": "Weekly Short",
    "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint",
    "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",
    "freeTierProviders": "Ilmaiset tason tarjoajat",
    "freeTierLabel": "Ilmainen taso saatavilla",
    "freeTierProvidersDesc": "Palveluntarjoajat, joilla on ilmaisia ​​tasoja – jotkut vaativat API-avaimen rekisteröitymisen, toiset eivät tarvitse kirjautumistietoja ollenkaan.",
    "providerSummaryAll": "Yhteensä",
    "ideProviders": "IDE-palveluntarjoajat",
    "ideProvidersDesc": "Toimittajat sisäänrakennetulla AI-tilauksella. Käytä palveluntarjoajan sivua tuodaksesi tunnistetiedot suoraan IDE-avainnipusta.",
    "noIdeProviders": "Yksikään IDE-palveluntarjoaja ei vastaa nykyisiä suodattimia.",
    "providerDetailFastTierTooltip": "Käytä Codex Fast -tasoa oletusarvoisesti kaikkiin Codex-yhteyksiin",
    "providerDetailFastDefaultLabel": "Nopea oletus",
    "providerDetailBrowserManualConnect": "Selain/manuaalinen yhteys",
    "providerDetailAuthUrl": "Auth URL",
    "providerDetailCallbackUrl": "Takaisinsoitto-URL-osoite",
    "providerDetailValidClaudeCredentialsFile": "Kelvollinen Clauden tunnistetiedosto",
    "providerDetailPathAutoDetectedAllOs": "Polku tunnistetaan automaattisesti käyttöjärjestelmäkohtaisesti (Linux/Mac/Windows).",
    "providerDetailMyClaudeAccountPlaceholder": "Claude-tilini",
    "providerDetailPathAutoDetected": "Polku tunnistetaan automaattisesti käyttöjärjestelmäkohtaisesti (Linux/Mac).",
    "webFetch": "__MISSING__:Web Fetch",
    "webFetchTooltip": "__MISSING__:Providers that extract content from web URLs (HTML → Markdown, scrape, screenshot)",
    "webFetchProvidersHeading": "__MISSING__:Web Fetch Providers",
    "compatibleProvidersDesc": "__MISSING__:OpenAI-compatible and Anthropic-compatible endpoints you host or configure. Point any OpenAI SDK to your own URL and route requests here.",
    "oauthProvidersDesc": "__MISSING__:Providers authenticated via OAuth — sign in once and OmniRoute handles token rotation automatically.",
    "webCookieProvidersDesc": "Nämä palveluntarjoajat käyttävät selaimen verkkoistuntoja, evästeitä tai verkkotunnuksia API-avainten sijasta. Avaa palveluntarjoaja lisätäksesi tarvittavat istunnon tunnistetiedot.",
    "apiKeyProvidersDesc": "__MISSING__:Standard API key providers. Add your key once and OmniRoute routes, retries, and rate-limits on your behalf.",
    "noAuthProvidersDesc": "__MISSING__:Open endpoints that require no credentials — ready to use immediately without any sign-up.",
    "upstreamProxyProvidersDesc": "__MISSING__:Route outbound traffic through an upstream proxy before it reaches the provider. Useful for corporate networks or traffic inspection.",
    "webFetchProvidersDesc": "__MISSING__:Providers that fetch and extract content from web URLs. Use them to ground prompts with live web data.",
    "aggregatorsGatewaysDesc": "__MISSING__:Multi-provider aggregators and AI gateways that expose a single unified API across dozens of underlying models.",
    "enterpriseCloudDesc": "__MISSING__:Enterprise-tier and cloud-hosted models with enhanced SLAs, compliance certifications, and dedicated capacity.",
    "cloudAgentProvidersDesc": "__MISSING__:Autonomous cloud agents that execute long-running tasks with plan approval and live status tracking.",
    "localProvidersDesc": "__MISSING__:Self-hosted models running on your own hardware. No data leaves your infrastructure.",
    "searchProvidersDesc": "__MISSING__:Web and document search providers. Attach them to LLM calls for Retrieval-Augmented Generation.",
    "audioProvidersDesc": "__MISSING__:Text-to-speech and speech-to-text providers for voice I/O and audio transcription pipelines.",
    "embeddingRerankProvidersDesc": "__MISSING__:Vector embedding and reranking providers for semantic search, RAG pipelines, and similarity scoring.",
    "imageProvidersDesc": "__MISSING__:Image generation and vision providers — create images from text or analyse existing ones.",
    "videoProvidersDesc": "__MISSING__:Video generation providers. Create short video clips from text prompts or images.",
    "onboardingWizard": "Palveluntarjoajan käyttöönottovelho",
    "onboardingWizardShort": "Ohjattu käyttöönottotoiminto",
    "onboardingWizardDescription": "Yhdistä API-avain, mukautetut yhteensopivat ja OAuth-palveluntarjoajat validoinnin, pysyvyyden ja välittömän yhteystestin avulla.",
    "onboardingStepType": "Kirjoita",
    "onboardingStepProvider": "Palveluntarjoaja",
    "onboardingStepCredentials": "Valtuustiedot",
    "onboardingStepResult": "Tulos",
    "onboardingTypeApiKeyTitle": "API-avaimen tarjoaja",
    "onboardingTypeApiKeyText": "Käytä sisäänrakennettuja palveluntarjoajia, kuten OpenAI, Anthropic, Gemini, Groq, Azure ja muita.",
    "onboardingTypeCustomTitle": "Mukautettu yhteensopiva palveluntarjoaja",
    "onboardingTypeCustomText": "Luo OpenAI-, Anthropic- tai Claude Code -yhteensopiva päätepiste ja lisää sen avain.",
    "onboardingTypeOAuthTitle": "OAuth-palveluntarjoaja",
    "onboardingTypeOAuthText": "Käytä uudelleen olemassa olevia OAuth-, laitekoodi- tai paikallisia tuontivirtoja koodauksen tarjoajille.",
    "onboardingChooseOAuthProvider": "Valitse OAuth-palveluntarjoaja",
    "onboardingChooseApiKeyProvider": "Valitse API-avaimen toimittaja",
    "onboardingChooseProviderDescription": "Valitse palveluntarjoaja, niin ohjattu toiminto opastaa sinua valtuustietojen ja testauksen läpi.",
    "onboardingChangeType": "Vaihda tyyppiä",
    "onboardingChangeProvider": "Vaihda palveluntarjoajaa",
    "onboardingSearchProviders": "Hae palveluntarjoajia…",
    "onboardingApiKeyOptional": "API-avain valinnainen",
    "onboardingProviderConnected": "Palveluntarjoaja yhdistetty",
    "onboardingProviderSavedWithWarnings": "Palveluntarjoaja tallennettu varoituksiin",
    "onboardingProviderFinished": "Palveluntarjoajan käyttöönotto on valmis",
    "onboardingYourProviderConnection": "Palveluntarjoajayhteytesi",
    "onboardingTestPassed": "Testi läpäissyt",
    "onboardingTestFailed": "Testi epäonnistui",
    "onboardingOpenProviderDetails": "Avaa palveluntarjoajan tiedot",
    "onboardingTryInPlayground": "Kokeile leikkikentällä",
    "onboardingDefaultConnectionName": "{provider} Ensisijainen",
    "onboardingTestingConnection": "Testataan palveluntarjoajan yhteyttä…",
    "onboardingValidatingCredentials": "Vahvistetaan kirjautumistietoja…",
    "onboardingSavingConnection": "Tallennetaan palveluntarjoajan yhteyttä…",
    "onboardingProviderFailed": "Palveluntarjoajan käyttöönotto epäonnistui",
    "onboardingCreatingCompatibleProvider": "Luodaan yhteensopivaa palveluntarjoajaa…",
    "onboardingSavingCompatibleConnection": "Tallennetaan yhteensopivaa palveluntarjoajan yhteyttä…",
    "onboardingCustomProviderFallbackName": "Mukautettu palveluntarjoaja",
    "onboardingCustomProviderFailed": "Mukautetun palveluntarjoajan käyttöönotto epäonnistui",
    "onboardingLoadingOAuthConnection": "Ladataan OAuth-yhteyttä…",
    "onboardingOAuthNoConnectionFound": "OAuth on valmis, mutta palveluntarjoajayhteyttä ei löytynyt.",
    "onboardingOAuthFailed": "OAuthin käyttöönotto epäonnistui",
    "onboardingAddProvider": "Lisää {provider}",
    "onboardingConnectionName": "Yhteyden nimi",
    "onboardingApiKeyOptionalLabel": "API-avain (valinnainen)",
    "onboardingBaseUrlOverride": "Perus-URL-osoitteen ohitus",
    "onboardingBaseUrlOverrideHint": "Valinnainen. Tallennettu nimellä providerSpecificData.baseUrl.",
    "onboardingRegion": "Alue",
    "onboardingSearchCx": "Hae CX / Moottorin tunnus",
    "onboardingProviderSpecificIdPlaceholder": "Valinnainen palveluntarjoajakohtainen tunnus",
    "onboardingCustomUserAgent": "Mukautettu käyttäjäagentti",
    "onboardingWorking": "Työskentelee…",
    "onboardingValidateSaveTest": "Vahvista, tallenna ja testaa",
    "onboardingBack": "Takaisin",
    "onboardingCreateCustomCompatibleProvider": "Luo mukautettu yhteensopiva palveluntarjoaja",
    "onboardingCreateCustomCompatibleDescription": "Ohjattu toiminto luo ensin toimittajasolmun, jonka jälkeen tallentaa ja testaa sen API-avainyhteyden.",
    "onboardingProtocol": "pöytäkirja",
    "onboardingOpenAiCompatible": "OpenAI-yhteensopiva",
    "onboardingAnthropicCompatible": "Antrooppinen yhteensopiva",
    "onboardingClaudeCodeCompatible": "Claude Code -yhteensopiva",
    "onboardingProviderPrefix": "Tarjoajan etuliite",
    "onboardingProviderPrefixHint": "Käytetään hallitun palveluntarjoajan tunnuksen luomiseen.",
    "onboardingChatPath": "Chat-polku",
    "onboardingModelsPath": "Mallin polku",
    "onboardingCreateSaveTest": "Luo, tallenna ja testaa",
    "onboardingConnectProvider": "Yhdistä {provider}",
    "onboardingOAuthFlowDescription": "OmniRoute avaa nykyisen OAuth-kulun tälle palveluntarjoajalle. Kirjautumisen jälkeen ohjattu toiminto lataa tallennetun yhteyden uudelleen ja suorittaa saman yhteystestin kuin toimittajasivu.",
    "onboardingStartOAuthFlow": "Käynnistä OAuth-kulku",
    "passthroughModelsDescription": "{provider} hyväksyy palveluntarjoajan alkuperäiset mallitunnukset. Tuo /modelsista tai lisää mukautettuja tunnuksia reititystä varten.",
    "bedrockModelsDescription": "Amazon Bedrock -mallit on luokiteltu AWS-alueen mukaan. Tuo osoitteesta /models tai lisää valitulla alueella käytössä olevat kallioperän mallitunnukset.",
    "bedrockModelPlaceholder": "antrooppinen.claude-sonnet-4-6",
    "addProviderSessionCookieTitle": "Lisää {provider} istuntoeväste",
    "addProviderWebTokenTitle": "Lisää {provider} verkkotunnus",
    "addProviderConnectionTitle": "Lisää {provider}-yhteys",
    "webTokenCredentialLabel": "Verkkoistunnon tunnus",
    "webNoAuthCredentialLabel": "Tunnuksia ei vaadita",
    "webCookieCredentialHint": "Vaadittu eväste: {credential}. Liitä eväste-otsikon arvo omasta sisäänkirjautuneesta {provider}-verkkoistunnostasi. Älä sisällytä Cookie:-etuliitettä.",
    "webTokenCredentialHint": "Tunnistetiedot: {credential}. Liitä tunnusarvo omasta sisäänkirjautuneesta {provider}-verkkoistunnostasi tai DevToolsin HAR-viennistä, jos palveluntarjoaja tukee sitä.",
    "webCookieEditHint": "Jätä tyhjäksi, jos haluat säilyttää nykyisen istunnon evästeen. Vaadittu eväste: {credential}.",
    "webTokenEditHint": "Jätä tyhjäksi, jos haluat säilyttää nykyisen verkkoistunnon tunnus. Tunnistetiedot: {credential}.",
    "webSessionGuideTitle": "Kuinka saada istunnon kirjautumistiedot",
    "webSessionGuideIntro": "{provider} käyttää selaimen verkkoistuntoa API-avaimen sijasta.",
    "webCookieRequiredCredential": "Vaadittu eväste: {credential}",
    "webTokenRequiredCredential": "Vaadittu tunnus: {credential}",
    "webSessionGuideStep1": "Kirjaudu sisään {provider} -palveluun selaimessasi.",
    "webSessionGuideStep2": "Avaa selaimen kehittäjätyökalut ja tarkista verkkosovelluksen tekemä pyyntö.",
    "webSessionGuideStep3": "Kopioi tarvittavat tunnistetiedot palveluntarjoajan omasta verkkotunnuksesta. Kopioi evästeitä varten vain Evästeen otsikon arvo ja jätä pois Cookie:.",
    "webSessionGuideStep4": "Liitä se tähän ja tarkista yhteys. Jos se lakkaa toimimasta, kirjaudu uudelleen sisään ja korvaa se uudella arvolla.",
    "webSessionSecurityHint": "Käsittele tätä kuin salasanaa: se voi käyttää kirjautuneena verkkotiliäsi, kunnes se vanhenee tai se peruutetaan.",
    "webNoAuthGuideTitle": "Tunnuksia ei vaadita",
    "webNoAuthGuideBody": "{provider} ei tarvitse API-avainta tai evästettä. Tallenna yhteys käyttääksesi sen ilmaista verkkopäätepistettä.",
    "webSessionCredentialValidationFailed": "Istunnon kirjautumistietojen vahvistus epäonnistui. Kirjaudu uudelleen sisään, kopioi uudet kirjautumistiedot ja yritä uudelleen.",
    "checkCookie": "Tarkista eväste",
    "checkWebToken": "Tarkista tunnus"
  },
  "settings": {
    "title": "Asetukset",
    "general": "Kenraali",
    "security": "Turvallisuus",
    "appearance": "Ulkonäkö",
    "routing": "Reititys",
    "cache": "Välimuisti",
    "resilience": "Joustavuus",
    "routingSettingsIntro": "Hallitsee, kuinka pyyntösi reititetään, muunnetaan ja lähetetään tekoälyn tarjoajille.",
    "routingOpDropParagraphContainsLabel": "__MISSING__:Drop paragraph (contains)",
    "routingOpDropParagraphStartsWithLabel": "__MISSING__:Drop paragraph (starts with)",
    "routingOpReplaceTextLabel": "__MISSING__:Replace text",
    "routingOpReplaceRegexLabel": "__MISSING__:Replace regex",
    "routingOpDropBlockContainsLabel": "__MISSING__:Drop block (contains)",
    "routingOpPrependSystemBlockLabel": "__MISSING__:Prepend system block",
    "routingOpAppendSystemBlockLabel": "__MISSING__:Append system block",
    "routingOpInjectBillingHeaderLabel": "__MISSING__:Inject billing header",
    "routingOpObfuscateWordsLabel": "__MISSING__:Obfuscate words (ZWJ)",
    "routingOpDropParagraphContainsDesc": "__MISSING__:Removes any paragraph (text block split on blank lines) inside the system prompt whose text contains ANY of the listed substrings. Use to strip third-party client fingerprints like 'github.com/anomalyco/opencode' or 'docs.openwebui.com' that Anthropic's classifier flags.",
    "routingOpDropParagraphStartsWithDesc": "__MISSING__:Removes any paragraph that STARTS WITH one of the listed prefixes. Use for identity lines like 'You are OpenCode' or 'You are Open WebUI' that announce the calling client.",
    "routingOpReplaceTextDesc": "__MISSING__:Replaces a literal substring with another literal substring. Use for known trigger phrases — e.g. rewrite 'Here is some useful information about the environment you are running in:' to 'Environment context you are running in:' (an empirically-validated trigger phrase).",
    "routingOpReplaceRegexDesc": "__MISSING__:Replaces text matching a regular expression. Use when you need patterns (character classes, optional whitespace, anchors) instead of literal substrings. A malformed pattern is caught at runtime when the op runs.",
    "routingOpDropBlockContainsDesc": "__MISSING__:Removes ENTIRE system blocks (not just paragraphs) whose text contains any of the listed substrings. Use when a whole block is fingerprint-bearing and you want it gone — e.g. an injected MCP-server description.",
    "routingOpPrependSystemBlockDesc": "__MISSING__:Inserts a new text block at the FRONT of the system array. Use to add the SDK identity 'You are a Claude agent, built on Anthropic's Claude Agent SDK.' that Anthropic's classifier expects.",
    "routingOpAppendSystemBlockDesc": "__MISSING__:Inserts a new text block at the END of the system array. Use for cosmetic additions that don't need to be at position [0].",
    "routingOpInjectBillingHeaderDesc": "__MISSING__:Prepends the special 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;' text block that Anthropic's classifier validates. Required for CC bridge relay endpoints; for the native claude provider OmniRoute already injects its own billing line so this op is usually redundant there.",
    "routingOpObfuscateWordsDesc": "__MISSING__:Inserts a Zero-Width-Joiner character after the first letter of each listed word, so 'opencode' becomes 'o‍pencode'. Reads identical to humans but bypasses classifier word matches. Targets system blocks, user/assistant messages, and tool descriptions.",
    "routingNeedlesHint": "__MISSING__:List of substrings. A paragraph matches if it contains ANY one of them. Add one per line via 'Add entry'.",
    "routingPrefixesHint": "__MISSING__:List of strings. A paragraph matches if it starts with any one of them (leading whitespace is trimmed before matching).",
    "routingCaseSensitiveHint": "__MISSING__:When ON, 'OpenCode' and 'opencode' are different strings. When OFF (default), the comparison ignores case.",
    "routingMatchLiteralHint": "__MISSING__:Exact literal substring to find. No regex syntax — special chars like . * ? are treated as themselves.",
    "routingReplacementTextHint": "__MISSING__:Replacement string. Leave blank to delete the match. The output preserves surrounding text.",
    "routingAllOccurrencesHint": "__MISSING__:When ON (default), every instance is replaced. When OFF, only the first match is replaced.",
    "routingPatternHint": "__MISSING__:JavaScript regex source. Don't wrap in slashes — just 'foo(.*)bar'. Server rejects patterns that fail to compile.",
    "routingRegexFlagsHint": "__MISSING__:JavaScript regex flags (g = all matches, i = case-insensitive, s = dot matches newline, m = multiline). Default 'g'.",
    "routingBlockTextHint": "__MISSING__:Full text of the new system block. Use a literal string; the system block stores text only.",
    "routingIdempotencyKeyHint": "__MISSING__:Optional. If set, the op skips when a block whose text starts with this key is already present. Prevents double-prepend on retries.",
    "routingBillingEntrypointHint": "__MISSING__:Value injected as 'cc_entrypoint='. Anthropic accepts 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI), or other documented values.",
    "routingBillingVersionFormatHint": "__MISSING__:How the 3-char build hash after cc_version= is computed. 'ex-machina' = sha256 of CCH_SALT+chars-from-first-user-msg+version (per-message). 'omniroute-daystamp' = sha256 of YYYY-MM-DD+version (stable per-day).",
    "routingBillingCchAlgoHint": "__MISSING__:How the 5-char cch= token is computed. 'sha256-first-user' = sha256 of first user message text. 'xxhash64-body' = body-level signing fills it later. 'static-zero' = literal '00000' placeholder.",
    "routingObfuscateWordsHint": "__MISSING__:Lowercase words to obfuscate. ZWJ insertion is applied case-insensitively, so 'opencode' also matches 'OpenCode' and 'OPENCODE'.",
    "routingObfuscateTargetsHint": "__MISSING__:Which body regions to scan for the words: system blocks, user/assistant messages, and/or tool descriptions.",
    "routingObfuscateTargetsLabel": "__MISSING__:Targets",
    "routingSummarizeDropParagraphContains": "__MISSING__:drop paragraphs containing: {items}",
    "routingSummarizeDropParagraphStartsWith": "__MISSING__:drop paragraphs starting with: {items}",
    "routingSummarizeReplaceText": "__MISSING__:replace \"{match}\" → \"{replacement}\"",
    "routingSummarizeReplaceRegex": "__MISSING__:regex /{pattern}/{flags} → \"{replacement}\"",
    "routingSummarizeDropBlockContains": "__MISSING__:drop blocks containing: {items}",
    "routingSummarizePrependSystemBlock": "__MISSING__:prepend block: \"{text}\"",
    "routingSummarizeAppendSystemBlock": "__MISSING__:append block: \"{text}\"",
    "routingSummarizeInjectBillingHeader": "__MISSING__:inject billing header (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})",
    "routingSummarizeObfuscateWords": "__MISSING__:obfuscate {count} word(s) via ZWJ in {targets}",
    "routingDefaultAutoVariantLKGP": "__MISSING__:Last Known Good Provider",
    "routingDefaultAutoVariantLKGPDesc": "__MISSING__:Last Known Good Provider",
    "routingDefaultAutoVariantCoding": "__MISSING__:Quality-first for code",
    "routingDefaultAutoVariantCodingDesc": "__MISSING__:Quality-first for code",
    "routingDefaultAutoVariantFast": "__MISSING__:Low-latency routing",
    "routingDefaultAutoVariantFastDesc": "__MISSING__:Low-latency routing",
    "routingDefaultAutoVariantCheap": "__MISSING__:Cost-optimized",
    "routingDefaultAutoVariantCheapDesc": "__MISSING__:Cost-optimized",
    "routingDefaultAutoVariantOffline": "__MISSING__:High availability",
    "routingDefaultAutoVariantOfflineDesc": "__MISSING__:High availability",
    "routingDefaultAutoVariantSmart": "__MISSING__:Best discovery (10% explore)",
    "routingDefaultAutoVariantSmartDesc": "__MISSING__:Best discovery (10% explore)",
    "routingOpSummaryCount": "__MISSING__:{count, plural, =0 {no ops} one {# op} other {# ops}}",
    "routingOpEnabled": "__MISSING__:enabled",
    "routingOpDisabled": "__MISSING__:disabled",
    "routingOpStatusSeparator": "__MISSING__: · ",
    "resilienceSettingsIntro": "Automaattinen uudelleenyritys, jäähdytys ja palautus, kun palveluntarjoajat epäonnistuvat.",
    "aiSettingsIntro": "Tekoälykohtaiset asetukset ajattelubudjettia, mallin käyttäytymistä ja pakkausta varten.",
    "systemPrompt": "Järjestelmäkehote",
    "thinkingBudget": "Miettivä budjetti",
    "proxy": "Välityspalvelin",
    "httpProxy": "HTTP Proxy",
    "1proxy": "1proxy",
    "proxySubTabsAria": "Proxy sections",
    "requestBodyLimitTitle": "Request Body Limit",
    "requestBodyLimitDescription": "Maximum API payload size accepted before a request body is parsed. Dedicated upload routes keep at least their built-in 100 MB limit.",
    "requestBodyLimitInputLabel": "Request body limit in MB",
    "requestBodyLimitEmptyError": "Enter a limit in MB",
    "requestBodyLimitWholeNumberError": "Use a whole number",
    "requestBodyLimitMinimumError": "Minimum is {min} MB",
    "requestBodyLimitMaximumError": "Maximum is {max} MB",
    "requestBodyLimitLoadFailed": "Failed to load request limit settings",
    "requestBodyLimitSaveSuccess": "Request body limit saved",
    "requestBodyLimitSaveFailed": "Failed to save request body limit",
    "requestBodyLimitSaving": "Saving...",
    "requestBodyLimitSave": "Save",
    "requestBodyLimitCurrent": "Current: {value}",
    "mitmProxy": "MITM-välityspalvelin",
    "pricing": "Hinnoittelu",
    "storage": "Varastointi",
    "policies": "Käytännöt",
    "ipFilter": "IP-suodatin",
    "comboDefaults": "Yhdistelmän oletukset",
    "fallbackChains": "Varaketjut",
    "changePassword": "Vaihda salasana",
    "enablePassword": "Ota salasana käyttöön",
    "darkMode": "Tumma tila",
    "lightMode": "Valotila",
    "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": "juuri nyt",
    "modelsDevStats": "Sync Statistics",
    "modelsDevStatsDesc": "Current models.dev data coverage",
    "providers": "Palveluntarjoajat",
    "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": "Järjestelmän teema",
    "debugToggle": "Enable Debug Mode",
    "sidebarVisibilityToggle": "Show Sidebar Items",
    "enableCache": "Ota välimuisti käyttöön",
    "cacheTTL": "Välimuisti TTL",
    "maxCacheSize": "Välimuistin enimmäiskoko",
    "clearCache": "Tyhjennä välimuisti",
    "cacheCleared": "Cache cleared successfully",
    "clearCacheFailed": "Failed to clear cache",
    "cacheHits": "Välimuistin osumia",
    "cacheMisses": "Välimuisti puuttuu",
    "hitRate": "Osumaprosentti",
    "cacheEntries": "Välimuistin merkinnät",
    "cacheSettings": "Cache Settings",
    "semanticCache": "Semantic Cache",
    "maxEntries": "Max Entries",
    "ttlMinutes": "TTL (minutes)",
    "promptCache": "Kehotusvälimuisti",
    "strategy": "Strategy",
    "preserveClientCache": "Preserve Client Cache",
    "enabled": "Enabled",
    "loading": "Loading...",
    "saving": "Tallennetaan...",
    "save": "Save",
    "circuitBreaker": "Katkaisija",
    "retryPolicy": "Yritä uudelleen -käytäntö",
    "maxRetries": "Max Uudelleenyritykset",
    "retryDelay": "Yritä uudelleen Viive",
    "timeoutMs": "Aikakatkaisu (ms)",
    "enableSystemPrompt": "Ota järjestelmäkehote käyttöön",
    "systemPromptText": "Järjestelmäkehoteteksti",
    "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.",
    "resilienceStructureTitle": "Resilience Structure",
    "resilienceStructureDesc": "Tämä sivu määrittää vain käyttäytymisen. Live-katkaisijan tila näkyy Terveys-sivulla. Yhdistelmäkohtainen uudelleenyritys ja round-robin-paikan ohjaus pysyvät yhdistelmäasetuksissa.",
    "enableThinking": "Ota ajattelu käyttöön",
    "maxThinkingTokens": "Max Thinking Tokens",
    "enableProxy": "Ota välityspalvelin käyttöön",
    "proxyUrl": "Välityspalvelimen URL-osoite",
    "pricingRates": "Hinnoitteluhinnastomuoto",
    "currentPricing": "Nykyisen hinnoittelun yleiskatsaus",
    "loadingPricing": "Ladataan hintatietoja...",
    "noPricing": "Hintatietoja ei ole saatavilla",
    "input": "Syöte",
    "output": "Lähtö",
    "cached": "Välimuistissa",
    "reasoning": "Päättely",
    "cacheCreation": "Välimuistin luominen",
    "customPricing": "Mukautettu hinnoittelu",
    "databaseSize": "Tietokannan koko",
    "backupDb": "Varmuuskopiointitietokanta",
    "restoreDb": "Palauta tietokanta",
    "exportData": "Vie tiedot",
    "importData": "Tuo tiedot",
    "clearData": "Tyhjennä kaikki tiedot",
    "clearDataConfirm": "Tämä poistaa pysyvästi kaikki tiedot. Oletko varma?",
    "enableRequestLogs": "Ota pyyntölokit käyttöön",
    "logRetention": "Lokin säilyttäminen",
    "ipWhitelist": "IP valkoinen lista",
    "ipBlacklist": "IP musta lista",
    "addIP": "Lisää IP",
    "savedSuccessfully": "Asetukset tallennettu onnistuneesti",
    "ai": "AI",
    "advanced": "Edistynyt",
    "localMode": "Paikallinen tila — Kaikki laitteellesi tallennetut tiedot",
    "settingsSectionsAria": "Asetukset-osiot",
    "switchThemes": "Vaihda vaaleiden ja tummien teemojen välillä",
    "themeSelectionAria": "Teeman valinta",
    "themeLight": "Kevyt",
    "themeDark": "Tumma",
    "themeSystem": "Järjestelmä",
    "endpointTunnelVisibility": "Päätepisteen tunnelin näkyvyys",
    "endpointTunnelVisibilityDesc": "Piilota tunnelin säätimet Päätepiste-sivulta muuttamatta tunnelin tilaa.",
    "showCloudflareTunnel": "Cloudflare Quick Tunnel",
    "showCloudflareTunnelDesc": "Näytä Cloudflare Quick Tunnel -ohjaimet Päätepiste-sivulla.",
    "showTailscaleFunnel": "Tailscalen suppilo",
    "showTailscaleFunnelDesc": "Näytä Tailscalen suppilon säätimet Päätepiste-sivulla.",
    "showNgrokTunnel": "ngrok tunneli",
    "showNgrokTunnelDesc": "Näytä ngrok Tunnelin säätimet Päätepiste-sivulla.",
    "sidebarVisibility": "Hide sidebar items",
    "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter.",
    "sidebarVisibilityHint": "Any sidebar section is hidden automatically when a...",
    "hideHealthLogs": "Piilota kuntotarkastuslokit",
    "hideHealthLogsDesc": "Kun PÄÄLLÄ, estä [HealthCheck]-viestit palvelinkonsolissa",
    "themeAccent": "Teeman väri",
    "themeAccentDesc": "Valitse valmis väri tai luo oma teemasi yhdellä värillä",
    "themeCreate": "Luo teema",
    "themeCustom": "Mukautettu teema",
    "themeBlue": "Sininen",
    "themeRed": "Punainen",
    "themeGreen": "Vihreä",
    "themeViolet": "Violetti",
    "themeOrange": "Oranssi",
    "themeCyan": "Syaani",
    "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": "Tyhjennä välimuisti",
    "flushing": "Huuhdellaan…",
    "size": "Koko",
    "hits": "Osumat",
    "evictions": "Häädöt",
    "loadingCacheStats": "Ladataan välimuistin tilastoja…",
    "globalProxy": "Globaali välityspalvelin",
    "globalProxyDesc": "Määritä yleinen lähtevä välityspalvelin kaikille API-kutsuille. Yksittäiset palveluntarjoajat, yhdistelmät ja avaimet voivat ohittaa tämän.",
    "noGlobalProxy": "Globaalia välityspalvelinta ei ole määritetty",
    "globalLabel": "Maailmanlaajuinen",
    "configure": "Määritä",
    "globalSystemPrompt": "Globaali järjestelmäkehote",
    "saved": "Tallennettu",
    "beforePromptLabel": "__MISSING__:Before Prompt",
    "beforePromptDesc": "__MISSING__:Injected before agent/provider system instructions",
    "beforePromptPlaceholder": "__MISSING__:Instructions inserted before agent/provider prompt...",
    "afterPromptLabel": "__MISSING__:After Prompt",
    "afterPromptDesc": "__MISSING__:Injected after agent/provider system instructions",
    "afterPromptPlaceholder": "__MISSING__:Instructions inserted after agent/provider prompt...",
    "chars": "{count} merkkiä",
    "thinkingBudgetTitle": "Miettivä budjetti",
    "thinkingBudgetDesc": "Hallitse tekoälyn päättelytunnuksen käyttöä kaikissa pyynnöissä",
    "passthrough": "Läpivienti",
    "passthroughDesc": "Ei muutoksia – asiakas hallitsee ajattelubudjettia",
    "auto": "Auto",
    "autoDesc": "Poista kaikki ajatellut asetukset – anna palveluntarjoajan päättää",
    "custom": "Mukautettu",
    "customDesc": "Aseta kiinteä tunnusbudjetti kaikille pyynnöille",
    "adaptive": "Mukautuva",
    "adaptiveDesc": "Skaalaa budjetti pyynnön monimutkaisuuden perusteella",
    "effortNone": "Ei mitään (0 merkkiä)",
    "effortLow": "Matala (1 000 tokenia)",
    "effortMedium": "Keskikokoinen (10 000 merkkiä)",
    "effortHigh": "High (128 000 tokenia)",
    "tokenBudget": "Token-budjetti",
    "tokens": "rahakkeita",
    "baseEffortLevel": "Perusponnistuksen taso",
    "adaptiveHint": "Mukautuva tila skaalautuu tältä perustasolta viestimäärän, työkalun käytön ja kehotteen pituuden perusteella.",
    "requireLogin": "Vaadi kirjautumista",
    "requireLoginDesc": "Kun PÄÄLLÄ, kojelauta vaatii salasanan. Kun POIS PÄÄLTÄ, käytä ilman kirjautumista.",
    "currentPassword": "Nykyinen salasana",
    "enterCurrentPassword": "Anna nykyinen salasana",
    "newPassword": "Uusi salasana",
    "enterNewPassword": "Syötä uusi salasana",
    "confirmPassword": "Vahvista uusi salasana",
    "confirmPasswordPlaceholder": "Vahvista uusi salasana",
    "passwordsNoMatch": "Salasanat eivät täsmää",
    "passwordUpdated": "Salasana päivitetty onnistuneesti",
    "failedUpdatePassword": "Salasanan päivitys epäonnistui",
    "errorOccurred": "Tapahtui virhe",
    "updatePassword": "Päivitä salasana",
    "setPassword": "Aseta salasana",
    "apiEndpointProtection": "API Endpoint Protection",
    "requireAuthModels": "Vaadi API-avain /mallille",
    "requireAuthModelsDesc": "Kun PÄÄLLÄ, /v1/models-päätepiste palauttaa 404 todentamattomille pyynnöille. Estää valtuuttamattomien käyttäjien mallin löytämisen.",
    "authModelHeading": "Aktiivinen valtuutusmalli",
    "authModelClient": "Client API -päätepisteet (/v1/*, /chat/*, /responses/*, /codex/*, /messages/*) vaativat Bearer API-avaimen.",
    "authModelManagement": "Hallintapäätepisteet (/dashboard, /api/*) vaativat kojelautaistunnon tai hallinnan tunnistetiedot.",
    "authModelPublic": "Vain kirjautumis-, terveys- ja käynnistysreitit ovat julkisia.",
    "bruteForceProtection": "Kirjaudu sisään brute force -suojaus",
    "bruteForceProtectionDesc": "Kaasuta ja lukitse /api/auth/login toistuvien virheiden jälkeen samasta IP-osoitteesta.",
    "corsAllowedOrigins": "CORS:n sallitut alkuperät",
    "corsAllowedOriginsDesc": "Pilkuilla eroteltu luettelo selaimen lähteistä, joilla on lupa kutsua tätä palvelinta. Tyhjä luettelo = ei selaimen CORS-käyttöä (palvelin-palvelin toimii edelleen). Käytä CORS_ALLOW_ALL=true env var vain kehittämiseen.",
    "blockedProviders": "Estetyt palveluntarjoajat",
    "blockedProvidersDesc": "Piilota tietyt toimittajat /v1/models-vastauksesta. Estetyt palveluntarjoajat eivät näy malliluetteloissa.",
    "providersBlocked": "{count} toimittaja(t) estetty /modelsista",
    "blockProviderTitle": "Estä {provider}",
    "unblockProviderTitle": "Kumoa esto {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}",
    "systemTransforms": "System-block Transform Pipeline",
    "systemTransformsDesc": "Palveluntarjoajakohtaisesti tilattu muunnossarja, joka on sovellettu pyynnön runkoon ennen edelleenlähetystä. Tukee mitä tahansa palveluntarjoajan tunnusta.",
    "systemTransformsAddProvider": "Lisää palveluntarjoaja",
    "systemTransformsAddProviderPlaceholder": "Valitse palveluntarjoaja…",
    "systemTransformsAddProviderAllConfigured": "Kaikki palveluntarjoajat on jo määritetty",
    "systemTransformsRemoveProvider": "Poista palveluntarjoaja",
    "systemTransformsNoProviders": "Palveluntarjoajia ei ole määritetty. Aloita lisäämällä palveluntarjoaja.",
    "systemTransformsOpMoveUp": "Siirrä ylös",
    "systemTransformsOpMoveDown": "Siirry alas",
    "systemTransformsOpDelete": "Poista op",
    "routingStrategy": "Reititysstrategia",
    "routingAdvancedGuideTitle": "Edistynyt reititysopastus",
    "routingAdvancedGuideHint1": "Käytä Täytä ensin ennustettavaa prioriteettia varten, Round Robinia oikeudenmukaisuuden varmistamiseksi ja P2C:tä latenssin kestävyyteen.",
    "routingAdvancedGuideHint2": "Jos palveluntarjoajat vaihtelevat laadultaan/kustannuksiltaan, aloita Cost Opt -vaihtoehdolla taustatyössä ja Vähiten käytetyllä tasapainoiseen kulumiseen.",
    "fillFirst": "Täytä ensin",
    "fillFirstDesc": "Käytä tilejä tärkeysjärjestyksessä",
    "roundRobin": "Round Robin",
    "roundRobinDesc": "Selaa kaikki tilit läpi",
    "p2c": "P2C",
    "p2cDesc": "Valitse 2 satunnaista, käytä terveellisempää",
    "random": "Satunnainen",
    "randomDesc": "Satunnainen tili jokainen pyyntö",
    "leastUsed": "Vähiten käytetty",
    "leastUsedDesc": "Valitse vähiten käytetty tili",
    "costOpt": "Kustannusopt",
    "costOptDesc": "Valitse halvin saatavilla oleva tili",
    "resetAware": "Reset-Aware RR",
    "resetAwareDesc": "Suosi tilejä, joilla on terve jäljellä oleva kiintiö ja lähempänä nollauksia",
    "strictRandom": "Strict Random",
    "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling",
    "stickyLimit": "Sticky Limit",
    "stickyLimitDesc": "Puhelut tilikohtaisesti ennen vaihtamista",
    "modelAliases": "Mallin aliakset",
    "modelAliasesTitle": "Mallialias",
    "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.",
    "addCustomAlias": "Lisää Mukautettu Alias",
    "deprecatedModelId": "Vanhentunut malli-ID",
    "newModelId": "Uusi malli-ID",
    "customAliases": "Mukautetut Aliakset",
    "builtInAliases": "Sisäänrakennetut Aliakset",
    "backgroundDegradationTitle": "Taustatyö Degradointi",
    "backgroundDegradationDesc": "Tunnistaa automaattisesti taustatyöt (otsikot, yhteenvedot) ja ohjaa halvempiin malleihin",
    "enableDegradation": "Ota Taustadegraadointi Käyttöön",
    "enableDegradationHint": "Kun käytössä, taustatyöt kuten otsikoiden luominen ja yhteenvedot ohjataan automaattisesti halvempiin malleihin",
    "tasksDetected": "Tehtävät tunnistettu",
    "degradationMap": "Mallin Degradaatiokartta",
    "premiumModel": "Premium-malli",
    "cheapModel": "Halpa malli",
    "detectionPatterns": "Tunnistusmallit",
    "newPattern": "esim. \"luo otsikko\"",
    "aliasPatternPlaceholder": "claude-sonett-*",
    "aliasTargetPlaceholder": "claude-sonnet-4-20250514",
    "pattern": "kuvio",
    "targetModel": "Kohdemalli",
    "add": "+ Lisää",
    "session": "Istunto",
    "sessionDetailsAria": "Istunnon tiedot",
    "status": "Tila",
    "authenticated": "Todennettu",
    "guest": "Vieras",
    "loginTime": "Kirjautumisaika",
    "sessionAge": "Istunnon ikä",
    "browser": "Selain",
    "clearLocalData": "Tyhjennä paikalliset tiedot",
    "logout": "Kirjaudu ulos",
    "clearLocalDataConfirm": "Poistetaanko kaikki paikalliset tiedot? Tämä nollaa asetuksesi.",
    "unknown": "Tuntematon",
    "systemActor": "järjestelmä",
    "ipAccessControl": "IP Access Control",
    "ipAccessControlDesc": "Estä tai salli tietyt IP-osoitteet",
    "ipModeDisabled": "Ei käytössä",
    "ipModeBlacklist": "Musta lista",
    "ipModeWhitelist": "Valkoinen lista",
    "ipModeWhitelistPriority": "WL-prioriteetti",
    "addIpAddress": "Lisää IP-osoite",
    "ipAddressPlaceholder": "192.168.1.0/24 tai 10.0.*.*",
    "block": "+ Estä",
    "allow": "+ Salli",
    "blocked": "Estetty ({count})",
    "allowed": "Sallittu ({count})",
    "temporaryBans": "Väliaikaiset kiellot ({count})",
    "minLeft": "{min}m jäljellä",
    "auditLog": "Tarkastusloki",
    "searchAuditLogs": "Hae valvontalokeja...",
    "failedLoadAuditLog": "Tarkastuslokin lataaminen epäonnistui",
    "noAuditEvents": "Tarkastustapahtumia ei löytynyt",
    "action": "Toiminta",
    "actor": "näyttelijä",
    "details": "Yksityiskohdat",
    "time": "Aika",
    "fallbackChainsTitle": "Varaketjut",
    "fallbackChainsDesc": "Määritä toimittajan varatilaus mallikohtaisesti",
    "addChain": "+ Lisää ketju",
    "modelName": "Mallin nimi",
    "modelNamePlaceholder": "claude-sonnet-4-20250514",
    "providersCommaSeparated": "Palveluntarjoajat (pilkuilla erotettuna, tärkeysjärjestyksessä)",
    "providersCommaSeparatedPlaceholder": "antrooppinen, openai, kaksoset",
    "createChain": "Luo ketju",
    "noFallbackChains": "Ei varaketjuja",
    "noFallbackChainsDesc": "Luo ketju toimittajan varatilauksen määrittämiseksi mallille.",
    "loadingFallbackChains": "Ladataan varaketjuja...",
    "deleteChainConfirm": "Poistetaanko varaketju kohteelle \"{model}\"?",
    "chainCreated": "Ketju luotu kohteelle {model}",
    "chainDeleted": "Ketju poistettu {model}",
    "failedCreateChain": "Ketjun luominen epäonnistui",
    "failedDeleteChain": "Ketjun poistaminen epäonnistui",
    "deleteChain": "Poista ketju",
    "fillModelAndProviders": "Täytä mallin nimi ja toimittajat",
    "addAtLeastOneProvider": "Lisää vähintään yksi palveluntarjoaja",
    "comboDefaultsTitle": "Yhdistelmän oletukset",
    "comboDefaultsGuideTitle": "Kuinka virittää yhdistelmäoletusasetukset",
    "comboDefaultsGuideHint1": "Pidä uudelleenyritykset alhaisena matalan viiveen virroissa; lisää aikakatkaisua vain pitkiä sukupolvitehtäviä varten.",
    "comboDefaultsGuideHint2": "Käytä palveluntarjoajan ohituksia, kun yksi palveluntarjoaja tarvitsee erilaista aikakatkaisu-/uudelleenyritystoimintaa kuin yleiset oletusasetukset.",
    "globalComboConfig": "Globaali yhdistelmäkokoonpano",
    "defaultStrategy": "Oletusstrategia",
    "defaultStrategyDesc": "Sovelletaan uusiin komboihin ilman selkeää strategiaa",
    "comboStrategyAria": "Yhdistelmästrategia",
    "priority": "Prioriteetti",
    "weighted": "Painotettu",
    "contextRelay": "Context Relay",
    "contextRelayDesc": "Hands off context between providers with automatic summarization",
    "maxRetriesLabel": "Max Uudelleenyritykset",
    "retryDelayLabel": "Uudelleenyrityksen viive (ms)",
    "timeoutLabel": "Aikakatkaisu (ms)",
    "healthCheck": "Terveystarkastus",
    "healthCheckDesc": "Tarkista palveluntarjoajan saatavuus etukäteen",
    "trackMetrics": "Seuraa mittareita",
    "trackMetricsDesc": "Tallenna yhdistelmäkohtaiset pyyntötiedot",
    "providerOverrides": "Palveluntarjoajan ohitukset",
    "providerOverridesDesc": "Ohita aikakatkaisu ja yritä uudelleen palveluntarjoajan mukaan. Palveluntarjoajan asetukset ohittavat yleiset oletukset.",
    "providerMaxRetriesAria": "{provider} enintään uudelleenyritystä",
    "providerTimeoutAria": "{provider} aikakatkaisu ms",
    "removeProviderOverrideAria": "Poista {provider} ohitus",
    "newProviderNamePlaceholder": "esim. google, avaa...",
    "newProviderNameAria": "Uusi palveluntarjoajan nimi",
    "retries": "yrittää uudelleen",
    "ms": "ms",
    "saveComboDefaults": "Tallenna yhdistelmän oletusasetukset",
    "maxNestingDepth": "Suurin pesintäsyvyys",
    "concurrencyPerModel": "Samanaikaisuus / malli",
    "queueTimeout": "Jonon aikakatkaisu (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": "Palveluntarjoajan profiilit",
    "providerProfilesDesc": "Erilliset joustavuusasetukset OAuth- (istuntopohjainen) ja API-avaimen (mittari) tarjoajille. OAuth-palveluntarjoajilla on tiukemmat kynnykset alhaisempien nopeusrajojen vuoksi.",
    "oauthProviders": "OAuth-palveluntarjoajat",
    "apiKeyProviders": "API-avainten tarjoajat",
    "transientCooldown": "Ohimenevä jäähtyminen",
    "rateLimitCooldown": "Rate Limit Cooldown",
    "maxBackoffLevel": "Maksimitaso",
    "cbThreshold": "CB-kynnys",
    "cbResetTime": "CB-nollausaika",
    "rateLimiting": "Rate Limiting",
    "rateLimitingDesc": "API-avainten tarjoajat ovat automaattisesti nopeudeltaan rajoitettuja turvallisilla oletusasetuksilla. Rajat opitaan vastausotsikoista ja mukautuvat ajan myötä.",
    "defaultSafetyNet": "Oletusturvaverkko",
    "rpm": "RPM",
    "minGap": "Min Gap",
    "maxConcurrent": "Max Samanaikainen",
    "activeLimiters": "Aktiiviset rajoittimet",
    "noActiveLimiters": "Ei vielä aktiivisia nopeudenrajoittimia.",
    "reservoir": "Säiliö",
    "running": "Juoksemassa",
    "queued": "Jonossa",
    "circuitBreakers": "Katkaisijat",
    "breakerStateClosed": "Suljettu",
    "breakerStateOpen": "Avaa",
    "breakerStateHalfOpen": "Puoliavoin",
    "tripped": "{count} lauennut",
    "healthy": "{count} terve",
    "resetAll": "Nollaa kaikki",
    "noCircuitBreakers": "Katkaisijat eivät ole vielä aktiivisia. Ne luodaan automaattisesti, kun pyynnöt kulkevat yhdistelmäputkilinjan läpi.",
    "failures": "{count} virhe(ä)",
    "policiesLocked": "Käytännöt ja lukitut tunnisteet",
    "allOperational": "Kaikki järjestelmät toimivat – ei lukituksia tai lauenneita katkaisijoita",
    "loadingPolicies": "Ladataan käytäntöjä...",
    "lockedIdentifiers": "Lukitut tunnisteet",
    "unlockedIdentifier": "Avattu: {identifier}",
    "sinceDate": "alkaen {date}",
    "forceUnlock": "Pakota lukitus",
    "unlocking": "Avataan...",
    "failedUnlock": "Lukituksen avaaminen epäonnistui",
    "failedLoadWithStatus": "Lataus epäonnistui: {status}",
    "failedLoadResilience": "Resilienssitilan lataaminen epäonnistui",
    "saveFailed": "Tallennus epäonnistui",
    "resetFailed": "Nollaus epäonnistui",
    "loadingResilience": "Ladataan joustavuuden tilaa...",
    "retry": "Yritä uudelleen",
    "systemStorage": "Järjestelmä ja tallennustila",
    "allDataLocal": "Kaikki tiedot on tallennettu paikallisesti koneellesi",
    "databasePath": "Tietokannan polku",
    "exportDatabase": "Vie tietokanta",
    "exportAll": "Vie kaikki (.tar.gz)",
    "importDatabase": "Tuo tietokanta",
    "confirmDbImport": "Vahvista tietokannan tuonti",
    "confirmDbImportDesc": "Tämä korvaa kaikki nykyiset tiedot kohteen {file} sisällöllä. Varmuuskopio luodaan automaattisesti ennen tuontia.",
    "yesImport": "Kyllä, tuonti",
    "lastBackup": "Viimeinen varmuuskopio",
    "noBackupYet": "Ei vielä varmuuskopiota",
    "backupNow": "Varmuuskopioi nyt",
    "backupRestore": "Varmuuskopiointi ja palautus",
    "viewBackups": "Näytä varmuuskopiot",
    "hide": "Piilota",
    "backupRetentionDesc": "Tietokannan tilannevedokset luodaan automaattisesti ennen palautusta ja 15 minuutin välein tietojen muuttuessa. Säilytys: 24 tunnin välein + 30 päivittäistä varmuuskopiota älykkäällä kierrolla.",
    "loadingBackups": "Ladataan varmuuskopioita...",
    "noBackupsYet": "Varmuuskopioita ei ole vielä saatavilla. Varmuuskopiot luodaan automaattisesti, kun tiedot muuttuvat.",
    "backupsAvailable": "{count} varmuuskopio(t) saatavilla",
    "refresh": "Päivitä",
    "confirm": "Vahvista?",
    "yes": "Kyllä",
    "no": "Ei",
    "restore": "Palauta",
    "invalidFileType": "Virheellinen tiedostotyyppi. Vain .sqlite-tiedostot hyväksytään.",
    "exportFailed": "Vienti epäonnistui",
    "exportFailedWithError": "Vienti epäonnistui: {error}",
    "fullExportFailedWithError": "Täysi vienti epäonnistui: {error}",
    "backupCreated": "Varmuuskopio luotu: {file}",
    "restoreSuccess": "Palautettu! {connections} yhteydet, {nodes} solmut, {combos} yhdistelmät, {apiKeys} API-avaimet.",
    "importSuccess": "Tietokanta tuotu! {connections} yhteydet, {nodes} solmut, {combos} yhdistelmät, {apiKeys} API-avaimet.",
    "minutesAgo": "{count}min sitten",
    "hoursAgo": "{count}h sitten",
    "daysAgo": "{count}pv sitten",
    "backupReasonManual": "manuaalinen",
    "backupReasonPreRestore": "esipalautus",
    "connectionsCount": "{count, plural, one {# connection} other {# connections}}",
    "noChangesSinceBackup": "Ei muutoksia edellisen varmuuskopioinnin jälkeen",
    "backupFailed": "Varmuuskopiointi epäonnistui",
    "restoreFailed": "Palautus epäonnistui",
    "importFailed": "Tuonti epäonnistui",
    "errorDuringRestore": "Palautuksen aikana tapahtui virhe",
    "errorDuringImport": "Tuonnin aikana tapahtui virhe",
    "modelPricing": "Mallin hinnoittelu",
    "modelPricingDesc": "Määritä mallikohtaiset hintahinnat • Kaikki hinnat $/1M tunnuksissa",
    "registry": "Rekisteri",
    "priced": "hinnoiteltu",
    "searchProvidersModels": "Hae palveluntarjoajia tai malleja...",
    "showAll": "Näytä kaikki",
    "noProvidersMatch": "Yksikään palveluntarjoaja ei vastaa hakuasi.",
    "howPricingWorks": "Kuinka hinnoittelu toimii",
    "cacheWrite": "Välimuistin kirjoitus",
    "unsaved": "tallentamaton",
    "resetDefaults": "Palauta oletukset",
    "saveProvider": "Tallenna palveluntarjoaja",
    "model": "Malli",
    "models": "mallit",
    "moreProviders": "{count} lisää palveluntarjoajia",
    "withPricing": "hinnoittelu määritettynä",
    "policiesCircuitBreakers": "Käytännöt ja katkaisijat",
    "activeIssuesDetected": "Aktiivisia ongelmia havaittu",
    "off": "Pois päältä",
    "resetPricingConfirm": "Palautetaanko kaikki kohteen {provider} hinnat oletusasetuksiin?",
    "pricingDescInput": "Syöte: mallille lähetetyt tunnukset",
    "pricingDescOutput": "Tulos: luotuja merkkejä",
    "pricingDescCached": "Välimuistissa: uudelleen käytetty syöttö (~50 % syöttönopeudesta)",
    "pricingDescReasoning": "Päättely: ajattelumerkit (palautuu ulostuloon)",
    "pricingDescCacheWrite": "Välimuistin kirjoitus: välimuistin merkintöjen luominen (palautuu syötteeseen)",
    "pricingDescFormula": "Kustannukset = (syöttö × syöttönopeus) + (tuotos × lähtönopeus) + (välimuisti × välimuistin_nopeus) miljoonaa merkkiä kohden.",
    "pricingSettingsTitle": "Hinnoitteluasetukset",
    "totalModels": "Mallit yhteensä",
    "active": "Aktiivinen",
    "costCalculation": "Kustannuslaskenta",
    "costCalculationDesc": "Kustannukset lasketaan kullekin mallille määritettyjen tunnuksen käytön ja hinnoittelun perusteella.",
    "pricingFormat": "Hinnoittelumuoto",
    "pricingFormatDesc": "Kaikki hinnat ovat $/1M tokeneita (dollaria per miljoonaa rahaketta).",
    "tokenTypes": "Token-tyypit",
    "inputTokenDesc": "Vakiokehotetunnukset",
    "outputTokenDesc": "Täydennys-/vastaustunnukset",
    "cachedTokenDesc": "Välimuistissa olevat syöttötunnukset (yleensä 50 % syöttönopeudesta)",
    "reasoningTokenDesc": "Erityiset päättely-/ajattelutunnisteet (varaustulosta)",
    "cacheCreationTokenDesc": "Välimuistimerkintöjen luomiseen käytetyt tunnukset (varausarvo syöttönopeuteen)",
    "customPricingNote": "Voit ohittaa tiettyjen mallien oletushinnoittelun. Mukautetut ohitukset ovat etusijalla automaattisesti tunnistettuihin hinnoitteluun nähden.",
    "editPricing": "Muokkaa hinnoittelua",
    "viewFullDetails": "Näytä täydelliset tiedot",
    "themeCoral": "Koralli",
    "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": "Pricing Source Lite Llm",
    "clearSyncedPricingConfirm": "Clear Synced Pricing Confirm",
    "clearSyncedPricingFailed": "Clear Synced Pricing Failed",
    "pricingSourceUser": "Pricing Source User",
    "pageDescription": "Page Description",
    "pricingSyncStatus": "Pricing Sync Status",
    "whitelist": "Whitelist",
    "syncDisabled": "Sync Disabled",
    "pricingLoadFailed": "Pricing Load Failed",
    "pricingSyncDescription": "Pricing Sync Description",
    "clearSyncedPricingSuccess": "Clear Synced Pricing Success",
    "clearSyncedPricingFailedWithReason": "Hinnoittelun tyhjennys epäonnistui: {reason}",
    "pricingSourceDefault": "Pricing Source Default",
    "pricingSyncSuccess": "Pricing Sync Success",
    "enableSyncError": "Enable Sync Error",
    "syncEnabled": "Sync Enabled",
    "blacklist": "Blacklist",
    "pricingSourceModelsDev": "Pricing Source Models Dev",
    "syncedModels": "Synced Models",
    "budget": "Budget",
    "pricingSyncTitle": "Pricing Sync Title",
    "pricingResetFailedWithReason": "Hinnoittelun nollaaminen epäonnistui: {reason}",
    "tab": "Tab",
    "pricingSavedProvider": "Hinnoittelu tallennettu palvelulle {provider}",
    "pricingSyncFailed": "Pricing Sync Failed",
    "pricingSaveFailedWithReason": "Hinnoittelun tallentaminen epäonnistui: {reason}",
    "pricingResetProvider": "Hinnoittelu nollattu palvelulle {provider}",
    "nextSync": "Next Sync",
    "pricingSyncFailedWithReason": "Hinnoittelun synkronointi epäonnistui: {reason}",
    "clearSyncedPricing": "Clear Synced Pricing",
    "compressionTitle": "Prompt Compression",
    "compressionDesc": "Reduce token usage by compressing prompts before sending to providers",
    "compressionMode": "Compression Mode",
    "compressionModeOff": "Off",
    "compressionModeOffDesc": "No compression applied",
    "compressionModeLite": "Lite",
    "compressionModeLiteDesc": "Whitespace and blank line reduction",
    "compressionModeStandard": "Standard (Caveman)",
    "compressionModeStandardDesc": "Rule-based compression with 30+ patterns, preserves code blocks and URLs",
    "compressionModeAggressive": "Aggressive",
    "compressionModeAggressiveDesc": "Summarization + tool result compression + progressive aging for maximum savings",
    "compressionModeUltra": "Ultra",
    "compressionModeUltraDesc": "Maximum compression with all techniques including semantic deduplication",
    "compressionAggressiveConfig": "Aggressiivinen moottorin kokoonpano",
    "compressionAggressiveConfigDesc": "Hienosäätää yhteenvetoa, työkalun pakkausta ja ikääntymisen kynnysarvoja",
    "compressionUltraConfig": "Ultra-moottorin kokoonpano",
    "compressionUltraConfigDesc": "Hienosäädä heuristista karsimista, SLM-varaa ja viestikohtaisia kynnysarvoja",
    "compressionUltraRate": "Pidä korko",
    "compressionUltraMinScore": "Pisteiden vähimmäiskynnys",
    "compressionUltraSlmFallback": "Takaisin aggressiiviseen",
    "compressionUltraModelPath": "SLM-mallin polku",
    "compressionSummarizerEnabled": "Ota Summarizer käyttöön",
    "compressionMaxTokensPerMessage": "Max Tokens per viesti",
    "compressionMinSavings": "Minimi säästökynnys",
    "compressionAgingThresholds": "Ikääntymisen kynnykset",
    "compressionAgingThresholdsDesc": "Viimeaikaisten viestien määrä kullakin ikääntymistasolla (korkeampi = enemmän säilynyt)",
    "compressionToolStrategies": "Työkalutulosstrategiat",
    "compressionToolStrategiesDesc": "Vaihda pakkausstrategiat eri työkalutulostyypeille",
    "compressionGeneral": "General Settings",
    "compressionAutoTrigger": "Auto-Trigger Threshold",
    "compressionCacheTTL": "Cache TTL",
    "compressionPreserveSystem": "Preserve System Prompt",
    "compressionCavemanConfig": "Caveman Engine Configuration",
    "compressionCavemanConfigDesc": "Fine-tune the rule-based compression engine",
    "compressionRoles": "Compress Message Roles",
    "compressionRoleUser": "User",
    "compressionRoleAssistant": "Assistant",
    "compressionRoleSystem": "System",
    "compressionMinLength": "Minimum Message Length",
    "compressionSkipRules": "Skip Compression Rules",
    "compressionSkipRulesDesc": "Click rules to skip them during compression",
    "compressionPreservePatterns": "Preserve Patterns",
    "compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)",
    "compressionLogTitle": "Compression Log",
    "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.",
    "minutes": "minuuttia",
    "compressionModeRtk": "RTK",
    "compressionModeRtkDesc": "Command-aware tool output filtering",
    "compressionModeStacked": "Stacked",
    "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression",
    "qdrantTitle": "Qdrant (Vector memory)",
    "qdrantDesc": "Optional. Indexes semantic memories in an external vector database for faster retrieval.",
    "qdrantStatusActive": "Active",
    "qdrantStatusError": "Error",
    "qdrantStatusDisabled": "Disabled",
    "qdrantEnable": "Enable Qdrant",
    "qdrantEnableDesc": "When enabled, semantic/hybrid strategy can use Qdrant to retrieve memories.",
    "qdrantTesting": "Testing...",
    "qdrantTestConnection": "Test connection",
    "qdrantSaved": "Configuration saved",
    "qdrantSaveError": "Failed to save configuration",
    "qdrantHostHint": "Without port. Example: 127.0.0.1 or http://qdrant",
    "qdrantPort": "Port",
    "qdrantPortHint": "Qdrant default: 6333",
    "qdrantCollectionHint": "Where memory points will be stored.",
    "qdrantEmbeddingModel": "Embedding model",
    "qdrantHelpTitle": "Quick setup help",
    "qdrantHelpQuickTitle": "Quick setup (Qdrant + OpenRouter)",
    "qdrantHelpStep1": "1. Host: Qdrant IP/URL, Port: 6333, Collection: omniroute_memory.",
    "qdrantHelpStep2": "2. If using nvidia/llama-nemotron-embed-vl-1b-v2:free, use collection dimension 2048.",
    "qdrantHelpStep3": "3. Model field: openrouter/nvidia/llama-nemotron-embed-vl-1b-v2:free.",
    "qdrantHelpStep4": "4. Save, test connection, then test search.",
    "qdrantEmbeddingQuickSelect": "Quick select from discovered models...",
    "qdrantEmbeddingInputPlaceholder": "openai/text-embedding-3-small",
    "qdrantEmbeddingHint": "Format: provider/model. The provider credential must be configured.",
    "qdrantApiKeyPlaceholderKeep": "(leave empty to keep current key)",
    "qdrantApiKeyPlaceholderOptional": "(leave empty if not used)",
    "qdrantSaveHint": "Tip: edit host/port/collection/model and click Save. API key is optional.",
    "qdrantSearchTestTitle": "Search test",
    "qdrantSearchTestDesc": "Generates embedding and searches in Qdrant.",
    "qdrantSearchPlaceholder": "Example: user preferences, history, etc",
    "qdrantNoResults": "No results (or Qdrant is not configured).",
    "qdrantCleanupTitle": "Retention and cleanup",
    "qdrantCleanupDesc": "Removes expired and old points based on",
    "searching": "Searching...",
    "cleaning": "Cleaning...",
    "cleanNow": "Clean now",
    "optional": "Valinnainen",
    "current": "Nykyinen",
    "remove": "Poista",
    "search": "Etsi",
    "oneproxyTitle": "1proxy Ilmainen välityspalvelinmarkkinapaikka",
    "oneproxyTotalProxies": "Välityspalvelimet yhteensä",
    "oneproxyAvgQuality": "Keskimääräinen laatu",
    "resilienceScope": "Laajuus:",
    "resilienceTrigger": "Triggeri:",
    "resilienceEffect": "Vaikutus:",
    "resilienceRequestQueueTitle": "Request Queue & Rate",
    "resilienceAutoEnableApiKeyProviders": "Auto-enable for API-key providers",
    "resilienceRequestsPerMinute": "Requests per minute",
    "resilienceMinTimeBetweenRequests": "Minimum time between requests",
    "resilienceConcurrentRequests": "Concurrent requests",
    "resilienceMaxQueueWaitTime": "Suurin jonon odotusaika",
    "resilienceBaseCooldown": "Base cooldown",
    "resilienceUseUpstreamRetryHints": "Use upstream retry hints",
    "resilienceDefaultPerProvider": "Default (per provider)",
    "resilienceAlwaysOn": "Always on",
    "resilienceAlwaysOff": "Always off",
    "routingRemoveEntry": "Poista merkintä",
    "routingNeedlesSubstrings": "Neulat (sovittavat osajonot)",
    "routingCaseSensitive": "Kirjainkoolla on merkitystä",
    "routingPrefixes": "Etuliitteet",
    "routingMatch": "Ottelu",
    "routingReplacement": "Vaihto",
    "routingReplaceAllOccurrences": "Korvaa kaikki esiintymät",
    "routingPatternRegex": "Malli (säännöllinen lauseke)",
    "routingFlags": "Liput",
    "routingNeedles": "Neuloja",
    "routingBlockText": "Estä teksti",
    "routingIdempotencyKey": "Idempotenssiavain",
    "routingEntrypoint": "Pääsypiste",
    "routingVersionFormat": "Version muoto",
    "routingCchAlgorithm": "CCH-algoritmi",
    "routingWordsToObfuscate": "Hämärtävät sanat (ZWJ lisätty ensimmäisen merkin jälkeen)",
    "logsSettingsTitle": "Lokien asetukset",
    "detailedLogsLabel": "Yksityiskohtaiset lokit käytössä",
    "detailedLogsDesc": "Ota käyttöön yksityiskohtainen pyyntö/vastausloki",
    "callLogPipelineLabel": "Puhelulokiputkisto",
    "callLogPipelineDesc": "Ota käyttöön puhelulokin käsittelyputki",
    "maxDetailSizeLabel": "Yksityiskohtien enimmäiskoko (kt)",
    "maxDetailSizeDesc": "Yksityiskohtaisten lokimerkintöjen enimmäiskoko",
    "ringBufferSizeLabel": "Renkaan puskurin koko",
    "ringBufferSizeDesc": "Tukkien rengaspuskurin koko",
    "semanticCacheEnabledLabel": "Semanttinen välimuisti käytössä",
    "semanticCacheMaxSizeLabel": "Semanttisen välimuistin enimmäiskoko",
    "semanticCacheMaxSizeDesc": "Semanttisen välimuistin merkintöjen enimmäismäärä",
    "semanticCacheTTLLabel": "Semanttinen välimuisti TTL",
    "promptCacheEnabledLabel": "Kehotusvälimuisti käytössä",
    "promptCacheEnabledDesc": "Ota välimuisti käyttöön",
    "promptCacheStrategyLabel": "Nopea välimuististrategia",
    "promptCacheStrategyDesc": "Strategia nopeaan välimuistiin tallentamiseen",
    "alwaysPreserveClientCacheLabel": "Säilytä aina asiakkaan välimuisti",
    "alwaysPreserveClientCacheDesc": "Asiakkaan välimuistin säilytyskäytäntö",
    "logRetentionPolicyTitle": "Lokin säilytyskäytäntö",
    "resilienceUseUpstream429HintsForBreaker": "Käytä ylävirran 429 vihjettä (katkaisija)",
    "appearanceLogoPreviewAlt": "Logon esikatselu",
    "appearanceFaviconPreviewAlt": "Favicon esikatselu",
    "oneproxyLastSync": "Viimeinen synkronointi",
    "oneproxyAllProtocols": "Kaikki pöytäkirjat",
    "oneproxyCountryCodePlaceholder": "Maakoodi (esim. USA)",
    "oneproxyMinQualityPlaceholder": "Minimi laatu",
    "oneproxyLoadingProxies": "Ladataan välityspalvelimia...",
    "oneproxyLastSyncLabel": "Viimeisin synkronointi:",
    "oneproxyProxiesFetched": "Välityspalvelimet haettu:",
    "oneproxyConsecutiveFailures": "Peräkkäiset epäonnistumiset:",
    "oneproxyErrorLabel": "Virhe:",
    "oneproxyNever": "Ei koskaan",
    "oneproxySyncStatusTitle": "Synkronoinnin tila",
    "oneproxySuccess": "Menestystä",
    "oneproxyFailed": "Epäonnistui",
    "routingAntigravitySignatureTitle": "Antigravity Signature Cache Mode",
    "routingAntigravitySignatureDesc": "__MISSING__:Control whether OmniRoute reuses only stored Gemini thought signatures or accepts validated client-provided signatures in Antigravity-compatible tool-call flows.",
    "routingAntigravitySignatureEnabledLabel": "__MISSING__:Enabled",
    "routingAntigravitySignatureEnabledDesc": "__MISSING__:Current behavior. Ignore client-provided signatures and keep using the stored OmniRoute flow.",
    "routingAntigravitySignatureBypassLabel": "__MISSING__:Bypass",
    "routingAntigravitySignatureBypassDesc": "__MISSING__:Accept client-provided signatures after lightweight validation and fall back to the stored signature when invalid.",
    "routingAntigravitySignatureBypassStrictLabel": "__MISSING__:Bypass Strict",
    "routingAntigravitySignatureBypassStrictDesc": "__MISSING__:Require full protobuf validation before accepting a client-provided signature.",
    "routingHeaderFingerprintTitle": "Otsikon sormenjälki (per palveluntarjoaja)",
    "routingServerRejectedSave": "⚠ Palvelimen tallennus hylätty:",
    "routingAddTransformOp": "Lisää muunnos op",
    "routingClientCacheControlTitle": "Asiakkaan välimuistin hallinta",
    "routingClientCacheControlDesc": "__MISSING__:Configure whether OmniRoute preserves client-provided cache_control markers",
    "routingClientCacheControlAutoDesc": "__MISSING__:For deterministic Claude-compatible flows, preserve client-provided cache_control as-is. If the request has no cache_control, OmniRoute does not inject any bridge-owned markers for CC-compatible third-party proxy compatibility.",
    "routingClientCacheControlAlwaysLabel": "__MISSING__:Always Preserve",
    "routingClientCacheControlAlwaysDesc": "__MISSING__:Always forward client-provided cache_control headers to upstream providers as-is.",
    "routingClientCacheControlNeverLabel": "__MISSING__:Never Preserve",
    "routingClientCacheControlNeverDesc": "__MISSING__:Always remove client cache_control headers and let OmniRoute manage caching where native provider flows support it.",
    "routingZeroConfigTitle": "Zero-Config Auto-Routing",
    "routingZeroConfigDesc": "__MISSING__:Enable automatic provider selection using the auto/ prefix. When enabled, requests to auto, auto/coding, auto/fast, etc. will dynamically route across all connected providers.",
    "routingDefaultAutoVariant": "Automaattinen oletusversio",
    "visionBridge": "Vision silta",
    "visionBridgeDesc": "__MISSING__:Run an automatic vision-to-text fallback before routing image requests to text-only models.",
    "visionBridgeEnabledLabel": "__MISSING__:Enabled",
    "visionBridgeEnabledDesc": "__MISSING__:Toggle the pre-call bridge that replaces image parts with extracted text.",
    "visionBridgeModel": "Sillan malli",
    "visionBridgeModelPlaceholder": "openai/gpt-4o-mini",
    "visionBridgeModelHint": "__MISSING__:Any OmniRoute model ID that supports vision can be used here.",
    "visionBridgePrompt": "Bridge-kehote",
    "visionBridgePromptPlaceholder": "Kuvaile tätä kuvaa ytimekkäästi.",
    "visionBridgePromptHint": "__MISSING__:Sent to the vision model before the extracted description is injected back into the original request.",
    "visionBridgeTimeoutMs": "Aikakatkaisu (ms)",
    "visionBridgeMaxImagesPerRequest": "Kuvia enintään pyynnöstä",
    "resilienceMaxBackoffSteps": "Max backoff steps",
    "resilienceProviderBreakerTitle": "Circuit Breaker per Provider",
    "resilienceFailureThreshold": "Failure threshold",
    "resilienceResetTimeout": "Nollaa aikakatkaisu",
    "resilienceFailureThresholdLabel": "Epäonnistumisen kynnys",
    "resilienceResetTimeoutLabel": "Nollaa aikakatkaisu",
    "resilienceConnectionCooldownTitle": "Connection Cooldown",
    "resilienceUseUpstreamRetryHintsLabel": "Käytä ylävirran uudelleenyritysvinkkejä",
    "resilienceUseUpstream429BreakerLabel": "Käytä ylävirran 429 vihjettä (katkaisija)",
    "resilienceMaxBackoffStepsLabel": "Max perääntymisaskel",
    "resilienceYes": "Kyllä",
    "resilienceNo": "Ei",
    "resilienceDefault": "Default",
    "storageDatabaseBackupRetention": "Tietokannan varmuuskopion säilyttäminen",
    "storagePurgeData": "Tyhjennä tiedot",
    "retentionQuotaSnapshots": "Kiintiön tilannekuvat (päiviä)",
    "retentionMcpAudit": "MCP-tarkastus (päiviä)",
    "retentionA2aEvents": "A2A-tapahtumat (päiviä)",
    "retentionCallLogs": "Puhelulokit (päiviä)",
    "retentionUsageHistory": "Käyttöhistoria (päiviä)",
    "retentionMemoryEntries": "Muistimerkinnät (päiviä)",
    "storageAutoVacuumMode": "Automaattinen tyhjiötila",
    "storageScheduledVacuum": "Suunniteltu tyhjiö",
    "storageVacuumHour": "Tyhjiötunti (0-23)",
    "storagePageSize": "Sivun koko (tavua)",
    "storageDatabaseSize": "Tietokannan koko",
    "storagePageCount": "Sivumäärä",
    "storageFreelistCount": "Freelist Count",
    "storageLastVacuum": "Viimeinen tyhjiö",
    "storageLastOptimization": "Viimeinen optimointi",
    "storageIntegrityCheck": "Eheyden tarkistus",
    "storageIntegrityOk": "✓ OK",
    "storageIntegrityError": "✗ Virhe",
    "storageUsageTokenBuffer": "Käyttötunnuspuskuri",
    "compressionSettingsAutoTriggerMode": "Automaattinen laukaisutila",
    "compressionSettingsMcpDescriptionCompression": "MCP-kuvauksen pakkaus",
    "compressionSettingsCavemanIntensity": "Luolamiesten intensiteetti",
    "compressionSettingsCavemanOutputMode": "Caveman-lähtötila",
    "compressionSettingsOutputIntensity": "Tulostuksen intensiteetti",
    "compressionSettingsAutoClarityBypass": "Automaattinen selkeyden ohitus",
    "resilienceWaitForCooldown": "Odota jäähdytystä",
    "resilienceEnableServerSideWait": "Ota palvelinpuolen odotus käyttöön",
    "resilienceMaximumRetries": "Uudelleenyritysten enimmäismäärä",
    "resilienceMaximumWaitPerRetry": "Maksimi odotusaika uudelleenyritystä kohden",
    "memorySkillsSkillsmpMarketplace": "SkillsMP Marketplace",
    "memorySkillsFailedToSave": "Tallentaminen epäonnistui",
    "memorySkillsApiKey": "API-avain",
    "memorySkillsActiveSkillsProvider": "Aktiivisten taitojen tarjoaja",
    "cliproxyapiFallback": "CLIProxyAPI-varaus",
    "cliproxyapiEnableFallback": "Ota CLIProxyAPI-varaus käyttöön",
    "cliproxyapiUrl": "CLIProxyAPI URL",
    "cliproxyapiStatus": "CLIProxyAPI-tila",
    "cliproxyapiNotDetected": "Ei havaittu",
    "payloadRulesTitle": "Hyötykuormasäännöt",
    "payloadRulesDesc": "__MISSING__:Configure request payload mutations by model and protocol. Changes are persisted in settings and hot reloaded into the runtime immediately after save.",
    "payloadRuleDefaultTitle": "__MISSING__:default",
    "payloadRuleDefaultDesc": "__MISSING__:Applies params only when the target path is missing from the outgoing payload.",
    "payloadRuleOverrideTitle": "__MISSING__:override",
    "payloadRuleOverrideDesc": "__MISSING__:Forces values onto the payload, replacing anything already present at that path.",
    "payloadRuleFilterTitle": "__MISSING__:filter",
    "payloadRuleFilterDesc": "__MISSING__:Removes blocked params from the payload before the upstream request is sent.",
    "payloadRuleDefaultRawTitle": "__MISSING__:defaultRaw",
    "payloadRuleDefaultRawDesc": "__MISSING__:Like default, but string values are parsed as JSON first when possible. The legacy input alias default-raw is also accepted on save.",
    "payloadEditorTitle": "__MISSING__:Editor",
    "payloadEditorDesc": "__MISSING__:Use the runtime schema shape: default, override, filter, defaultRaw. The API also accepts the legacy input key default-raw.",
    "payloadEditorReady": "__MISSING__:Ready",
    "payloadResetInfo": "__MISSING__:Editor reset to the neutral template. Save to apply it.",
    "payloadSaveSuccess": "__MISSING__:Payload rules saved and hot reloaded.",
    "payloadJsonParseError": "__MISSING__:JSON parse error: {error}",
    "payloadMustBeObject": "__MISSING__:Payload rules must be a JSON object.",
    "payloadInvalidJson": "__MISSING__:Invalid JSON payload.",
    "payloadValidJsonRequired": "__MISSING__:Payload rules must be valid JSON before saving.",
    "savePayloadRules": "__MISSING__:Save Payload Rules",
    "requestLimitsTitle": "__MISSING__:Request Limits",
    "requestLimitsDesc": "__MISSING__:Configure global request limits and concurrency guards.",
    "maxRequestSizeLabel": "__MISSING__:Max Request Size (MB)",
    "maxRequestSizeDesc": "__MISSING__:Maximum allowed size for incoming API requests.",
    "maxResponseSizeLabel": "__MISSING__:Max Response Size (MB)",
    "maxResponseSizeDesc": "__MISSING__:Maximum allowed size for outgoing API responses.",
    "maxRequestTokensLabel": "__MISSING__:Max Request Tokens",
    "maxRequestTokensDesc": "__MISSING__:Maximum total tokens allowed in a single request.",
    "maxResponseTokensLabel": "__MISSING__:Max Response Tokens",
    "maxResponseTokensDesc": "__MISSING__:Maximum total tokens allowed in a single response.",
    "modelCooldownsTitle": "Mallit jäähtymässä",
    "modelCooldownsEmpty": "Yksikään malli ei ole jäähtymässä tällä hetkellä.",
    "codexFastTierTitle": "Codex Fast Tier",
    "codexFastTierDesc": "Globaalisti inject service_tier=prioriteetti OpenAI Codex -pyyntöille.",
    "codexFastTierHint": "Kun OmniRoute on käytössä, se lisää service_tier=priority lähteviin Codex-pyyntöihin yhteyksille, jotka eivät vielä määritä tasoa. Prioriteettitaso vaatii OpenAI Enterprise API -avaimen tai ChatGPT-auth Codex -polun; muut avaintyypit saavat tasoon liittyvän virheen OpenAI:lta. Codex-palveluntarjoajan sivun yhteyskohtaiset asetukset ovat ensisijaisia.",
    "codexFastTierSaveError": "Codex Fast Tier -asetuksen päivittäminen epäonnistui",
    "codexFastTierTierLabel": "__MISSING__:Service tier",
    "codexFastTierTierPriority": "__MISSING__:Priority",
    "codexFastTierTierFlex": "__MISSING__:Flex",
    "codexFastTierTierDefault": "__MISSING__:Default",
    "codexFastTierModelsLabel": "__MISSING__:Fast-tier models",
    "codexFastTierModelsHint": "__MISSING__:Only checked models receive service_tier when Fast Tier is enabled.",
    "codexFastTierModelCheckbox": "__MISSING__:Enable Fast Tier for {model}",
    "claudeFastModeTitle": "Claude Fast Mode",
    "claudeFastModeDesc": "Valitse valitut Claude-pyynnöt antrooppiseen nopeaan tilaan (nopeus: \"nopea\").",
    "claudeFastModeHint": "Anthropic ei virallisesti tue Fast Modea SDK-tyylisille asiakkaille. Kun OmniRoute on käytössä, se välittää X-CPA-Force-Fast-Mode-otsikon, jotta pariksi liitetty CLIProxyAPI-koontiversio voi valita aloituspisteen huijauksen. Vain luetellut Opus-mallit ovat Anthropicin asiakaspuolen tarkastuksen aidattuja. Tilaustaso, enimmäispaketti ja Fast Mode -saldo ovat edelleen pakotettuja palvelinpuolella – Anthropic voi palauttaa out_of_credits, vaikka kytkin on päällä.",
    "claudeFastModeModelsLabel": "Sovelletaan malleihin ({count})",
    "claudeFastModeModelCheckbox": "Ota nopea tila käyttöön kohteelle {model}",
    "claudeFastModeSaveError": "Claude Fast Mode -asetuksen päivittäminen epäonnistui",
    "authz": {
      "title": "__MISSING__:Authz Inventory",
      "description": "__MISSING__:5-tier route classification with live bypass policy. Read shows the full taxonomy; mutations re-prompt for the management password.",
      "loading": "__MISSING__:Loading inventory…",
      "loadError": "__MISSING__:Failed to load authz inventory",
      "tier": {
        "LOCAL_ONLY": "__MISSING__:Local only",
        "ALWAYS_PROTECTED": "__MISSING__:Always protected",
        "MANAGEMENT": "__MISSING__:Management",
        "CLIENT_API": "__MISSING__:Client API",
        "PUBLIC": "__MISSING__:Public"
      },
      "bypass": {
        "section": "__MISSING__:Manage-scope bypass",
        "kill_switch": {
          "label": "__MISSING__:Bypass kill-switch",
          "desc": "__MISSING__:Master toggle. When off, no LOCAL_ONLY prefix is reachable from non-loopback regardless of the per-prefix list."
        },
        "prefix": {
          "label": "__MISSING__:Bypassable prefixes",
          "desc": "__MISSING__:LOCAL_ONLY prefixes that manage-scope API keys (or dashboard sessions) may reach from non-loopback hosts.",
          "add": "__MISSING__:Add prefix",
          "placeholder": "__MISSING__:/api/mcp/v2/",
          "empty": "__MISSING__:No prefixes configured. Bypass effectively off."
        },
        "cli_tools_runtime_note": "__MISSING__:Spawn-capable prefix. Compile-time deny; cannot be made bypassable. Shown read-only."
      },
      "password": {
        "prompt": {
          "label": "__MISSING__:Current password",
          "desc": "__MISSING__:Re-confirm to apply security-impacting changes."
        },
        "placeholder": "__MISSING__:Current management password",
        "cancel": "__MISSING__:Cancel",
        "submit": "__MISSING__:Apply"
      },
      "save": "__MISSING__:Save changes",
      "saved": "__MISSING__:Authz settings updated",
      "pending": "__MISSING__:Unsaved changes",
      "badge": {
        "bypassable": "__MISSING__:Bypassable via manage scope",
        "strict": "__MISSING__:Strict loopback",
        "auth_required": "__MISSING__:Auth required",
        "public": "__MISSING__:Public",
        "always_protected": "__MISSING__:Always protected",
        "spawn_capable": "__MISSING__:Spawn-capable"
      },
      "error": {
        "PASSWORD_REQUIRED": "__MISSING__:Current password required to apply these changes.",
        "PASSWORD_MISMATCH": "__MISSING__:Current password is incorrect.",
        "INSUFFICIENT_SCOPE": "__MISSING__:API key lacks the manage scope.",
        "BYPASS_PREFIX_NOT_ALLOWED": "__MISSING__:One or more prefixes target spawn-capable routes and cannot be bypassed.",
        "GENERIC": "__MISSING__:Failed to update authz settings."
      }
    },
    "resilienceBaseCooldownLabel": "Perusjäähdytys",
    "scopeLabel": "Laajuus",
    "triggerLabel": "Liipaisin",
    "effectLabel": "Vaikutus",
    "statusEnabled": "Käytössä",
    "statusDisabled": "Ei käytössä",
    "resilienceRequestQueueScope": "Pyyntöjen mukaan",
    "resilienceRequestQueueTrigger": "Ennen lähettämistä ylävirtaan",
    "resilienceRequestQueueEffect": "Jonottelee pyyntöjä, rajoittaa samanaikaisuutta ja välilyöntejä puheluille",
    "resilienceRequestQueueDesc": "Tämä taso ohjaa vain jonotusta ja tahdistusta. Se ei tallenna jäähtymiä tai avoimia katkaisijoita.",
    "resilienceAutoEnableApiKeyProvidersDesc": "Ottaa oletuksena käyttöön jonosuojauksen aktiivisille API-avainyhteyksille.",
    "resilienceMaxQueueWait": "Suurin jonon odotusaika",
    "resilienceConnectionCooldownScope": "Yksilöllinen yhteys",
    "resilienceConnectionCooldownTrigger": "Kun yhteys palauttaa ohimenevän ylävirran häiriön",
    "resilienceConnectionCooldownEffect": "Ohittaa väliaikaisesti kyseisen yhteyden ja lisää takaisinkytkentää toistuvien vikojen varalta",
    "resilienceConnectionCooldownDesc": "Perusjäähdytys kattaa ohimenevät yhteyshäiriöt. Kun ylävirran uudelleenyritysvihjeet ovat käytössä, palveluntarjoajan nimenomainen ikkuna ohittaa paikallisen jäähtymisen.",
    "resilienceUseUpstreamRetryHintsDesc": "Käyttää uudelleen yrittämisen jälkeen/nollausarvoja ylävirran toimittajalta, kun ne ovat saatavilla.",
    "resilienceUseUpstream429BreakerHints": "Käytä ylävirran 429 vihjeitä katkaisijan jäähdyttämiseen",
    "resilienceUseUpstream429BreakerHintsShort": "Käytä ylävirran 429 vihjeitä",
    "resilienceUseUpstream429BreakerHintsDesc": "Käytä Retry-After / kiintiön loppuun käytettyjä signaaleja 429 vastauksesta katkaisijan jäähtymisen kestoon. Oletus käyttää palveluntarjoajakohtaista käytäntöä: suorat pilvipalveluntarjoajat ovat oletuksena käytössä; käänteisen välityspalvelimen, itseisännöidyt ja CLI-tuetut palveluntarjoajat ovat oletuksena pois päältä. Riippumaton \"Käytä ylävirran uudelleenyritysvihjeitä\".",
    "resilienceProviderBreakerScope": "Koko palveluntarjoaja",
    "resilienceProviderBreakerTrigger": "Lopulliset siirto-/palvelinvirheet sen jälkeen, kun yhteyden varatoimitus on käytetty loppuun",
    "resilienceProviderBreakerEffect": "Estää tilapäisesti kyseisen palveluntarjoajan, kunnes nollausaika umpeutuu",
    "resilienceProviderBreakerDesc": "Live-katkaisijan tila näkyy vain Terveys-sivulla. Yhteyden kattavat 429 nopeusrajoitukset pysyvät Connection Cooldown -tilassa eivätkä laukea palveluntarjoajan katkaisijaa.",
    "resilienceResetTime": "Nollaa aika",
    "resilienceWaitForCooldownTitle": "Odota jäähtymistä",
    "resilienceWaitForCooldownScope": "Nykyinen asiakaspyyntö",
    "resilienceWaitForCooldownTrigger": "Kun kaikki ehdokasyhteydet ovat jo jäähtyneet",
    "resilienceWaitForCooldownEffect": "Odottaa palvelimella ja yrittää uudelleen, kun ensimmäinen jäähdytysaika päättyy",
    "resilienceWaitForCooldownDesc": "Tämä vaikuttaa vain nykyiseen pyyntöön. Se ei tallenna yhteyttä tai palveluntarjoajan tilaa.",
    "resilienceEnableServerWait": "Ota palvelinpuolen odotus käyttöön",
    "resilienceEnableServerWaitDesc": "Kun OmniRoute on käytössä, se odottaa ensimmäisen jäähtymisjakson päättymistä ja yrittää automaattisesti uudelleen.",
    "resilienceMaxAttempts": "Yritysten enimmäismäärä",
    "resilienceMaxWaitPerAttempt": "Enimmäisodotus yritystä kohden",
    "forcedFingerprintTitle": "Always enabled for {provider} — required for OAuth account safety; cannot be turned off.",
    "forcedFingerprintBadge": "Required",
    "codexSessionAffinityTitle": "Codex-istunnon affiniteetti",
    "codexSessionAffinityDesc": "Pitää yhden Codex-keskustelun samalla tilillä näin monta sekuntia. 0 poistaa sen käytöstä.",
    "codexSessionAffinityTtl": "Affinity TTL (sekuntia)",
    "resetAwareQuotaCacheTitle": "Nollaa kiintiövälimuisti",
    "resetAwareQuotaCacheDesc": "Tallentaa välimuistiin kiintiön telemetrian vain nollaustietoisia tilauksia varten. Kiintiön esitarkastus suojaa edelleen pyyntöjä. 0/0 jatkaa suoraa hakua.",
    "resetAwareQuotaCacheTtl": "Tuore TTL (sekuntia)",
    "resetAwareQuotaCacheMaxStale": "Enintään vanhentunut (sekuntia)",
    "qdrantCleanupSuccess": "OK: poistettu {count} pistettä (säilytys: {days} päivää)",
    "qdrantCleanupFailed": "Puhdistus epäonnistui",
    "qdrantCleanupError": "Virhe: {error}",
    "vercelRelaySuccess": "__MISSING__:Vercel Relay deployed successfully",
    "vercelRelayButton": "__MISSING__:Deploy Vercel Relay",
    "vercelRelayModalTitle": "__MISSING__:Deploy Vercel Relay",
    "vercelRelayWarning": "__MISSING__:Warning: A Vercel deployment token is required. This token will only be used to create the serverless relay and will never be stored by OmniRoute.",
    "vercelRelayTokenLabel": "__MISSING__:Vercel Access Token",
    "vercelRelayProjectNameLabel": "__MISSING__:Vercel Project Name",
    "vercelRelayFreeTierNote": "__MISSING__:Relays are lightweight proxy endpoints deployed on Vercel's free tier to bypass local network/region limitations.",
    "vercelRelayDeploying": "__MISSING__:Deploying...",
    "vercelRelayDeploy": "__MISSING__:Deploy",
    "homePinProviderQuotaToHome": "Pin Information to Home Page",
    "homeProviderQuotaLimits": "Provider Quota Limits",
    "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.",
    "homeQuickStart": "Quick Start",
    "homeQuickStartDesc": "Show the Quick Start panel on the Home page.",
    "homeProviderTopology": "Provider Topology",
    "homeProviderTopologyDesc": "Show the Provider Topology on the Home page."
  },
  "contextRtk": {
    "title": "RTK Engine",
    "description": "Command-aware compression for tool output, terminal logs and build results.",
    "enabled": "Enabled",
    "intensity": "Intensity",
    "intensityMinimal": "Minimal",
    "intensityStandard": "Standard",
    "intensityAggressive": "Aggressive",
    "toolResults": "Tool results",
    "assistantMessages": "Assistant messages",
    "codeBlocks": "Code blocks",
    "filterCatalog": "Suodatinluettelo",
    "filterCatalogDesc": "Saatavilla olevat lähtösuodattimet luokittain",
    "guidedConfig": "Kokoonpano",
    "guidedConfigDesc": "Säädä, miten RTK suodattaa terminaalin lähtösi",
    "maxLines": "Max lines",
    "maxChars": "Max chars",
    "deduplicateThreshold": "Poista päällekkäinen kynnys",
    "customFilters": "Mukautetut suodattimet",
    "detectedType": "Havaittu tyyppi",
    "confidence": "Luottamus",
    "beforeAfter": "Ennen / jälkeen",
    "trustProjectFilters": "Luota projektisuodattimiin",
    "rawOutputRetention": "Raakatulosteen säilyttäminen",
    "rawOutputNever": "Ei koskaan",
    "rawOutputFailures": "Epäonnistumisia",
    "rawOutputAlways": "Aina",
    "rawOutputMaxBytes": "Raaka ulostulo max tavua",
    "filterTesting": "Filter Testing",
    "pasteOutput": "Paste tool output to test filtering...",
    "presetHigh": "Aggressiivinen",
    "presetLow": "Kevyt",
    "presetMaxChars": "Enimmäismäärä merkkejä",
    "presetMaxLines": "Max lähtölinjat",
    "presetMedium": "Vakio",
    "run": "Run",
    "result": "Result",
    "previewEmpty": "Run a sample to preview RTK output.",
    "detected": "Detected",
    "masterSwitchOffAlert": "__MISSING__:Token Saver master switch is OFF — these settings will not affect requests until you turn it on from the Endpoint page.",
    "tokensFiltered": "Tokens filtered",
    "filtersActive": "Filters active",
    "requests": "Requests",
    "avgSavings": "Avg savings",
    "simpleMode": "Yksinkertainen",
    "advancedMode": "Edistynyt",
    "searchFilters": "Hakusuodattimet...",
    "tooltipDedup": "Kuinka aggressiivisesti toistuvat rivit poistetaan.",
    "tooltipMaxChars": "Merkkien enimmäismäärä tulostuslohkoa kohden.",
    "tooltipMaxLines": "Enimmäismäärä komennon ulostulossa säilytettävät rivit. Ylimäärä katkaistaan."
  },
  "contextCombos": {
    "title": "Compression Combos",
    "description": "Define how engines are combined for different routing scenarios.",
    "createCombo": "Create Compression Combo",
    "editCombo": "Edit",
    "deleteCombo": "Delete",
    "deleteConfirm": "Delete this compression combo?",
    "pipeline": "Pipeline",
    "addStep": "Add Step",
    "removeStep": "Remove",
    "name": "Name",
    "descriptionField": "Description",
    "languagePacks": "Language Packs",
    "outputMode": "Output Mode",
    "assignToRouting": "Assign to Routing Combos",
    "noAssignments": "No routing combos available",
    "default": "Default",
    "setAsDefault": "Set as Default",
    "save": "Save",
    "cancel": "Cancel",
    "enabled": "Enabled"
  },
  "contextCaveman": {
    "title": "Caveman Engine",
    "description": "Rule-based message compression, language packs, analytics and output mode controls.",
    "advancedConfig": "Lisäasetukset",
    "advancedConfigDesc": "Hienosäädä pakkauskäyttäytymistä",
    "aggressiveSettings": "Aggressiiviset asetukset",
    "aggressiveSettingsDesc": "Maksimaalinen pakkaus ja mahdolliset laadun kompromissit",
    "requests": "Requests",
    "tokensSaved": "Tokens saved",
    "savingsPercent": "Savings %",
    "avgLatency": "Avg latency",
    "languagePacks": "Language Packs",
    "languagePacksDesc": "Enable compression rules for specific languages.",
    "labelAutoTrigger": "Pakkaa automaattisesti, kun konteksti ylittää",
    "labelCompressionRate": "Puristusvoima",
    "labelMaxTokens": "Kohdista tunnukset viestiä kohden",
    "labelMinLength": "Viestin vähimmäispituus",
    "labelMinSavings": "Vähimmäismäärä tallennettavia tokeneja",
    "enabled": "Enabled",
    "autoDetect": "Auto-detect language",
    "rulesCount": "{count} rules",
    "inputCompressionTitle": "__MISSING__:Input compression",
    "inputCompressionDesc": "__MISSING__:Rewrite chat history with shorter wording. Reduces input tokens by ~50%.",
    "analyticsTitle": "Compression Analytics",
    "noAnalytics": "No compression analytics yet.",
    "outputMode": "Lähtötila",
    "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
    "outputModeTitle": "Output Mode",
    "quickSettings": "Pika-asetukset",
    "quickSettingsDesc": "Pakkauksen perusasetukset aloittaaksesi",
    "autoClarity": "Auto-Clarity Bypass",
    "bypassConditions": "Bypass conditions",
    "bypassConditionsList": "turvallisuus, peruuttamaton, selvennys, järjestysherkkä",
    "simpleMode": "Yksinkertainen",
    "advancedMode": "Edistynyt",
    "tooltipAutoTrigger": "Pakkaa automaattisesti, kun konteksti ylittää tämän koon.",
    "tooltipCompressionRate": "0,0 = ei mitään, 1,0 = maksimi. 0,5 = tasapainoinen.",
    "tooltipMaxTokens": "Kohdetunnusten määrä pakkaamisen jälkeen. Matala = aggressiivisempi.",
    "tooltipMinLength": "Tätä lyhyempiä viestejä ei pakata. Alempi = enemmän pakkausta.",
    "tooltipMinSavings": "Pakkaa vain, jos se säästää vähintään näin monta merkkiä.",
    "ultraSettings": "Ultra-asetukset",
    "ultraSettingsDesc": "SLM-käyttöinen semanttinen pakkaus",
    "preview": {
      "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
      "full": "Respond terse and compact. Preserve all technical substance.",
      "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
    }
  },
  "translator": {
    "title": "Kääntäjä",
    "metaTitle": "Kääntäjä leikkikenttä | OmniRoute",
    "metaDescription": "Tee virheenkorjaus, testaa ja visualisoi API-muotojen käännökset palveluntarjoajien välillä",
    "playgroundTitle": "Kääntäjä leikkikenttä",
    "playground": "Leikkipaikka",
    "realtime": "Reaaliaikainen käännöstoiminta",
    "chatTester": "Chatin testaaja",
    "testBench": "Testipenkki",
    "liveMonitor": "Live Monitor",
    "modeDescriptionPlayground": "Liitä mikä tahansa API-pyynnön runko ja katso, kuinka OmniRoute kääntää sen toimittajamuotojen välillä (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)",
    "modeDescriptionChatTester": "Lähetä todellisia chat-pyyntöjä OmniRouten kautta ja tarkasta koko meno-paluu: syöttö, käännetty pyyntö, palveluntarjoajan vastaus ja käännetty tulos.",
    "modeDescriptionTestBench": "Suorita ennalta määritettyjä skenaarioita ja vertaile toimittajien ja mallien yhteensopivuutta.",
    "modeDescriptionLiveMonitor": "Katso käännöstapahtumia reaaliajassa, kun pyynnöt kulkevat OmniRouten kautta.",
    "modeDescriptionFallback": "Tee virheenkorjaus, testaa ja visualisoi, kuinka OmniRoute kääntää API-pyynnöt palveluntarjoajien välillä.",
    "recentTranslations": "Viimeaikaiset käännökset",
    "noTranslations": "Ei vielä käännöksiä",
    "source": "lähde",
    "target": "Kohde",
    "time": "Aika",
    "model": "Malli",
    "status": "Tila",
    "latency": "Latenssi",
    "totalTranslations": "Yhteensä käännöksiä",
    "successful": "Onnistunut",
    "errors": "Virheet",
    "avgLatency": "Keskimääräinen viive",
    "millisecondsShort": "{value}ms",
    "notAvailableSymbol": "—",
    "liveAutoRefreshing": "Live - automaattinen päivitys",
    "paused": "Keskeytetty",
    "eventsAppearHint": "Käännöstapahtumat näkyvät täällä, kun pyynnöt kulkevat OmniRouten kautta. Käytä mitä tahansa näistä menetelmistä tapahtumien luomiseen:",
    "chatTesterTab": "Chat Tester -välilehti",
    "testBenchTab": "Testipenkki-välilehti",
    "externalApiCalls": "Ulkoiset API-kutsut",
    "ideCliIntegrations": "IDE/CLI-integraatiot",
    "inMemoryNote": "Huomautus: Tapahtumat tallennetaan muistiin ja nollataan, kun palvelin käynnistyy uudelleen.",
    "ok": "OK",
    "errorShort": "ERR",
    "formatConverter": "Format Converter",
    "formatConverterDescription": "Liitä tai kirjoita JSON-pyynnön leipäteksti. Kääntäjä tunnistaa automaattisesti lähdemuodon ja muuntaa sen kohdemuotoon. Käytä tätä virheenkorjaukseen, kuinka OmniRoute kääntää pyynnöt muotojen välillä (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).",
    "translationPathHubSpoke": "{source} → OpenAI (keskitaso) → {target}",
    "translationPathDirect": "{source} → {target} (suora kääntäjä)",
    "translationPathPassthrough": "Sama muoto – käännöstä ei tarvita",
    "openaiIntermediatePanel": "OpenAI Intermediate",
    "autoFeaturesTitle": "Mitä OmniRoute tekee automaattisesti",
    "autoFeaturesCount": "8 ominaisuutta",
    "featureReasoningCache": "Päättelyvälimuisti",
    "featureReasoningCacheDesc": "Lisää välimuistiin tallennettua päättelysisältöä uudelleen ajattelutapamalleille (DeepSeek V4, Kimi K2, Qwen), kun asiakkaat jättävät sen pois keskusteluhistoriasta.",
    "featureSchemaCoercion": "Schema Coercion",
    "featureSchemaCoercionDesc": "Korjaa rikkinäiset työkalukaaviot: lisää puuttuvia lisäominaisuuksia, puhdistaa pitkät kuvaukset, normalisoi sisäkkäiset objektit.",
    "featureRoleNormalization": "Roolin normalisointi",
    "featureRoleNormalizationDesc": "Maps-kehittäjä→järjestelmä muille kuin OpenAI-kohteille. Karttajärjestelmä→käyttäjä malleille, jotka eivät tue järjestelmäroolia.",
    "featureToolCallIds": "Työkalu Puhelutunnuksen normalisointi",
    "featureToolCallIdsDesc": "Luo yksilölliset tool_call-tunnukset, kun ne puuttuvat. Normalisoituu 9-merkin muotoon sellaisille palveluntarjoajille kuin Mistral.",
    "featureMissingToolResponse": "Tool Response Injection",
    "featureMissingToolResponseDesc": "Lisää tyhjät tool_result -viestit, kun asiakkaat lähettävät työkalukutsut ilman vastaavia vastauksia.",
    "featureThinkingBudget": "Miettivä budjetti",
    "featureThinkingBudgetDesc": "Hallitsee automaattisesti ajatteluasetuksia. Poistaa ajatteluparametrit, kun viimeinen viesti ei ole käyttäjältä.",
    "featureDirectPaths": "Suorat käännöspolut",
    "featureDirectPathsDesc": "Joissakin muotopareissa (Claude→Gemini) on suorat kääntäjät, jotka ohittavat OpenAI-keskittimen ja tuottavat tarkempaa tulosta.",
    "featureImageMapping": "Kuvan koon kartoitus",
    "featureImageMappingDesc": "Kääntää kuvien mittasuhteita API-muotojen välillä (esim. OpenAI-tietotasot → Gemini-mitat).",
    "input": "Syöte",
    "output": "Lähtö",
    "auto": "Auto",
    "swapFormats": "Vaihda formaatteja",
    "translateAction": "Käännä",
    "clear": "Selkeä",
    "inputPlaceholder": "Liitä pyynnön teksti tähän tai valitse malli alta...",
    "exampleTemplates": "Esimerkkimalleja",
    "exampleTemplatesHint": "- Napsauta ladataksesi",
    "templateLoadHint": "Malli lataa pyynnön muodossa {format}. Muuta lähdemuotoa ladataksesi eri muodossa.",
    "compatibilityTester": "Yhteensopivuuden testaaja",
    "compatibilityReport": "Yhteensopivuusraportti",
    "testBenchDescription": "Suorita ennalta määritettyjä skenaarioita (Simple Chat, Tool Calling jne.) varmistaaksesi käännöksen ja palveluntarjoajan yhteensopivuuden. Valitse lähdemuoto ja kohdetoimittaja ja suorita sitten kaikki testit nähdäksesi yhteensopivuusprosentti. Käytä tätä selvittääksesi, mitkä ominaisuudet toimivat eri palveluntarjoajien välillä.",
    "targetProvider": "Kohdetoimittaja",
    "runAllTests": "Suorita kaikki testit",
    "runTest": "Suorita testi",
    "reRun": "Suorita uudelleen",
    "running": "Juoksemassa...",
    "passed": "läpäissyt",
    "failed": "epäonnistunut",
    "passedIconLabel": "✅ Läpäisty",
    "chunks": "paloina",
    "scenarioSimpleChat": "Yksinkertainen chat",
    "scenarioToolCalling": "Työkalun kutsuminen",
    "scenarioMultiTurn": "Monikierros",
    "scenarioThinking": "Ajatteleminen",
    "scenarioSystemPrompt": "Järjestelmäkehote",
    "scenarioStreaming": "Suoratoisto",
    "templateNames": {
      "simple-chat": "Yksinkertainen chat",
      "tool-calling": "Työkalun kutsuminen",
      "multi-turn": "Monikierros",
      "thinking": "Ajatteleminen",
      "system-prompt": "Järjestelmäkehote",
      "streaming": "Suoratoisto",
      "vision": "Visio",
      "schema-coercion": "Schema Coercion"
    },
    "templateDescriptions": {
      "simple-chat": "Perustekstiviesti",
      "tool-calling": "Toiminnon/työkalun kutsuminen",
      "multi-turn": "Keskustelua historian kanssa",
      "thinking": "Laajennettu ajattelu/päättely",
      "system-prompt": "Monimutkaiset järjestelmäohjeet",
      "streaming": "SSE-suoratoistopyyntö",
      "vision": "Multimodaalinen pyyntö kuvasyötöllä",
      "schema-coercion": "Strukturoitu tulos / JSON-skeeman valvonta"
    },
    "templatePayloads": {
      "simpleChat": {
        "system": "Olet avulias avustaja.",
        "userGreeting": "Hei! Miten voit tänään?"
      },
      "toolCalling": {
        "userWeather": "Millainen sää on São Paulossa?",
        "toolDescription": "Hanki nykyisen sijainnin sää",
        "cityNameDescription": "Kaupungin nimi"
      },
      "multiTurn": {
        "system": "Olet koodausassistentti.",
        "userInitial": "Kirjoita funktio taulukon lajittelemiseksi Pythonissa.",
        "assistantExample": "Tässä on yksinkertainen lajittelutoiminto:\n\n``` python\ndef sort_array(arr):\n    palautus lajiteltuna(arr)\n```",
        "userFollowUp": "Järjestä se nyt laskevaan järjestykseen."
      },
      "thinking": {
        "question": "Mikä on 100 ensimmäisen alkuluvun summa?"
      },
      "systemPrompt": {
        "systemInstruction": "Olet hajautettuihin järjestelmiin erikoistunut vanhempi ohjelmistosuunnittelija. Vastaa kysymyksiin ytimekkäästi käyttämällä alan parhaita käytäntöjä. Anna aina koodiesimerkkejä tarvittaessa. Muotoile vastauksesi käyttämällä markdownia.",
        "question": "Kuinka otan käyttöön katkaisijakuvion?"
      },
      "streaming": {
        "prompt": "Kerro minulle lyhyt tarina robotista, joka oppii maalaamaan."
      },
      "vision": {
        "system": "Olet avustaja, joka kuvaa kuvat tarkasti.",
        "userPrompt": "Mitä tässä kuvassa näkyy?",
        "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/600px-PNG_transparency_demonstration_1.png"
      },
      "schemaCoercion": {
        "userPrompt": "Etsi Tokion sää metristen yksiköiden avulla ja sisällytä tuntikohtainen erittely.",
        "toolDescription": "Hae kaupungin sää strukturoiduilla vaihtoehdoilla.",
        "cityDescription": "Kysyttävä kaupunki, esim. \"Tokio\" tai \"New York\"."
      }
    },
    "openaiCompatibleLabel": "OpenAI-yhteensopiva",
    "anthropicCompatibleLabel": "Antrooppinen yhteensopiva",
    "noTemplateForFormat": "Ei mallia tälle muodolle",
    "translationFailed": "Käännös epäonnistui: {error}",
    "pipelineDebugger": "Pipeline Debugger",
    "translationPipeline": "Käännösputki",
    "pipelineVisualization": "Putkilinjan visualisointi",
    "pipelineVisualizationHint": "Lähetä viesti nähdäksesi, kuinka pyyntösi etenee tunnistuksen → käännös → palveluntarjoajan puhelun kautta.",
    "chatTesterDescription": "Lähetä viestejä tietyssä asiakasmuodossa ja tarkista käännösputken jokainen vaihe.",
    "chatTesterFlow": "Asiakaspyyntö → muodon tunnistus → OpenAI-välitaso → tarjoajan muoto → vastaus",
    "clickStepToInspect": "Napsauta mitä tahansa vaihetta tarkistaaksesi tiedot siinä vaiheessa.",
    "clientFormat": "Asiakasmuoto",
    "provider": "Palveluntarjoaja",
    "modelPlaceholder": "Valitse tai kirjoita mallin nimi...",
    "sendMessageToSeePipeline": "Lähetä viesti nähdäksesi käännösputken",
    "chatMessageHintPrefix": "Viestisi muotoillaan muodossa a",
    "chatMessageHintSuffix": "pyyntö, käännetään putken kautta ja lähetetään valitulle palveluntarjoajalle.",
    "youWithFormat": "Sinä ({format})",
    "assistant": "Assistant",
    "typeMessage": "Kirjoita viesti...",
    "send": "Lähetä",
    "clientRequest": "Asiakaspyyntö",
    "clientRequestDescription": "Pyynnön elin sellaisena kuin asiakkaasi sen lähettäisi",
    "formatDetected": "Muoto havaittu",
    "formatDetectedDescription": "OmniRoute tunnistaa automaattisesti API-muodon pyyntörakenteesta",
    "openaiIntermediate": "OpenAI Intermediate",
    "openaiIntermediateDescription": "Kaikki muodot normalisoidaan ensin OpenAI-muotoon (yleinen silta)",
    "providerFormat": "Tarjoajan muoto",
    "providerFormatDescription": "OpenAI-muoto käännetään palveluntarjoajan alkuperäiseen muotoon",
    "providerResponse": "Palveluntarjoajan vastaus",
    "providerResponseRawDescription": "Raaka vastaus palveluntarjoajan API:lta",
    "providerResponseSseDescription": "Raaka SSE-stream palveluntarjoajan sovellusliittymästä",
    "unexpectedError": "Tapahtui odottamaton virhe",
    "error": "Virhe",
    "errorMessage": "Virhe: {message}",
    "requestFailed": "Pyyntö epäonnistui",
    "noTextExtracted": "(Ei tekstiä poimittu)",
    "liveMonitorMemoryNote": "Tapahtumat tallennetaan muistiin ja menetetään uudelleenkäynnistyksen yhteydessä.",
    "liveMonitorMemoryCapNote": "Enintään 200 tapahtumaa säilytetään.",
    "eventSourcesLabel": "Tapahtuman lähteet:",
    "eventSourceTranslatorPage": "• Kääntäjäsivu (Chat Tester, Test Bench)",
    "eventSourceMainPipeline": "• Pääpyyntöputkisto (CLI/IDE/API-liikenne)",
    "liveMonitorDescriptionPrefix": "Näyttää käännöstapahtumat, kun API-kutsut kulkevat OmniRouten kautta. Tapahtumat tulevat muistin puskurista (palautuu uudelleenkäynnistyksen yhteydessä). Käytä",
    "liveMonitorDescriptionSuffix": "tai ulkoisia API-kutsuja tapahtumien luomiseksi.",
    "streamTransformer": "Stream Transformer",
    "modeDescriptionStreamTransformer": "Suorita chatin loppuunsaattamisen SSE-suorat Responses-muuntajan kautta.",
    "streamTransformerTitle": "Vastaukset Stream Transformer",
    "streamTransformerDescription": "Liitä keskustelun loppuunsaattamisen SSE-virta, suorita se OmniRouten vastausmuuntajan läpi ja tarkasta lähetetyt vastaukset.*-tapahtumat ennen kuin liität asiakkaan.",
    "loadTextSample": "Lataa tekstinäyte",
    "loadToolSample": "Lataa työkalukutsunäyte",
    "transformToResponses": "Muunna vastauksiksi",
    "rawChatSseInput": "Raaka-chatin loppuun saattaminen SSE",
    "transformedResponsesSse": "Transformed Responses API SSE",
    "noResultsYet": "Ei tuloksia vielä",
    "transformedEvents": "Muuttuneet tapahtumat",
    "uniqueEventTypes": "Ainutlaatuiset tapahtumatyypit",
    "inputLines": "Syöttölinjat",
    "outputLines": "Lähtölinjat",
    "transformedEventTimeline": "Tapahtuman aikajana muutettu",
    "transformerTimelineHint": "Suorita muuntaja tarkastaaksesi lähetetyt response.output_* -tapahtumat järjestyksessä.",
    "eventType": "Tapahtuman tyyppi",
    "eventPreview": "Esikatselu",
    "comboRouted": "Yhdistelmä reititetty",
    "uniqueEndpoints": "Ainutlaatuiset päätepisteet",
    "routeDetails": "Reitin tiedot",
    "comboBadge": "Yhdistelmä",
    "routeEndpointLabel": "Päätepiste",
    "routeConnectionLabel": "Yhteys",
    "scenarioVision": "Visio (kuvan ymmärtäminen)",
    "scenarioSchemaCoercion": "Kaavojen pakottaminen (strukturoitu tulos)",
    "techniques": "Tekniikat:"
  },
  "usage": {
    "title": "Käyttö",
    "loggerTab": "Kirjaaja",
    "proxyTab": "Välityspalvelin",
    "budgetManagement": "Budjetin hallinta",
    "budgetSaved": "Budjettirajat tallennettu",
    "budgetSaveFailed": "Budjetin säästäminen epäonnistui",
    "loadingBudgetData": "Ladataan budjettitietoja...",
    "noApiKeysTitle": "Ei API-avaimia",
    "noApiKeysDescription": "Lisää ensin API-avaimet budjettirajojen määrittämiseksi.",
    "apiKey": "API-avain",
    "todaysSpend": "Päivän kulutus",
    "thisMonth": "Tässä kuussa",
    "setLimits": "Aseta rajat",
    "dailyLimitUsd": "Päivittäinen raja (USD)",
    "monthlyLimitUsd": "Kuukausiraja (USD)",
    "warningThresholdPercent": "Varoituskynnys (%)",
    "dailyLimitPlaceholder": "esim. 5.00",
    "monthlyLimitPlaceholder": "esim. 50.00",
    "warningThresholdPlaceholder": "80",
    "saveLimits": "Tallenna rajoitukset",
    "budgetOk": "Budjetti OK – {remaining} jäljellä",
    "budgetExceeded": "Budjetti ylitetty – pyynnöt voidaan estää",
    "totalRequests": "Pyyntöjä yhteensä",
    "noDataYet": "Ei vielä dataa",
    "latency": "Latenssi",
    "latencyP50": "p50",
    "latencyP95": "p95",
    "latencyP99": "p99",
    "promptCache": "Kehotusvälimuisti",
    "systemHealth": "Järjestelmän terveys",
    "entries": "merkinnät",
    "activeCount": "{count} aktiivinen",
    "openCircuitBreakersDetected": "Katkaisijat havaittu",
    "hitRate": "Osumaprosentti",
    "hitsMisses": "Osumat / Miss",
    "circuitBreakers": "Katkaisijat",
    "lockedIPs": "Lukitut IP:t",
    "lockoutsAutoRefreshHint": "Mallikohtaiset nopeusrajoitukset • Automaattinen päivitys 10s",
    "lockedCount": "{count, plural, one {# locked} other {# locked}}",
    "timeLeft": "{time} jäljellä",
    "howItWorks": "Miten se toimii",
    "howItWorksSubtitle": "Opi kuinka arvioinnit vahvistavat LLM-vastauksesi",
    "define": "Määritä",
    "defineStepDescription": "Luo testitapauksia, joissa on syöttökehotteita ja odotettuja tulosehtoja käyttämällä strategioita, kuten sisältää, regex tai tarkka vastaavuus.",
    "run": "Juokse",
    "runStepDescription": "Suorita testitapauksia LLM-päätepisteitäsi vastaan OmniRouten kautta. Jokainen tapaus lähetetään todellisena API-pyyntönä.",
    "evaluate": "Arvioi",
    "evaluateStepDescription": "Vastauksia verrataan odotettuihin kriteereihin. Katso kunkin tapauksen hyväksyntä/hylkäys viivemittareiden ja yksityiskohtaisen palautteen avulla.",
    "evalsStrategyContainsLabel": "__MISSING__:Contains",
    "evalsStrategyExactLabel": "__MISSING__:Exact Match",
    "evalsStrategyRegexLabel": "__MISSING__:Regex",
    "evalsStrategyCustomLabel": "__MISSING__:Custom Logic",
    "evalsStrategyContainsDescription": "__MISSING__:Checks if the LLM output contains the expected substring.",
    "evalsStrategyExactDescription": "__MISSING__:Checks if the LLM output exactly matches the expected value.",
    "evalsStrategyRegexDescription": "__MISSING__:Validates the LLM output against a regular expression pattern.",
    "evalsStrategyCustomDescription": "__MISSING__:Custom evaluation logic (configured via JSON).",
    "historyColumnSuiteName": "__MISSING__:Suite Name",
    "historyColumnTarget": "__MISSING__:Target",
    "historyColumnPassRate": "__MISSING__:Pass Rate",
    "historyColumnAvgLatencyMs": "__MISSING__:Avg Latency",
    "historyColumnCreatedAt": "__MISSING__:Executed",
    "evalSuites": "Arviointisviitit",
    "evalSuitesHint": "Napsauta sarjaa tarkastellaksesi testitapauksia ja suorita sitten LLM-päätepisteiden arvioiminen",
    "evalsLoading": "Ladataan eval-sviittejä...",
    "noEvalSuitesFound": "Eval Suitesta ei löytynyt",
    "noEvalSuitesDescription": "Eval-sarjat voidaan määrittää API:n kautta tai koodilla. He testaavat mallin tuloksia odotettujen tulosten kanssa käyttämällä strategioita, kuten sisältää, regex, tarkka vastaavuus ja mukautetut funktiot.",
    "columnCase": "Asia",
    "columnStatus": "Tila",
    "columnLatency": "Latenssi",
    "columnDetails": "Yksityiskohdat",
    "columnModel": "Malli",
    "columnStrategy": "strategia",
    "columnExpected": "Odotettu",
    "statsSuites": "Sviitit",
    "statsTestCases": "Testitapaukset",
    "statsModels": "Mallit",
    "statsCoverage": "Kattavuus",
    "statsStrategiesCount": "{count} strategioita",
    "evaluationStrategies": "Arviointistrategiat",
    "modelsUnderTest": "Mallit testattavana",
    "searchSuitesPlaceholder": "Etsi sviittejä...",
    "passSuffix": "pass",
    "casesCount": "{count, plural, one {# case} other {# cases}}",
    "runEval": "Juokse Eval",
    "runAllSuites": "Suorita kaikki",
    "runAllRunning": "Kaikki käynnissä...",
    "runAllProgress": "Käynnissä {current}/{total}: {name}",
    "runAllFailedSuites": "{count, plural, one {# suite failed} other {# suites failed}}",
    "runAllCompleted": "Suoritettiin {suites} sviittiä – {passed} hyväksytty, {failed} epäonnistui",
    "runAllCompletedWithFailures": "Käytti {completed} sviittiä; {failedSuites} epäonnistui",
    "runningProgress": "Käynnissä {current}/{total}...",
    "passRate": "läpäisyaste",
    "summaryBreakdown": "{passed} hyväksytty · {failed} epäonnistui · {total} yhteensä",
    "passedIconLabel": "✅ Läpäisty",
    "failedIconLabel": "❌ Epäonnistui",
    "resultPassed": "Läpäisty",
    "resultFailed": "Epäonnistui",
    "expandResult": "Laajenna tulostiedot",
    "collapseResult": "Tiivistä tulostiedot",
    "detailsContains": "Sisältää: \"{term}\"",
    "detailsRegex": "Regex: {pattern}",
    "detailsExpected": "Odotettu: \"{expected}\"",
    "expectedOutputLabel": "Odotettu tulos",
    "noResultsYet": "Ei tuloksia vielä",
    "testCasesCount": "Testitapaukset ({count})",
    "noTestCasesDefined": "Testitapauksia ei ole määritelty",
    "runEvalHint": "Napsauta \"Suorita Eval\" suorittaaksesi kaikki tapaukset LLM-päätepisteellesi. Jokainen testi lähettää oikean pyynnön OmniRouten kautta.",
    "notifyNoTestCases": "Tälle sarjalle ei ole määritetty testitapauksia",
    "notifyAllCasesPassed": "Kaikki {total} tapausta ohitettu ✅",
    "notifySomeCasesFailed": "{passed}/{total} hyväksytty, {failed} epäonnistui",
    "notifyEvalRunFailed": "Eval-juoksu epäonnistui",
    "notifyEvalTitle": "Arvosana: {name}",
    "modelEvals": "Mallin arvioinnit",
    "evalsHeroDescription": "Testaa ja vahvista LLM-päätepisteesi suorittamalla ennalta määritettyjä arviointipaketteja. Jokainen sarja sisältää testitapauksia, jotka lähettävät todellisia kehotteita OmniRouten kautta ja vertaavat vastauksia odotettuihin kriteereihin – auttaen sinua havaitsemaan regressioita, vertailla malleja ja varmistamaan vastausten laadun eri tarjoajien välillä.",
    "qualityValidation": "Laadun validointi",
    "modelComparison": "Mallin vertailu",
    "regressionDetection": "Regression havaitseminen",
    "latencyBenchmarks": "Viiveen vertailuarvot",
    "modelLockouts": "Mallin lukitukset",
    "noLockouts": "Tällä hetkellä ei ole lukittuja malleja",
    "activeSessions": "Aktiiviset istunnot",
    "noSessions": "Ei aktiivisia istuntoja",
    "sessionsHint": "Istunnot näkyvät välityspalvelimen kautta kulkevien pyyntöjen aikana",
    "sessionsTrackedHint": "Seurataan sormenjälkien pyytämisellä • Automaattinen päivitys 5s",
    "session": "Istunto",
    "age": "Ikä",
    "requests": "Pyynnöt",
    "connection": "Yhteys",
    "durationMillisecondsShort": "{value}ms",
    "durationSecondsShort": "{value}s",
    "durationMinutesShort": "{value}m",
    "durationHoursShort": "{value}h",
    "reasonSeparator": " - ",
    "notAvailableSymbol": "-",
    "providerLimits": "Palveluntarjoajan rajoitukset",
    "noProviders": "Ei yhdistettyjä palveluntarjoajia",
    "connectProvidersForQuota": "Muodosta yhteys palveluntarjoajiin OAuthin avulla seurataksesi API-kiintiörajoja ja käyttöä.",
    "accountsCount": "{count, plural, one {# account} other {# accounts}}",
    "filteredFromCount": "(suodatettu kohteesta {count})",
    "autoRefresh": "Automaattinen päivitys",
    "refreshAll": "Päivitä kaikki",
    "loadingQuotas": "Ladataan...",
    "account": "Tili",
    "modelQuotas": "Mallikiintiöt",
    "lastUsed": "Last Refreshed",
    "actions": "Toiminnot",
    "refreshQuota": "Päivitä kiintiö",
    "today": "Tänään",
    "tomorrow": "Huomenna",
    "dayTimeFormat": "{day}, {time}",
    "inDuration": "kohteessa {duration}",
    "notApplicable": "Ei käytössä",
    "rawPlanWithValue": "Raakasuunnitelma: {plan}",
    "noPlanFromProvider": "Ei suunnitelmaa palveluntarjoajalta",
    "noQuotaData": "Ei kiintiötietoja",
    "cardExpand": "__MISSING__:Expand",
    "cardCollapse": "__MISSING__:Collapse",
    "moreQuotas": "__MISSING__:+{count} more",
    "ungrouped": "Ungrouped",
    "viewFlat": "Flat",
    "viewByEnvironment": "By Environment",
    "noQuotaDataAvailable": "Kiintiötietoja ei ole saatavilla",
    "noAccountsForTierFilter": "Tasosuodattimelle ei löytynyt tilejä",
    "tierAll": "Kaikki",
    "tierEnterprise": "Yritys",
    "tierTeam": "Joukkue",
    "tierBusiness": "Business",
    "tierUltra": "Ultra",
    "tierPro": "Pro",
    "tierPlus": "Plus",
    "tierFree": "Ilmainen",
    "tierLite": "__MISSING__:Lite",
    "tierUnknown": "Tuntematon",
    "statTotal": "__MISSING__:Total",
    "statCritical": "__MISSING__:Critical",
    "statAlert": "__MISSING__:Alert",
    "statHealthy": "__MISSING__:Healthy",
    "filterPurchaseTypeLabel": "__MISSING__:Type",
    "filterTierLabel": "__MISSING__:Tier",
    "purchaseAll": "__MISSING__:All",
    "purchaseOauthSub": "__MISSING__:Subscription",
    "purchaseOauthFree": "__MISSING__:OAuth Free",
    "purchaseApiKey": "__MISSING__:API Key",
    "creditsLabel": "__MISSING__:Credits",
    "creditBalanceHint": "__MISSING__:Remaining balance",
    "unlimitedLabel": "__MISSING__:Unlimited",
    "refreshing": "__MISSING__:Refreshing",
    "resetsIn": "__MISSING__:Resets in",
    "editCutoffs": "Muokkaa rajauksia",
    "forceRefresh": "Päivitä nyt",
    "suiteBuilderSaveFailed": "Failed to save suite",
    "clone": "Klooni",
    "exportSuite": "Vie",
    "importSuite": "Tuo",
    "suiteExported": "Suite viety",
    "suiteExportFailed": "Suiten vienti epäonnistui",
    "suiteImportReady": "Suiten tuonti ladattu tarkistettavaksi",
    "suiteImportFailed": "Suiten tuonti epäonnistui",
    "suiteImportInvalid": "Virheellinen eval suite JSON",
    "suiteBuilderCloneSuffix": "kopioida",
    "suiteBuilderImportedSuite": "Tuotu sviitti",
    "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",
    "suiteBuilderCaseExpectedPlaceholderContains": "esim. def fibonacci",
    "suiteBuilderCaseExpectedPlaceholderExact": "Liitä tarkka odotettu vastaus",
    "suiteBuilderCaseExpectedPlaceholderRegex": "esim. ^\\\\s*\\\\{.*\\\\}\\\\s*$",
    "suiteBuilderCaseExpectedHintRegex": "Käytä säännöllistä JavaScript-lauseketta ilman vinoviivaa.",
    "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",
    "suiteBuilderDuplicateCase": "Kopioi",
    "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",
    "staleQuotaTooltip": "Last refresh failed — showing cached data",
    "quotaThresholdLabel": "Min jäljellä",
    "quotaCutoffsColumnHelp": "Pysäytä pyynnöt, kun jäljellä oleva kiintiö laskee tähän prosenttiosuuteen tai sen alle.",
    "quotaCutoffsButtonDefault": "Oletus",
    "quotaCutoffsButtonHelp": "Muokkaa tämän tilin jäljellä olevia vähimmäiskiintiöitä.",
    "quotaCutoffsButtonDisabled": "Tälle tilille ei ole vielä saatavilla kiintiöikkunoita.",
    "quotaCutoffsTitle": "Kiintiön rajat kohteelle {name} ({provider})",
    "quotaCutoffsExplainer": "Ohita jäljellä olevan kiintiön vähimmäisprosenttiosuus, jos tätä tiliä ei enää valita kullekin kiintiöikkunalle. Jätä tyhjäksi, jos haluat periä palveluntarjoajan oletusarvon.",
    "quotaCutoffsDefaultHint": "Minimi oletusarvo jäljellä: {default}%",
    "quotaCutoffsResetAll": "Nollaa kaikki",
    "quotaCutoffsNoWindows": "Tälle tilille ei ole vielä saatavilla kiintiöikkunoita.",
    "quotaThresholdInvalid": "Syötä kokonaisluku väliltä 0-100.",
    "budgetKpiToday": "Tänään",
    "budgetKpiThisMonth": "Tämä kuukausi",
    "budgetKpiProjEom": "Proj EOM",
    "budgetKpiBlocked": "Estetty",
    "budgetKpiAtRisk": "Vaarassa",
    "budgetKpiActiveKeys": "Aktiiviset avaimet",
    "budgetSearchKeysPlaceholder": "Hakuavaimet...",
    "budgetSortPctUsed": "Lajittele: % Käytetty ↓",
    "budgetSortTodayDollar": "Lajittele: Tänään $ ↓",
    "budgetSortMonthDollar": "Lajittele: Kuukausi $ ↓",
    "budgetSortNameAZ": "Lajittele: Nimi (A–Z)",
    "budgetColDailyLim": "Päivittäinen lim",
    "budgetColMonthlyLim": "Kuukausilim",
    "budgetColUsedPct": "Käytetty %",
    "budgetLoading": "Ladataan…",
    "budgetNoKeysMatch": "Yksikään näppäin ei vastaa suodattimia",
    "budgetLinearExtrapolation": "lineaarinen ekstrapolaatio",
    "budgetThisMonthSoFar": "Tässä kuussa tähän mennessä",
    "budgetProjectedEndOfMonth": "Arvioitu kuun loppu",
    "budgetByProvider": "palveluntarjoajan mukaan",
    "budgetDailyDollar": "Päivittäinen $",
    "budgetWeeklyDollar": "Viikoittainen $",
    "budgetMonthlyDollar": "Kuukausittainen $",
    "budgetWarnAtPct": "Varoita %",
    "quotaAlerts": "Kiintiöhälytykset",
    "quotaTableRefreshing": "⟳ Virkistävää...",
    "noSpendLast30Days": "Ei kuluja viimeisen 30 päivän aikana",
    "updatedShort": "__MISSING__:Updated",
    "lastRefreshed": "__MISSING__:Last refreshed",
    "providerQuota": "__MISSING__:Provider Quota",
    "providerQuotaHomeHint": "__MISSING__:Live status across connected accounts"
  },
  "modals": {
    "waitingAuth": "Odotetaan valtuutusta",
    "verificationUrl": "Vahvistus-URL",
    "yourCode": "Koodisi",
    "remoteAccess": "Etäkäyttö:",
    "connectedSuccess": "Yhdistetty onnistuneesti!",
    "connectionFailed": "Yhteys epäonnistui",
    "chooseAuthMethod": "Valitse todennustapasi:",
    "awsBuilderId": "AWS Builder ID",
    "awsIamIdentity": "AWS IAM Identity Center",
    "googleAccount": "Google-tili",
    "githubAccount": "GitHub-tili",
    "importToken": "Tuo tunnus",
    "pasteToken": "Liitä päivitystunnus Kiro IDE:stä.",
    "awsRegion": "AWS-alue",
    "autoDetecting": "Tunnistetaan automaattisesti...",
    "readingFromCache": "Lukee AWS SSO -välimuistista",
    "readingFromCursor": "Lukeminen Cursor IDE -tietokannasta",
    "initializing": "Alustetaan...",
    "pricingConfig": "Hinnoitteluasetukset",
    "loadingPricing": "Ladataan hintatietoja...",
    "pricingRatesFormat": "Hinnoitteluhinnastomuoto",
    "noPricingData": "Hintatietoja ei ole saatavilla",
    "noModelsFound": "Malleja ei löytynyt"
  },
  "loggers": {
    "allProviders": "Kaikki palveluntarjoajat",
    "allModels": "Kaikki mallit",
    "allAccounts": "Kaikki tilit",
    "allApiKeys": "Kaikki API-avaimet",
    "allTypes": "Kaikki tyypit",
    "allLevels": "Kaikki tasot",
    "modelAZ": "Malli A-Z",
    "modelZA": "Malli Z-A",
    "loadingLogs": "Ladataan lokeja...",
    "loadingProxyLogs": "Ladataan välityspalvelimen lokeja...",
    "noLogEntries": "Lokimerkintöjä ei löytynyt",
    "noPayloadData": "Tälle lokimerkinnälle ei ole saatavilla hyötykuormatietoja.",
    "proxyEvent": "Välityspalvelintapahtuma",
    "proxy": "Välityspalvelin",
    "level": "Taso",
    "directNative": "Suora (natiivi)",
    "combo": "Yhdistelmä",
    "inputTokens": "Minä:",
    "outputTokens": "O:"
  },
  "stats": {
    "usageOverview": "Käyttökatsaus",
    "outputTokens": "Tulostustunnukset",
    "totalCost": "Kokonaiskustannukset",
    "usageByModel": "Käyttö mallin mukaan",
    "usageByAccount": "Käyttö tilikohtaisesti",
    "failedToLoad": "Käyttötilastojen lataaminen epäonnistui.",
    "tokenHealth": "Token Health",
    "totalOAuth": "Yhteensä OAuth",
    "healthy": "Terve",
    "warning": "Varoitus",
    "errored": "Virheellinen",
    "lastCheck": "Viimeinen tarkistus",
    "noData": "Ei dataa",
    "share": "Jaa",
    "unableToLoad": "Järjestelmän mittareita ei voi ladata",
    "product": "Tuote",
    "resources": "Resurssit",
    "company": "Yritys"
  },
  "auth": {
    "welcome": "Tervetuloa",
    "signIn": "Kirjaudu sisään",
    "enterPassword": "Anna salasanasi jatkaaksesi",
    "password": "Salasana",
    "unifiedProxy": "Unified AI API Proxy",
    "unifiedAiApiProxy": "Unified AI API Proxy",
    "unifiedAiApiProxyDesc": "Reititä pyynnöt useille tekoälypalveluntarjoajille yhden päätepisteen kautta. Kuormituksen tasapainotus, vikasieto ja käytön seuranta sisäänrakennettu.",
    "passwordNotEnabled": "Salasanasuojaus ei ole käytössä",
    "loading": "Ladataan...",
    "invalidPassword": "Virheellinen salasana",
    "errorOccurredRetry": "Tapahtui virhe. Yritä uudelleen.",
    "configureInstance": "Määritetään OmniRoute-esiintymäsi",
    "runOnboardingWizard": "Määritä salasanasi ja yhdistä ensimmäinen tekoälypalveluntarjoajasi suorittamalla ohjattu käyttöönottotoiminto.",
    "startOnboarding": "Aloita perehtyminen",
    "secureYourInstance": "Suojaa tapauksesi",
    "setPasswordDescription": "Aseta salasana suojataksesi kojelautaasi ja suojataksesi API-päätepisteesi luvattomalta käytöltä.",
    "configurePassword": "Määritä salasana",
    "continue": "Jatka",
    "windowWillClose": "Tämä ikkuna sulkeutuu automaattisesti...",
    "closeTabNow": "Voit sulkea tämän välilehden nyt.",
    "copyUrlManual": "Kopioi URL-osoite osoitepalkista ja liitä se sovellukseen.",
    "accessDeniedDescription": "Sinulla ei ole lupaa käyttää tätä resurssia. Tarkista API-avaimesi tai ota yhteyttä järjestelmänvalvojaan.",
    "goToDashboard": "Siirry Dashboardiin",
    "featureMultiProviderTitle": "Multi-Provider",
    "featureMultiProviderDesc": "OpenAI, Anthropic, Google ja paljon muuta",
    "featureLoadBalancingTitle": "Kuorman tasapainotus",
    "featureLoadBalancingDesc": "Jaa pyynnöt älykkäästi",
    "featureUsageTrackingTitle": "Käytön seuranta",
    "featureUsageTrackingDesc": "Valvo kustannuksia ja tokeneja",
    "resetPassword": "Palauta salasana",
    "resetDescription": "Valitse menetelmä hallintapaneelin käyttöoikeuden palauttamiseksi",
    "stopServer": "Pysäytä OmniRoute-palvelin",
    "processing": "Käsitellään...",
    "pleaseWait": "Odota, kun saamme valtuutuksen valmiiksi.",
    "authSuccess": "Valtuutus onnistui!",
    "copyUrl": "Kopioi tämä URL-osoite",
    "accessDenied": "Pääsy kielletty",
    "methodCliTitle": "Tapa 1: CLI-nollaus",
    "methodCliDescription": "Suorita seuraava komento palvelimella, jossa OmniRoute on käynnissä:",
    "methodCliHint": "Tämä kehottaa sinua asettamaan uuden salasanan. Palvelin on ensin pysäytettävä.",
    "methodManualTitle": "Tapa 2: Manuaalinen nollaus",
    "methodManualDescription": "Poista salasana tietokannasta ja aseta uusi salasana käynnistyksen yhteydessä:",
    "setPasswordInYour": "Aseta uusi salasana omaan",
    "fileLabelSuffix": "tiedosto:",
    "newPasswordPlaceholder": "your_new_password",
    "deleteSettingsFile": "Poista",
    "orRemovePasswordHashField": "tai poista salasanaHash-kenttä",
    "restartServerWithNewPassword": "Käynnistä palvelin uudelleen - se käyttää uutta salasanaa",
    "backToLogin": "Takaisin kirjautumiseen",
    "forgotPassword": "Unohditko salasanan?",
    "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)",
    "Authorization": "Valtuutus",
    "Content-Disposition": "Sisältö-sijoittelu",
    "waitingForAuthorization": "Odotetaan valtuutusta...",
    "waitingForGoogleAuthorization": "Odotetaan Googlen valtuutusta...",
    "waitingForOpenAIAuthorization": "Odotetaan OpenAI-valtuutusta...",
    "waitingForAntigravityAuthorization": "Odotetaan antigravitaatiovaltuutusta...",
    "waitingForQoderAuthorization": "Odotetaan Qoder-valtuutusta...",
    "exchangingCodeForTokens": "Vaihdetaan koodia tokeneihin...",
    "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": "Navigoi kotiin",
    "toggleMenu": "Vaihda valikkoa",
    "featuresLink": "Ominaisuudet",
    "docsLink": "Asiakirjat",
    "github": "GitHub",
    "versionLive": "v1.0 on nyt julkaistu",
    "oneEndpoint": "Yksi päätepiste",
    "allProviders": "Kaikki AI-palveluntarjoajat",
    "heroDescription": "AI-päätepisteen välityspalvelin web-hallintapaneelilla – CLIProxyAPI:n JavaScript-portti. Toimii saumattomasti Claude Coden, OpenAI Codexin, Clinen, RooCoden ja muiden CLI-työkalujen kanssa.",
    "getStarted": "Aloita",
    "viewOnGithub": "Katso GitHubissa",
    "powerfulFeatures": "Tehokkaat ominaisuudet",
    "featuresSubtitle": "Kaikki mitä tarvitset AI-infrastruktuurin hallintaan yhdessä paikassa, mittakaavassa rakennettu.",
    "featureUnifiedEndpointTitle": "Yhtenäinen päätepiste",
    "featureUnifiedEndpointDesc": "Pääset kaikkiin palveluntarjoajiin yhden standardin API-URL-osoitteen kautta.",
    "featureEasySetupTitle": "Helppo asennus",
    "featureEasySetupDesc": "Pääset käyntiin muutamassa minuutissa npx-komennolla.",
    "featureModelFallbackTitle": "Mallin takaisku",
    "featureModelFallbackDesc": "Vaihda automaattisesti palveluntarjoajaa vikatilanteen tai korkean viiveen sattuessa.",
    "featureUsageTrackingTitle": "Käytön seuranta",
    "featureUsageTrackingDesc": "Yksityiskohtainen analytiikka ja kustannusseuranta kaikissa malleissa.",
    "featureOAuthApiKeysTitle": "OAuth- ja API-avaimet",
    "featureOAuthApiKeysDesc": "Hallitse tunnistetietoja turvallisesti yhdessä holvissa.",
    "featureCloudSyncTitle": "Cloud Sync",
    "featureCloudSyncDesc": "Synkronoi määritykset eri laitteiden välillä välittömästi.",
    "featureCliSupportTitle": "CLI-tuki",
    "featureCliSupportDesc": "Toimii Claude Coden, Codexin, Clinen, Cursorin ja muiden kanssa.",
    "featureDashboardTitle": "Kojelauta",
    "featureDashboardDesc": "Visuaalinen kojelauta reaaliaikaista liikenneanalyysiä varten.",
    "howItWorks": "Kuinka OmniRoute toimii",
    "howItWorksDescription": "Tiedot kulkevat saumattomasti sovelluksestasi älykkään reitityskerroksen kautta työsi parhaalle toimittajalle.",
    "howItWorksStep1Title": "1. CLI ja SDK:t",
    "howItWorksStep1Description": "Pyyntösi alkavat suosikkityökaluistasi tai yhdistetystä SDK:sta. Vaihda vain perus-URL-osoite.",
    "howItWorksStep2Title": "2. OmniRoute Hub",
    "howItWorksStep2Description": "Moottorimme analysoi kehotteen, tarkistaa palveluntarjoajan kunnon ja reitit pienimmän viiveen tai kustannusten varalta.",
    "howItWorksStep3Title": "3. AI-palveluntarjoajat",
    "howItWorksStep3Description": "OpenAI, Anthropic, Gemini tai muut täyttävät pyynnön välittömästi.",
    "getStartedIn30Seconds": "Aloita 30 sekunnissa",
    "getStartedDescription": "Asenna OmniRoute, määritä palveluntarjoajasi web-hallintapaneelin kautta ja aloita AI-pyyntöjen reitittäminen.",
    "installOmniRoute": "Asenna OmniRoute",
    "installStepDescription": "Suorita npx-komento käynnistääksesi palvelimen välittömästi",
    "openDashboard": "Avaa Dashboard",
    "openDashboardStepDescription": "Määritä palveluntarjoajat ja API-avaimet verkkokäyttöliittymän kautta",
    "routeRequests": "Reittipyynnöt",
    "routeRequestsStepDescription": "Osoita CLI-työkalusi osoitteeseen {endpoint}",
    "terminal": "terminaali",
    "copy": "Kopioi",
    "copied": "✓ Kopioitu",
    "startingOmniRoute": "OmniRoute aloitetaan...",
    "serverRunningOnLabel": "Palvelin käynnissä",
    "dashboardLabel": "Kojelauta",
    "readyToRoute": "Valmiina reittiin! ✓",
    "configureProvidersNote": "📝 Määritä palveluntarjoajat kojelaudassa tai käytä ympäristömuuttujia",
    "dataLocation": "Tietojen sijainti:",
    "dataLocationMacLinux": " macOS/Linux:",
    "dataLocationWindows": " Windows:",
    "product": "Tuote",
    "dashboardLink": "Kojelauta",
    "changelog": "Muutosloki",
    "resources": "Resurssit",
    "documentation": "Dokumentaatio",
    "npm": "NPM",
    "legal": "Laillinen",
    "mitLicense": "MIT-lisenssi",
    "footerTagline": "Tekoälyn sukupolven yhtenäinen päätepiste. Yhdistä, reititä ja hallitse tekoälypalveluntarjoajiasi helposti.",
    "copyright": "© {year} OmniRoute. Kaikki oikeudet pidätetään.",
    "flowToolClaudeCode": "Claude Code",
    "flowToolOpenAICodex": "OpenAI Codex",
    "flowToolCline": "Cline",
    "flowToolCursor": "Kursori",
    "flowProviderOpenAI": "OpenAI",
    "flowProviderAnthropic": "Antrooppinen",
    "flowProviderGemini": "Kaksoset",
    "flowProviderGithubCopilot": "GitHub Copilot",
    "interactiveDiagram": "Interaktiivinen kaavio näkyy työpöydällä",
    "ctaTitle": "Oletko valmis yksinkertaistamaan tekoäly-infrastruktuuriasi?",
    "ctaDescription": "Liity kehittäjien joukkoon, jotka virtaviivaistavat tekoälyintegraatiotaan OmniRouten avulla. Avoin lähdekoodi ja ilmainen aloittaa.",
    "startFree": "Aloita ilmaiseksi",
    "readDocumentation": "Lue dokumentaatio"
  },
  "docs": {
    "title": "Dokumentaatio",
    "quickStart": "Pika-aloitus",
    "deploymentGuides": "Käyttöönottooppaat",
    "features": "Ominaisuudet",
    "supportedProviders": "Tuetut palveluntarjoajat",
    "supportedProvidersToc": "Palveluntarjoajat",
    "commonUseCases": "Yleiset käyttötapaukset",
    "clientCompatibility": "Asiakasyhteensopivuus",
    "protocolsToc": "Protokollat",
    "apiReference": "API-viite",
    "managementApiReference": "Management API Reference",
    "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
    "method": "menetelmä",
    "path": "Polku",
    "notes": "Huomautuksia",
    "modelPrefixes": "Mallin etuliitteet",
    "prefix": "Etuliite",
    "troubleshooting": "Vianetsintä",
    "supportsChat": "Tukee sekä chat- että vastauspäätepisteitä.",
    "oauthAutoRefresh": "OAuth-yhteys automaattisella tunnuksen päivityksellä.",
    "fullStreaming": "Täysi suoratoistotuki kaikille malleille.",
    "docsLabel": "Asiakirjat",
    "docsHeroDescription": "Tekoälyyhdyskäytävä usean palveluntarjoajan LLM:ille. Yksi päätepiste OpenAI:lle, Anthropicille, Geminille, GitHub Copilotille, Claude Codelle, Cursorille ja yli 20 muulle palveluntarjoajalle.",
    "openDashboard": "Avaa Dashboard",
    "endpointPage": "Päätepistesivu",
    "github": "GitHub",
    "reportIssue": "Ilmoita ongelmasta",
    "onThisPage": "Tällä sivulla",
    "documentationVersion": "Dokumentaatio - v{version}",
    "quickStartStep1Title": "1. Asenna ja suorita",
    "quickStartStep1Prefix": "Juokse",
    "quickStartStep1Middle": "tai kloonaa GitHubista ja aja",
    "quickStartStep2Title": "2. Luo API-avain",
    "quickStartStep2Text": "Siirry kohtaan Päätepiste -> Rekisteröidyt avaimet. Luo yksi avain ympäristöä kohden.",
    "quickStartStep3Title": "3. Yhdistä palveluntarjoajat",
    "quickStartStep3Text": "Lisää palveluntarjoajan tilejä OAuth-kirjautumisen, API-avaimen tai vapaan tason automaattisen yhteyden avulla.",
    "quickStartStep4Title": "4. Aseta asiakaskannan URL-osoite",
    "quickStartStep4Prefix": "Osoita IDE- tai API-asiakkaasi",
    "quickStartStep4Suffix": "Käytä esimerkiksi palveluntarjoajan etuliitettä",
    "deploySetupTitle": "Asennusopas",
    "deploySetupText": "Vaiheittainen asennus, ympäristön määritys ja ensimmäinen läpikäynti OmniRoutelle.",
    "deployElectronTitle": "Electron Desktop",
    "deployElectronText": "Suorita OmniRoute alkuperäisenä työpöytäsovelluksena Windowsissa, macOS:ssä ja Linuxissa.",
    "deployDockerTitle": "Docker",
    "deployDockerText": "Konttikäyttöönotto Docker Composella; valmis tuotantopinot ja Kubernetes.",
    "deployVmTitle": "Virtuaalikone",
    "deployVmText": "Oma isäntä missä tahansa Linux-VM:ssä. Sisältää järjestelmäyksikön, lokin kierron ja varmuuskopiointityökalut.",
    "deployFlyTitle": "Fly.io",
    "deployFlyText": "Ota käyttöön Fly.io reunan suoritusaikana yhdellä fly.toml-tiedostolla ja yhdellä käyttöönottokomennolla.",
    "deployPwaTitle": "PWA",
    "deployPwaText": "Asenna OmniRoute progressiivisena verkkosovelluksena Android-, iOS- ja työpöytäselaimiin.",
    "deployTermuxTitle": "Termux (Android)",
    "deployTermuxText": "Run OmniRoute headless on Android via Termux. Access the dashboard from your mobile browser.",
    "featureRoutingTitle": "Usean palveluntarjoajan reititys",
    "featureRoutingText": "Reititä pyynnöt yli 30 tekoälypalveluntarjoajalle yhden OpenAI-yhteensopivan päätepisteen kautta. Tukee chat-, vastaus-, ääni- ja kuvasovellusliittymiä.",
    "featureCombosTitle": "Yhdistelmät ja tasapainotus",
    "featureCombosText": "Luo mallikomboja varaketjuilla ja tasapainotusstrategioilla: round-robin, prioriteetti, satunnainen, vähiten käytetty ja kustannusoptimoitu.",
    "featureUsageTitle": "Käytön ja kustannusten seuranta",
    "featureUsageText": "Reaaliaikainen tunnuksen laskenta, kustannuslaskenta palveluntarjoaja-/mallikohtaisesti ja yksityiskohtainen käyttöerittely API-avaimen ja tilin mukaan.",
    "featureAnalyticsTitle": "Analyticsin hallintapaneeli",
    "featureAnalyticsText": "Visuaalinen analytiikka, jossa on kaavioita pyynnöistä, tunnuksista, virheistä, viiveestä, kustannuksista ja mallin suosiosta ajan mittaan.",
    "featureHealthTitle": "Terveyden seuranta",
    "featureHealthText": "Live-terveystarkastukset, palveluntarjoajan tila, katkaisijatilat ja automaattinen nopeusrajan tunnistus eksponentiaalisella perääntymisellä.",
    "featureCliTitle": "CLI-työkalut",
    "featureCliText": "Hallitse IDE-määrityksiä, vie/tuo varmuuskopioita, etsi koodeksiprofiileja ja määritä asetuksia kojelaudalta.",
    "featureSecurityTitle": "Turvallisuus ja käytännöt",
    "featureSecurityText": "API-avaimen todennus, IP-suodatus, pikasyöttösuoja, toimialueen käytännöt, istunnon hallinta ja tarkastusloki.",
    "featureCloudSyncTitle": "Cloud Sync",
    "featureCloudSyncText": "Synkronoi kokoonpanosi Cloudflare Workersin kanssa, jotta voit käyttää etäkäyttöä salatuilla tunnistetiedoilla ja automaattisella virheensiirrolla.",
    "providersAcrossConnectionTypes": "{count} palveluntarjoajia kolmessa yhteystyypissä.",
    "manageProviders": "Hallinnoi palveluntarjoajia",
    "providersCount": "{count} palveluntarjoajat",
    "providerTypeFree": "Ilmainen taso",
    "providerTypeOAuth": "OAuth",
    "providerTypeApiKey": "API-avain",
    "useCaseSingleEndpointTitle": "Yksi päätepiste useille palveluntarjoajille",
    "useCaseSingleEndpointText": "Osoita asiakkaat yhteen perus-URL-osoitteeseen ja reititä mallien etuliite (esimerkiksi: gh/, cc/, kr/, openai/).",
    "useCaseFallbackTitle": "Vara- ja mallinvaihto komboilla",
    "useCaseFallbackText": "Luo yhdistelmämalleja Dashboardissa ja pidä asiakkaan kokoonpano vakaana, kun toimittajat vaihtuvat sisäisesti.",
    "useCaseUsageVisibilityTitle": "Käyttö, hinta ja virheenkorjauksen näkyvyys",
    "useCaseUsageVisibilityText": "Seuraa tunnuksia ja kustannuksia palveluntarjoajan, tilin ja API-avaimen mukaan Käyttö- ja Analytics-välilehdillä.",
    "clientCherryStudioTitle": "Cherry Studio",
    "baseUrlLabel": "Perus-URL-osoite",
    "chatEndpointLabel": "Keskustelun päätepiste",
    "modelRecommendationLabel": "Mallisuositus: selkeä etuliite",
    "clientCodexTitle": "Codex / GitHub Copilot -mallit",
    "clientCodexBullet1": "Käytä mallitunnuksia kanssa",
    "clientCodexBullet2": "Codex-perheen mallit reitittävät automaattisesti kohteeseen",
    "clientCodexBullet3": "Ei-Codex-mallit jatkavat toimintaansa",
    "clientCursorTitle": "Kohdistin IDE",
    "clientCursorBullet1": "Käytä",
    "clientCursorBullet1Suffix": "etuliite kohdistinmalleille.",
    "clientCursorBullet2": "OAuth-yhteys - kirjaudu sisään Palveluntarjoajat-sivulta.",
    "clientClaudeTitle": "Claude Code / Antigravitaatio",
    "clientClaudeBullet1Prefix": "Käytä",
    "clientClaudeBullet1Middle": "(Claude) tai",
    "clientClaudeBullet1Suffix": "(Antigravity) etuliite.",
    "clientWindsurfTitle": "Purjelautailu",
    "clientWindsurfBullet1": "Käytä OmniRoutea OpenAI-yhteensopivana perus-URL-osoitteena ja säilytä nimenomaiset tarjoajan etuliitteet determinististä reititystä varten.",
    "clientWindsurfBullet2": "Osoita mallit hakemistoon \"/v1/chat/completions\" yleistä liikennettä varten ja säilytä \"/v1/responses\" Codex-tyylisille virroille.",
    "clientWindsurfBullet3": "Käytä Dashboard -> CLI Tools -työkalua saadaksesi valmiin Windsurf-määritysoppaan.",
    "clientClineTitle": "Cline",
    "clientClineBullet1": "Cline toimii parhaiten eksplisiittisten tarjoajan/mallien etuliitteiden kanssa, joten reitittimen ei koskaan tarvitse arvata taustajärjestelmää.",
    "clientClineBullet2": "Käytä `/v1/chat/completions' yleisissä malleissa ja käytä samaa OmniRouten perus-URL-osoitetta uudelleen eri tileillä.",
    "clientClineBullet3": "Käytä Providers-hallintapaneelia OAuth/API-avaimen vahvistamiseen ennen Cline-ajonaikaisten ongelmien virheenkorjausta.",
    "clientKimiTitle": "Kimi koodaus",
    "clientKimiBullet1": "Käytä OmniRoutea vakaana perus-URL-osoitteena, kun kierrät tilejä tai palveluntarjoajan yhdistelmiä alla.",
    "clientKimiBullet2": "Valitse etuliitteisiä malleja koodausvirroissa, jotta varmistus ja kirjausketju pysyvät selkeänä.",
    "clientKimiBullet3": "Käytä `/v1/responses', kun haluat natiivi Responses-tyylisen reitityksen työkaluja käyttäville asiakkaille.",
    "protocolsTitle": "Protokollat: MCP & A2A",
    "protocolsDescription": "OmniRoute paljastaa kaksi toimintaprotokollaa OpenAI-yhteensopivien sovellusliittymien lisäksi: MCP työkalujen suorittamiseen ja A2A agenttien välisiin työnkulkuihin.",
    "protocolMcpTitle": "MCP (Model Context Protocol)",
    "protocolMcpDesc": "Käytä MCP over stdio -palvelua, jotta asiakkaat voivat löytää ja kutsua OmniRoute-työkaluja tarkastuksen näkyvyydellä.",
    "protocolMcpStep1": "Aloita MCP-siirto `omniroute --mcp`:lla.",
    "protocolMcpStep2": "Osoita MCP-asiakkaasi stdio-kuljetukseen.",
    "protocolMcpStep3": "Vahvista yhteys soittamalla `omniroute_get_health` ja `omniroute_list_combos`.",
    "protocolA2aTitle": "A2A (Agent2Agent)",
    "protocolA2aDesc": "Käytä A2A JSON-RPC:tä tehtävien lähettämiseen synkronisesti tai SSE-suoratoiston kautta.",
    "protocolA2aStep1": "Lue `/.well-known/agent.json` agentin löytämiseksi.",
    "protocolA2aStep2": "Lähetä `message/send` tai `message/stream` pyynnöt osoitteeseen `POST /a2a`.",
    "protocolA2aStep3": "Hallitse tehtävän elinkaarta `tasks/get`- ja `tasks/cancel`-toiminnolla.",
    "protocolTroubleshootingTitle": "Protokollan vianmääritys",
    "protocolTroubleshooting1": "Jos MCP-tila on offline-tilassa, varmista, että stdio-prosessi on käynnissä ja heartbeat-tiedosto päivittyy.",
    "protocolTroubleshooting2": "Jos A2A-tehtävät pysyvät `working`, tarkista `/api/a2a/tasks/:id` ja suoratoista tapahtumat päätteen tilasta.",
    "protocolTroubleshooting3": "Käytä `/dashboard/mcp` ja `/dashboard/a2a` toiminnan ohjaamiseen ja tarkastuksen näkyvyyteen.",
    "endpointChatNote": "OpenAI-yhteensopiva chat-päätepiste (oletus).",
    "endpointResponsesNote": "Responses API-päätepiste (Codex, o-sarja).",
    "endpointModelsNote": "Malliluettelo kaikille liitetyille palveluntarjoajille.",
    "endpointAudioNote": "Äänen transkriptio (Deepgram, AssemblyAI).",
    "endpointSpeechNote": "Tekstistä puheeksi luominen (ElevenLabs, OpenAI TTS).",
    "endpointEmbeddingsNote": "Tekstin upottaminen (OpenAI, Cohere, Voyage).",
    "endpointImagesNote": "Kuvan luominen (NanoBanana).",
    "endpointRewriteChatNote": "Uudelleenkirjoitusapuohjelma asiakkaille ilman /v1.",
    "endpointRewriteResponsesNote": "Uudelleenkirjoitusapuohjelma vastauksille ilman /v1.",
    "endpointRewriteModelsNote": "Uudelleenkirjoitusapuohjelma mallin etsinnässä ilman /v1:tä.",
    "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": "Käytä toimittajan etuliitettä ennen mallin nimeä reitittääksesi tietylle toimittajalle. Esimerkki:",
    "modelPrefixesDescriptionEnd": "reitit GitHub Copilotiin.",
    "provider": "Palveluntarjoaja",
    "type": "Kirjoita",
    "troubleshootingModelRouting": "Jos asiakas epäonnistuu mallin reitityksessä, käytä nimenomaista tarjoaja/malli (esimerkiksi: gh/gpt-5.1-codex).",
    "troubleshootingAmbiguousModels": "Jos saat epäselviä mallivirheitä, valitse toimittajan etuliite paljaan mallitunnuksen sijaan.",
    "troubleshootingCodexFamily": "Säilytä GitHub Codex -perheen mallien mallina muodossa gh/codex-model; reititin valitsee / vastaa automaattisesti.",
    "troubleshootingTestConnection": "Käytä Dashboard > Providers > Test Connection ennen testaamista IDE:istä tai ulkoisista asiakkaista.",
    "troubleshootingCircuitBreaker": "Jos palveluntarjoaja näyttää katkaisijan auki, odota jäähtymistä tai katso lisätietoja Terveys-sivulta.",
    "troubleshootingOAuth": "OAuth-palveluntarjoajat todenna uudelleen, jos tunnukset vanhenevat. Tarkista palveluntarjoajan kortin tilailmaisin.",
    "endpointCompletionsNote": "Vanha viimeistelypäätepiste tekstin luomista varten.",
    "endpointModerationsNote": "Sisällön moderointi ja turvallisuusluokitus.",
    "endpointRerankNote": "Asiakirjojen uudelleensijoitus noudon lisätylle sukupolvelle (Cohere, Jina).",
    "endpointSearchNote": "Verkkohaku 5 palveluntarjoajan kanssa (Serper, Brave, Exa, Tavily, Perplexity).",
    "endpointSearchAnalyticsNote": "Hakupyyntöjen analyysit ja mittarit.",
    "endpointVideoNote": "Videoiden luominen (ComfyUI, SD WebUI työnkulku).",
    "endpointMusicNote": "Musiikin luominen ComfyUI-työnkulkujen avulla.",
    "endpointMessagesNote": "Anthropic-natiiviviestien päätepiste.",
    "endpointCountTokensNote": "Laske tunnukset tietylle viestin hyötykuormille.",
    "endpointFilesNote": "Tiedoston lataus multimodaalista syötteitä varten.",
    "endpointBatchesNote": "Joukkokäsittely API-pyyntöjen eräkäsittely.",
    "endpointWsNote": "WebSocket-päätepiste reaaliaikaista suoratoistoa varten.",
    "mgmtProvidersListNote": "Luettele kaikki rekisteröidyt palveluntarjoajan yhteydet.",
    "mgmtProvidersCreateNote": "Luo uusi palveluntarjoajayhteys.",
    "mgmtProvidersUpdateNote": "Päivitä olemassa oleva palveluntarjoajayhteys.",
    "mgmtProvidersDeleteNote": "Poista palveluntarjoajan yhteys.",
    "mgmtProvidersTestNote": "Testaa palveluntarjoajan yhteyksiä ja todennusta.",
    "mgmtProvidersModelsNote": "Listaa saatavilla olevat mallit tietylle toimittajalle.",
    "mgmtSettingsGetNote": "Hae nykyiset sovellusasetukset.",
    "mgmtSettingsUpdateNote": "Päivitä sovellusasetukset.",
    "mgmtPayloadRulesGetNote": "Hanki hyötykuorman muunnossäännöt.",
    "mgmtPayloadRulesUpdateNote": "Päivitä hyötykuorman muunnossäännöt.",
    "mcpToolsTitle": "MCP-työkalut",
    "mcpToolsDescription": "OmniRoute paljastaa {count} työkalut Model Context Protocol -protokollan kautta agenttien orkestrointia varten.",
    "mcpToolsCount": "{count} työkaluja",
    "mcpToolsToc": "MCP-työkalut",
    "mcpToolsRoutingTitle": "Reititys ja löytäminen",
    "mcpToolsRoutingDesc": "Terveystarkastukset, yhdistelmähallinta, kiintiöiden seuranta, kustannusraportointi ja malliluetteloiden käyttö.",
    "mcpToolsOperationsTitle": "Toiminta ja strategia",
    "mcpToolsOperationsDesc": "Reittisimulaatio, budjettivartijat, strategian vaihtaminen, joustavuusprofiilit ja palveluntarjoajan mittarit.",
    "mcpToolsCacheTitle": "Välimuistin hallinta",
    "mcpToolsCacheDesc": "Tarkastele välimuistitilastoja ja tyhjennä semanttisia tai allekirjoitusvälimuistia.",
    "mcpToolsCompressionTitle": "Kompressiomoottorit",
    "mcpToolsCompressionDesc": "Määritä RTK/Brotli-pakkaus, vaihda moottoreita ja tarkasta pakkausanalytiikka yhdistelmällä.",
    "mcpToolsOneProxyTitle": "1 Välityspalvelin / Tunnelit",
    "mcpToolsOneProxyDesc": "Hallinnoi lähteviä välityspalvelimia, kierrä kotien IP-osoitteita ja tarkasta välityspalvelimen kunto.",
    "mcpToolsMemoryTitle": "Muisti",
    "mcpToolsMemoryDesc": "Etsi, lisää ja tyhjennä pysyviä keskustelumuistimerkintöjä.",
    "mcpToolsSkillsTitle": "Taidot",
    "mcpToolsSkillsDesc": "Listaa, ota käyttöön, suorita ja valvo mukautettuja taitojen suorituksia.",
    "featureAutoComboTitle": "Automaattinen yhdistelmä",
    "featureAutoComboText": "Luo automaattisesti optimoituja komboja yhdistettyjen palveluntarjoajien, käyttötapojen ja mallien ominaisuuksien perusteella.",
    "featureSearchTitle": "Verkkohaku",
    "featureSearchText": "Integroitu verkkohaku 5 palveluntarjoajan kanssa (Serper, Brave, Exa, Tavily, Perplexity), mukaan lukien analytiikka ja kustannusseuranta.",
    "featureMemoryTitle": "Muistijärjestelmä",
    "featureMemoryText": "Pysyvä keskustelumuisti, jossa poimiminen, injektio, haku ja yhteenveto istuntojen välillä.",
    "featureSkillsTitle": "Skills Framework",
    "featureSkillsText": "Laajennettava taitojärjestelmä, jossa on sisäänrakennetut ja mukautetut taidot, hiekkalaatikkosuoritus, pyyntöjen sieppaus ja kontekstin lisäys.",
    "featureAcpTitle": "Agentin viestintä",
    "featureAcpText": "Agent Communication Protocol (ACP) -rekisteri agenttien välisten työnkulkujen ja työkalujen organisoinnin hallintaan.",
    "protocolAcpTitle": "ACP (agenttiviestintä)",
    "protocolAcpDesc": "Rekisteröi ja hallitse agentteja ACP-rekisterin kautta agenttien välistä viestintää ja työkalujen jakamista varten.",
    "protocolAcpStep1": "Siirry kohtaan Dashboard → Agents nähdäksesi rekisteröidyt ACP-agentit.",
    "protocolAcpStep2": "Rekisteröi uusia agentteja ominaisuuksineen ja päätepistemäärityksineen.",
    "protocolAcpStep3": "Käytä CLI-työkaluja agentin viestintäkanavien määrittämiseen."
  },
  "legal": {
    "privacyPolicy": "Tietosuojakäytäntö",
    "termsOfService": "Palveluehdot",
    "providerConfigurations": "Palveluntarjoajan määritykset",
    "apiKeys": "API-avaimet",
    "usageLogs": "Käyttölokit",
    "applicationSettings": "Sovellusasetukset",
    "viewExportAnalytics": "Tarkastele ja vie käyttöanalytiikkaa",
    "clearHistory": "Tyhjennä käyttöhistoria milloin tahansa",
    "configureRetention": "Määritä lokin säilytyskäytännöt",
    "backupRestore": "Varmuuskopioi ja palauta tietokanta",
    "privacyMetadataTitle": "Tietosuojakäytäntö | OmniRoute",
    "privacyMetadataDescription": "OmniRoute AI API -välityspalvelimen reitittimen tietosuojakäytäntö.",
    "termsMetadataTitle": "Palveluehdot | OmniRoute",
    "termsMetadataDescription": "OmniRoute AI API -välityspalvelimen reitittimen käyttöehdot.",
    "backToHome": "Takaisin kotiin",
    "lastUpdated": "Viimeksi päivitetty: {date}",
    "policyLastUpdatedDate": "13. helmikuuta 2026",
    "listSeparator": "-",
    "questionsVisit": "Kysymyksiä? Vieraile meillä",
    "githubRepository": "GitHub-arkisto",
    "privacySection1Title": "1. Local-First Architecture",
    "privacySection1Text": "OmniRoute on suunniteltu paikalliseksi sovellukseksi. Kaikki tietojen käsittely ja tallennus tapahtuu kokonaan koneessasi. Ei ole keskitettyä palvelinta, joka kerää tietojasi.",
    "privacySection2Title": "2. Tallentamamme tiedot",
    "privacyDataStoredIn": "Seuraavat tiedot on tallennettu paikallisesti",
    "privacyDataProviderConfigurationsDesc": "yhteyden URL-osoitteet, palveluntarjoajan tyypit ja prioriteettiasetukset",
    "privacyDataApiKeysDesc": "salattu ja tallennettu paikallisesti AI-palveluntarjoajien todennusta varten",
    "privacyDataUsageLogsDesc": "pyyntöjen määrät, tunnuksen käyttö, mallien nimet, aikaleimat ja vastausajat",
    "privacyDataApplicationSettingsDesc": "teemaasetukset, reititysstrategia ja yhdistelmäkokoonpanot",
    "privacySection3Title": "3. Ei telemetriaa",
    "privacySection3Text": "OmniRoute ei kerää telemetria-, analytiikka- tai virheraportteja. Tietoja ei lähetetä meille tai millekään kolmannelle osapuolelle. Käyttömallisi, API-kutsusi ja kokoonpanosi pysyvät täysin yksityisinä.",
    "privacySection4Title": "4. Kolmannen osapuolen tekoälypalveluntarjoajat",
    "privacySection4Text": "Kun soitat API-kutsuja OmniRouten kautta, pyyntösi välitetään määrittämillesi tekoälypalveluntarjoajille (esimerkiksi OpenAI, Anthropic, Google). Näillä palveluntarjoajilla on omat tietosuojakäytäntönsä, jotka säätelevät, kuinka he käsittelevät tietojasi. Tarkista:",
    "privacyOpenAiPolicy": "OpenAI:n tietosuojakäytäntö",
    "privacyAnthropicPolicy": "Antrooppinen tietosuojakäytäntö",
    "privacyGooglePolicy": "Googlen tietosuojakäytäntö",
    "privacySection5Title": "5. Cloud Sync (valinnainen)",
    "privacySection5Text": "Jos otat valinnaisen pilvisynkronointiominaisuuden käyttöön, palveluntarjoajan määritykset ja API-avaimet voidaan lähettää määritettyyn pilvipäätepisteeseen. Tämä ominaisuus on oletuksena pois käytöstä ja vaatii nimenomaisen osallistumisen.",
    "privacySection6Title": "6. Kirjautuminen",
    "privacyLoggingIntro": "Pyyntölokit voidaan määrittää kojelaudan asetuksista. Voit:",
    "privacySection7Title": "7. Sinun oikeutesi",
    "privacySection7TextStart": "Koska kaikki tiedot tallennetaan paikallisesti, sinulla on täysi hallinta. Voit poistaa tietosi milloin tahansa poistamalla",
    "privacySection7TextEnd": "hakemistosta tai käyttämällä tietokannan varmuuskopiointi- ja palautustoimintoja kojelaudassa.",
    "termsSection1Title": "1. Yleiskatsaus",
    "termsSection1Text": "OmniRoute on paikallinen ensimmäinen AI API -välityspalvelin, joka toimii kokonaan koneessasi. Se reitittää pyynnöt useille tekoälypalveluntarjoajille kuormituksen tasapainottamisen, vikasietoisuuden ja käytön seurannan avulla.",
    "termsSection2Title": "2. Käyttäjän velvollisuudet",
    "termsResponsibilityApiKeys": "Olet yksin vastuussa omien API-avainten ja valtuustietojen hallinnasta kolmannen osapuolen AI-palveluntarjoajille (OpenAI, Anthropic, Google jne.).",
    "termsResponsibilityCompliance": "Sinun on noudatettava jokaisen tekoälyn palveluntarjoajan, jonka API:ta käytät OmniRouten kautta, käyttöehtoja.",
    "termsResponsibilitySecurity": "Olet vastuussa paikallisen OmniRoute-asennuksesi turvallisuudesta, mukaan lukien salasanan asettamisesta ja verkkoon pääsyn rajoittamisesta.",
    "termsSection3Title": "3. Kuinka se toimii",
    "termsSection3Text": "OmniRoute toimii välittäjänä. OmniRouteen lähetetyt API-kutsut käännetään ja välitetään määritetyille tekoälypalveluntarjoajille. OmniRoute ei muuta pyyntöjesi tai vastaustesi sisältöä tarvittavan protokollan käännöksen lisäksi.",
    "termsSection4Title": "4. Tietojen käsittely",
    "termsDataStoredLocally": "Kaikki tiedot tallennetaan paikallisesti koneellesi SQLite-tietokantaan.",
    "termsNoTransmission": "OmniRoute ei lähetä mitään tietoja ulkoisille palvelimille, ellet ota pilvisynkronointiominaisuuksia erikseen käyttöön.",
    "termsDataLocationText": "Käyttölokit, API-avaimet ja määritykset tallennetaan",
    "termsSection5Title": "5. Vastuuvapauslauseke",
    "termsSection5Text": "OmniRoute toimitetaan \"sellaisenaan\" ilman minkäänlaista takuuta. Emme ole vastuussa kustannuksista, jotka aiheutuvat API:n käytöstä, palveluhäiriöistä tai tietojen katoamisesta. Pidä aina varmuuskopiot asetuksistasi.",
    "termsSection6Title": "6. Avoin lähdekoodi",
    "termsSection6Text": "OmniRoute on avoimen lähdekoodin ohjelmisto. Voit vapaasti tarkastaa, muokata ja jakaa sitä sen lisenssiehtojen mukaisesti."
  },
  "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",
    "comparisonTitle": "CLI-työkalut vs. agenttikohteet – mitä eroa on?",
    "comparisonCliToolsLabel": "CLI Tools -sivu",
    "comparisonCliToolsTitle": "IDE lähettää pyyntöjä OmniRouten kautta",
    "comparisonCliToolsDesc": "Määritä Claude Code, Codex, Cursor ja muut IDE:t käyttämään OmniRoutea API-perus-URL-osoitteena. OmniRoute toimii välityspalvelimena, joka reitittää pyyntöjä määrittämillesi palveluntarjoajille.",
    "comparisonAgentsLabel": "Tämä sivu (Agent Targets)",
    "comparisonAgentsTitle": "OmniRoute lähettää pyynnöt paikallisiin CLI-työkaluihin",
    "comparisonAgentsDesc": "OmniRoute voi luoda paikallisia CLI-binaareja (claude, codex, goose) suorituksen taustaohjelmina. CLI-työkalu käsittelee pyynnön käyttämällä omaa todennustaan ​​ja palauttaa tuloksen.",
    "comparisonSummary": "Lyhyesti: CLI Tools = määrität työkalut osoittamaan OmniRoutea. Agent Targets = OmniRoute käyttää työkaluja päätepisteinä.",
    "agentUseCaseHint": "Voidaan käyttää suorituskohteena ACP-protokollan kautta",
    "flowDiagramClient": "Asiakassovellus",
    "flowDiagramClientDesc": "SDK, API tai ylempi palvelu",
    "flowDiagramOmniRoute": "OmniRoute",
    "flowDiagramOmniRouteDesc": "Vastaanottaa pyynnön ja valitsee kohteen",
    "flowDiagramSpawn": "Spawn-prosessi",
    "flowDiagramSpawnDesc": "Käynnistää CLI-binaarin stdion kautta",
    "flowDiagramCli": "CLI-agentti",
    "flowDiagramCliDesc": "Prosessit omalla tunnuksella/mallilla",
    "fingerprintSettingsHint": "CLI-sormenjälkien täsmäys (naamioi pyynnöt erityisiksi CLI-työkaluiksi) voidaan määrittää",
    "settingsRoutingLink": "Asetukset/reititys",
    "openSettings": "Asetukset",
    "copyRawUrlTitle": "Kopioi raaka-URL leikepöydälle",
    "copied": "Kopioitu!",
    "copyUrl": "Kopioi URL-osoite",
    "startHere": "Aloita tästä",
    "badgeNew": "Uusi",
    "viewOnGithub": "Katso GitHubissa",
    "howToUse": "Kuinka käyttää",
    "browseAllSkillsOnGithub": "Selaa kaikkia taitoja GitHubissa",
    "apiSkills": "API-taidot",
    "cliSkills": "CLI-taidot",
    "apiSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via REST / HTTP",
    "cliSkillsSubtitle": "__MISSING__:{count} skills — control OmniRoute via the omniroute terminal binary",
    "howToUseStep1": "__MISSING__:Click <bold>{copyUrl}</bold> on the skill you want your agent to know about.",
    "howToUseStep2": "__MISSING__:In your AI agent (Claude, Cursor, Cline…), say:",
    "howToUseStep2Code": "__MISSING__:Use the skill at [pasted-url]",
    "howToUseStep3": "__MISSING__:The agent fetches the SKILL.md and learns OmniRoute's API or CLI — no manual docs needed."
  },
  "cloudAgents": {
    "title": "Pilviagentit",
    "description": "Hallitse autonomisia koodausagentteja (Jules, Devin, Codex Cloud)",
    "loading": "Ladataan tehtäviä...",
    "aboutTitle": "Tietoja Cloud Agentsista",
    "aboutDescription": "Pilviagentit ovat AI-koodausavustajia, jotka voivat suorittaa tehtäviä itsenäisesti. Ne toimivat eri tavalla kuin paikalliset CLI-agentit – olet vuorovaikutuksessa heidän kanssaan OmniRouten API:n kautta.",
    "howItWorksTitle": "Miten se toimii:",
    "howItWorksDesc": "Luo tehtävä → Agentti analysoi ja ehdottaa suunnitelmaa → Sinä hyväksyt → Agentti suorittaa → Palautetut tulokset",
    "newTaskTitle": "Luo uusi tehtävä",
    "newTaskDescription": "Aloita uusi tehtävä pilviagentilla",
    "selectAgent": "Valitse Agent",
    "taskDescription": "Tehtävän kuvaus",
    "taskDescriptionPlaceholder": "Kuvaile mitä haluat välittäjän tekevän...",
    "startTask": "Aloita tehtävä",
    "tasks": "Tehtävät",
    "taskDetail": "Tehtävän yksityiskohdat",
    "noTasks": "Ei vielä tehtäviä. Aloita luomalla sellainen.",
    "noTasksTitle": "__MISSING__:No tasks yet",
    "noTasksDesc": "__MISSING__:Create your first task to get started.",
    "tasksTab": "__MISSING__:Tasks",
    "agentsTab": "__MISSING__:Agents",
    "settingsTab": "__MISSING__:Settings",
    "agentsEnabled": "__MISSING__:Enabled",
    "agentsDisabled": "__MISSING__:Disabled",
    "filterAllProviders": "__MISSING__:All Providers",
    "filterAll": "__MISSING__:All",
    "autoRefreshing": "__MISSING__:Auto-refreshing",
    "viewPR": "__MISSING__:View Pull Request",
    "connected": "__MISSING__:Connected",
    "notConnected": "__MISSING__:Not connected",
    "configure": "__MISSING__:Configure",
    "settingsTitle": "__MISSING__:Cloud Agent Settings",
    "settingsDesc": "__MISSING__:Configure local preferences for cloud agents.",
    "settingEnableAgents": "__MISSING__:Enable cloud agents",
    "settingEnableAgentsDesc": "__MISSING__:Allow OmniRoute to orchestrate autonomous coding agents.",
    "settingAutoPR": "__MISSING__:Auto-create PR",
    "settingAutoPRDesc": "__MISSING__:When a task is completed, automatically create a Pull Request with the changes.",
    "settingRequireApproval": "__MISSING__:Require plan approval",
    "settingRequireApprovalDesc": "__MISSING__:Always wait for manual approval before an agent executes a proposed plan.",
    "untitledTask": "Nimetön tehtävä",
    "created": "Luotu",
    "conversation": "Keskustelu",
    "result": "Tulos",
    "error": "Virhe",
    "planReady": "Suunnitelma valmis hyväksyttäväksi",
    "approvePlan": "Hyväksy suunnitelma",
    "rejectPlan": "Hylkää & Peruuta",
    "sendMessagePlaceholder": "Lähetä viesti agentille...",
    "cancel": "Peruuta",
    "delete": "Poista",
    "selectTaskPrompt": "Valitse tehtävä nähdäksesi tiedot",
    "statusPending": "Odottaa",
    "statusRunning": "Juoksemassa",
    "statusWaitingApproval": "Odottaa hyväksyntää",
    "statusCompleted": "Valmis",
    "statusFailed": "Epäonnistui",
    "statusCancelled": "Peruutettu",
    "repositoryName": "Arkiston nimi",
    "repositoryUrl": "Tietovaraston URL-osoite",
    "branch": "Haara"
  },
  "templateNames": {
    "simple-chat": "Yksinkertainen chat",
    "streaming": "Suoratoisto",
    "system-prompt": "Järjestelmäkehote",
    "thinking": "Ajatteleminen",
    "tool-calling": "Työkalun kutsuminen",
    "multi-turn": "Monikierros",
    "vision": "Visio",
    "schema-coercion": "Schema Coercion"
  },
  "templateDescriptions": {
    "simple-chat": "Peruskeskustelumalli järjestelmäviestillä",
    "streaming": "Malli vastausten suoratoistoon",
    "system-prompt": "Malli mukautetulla järjestelmäkehotteella",
    "thinking": "Malli perustelulla/ajattelulla",
    "tool-calling": "Malli työkalun/toiminnon kutsumiseen",
    "multi-turn": "Malli usean käännöksen keskusteluille",
    "vision": "Multimodaalinen malli, jossa on kuvansyöttö",
    "schema-coercion": "Strukturoitu tulos / JSON-skeeman valvonta"
  },
  "templatePayloads": {
    "simpleChat": {
      "system": "Olet avulias AI-avustaja.",
      "userGreeting": "Hei! Kuinka voin auttaa sinua tänään?"
    },
    "streaming": {
      "prompt": "Kirjoita tarina aiheesta"
    },
    "systemPrompt": {
      "question": "Mikä on elämän tarkoitus?",
      "systemInstruction": "Anna harkittu, filosofinen vastaus."
    },
    "thinking": {
      "question": "Selitä kvanttilaskenta"
    },
    "toolCalling": {
      "cityNameDescription": "Kaupungin nimi, jolle sää haetaan",
      "toolDescription": "Hanki sijainnin nykyinen sää",
      "userWeather": "Millainen sää on Tokiossa?"
    },
    "multiTurn": {
      "system": "Olet avulias avustaja.",
      "assistantExample": "Autan sinua siinä mielelläni.",
      "userInitial": "Tarvitsen apua",
      "userFollowUp": "Voitko tarkentaa sitä?"
    }
  },
  "cache": {
    "title": "Cache Management",
    "description": "Monitor and manage semantic response cache, hit rates, and token savings.",
    "refresh": "Refresh",
    "clearAll": "Clear All",
    "memoryEntries": "Memory Entries",
    "memoryEntriesSub": "In-memory LRU",
    "dbEntries": "DB Entries",
    "dbEntriesSub": "Persisted (SQLite)",
    "cacheHits": "Cache Hits",
    "cacheHitsSub": "of {total} total",
    "tokensSaved": "Tokens Saved",
    "tokensSavedSub": "Estimated from hits",
    "hitRate": "Hit Rate",
    "performance": "Cache Performance",
    "autoRefresh": "Auto-refreshes every {seconds}s",
    "hits": "Hits",
    "misses": "Misses",
    "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": "Cache cleared. {count} expired entries removed.",
    "clearError": "Failed to clear cache.",
    "unavailable": "Cache unavailable",
    "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.",
    "loadingCacheAria": "__MISSING__:Loading cache",
    "promptCache": "Prompt Cache (Provider-Side)",
    "semanticCache": "Semantic Cache",
    "promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.",
    "promptTrendDesc": "Hourly request volume, cache coverage, and cache read volume across the last 24 hours.",
    "cachedRequests": "Cached Requests",
    "cachedRequests24h": "Cached Requests (24h)",
    "cacheHitRate": "Cache Hit Rate",
    "cacheRate": "Cache Rate",
    "cacheRateDesc": "of total requests",
    "cachedTokens": "Cached Tokens",
    "cacheCreationTokens": "Cache Creation Tokens",
    "cacheMetrics": "Prompt Cache Metrics",
    "withCacheControl": "With Cache Control",
    "cachedTokensRead": "Cached Tokens (Read)",
    "cacheCreationWrite": "Cache Creation (Write)",
    "cacheReuseRatio": "Cache Reuse Ratio",
    "cacheReuseRatioDesc": "Cached tokens / Total input tokens",
    "estCostSaved": "Est. Cost Saved",
    "lastUpdated": "Last updated",
    "hoursTracked": "hours tracked",
    "busiestHour": "Busiest Hour",
    "peakCacheRate": "Peak Cache Rate",
    "trendHour": "Hour",
    "activityVolume": "Activity",
    "requestsShort": "reqs",
    "inputShort": "In",
    "cachedShort": "Cached",
    "writeShort": "Write",
    "resetting": "Resetting...",
    "resetMetrics": "Reset Metrics",
    "byProvider": "Breakdown by Provider",
    "providerCacheRateDesc": "Each provider exposes total input tokens, cache read tokens, and cache write tokens so you can verify the reuse ratio against raw totals.",
    "provider": "Provider",
    "requests": "Requests",
    "inputTokens": "Input Tokens",
    "cachedTokensCol": "Cached",
    "cacheCreation": "Creation",
    "trend24h": "Cache Trend (24h)",
    "peakCached": "Peak cached",
    "cached": "Cached",
    "overview": "Overview",
    "tableProvider": "__MISSING__:Provider",
    "tableModel": "__MISSING__:Model",
    "performanceTitle": "__MISSING__:Performance",
    "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",
    "reasoningCache": "Päättelyn uusinta",
    "reasoningCacheDesc": "Säilyttää malliajattelun monikierroksisia työkalukutsuvirtoja varten",
    "reasoningEntries": "Aktiiviset merkinnät",
    "reasoningReplayRate": "Toistonopeus",
    "reasoningReplays": "Toistoja yhteensä",
    "reasoningCharsCached": "Välimuistissa olevat merkit",
    "reasoningMisses": "Välimuisti puuttuu",
    "reasoningByProvider": "Palveluntarjoajan toimesta",
    "reasoningByModel": "Mallin mukaan",
    "reasoningRecentEntries": "Viimeaikaiset merkinnät",
    "reasoningToolCallId": "Työkalun kutsutunnus",
    "reasoningChars": "Hahmot",
    "reasoningAge": "Ikä",
    "reasoningView": "Näytä",
    "reasoningDetail": "Päättelysisältö",
    "reasoningBehavior": "Käyttäytyminen",
    "reasoningBehaviorCapture": "Kaappaa argumentointisisällön suoratoistovastauksista",
    "reasoningBehaviorReplay": "Ruiskuttaa uudelleen seuraavalla käännöksellä, kun asiakas jättää sen pois",
    "reasoningBehaviorFallback": "Muisti ensin SQLite-varaustoiminnolla kaatumisista palautumista varten",
    "reasoningBehaviorTtl": "TTL: 2 tuntia | Enimmäismäärä: 2 000 (muisti)",
    "reasoningBehaviorModels": "Tuetut: DeepSeek, Kimi, Qwen-Thinking, GLM",
    "reasoningClearAll": "Tyhjennä päättelyvälimuisti",
    "reasoningClearSuccess": "Tyhjennettiin {count} päättelyvälimuistin merkintää",
    "reasoningClearError": "Päättelyvälimuistin tyhjennys epäonnistui",
    "reasoningNoData": "Välimuistissa ei ole vielä perusteluja. Merkinnät tulevat näkyviin, kun ajattelumallit käyttävät työkalukutsua.",
    "cachePerformanceRetry": "Yritä uudelleen",
    "cachePerformanceHitRate": "Osumaprosentti",
    "cachePerformanceAvgLatency": "Keskimääräinen viive (ms)",
    "cachePerformanceP95Latency": "p95 Latenssi (ms)",
    "retry": "Yritä uudelleen",
    "reasoningAvgChars": "Keskim. merkit",
    "tableShare": "__MISSING__:Share",
    "justNow": "__MISSING__:just now",
    "minutesAgo": "__MISSING__:{minutes}m ago",
    "hoursAgo": "__MISSING__:{hours}h ago",
    "daysAgo": "__MISSING__:{days}d ago",
    "entries": "Entries"
  },
  "proxyConfigModal": {
    "levelGlobal": "Maailmanlaajuinen",
    "levelProvider": "Palveluntarjoaja",
    "levelCombo": "Yhdistelmä",
    "levelKey": "Avain",
    "levelDirect": "Suora (ei välityspalvelinta)",
    "titleGlobal": "Yleiset välityspalvelimen asetukset",
    "titleLevel": "{level} Välityspalvelin – {label}",
    "loading": "Ladataan välityspalvelimen asetuksia...",
    "inheritingFrom": "Perinnöstä",
    "source": "lähde",
    "savedProxy": "Välityspalvelin tallennettu",
    "custom": "Mukautettu",
    "selectSavedProxyPlaceholder": "Valitse tallennettu välityspalvelin...",
    "proxyType": "Välityspalvelimen tyyppi",
    "host": "Isäntä",
    "hostPlaceholder": "1.2.3.4 tai proxy.example.com",
    "port": "Portti",
    "authOptional": "Todennus (valinnainen)",
    "username": "Käyttäjätunnus",
    "usernamePlaceholder": "Käyttäjätunnus",
    "password": "Salasana",
    "passwordPlaceholder": "Salasana",
    "connected": "Yhdistetty",
    "ip": "IP:",
    "connectionFailed": "Yhteys epäonnistui",
    "testConnection": "Testaa yhteys",
    "clear": "Selkeä",
    "cancel": "Peruuta",
    "save": "Tallenna",
    "errorSelectSavedProxy": "Valitse ensin tallennettu välityspalvelin.",
    "errorSelectProxyFirst": "Valitse ensin välityspalvelin.",
    "errorProxyNotFound": "Valittua välityspalvelinta ei löydy.",
    "errorClearSavedProxy": "Tallennetun välityspalvelimen tyhjennys epäonnistui",
    "errorSaveProxy": "Välityspalvelimen asetusten tallentaminen epäonnistui",
    "errorClearProxy": "Välityspalvelimen määrityksen tyhjennys epäonnistui",
    "errorSocks5Hidden": "SOCKS5 on määritetty, mutta piilotettu, koska NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false."
  },
  "oauthModal": {
    "title": "Yhdistä {providerName}",
    "waiting": "Odotetaan lupaa",
    "completeAuthInPopup": "Täydellinen valtuutus ponnahdusikkunassa.",
    "popupClosedHint": "Jos ponnahdusikkuna sulkeutuu ilman uudelleenohjausta (esim. Qoder), tämä valintaikkuna vaihtaa automaattisesti manuaaliseen URL-osoitteen syöttötilaan.",
    "popupBlocked": "Ponnahdusikkuna estetty? Kirjoita URL manuaalisesti",
    "deviceCodeVisitUrl": "Siirry alla olevaan URL-osoitteeseen ja kirjoita koodi:",
    "deviceCodeVerificationUrl": "Vahvistus-URL",
    "deviceCodeYourCode": "Sinun koodisi",
    "deviceCodeWaiting": "Odotetaan valtuutusta...",
    "googleOAuthWarning": "Etäkäyttö + Google OAuth: Oletuskirjautumistiedot hyväksyvät vain uudelleenohjaukset osoitteeseen <code>localhost</code>. Valtuutuksen jälkeen selaimesi yrittää avata <code>localhost</code> – kopioi koko URL-osoite ja liitä se alle. Jos haluat käyttää täysin etäkäyttöä ilman tätä manuaalista vaihetta, <a>määritä omat OAuth-kirjautumistietosi</a>.",
    "remoteAccessInfo": "Etäkäyttö: Koska käytät OmniRoutea etänä, valtuutuksen jälkeen näet virhesivun (paikallista isäntäkonetta ei löydy). Tämä on normaalia – kopioi koko URL-osoite selaimesi osoitepalkista ja liitä se alle.",
    "step1OpenUrl": "Vaihe 1: Avaa tämä URL-osoite selaimessasi",
    "copy": "Kopioi",
    "step2PasteCallback": "Vaihe 2: Liitä takaisinsoitto-URL-osoite tai valtuutuskoodi tähän",
    "step2Hint": "Liitä koko takaisinsoitto-URL-osoite valtuutuksen jälkeen. Claude Codelle ja Clinelle voit myös liittää todennuskoodin suoraan, esim. <code>code#state</code>.",
    "connect": "Yhdistä",
    "cancel": "Peruuta",
    "success": "Yhteys onnistui!",
    "successMessage": "{providerName} -tilisi on yhdistetty.",
    "done": "Valmis",
    "error": "Yhteys epäonnistui",
    "tryAgain": "Yritä uudelleen"
  },
  "cursorAuthModal": {
    "title": "Yhdistä kohdistin IDE",
    "autoDetecting": "Tunnistetaan automaattisesti...",
    "readingFromCursor": "Lukeminen Cursor IDE:stä tai cursor-agentista",
    "tokensAutoDetected": "Tokenit tunnistettiin automaattisesti Cursor IDE:stä!",
    "cursorNotDetected": "Kohdistimen IDE:tä ei havaittu. Liitä tunnus manuaalisesti.",
    "accessToken": "Käyttöoikeustunnus",
    "required": "*",
    "accessTokenPlaceholder": "Käyttöoikeustunnus täytetään automaattisesti...",
    "machineId": "Koneen tunnus",
    "optional": "(valinnainen)",
    "machineIdPlaceholder": "Konetunnus täytetään automaattisesti...",
    "importing": "Tuodaan...",
    "importToken": "Tuo tunnus",
    "cancel": "Peruuta",
    "errorAutoDetect": "Tunnuksia ei voi tunnistaa automaattisesti",
    "errorAutoDetectFailed": "Tunnusten automaattinen tunnistus epäonnistui",
    "errorEnterToken": "Anna käyttöoikeustunnus",
    "errorImportFailed": "Tuonti epäonnistui"
  },
  "pricingModal": {
    "title": "Hinnoitteluasetukset",
    "loading": "Ladataan hintatietoja...",
    "pricingRatesFormat": "Hinnoitteluhinnastomuoto",
    "ratesDescription": "Kaikki hinnat ovat <strong>dollareita miljoonaa rahaketta kohden</strong> ($/1 milj. tokenia). Esimerkki: Syöttönopeus 2,50 tarkoittaa 2,50 $ per 1 000 000 syöttötunnusta.",
    "model": "Malli",
    "input": "Syöte",
    "output": "Lähtö",
    "cached": "Välimuistissa",
    "reasoning": "Päättely",
    "cacheCreation": "Välimuistin luominen",
    "noPricingData": "Hintatietoja ei ole saatavilla",
    "resetToDefaults": "Palauta oletusasetukset",
    "cancel": "Peruuta",
    "saving": "Tallennetaan...",
    "saveChanges": "Tallenna muutokset",
    "resetConfirm": "Palautetaanko kaikki hinnat oletusarvoihin? Tätä ei voi kumota.",
    "errorSaveFailed": "Hinnoittelun tallentaminen epäonnistui",
    "errorResetFailed": "Hinnoittelun nollaaminen epäonnistui"
  },
  "proxyRegistry": {
    "title": "Title",
    "description": "Description",
    "importLegacy": "Import Legacy",
    "bulkAssign": "Bulk Assign",
    "addProxy": "Add Proxy",
    "loading": "Loading",
    "noProxies": "No Proxies",
    "tableName": "Table Name",
    "tableEndpoint": "Table Endpoint",
    "tableStatus": "Table Status",
    "tableHealth": "Table Health",
    "tableUsage": "Table Usage",
    "tableActions": "Table Actions",
    "test": "Test",
    "edit": "Edit",
    "delete": "Delete",
    "modalCreateTitle": "Modal Create Title",
    "modalEditTitle": "Modal Edit Title",
    "labelName": "Label Name",
    "labelType": "Kirjoita",
    "labelHost": "Isäntä",
    "labelPort": "Portti",
    "labelUsername": "Käyttäjätunnus",
    "labelPassword": "Salasana",
    "labelRegion": "Alue",
    "labelStatus": "Tila",
    "labelNotes": "Huomautuksia",
    "usernamePlaceholderEdit": "Jätä tyhjäksi, jos haluat säilyttää nykyisen käyttäjänimen",
    "passwordPlaceholderEdit": "Jätä tyhjäksi, jos haluat säilyttää nykyisen salasanan",
    "statusActive": "Aktiivinen",
    "statusInactive": "Ei-aktiivinen",
    "cancel": "Peruuta",
    "save": "Tallenna",
    "bulkModalTitle": "Joukkovälityspalvelimen määritys",
    "bulkLabelScope": "Laajuus",
    "bulkLabelProxy": "Välityspalvelin",
    "bulkClearAssignment": "(Tyhjennä tehtävä)",
    "bulkLabelScopeIds": "Laajuustunnukset (pilkulla tai rivinvaihdolla erotettuna)",
    "bulkScopeIdsPlaceholder": "tarjoaja-openai,tarjoaja-antrooppinen",
    "bulkApply": "Käytä",
    "labelScope": "__MISSING__:Scope",
    "labelProxy": "__MISSING__:Proxy",
    "scopeGlobal": "__MISSING__:global",
    "scopeProvider": "__MISSING__:provider",
    "scopeAccount": "__MISSING__:account",
    "scopeCombo": "__MISSING__:combo",
    "bulkImportErrorMissingName": "NAME puuttuu",
    "bulkImportErrorMissingHost": "HOST puuttuu",
    "bulkImportErrorInvalidPort": "Virheellinen PORT (täytyy olla 1-65535)",
    "bulkImportErrorInvalidType": "Virheellinen TYPE (käytä http, https tai socks5)",
    "bulkImportErrorInvalidStatus": "Virheellinen STATUS (käytä aktiivista tai ei-aktiivista)",
    "errorLoadFailed": "Error Load Failed",
    "errorNameHostRequired": "Error Name Host Required",
    "errorSaveFailed": "Error Save Failed",
    "errorDeleteFailed": "Error Delete Failed",
    "errorForceDeleteConfirm": "Error Force Delete Confirm",
    "errorMigrateFailed": "Error Migrate Failed",
    "errorBulkFailed": "Error Bulk Failed",
    "success": "✓",
    "failure": "✗",
    "failed": "Failed",
    "successRate": "{rate}% onnistumista",
    "avgLatency": "{latency}ms keskimäärin",
    "assignmentsCount": "{count} tehtävää",
    "noData": "No Data",
    "testSuccess": "✓ {ip}",
    "testLatency": "{latency}ms",
    "testFailure": "✗ {error}",
    "bulkImport": "Joukkotuonti",
    "bulkImportTitle": "Joukkotuonti välityspalvelimet",
    "bulkImportDescription": "Liitä välityspalvelinprofiilit käyttämällä putkieroteltua muotoa. Yksi välityspalvelin riviä kohden. Nykyiset välityspalvelimet (sama isäntä + portti) päivitetään.",
    "bulkImportParse": "Jäsentää",
    "bulkImportImport": "Tuo {count} välityspalvelimet",
    "bulkImportImporting": "Tuodaan...",
    "bulkImportParsed": "{count} välityspalvelinta jäsennetty",
    "bulkImportSkipped": "{count} riviä ohitettu",
    "bulkImportParseErrors": "{count} virheitä",
    "bulkImportNoValidEntries": "Kelvollisia merkintöjä ei löytynyt. Tarkista muoto ja yritä uudelleen.",
    "bulkImportSuccess": "Tuonti valmis: {created} luotu, {updated} päivitetty, {failed} epäonnistui",
    "bulkImportErrorLine": "Rivi {line}: {reason}",
    "bulkImportMaxExceeded": "Enintään 100 välityspalvelinta tuontia kohden",
    "bulkImportPreview": "Esikatselu",
    "clearAssignment": "(selkeä tehtävä)",
    "bulkProxyAssignment": "Joukkovälityspalvelimen määritys"
  },
  "playground": {
    "title": "Title",
    "description": "Description",
    "endpoint": "Endpoint",
    "provider": "Provider",
    "model": "Model",
    "accountKey": "Account Key",
    "autoAccounts": "Automaattinen ({count} tiliä)",
    "noAccounts": "No Accounts",
    "send": "Send",
    "cancel": "Cancel",
    "audioFile": "Audio File",
    "attachImages": "Attach Images",
    "multipartFormData": "Multipart Form Data",
    "upToImages": "Up To Images",
    "selectAudioFile": "Select Audio File",
    "clearAll": "Clear All",
    "request": "Request",
    "response": "Response",
    "transcription": "Transcription",
    "copy": "Copy",
    "resetToDefault": "Reset To Default",
    "downloadAudio": "Download Audio",
    "copyText": "Copy Text",
    "transcriptionHint": "Transcription Hint",
    "imagesGenerated": "Luotiin {count} kuvaa",
    "generatedImage": "Luotu kuva {index}",
    "save": "Save",
    "endpointOptions": {
      "chat": "Chat",
      "responses": "Responses",
      "images": "Images",
      "embeddings": "Embeddings",
      "speech": "Speech",
      "transcription": "Transcription",
      "video": "Video",
      "music": "Music",
      "rerank": "Rerank",
      "search": "Search"
    },
    "conversationalChat": "Keskustelukeskustelu",
    "clearChat": "Tyhjennä chat",
    "typeMessagePlaceholder": "Kirjoita viesti... (Vaihto+Enter uudelle riville)",
    "tabChat": "Chat",
    "tabCompare": "Compare",
    "tabApi": "API",
    "tabBuild": "Build",
    "configPane": "Config",
    "systemPrompt": "System prompt",
    "systemPromptPlaceholder": "You are a helpful assistant.",
    "modelPlaceholder": "e.g. openai/gpt-4o",
    "endpointLabel": "Endpoint",
    "parametersLabel": "Parameters",
    "collapseConfig": "Collapse config pane",
    "expandConfig": "Expand config pane",
    "temperature": "Temperature",
    "maxTokens": "Max tokens",
    "topP": "Top-p",
    "presencePenalty": "Presence penalty",
    "frequencyPenalty": "Frequency penalty",
    "seedPlaceholder": "Random (leave empty)",
    "presetsLabel": "Presets",
    "loadPreset": "Load preset",
    "savePreset": "Save preset",
    "noPresets": "No presets",
    "presetNamePlaceholder": "Preset name",
    "savingPreset": "Saving…",
    "nameRequired": "Name is required",
    "failedToSavePreset": "Failed to save preset",
    "improvePrompt": "Improve prompt",
    "improvingPrompt": "Improving…",
    "improvePromptTitle": "Improve your prompt with AI",
    "setModelFirst": "Set a model first",
    "improveQuotaWarning": "This will consume quota from the model configured in Config.",
    "improveConfirm": "Improve",
    "exportCode": "Export code",
    "exportCodeTitle": "Export Code",
    "noStateToExport": "No playground state available to export.",
    "copyCode": "Copy",
    "copiedCode": "Copied!",
    "addModel": "+ Add model",
    "runAll": "Run all",
    "cancelAll": "Cancel all",
    "maxColumnsReached": "Maximum {max} columns",
    "modelPlaceholderCompare": "Model (Cmd+K)…",
    "ttft": "TTFT",
    "tps": "TPS",
    "metricsDisclaimer": "client-side estimate",
    "tokensLabel": "Tokens",
    "costLabel": "Cost",
    "costEstimated": "(estimated)",
    "toolsLabel": "Tools",
    "addTool": "Add tool",
    "toolNamePlaceholder": "Function name",
    "toolDescPlaceholder": "Description (optional)",
    "toolParamsInvalid": "Parameters must be valid JSON",
    "structuredOutputLabel": "Structured Output",
    "enableJsonMode": "Enable JSON mode",
    "disableJsonMode": "Disable JSON mode",
    "invalidJson": "Invalid JSON",
    "running": "Running…",
    "runLabel": "Run",
    "enterToolResult": "Enter tool result…"
  },
  "miniPlayground": {
    "endpoint": "__MISSING__:Endpoint",
    "apiKey": "__MISSING__:API Key",
    "model": "__MISSING__:Model",
    "voice": "__MISSING__:Voice",
    "speed": "__MISSING__:Speed",
    "input": "__MISSING__:Input",
    "url": "__MISSING__:URL",
    "format": "__MISSING__:Format",
    "depth": "__MISSING__:Depth",
    "copyCurl": "__MISSING__:Copy cURL",
    "copied": "__MISSING__:Copied!",
    "run": "__MISSING__:Run",
    "running": "__MISSING__:Running...",
    "response": "__MISSING__:Response",
    "tunnel": "__MISSING__:Tunnel",
    "send": "__MISSING__:Send",
    "selectKey": "__MISSING__:Select key",
    "testLabel": "__MISSING__:Test",
    "expandTest": "__MISSING__:Expand test",
    "collapseTest": "__MISSING__:Collapse test",
    "revealKey": "__MISSING__:Reveal key",
    "hideKey": "__MISSING__:Hide key",
    "download": "__MISSING__:Download",
    "play": "__MISSING__:Play",
    "query": "__MISSING__:Query",
    "numResults": "__MISSING__:Max results",
    "prompt": "__MISSING__:Prompt",
    "size": "__MISSING__:Size",
    "duration": "__MISSING__:Duration",
    "question": "__MISSING__:Question",
    "audioFile": "__MISSING__:Audio file",
    "noKeysFound": "__MISSING__:No API keys found. Add one in the Keys section.",
    "exampleLabel": "__MISSING__:Example",
    "latency": "__MISSING__:{ms}ms",
    "statsLine": "__MISSING__:{ms}ms · {tokensIn} in / {tokensOut} out tokens"
  },
  "requestLogger": {
    "recording": "Recording",
    "paused": "Paused",
    "pipelineLogsOn": "Pipeline logs on",
    "pipelineLogsOff": "Pipeline logs off",
    "updatingPipelineLogs": "Updating pipeline logs...",
    "updatePipelineFailed": "Failed to update pipeline logging",
    "capturePipeline": "Capture pipeline payloads for new requests",
    "searchPlaceholder": "Search models, providers, accounts, API keys, combos...",
    "allProviders": "All providers",
    "allModels": "All models",
    "allAccounts": "All accounts",
    "allApiKeys": "All API keys",
    "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",
    "sortLogs": "Sort logs",
    "refresh": "Refresh",
    "columnsLabel": "Columns",
    "cacheSem": "SEM",
    "cacheUp": "UP",
    "semantic": "Semantic",
    "upstream": "Upstream",
    "semanticCacheHit": "Semantic cache hit (served by OmniRoute)",
    "upstreamResponse": "Upstream provider response",
    "noApiKey": "No API key",
    "requestedRoutedTitle": "Requested {requested}, routed as {routed}",
    "statusFilters": {
      "all": "All",
      "error": "Errors",
      "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",
      "compressed": "Puristus",
      "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}."
  },
  "proxyLogger": {
    "filterAll": "All",
    "filterErrors": "Errors",
    "filterSuccess": "Success",
    "filterTimeout": "Timeout",
    "colStatus": "Status",
    "colProxy": "Proxy",
    "colTls": "TLS",
    "colType": "Type",
    "colLevel": "Level",
    "colProvider": "Provider",
    "colTarget": "Target",
    "colLatency": "Latency",
    "colClientIp": "Client IP",
    "colTime": "Time",
    "recording": "Recording",
    "paused": "Paused",
    "searchPlaceholder": "Search host, provider, target, IP...",
    "allTypes": "All Types",
    "allLevels": "All Levels",
    "allProviders": "All Providers",
    "total": "total",
    "ok": "OK",
    "err": "ERR",
    "timeoutShort": "TMO",
    "direct": "direct",
    "newest": "Newest",
    "oldest": "Oldest",
    "latencyDesc": "Latency ↓",
    "latencyAsc": "Latency ↑",
    "refresh": "Refresh",
    "columns": "Columns",
    "loadingProxyLogs": "Loading proxy logs...",
    "noProxyLogs": "No proxy logs yet. Configure proxies and make API calls to see them here.",
    "noMatchingLogs": "No logs match the current filters.",
    "tlsFingerprint": "Chrome 124 TLS Fingerprint"
  },
  "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"
  },
  "runtime": {
    "title": "Runtime",
    "description": "Realtime observability — 3-layer resilience + sessions + quota alerts",
    "pause": "Pause",
    "resume": "Resume",
    "refreshNow": "Refresh now",
    "kpiSessions": "Sessions",
    "kpiCircuits": "Circuits",
    "kpiCooldowns": "Cooldowns",
    "kpiLockouts": "Lockouts",
    "hintStickyBound": "{count} sticky-bound",
    "hintRecovering": "{count} recovering",
    "hintAllHealthy": "all healthy",
    "hintOpen": "open",
    "hintConnsCooling": "connections cooling",
    "hintModelsBlocked": "models blocked",
    "resilienceTitle": "3-Layer Resilience",
    "resilienceSubtitle": "Mirrors the documented resilience model",
    "providersHealthy": "{percent}% providers healthy",
    "layer": "Layer {n}",
    "layer1Title": "Provider Circuit Breakers",
    "layer1Desc": "Stop traffic to providers failing at the upstream level",
    "layer2Title": "Connection Cooldowns",
    "layer2Desc": "Skip one bad account/key; other connections keep serving",
    "layer3Title": "Model Lockouts",
    "layer3Desc": "Per-model rate-limit locks; same connection still serves other models",
    "badgeAffectedOf": "{affected} of {total} affected",
    "badgeCooling": "{count} cooling",
    "badgeLocked": "{count} locked",
    "emptyCircuits": "No circuit breakers active yet",
    "emptyCooldowns": "No connection cooldowns active",
    "emptyLockouts": "No model lockouts",
    "moreCooldowns": "+{count} more cooldowns",
    "moreLockouts": "+{count} more lockouts",
    "feedTitle": "Live Feed",
    "feedSubtitle": "Last {count} events",
    "feedFilterAll": "All",
    "feedFilterCircuits": "Circuits",
    "feedFilterCooldowns": "Cooldowns",
    "feedFilterLockouts": "Lockouts",
    "feedFilterSessions": "Sessions",
    "feedFilterQuotas": "Quotas",
    "feedClear": "Clear",
    "feedEmptyWaiting": "Waiting for events... (polled every 5s)",
    "feedEmptyFiltered": "No events match this filter",
    "sessionsTitle": "Active Sessions",
    "sessionsSubtitle": "Sticky-bound request fingerprints (live)",
    "sessionsActive": "{count} active",
    "sessionsEmptyTitle": "No active sessions",
    "sessionsEmptyHint": "Sessions appear as requests flow through the proxy",
    "tblSession": "Session",
    "tblAge": "Age",
    "tblIdle": "Idle",
    "tblReqs": "Reqs",
    "tblBoundTo": "Bound to",
    "topApiKeys": "Top API keys",
    "quotaMonitorsTitle": "Quota Monitors",
    "quotaMonitorsSubtitle": "Live quota state per account window",
    "openQuota": "Open Quota",
    "allQuotasHealthy": "All quotas healthy",
    "statusExhausted": "EXHAUSTED",
    "statusAlerting": "ALERTING",
    "statusError": "ERROR",
    "moreSuffix": "+{count} more"
  },
  "quotaShare": {
    "title": "Quota Sharing",
    "description": "Share provider quotas across API keys with % limits",
    "newPool": "New pool",
    "betaTitle": "Beta — UI preview.",
    "betaDescription": "Configuration is saved in localStorage (not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split; real enforcement will land in a future iteration with DB persistence and upstream call interception.",
    "kpiActivePools": "Active pools",
    "kpiKeysAllocated": "Keys allocated",
    "kpiAvgUnallocated": "Avg unallocated",
    "kpiProvidersWithQuota": "Providers w/ quota",
    "emptyTitle": "No pools configured",
    "emptyDescription": "Create a pool to assign API keys to share a provider's quota window with % allocations.",
    "loading": "Loading…",
    "removePool": "Remove pool",
    "removeConfirm": "Remove this pool?",
    "pool": "Pool",
    "used": "used",
    "allocationsCount": "Allocations ({count})",
    "allocatedFree": "{allocated}% allocated · {free}% free",
    "noAllocations": "No keys allocated yet",
    "capLabel": "cap {value}",
    "notTrackedYet": "(not tracked yet)",
    "policy": "Policy",
    "policyHard": "hard",
    "policySoft": "soft",
    "policyBurst": "burst",
    "policyHardHint": "Block when key exhausts allocation",
    "policySoftHint": "Allow overflow, alert only",
    "policyBurstHint": "Allow burst into free pool",
    "editAllocations": "Edit allocations",
    "newPoolTitle": "New quota pool",
    "providerConnection": "Provider connection (account)",
    "selectConnection": "Select a connection…",
    "noEligibleConnections": "No connections with quota data. Refresh from /dashboard/quota first.",
    "quotaWindow": "Quota window",
    "selectWindow": "Select a window…",
    "alreadyUsedSuffix": "(already used)",
    "windowReset": "Reset",
    "duplicatePoolError": "A pool for this connection + window already exists",
    "cancel": "Cancel",
    "createPool": "Create pool",
    "editTitle": "Edit allocations",
    "noKeysAdded": "No keys allocated. Add one below.",
    "totalLabel": "Total: {percent}%",
    "totalExceeded": "⚠ exceeds 100%",
    "addKey": "+ Add key…",
    "equalSplit": "Equal split",
    "save": "Save allocations",
    "betaPreviewLabel": "Beta – käyttöliittymän esikatselu.",
    "betaConfigSavedPrefix": "Asetukset on tallennettu",
    "betaConfigSavedSuffix": "(ei vielä säilynyt palvelimella). Pyyntökohtainen enimmäismäärän valvontaa ei ole vielä kytketty välityspalvelimeen. Tämän näytön avulla voit suunnitella ja visualisoida kiintiöjaon; todellinen täytäntöönpano laskeutuu tulevaan iteraatioon DB:n pysyvyyden ja ylävirran puhelujen sieppauksen kanssa.",
    "policyLabel": "Käytäntö:",
    "resetIn": "nollata sisään",
    "quotaTotal": "yhteensä"
  },
  "plugins": {
    "title": "Plugins",
    "description": "Install and manage plugins for extending OmniRoute functionality",
    "loading": "Loading plugins...",
    "scanning": "Scanning...",
    "scanForPlugins": "Scan for Plugins",
    "noPlugins": "No plugins installed",
    "noPluginsDescription": "Place plugin directories in ~/.omniroute/plugins/ and click Scan.",
    "activate": "Activate",
    "deactivate": "Deactivate",
    "uninstall": "Uninstall",
    "uninstallConfirm": "Uninstall plugin \"{name}\"?",
    "pluginScanComplete": "Plugin scan complete",
    "pluginScanFailed": "Plugin scan failed",
    "activated": "{name} activated",
    "deactivated": "{name} deactivated",
    "activateFailed": "Failed to activate {name}",
    "deactivateFailed": "Failed to deactivate {name}",
    "uninstalled": "{name} uninstalled",
    "uninstallFailed": "Failed to uninstall {name}",
    "configure": "Configure: {name}",
    "configurePlugin": "Configure",
    "noConfigSettings": "This plugin has no configurable settings.",
    "saving": "Saving...",
    "saveConfiguration": "Save Configuration",
    "configurationSaved": "Configuration saved",
    "saveConfigurationFailed": "Failed to save configuration",
    "pluginNotFound": "Plugin not found",
    "version": "Version",
    "author": "Author",
    "description_label": "Description",
    "status": "Status",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "hooks": "Hooks"
  }
}
