{
  "common": {
    "save": "Enregistrer",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "loading": "Chargement...",
    "error": "Une erreur s'est produite",
    "success": "Succès",
    "confirm": "Etes-vous sûr ?",
    "refresh": "Actualiser",
    "close": "Fermer",
    "add": "Ajouter",
    "edit": "Modifier",
    "search": "Rechercher",
    "back": "Retour",
    "next": "Suivant",
    "submit": "Soumettre",
    "reset": "Réinitialiser",
    "copy": "Copier",
    "copied": "Copié!",
    "enabled": "Activé",
    "disabled": "Désactivé",
    "active": "Actif",
    "inactive": "Inactif",
    "noData": "Aucune donnée disponible",
    "nothingHere": "Nothing here yet",
    "configure": "Configurer",
    "manage": "Gérer",
    "name": "Nom",
    "actions": "Actions",
    "status": "Statut",
    "type": "Tapez",
    "model": "Modèle",
    "models": "modèles",
    "provider": "Fournisseur",
    "account": "Compte",
    "time": "Temps",
    "details": "Détails",
    "created": "Créé",
    "lastUsed": "Last Refreshed",
    "loadMore": "Charger plus",
    "noResults": "Aucun résultat trouvé",
    "reloadPage": "Recharger la page",
    "connected": "Connecté",
    "disconnected": "Déconnecté",
    "notConfigured": "Non configuré",
    "testConnection": "Tester la connexion",
    "enable": "Activer",
    "disable": "Désactiver",
    "columns": "Colonnes",
    "newest": "Le plus récent",
    "oldest": "Le plus ancien",
    "all": "Tout",
    "none": "Aucun",
    "yes": "Oui",
    "no": "Non",
    "on": "__MISSING__:ON",
    "off": "__MISSING__:OFF",
    "warning": "Avertissement",
    "note": "Remarque",
    "free": "Gratuit",
    "skipToContent": "Passer au contenu",
    "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.",
    "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...",
    "accept": "accept",
    "accountId": "accountId",
    "alias": "alias",
    "apiKeyId": "apiKeyId",
    "apiKeyName": "apiKeyName",
    "apiKeySecret": "apiKeySecret",
    "authorization": "authorization",
    "content-type": "content-type",
    "content-length": "content-length",
    "cookie": "cookie",
    "file": "file",
    "host": "host",
    "id": "id",
    "import": "import",
    "limit": "limit",
    "offset": "offset",
    "open": "open",
    "origin": "origin",
    "promptTokens": "promptTokens",
    "completionTokens": "completionTokens",
    "totalTokens": "totalTokens",
    "rawModel": "rawModel",
    "scope": "scope",
    "skill": "skill",
    "sortBy": "sortBy",
    "sortOrder": "sortOrder",
    "tab": "tab",
    "text": "text",
    "textarea": "textarea",
    "tool": "tool",
    "toolId": "toolId",
    "web": "web",
    "whereUsed": "whereUsed",
    "whitelist": "whitelist",
    "blacklist": "blacklist",
    "resolve": "resolve",
    "force": "force",
    "base64url": "base64url",
    "hex": "hex",
    "range": "range",
    "component": "component",
    "redirect_uri": "redirect_uri",
    "idempotency-key": "idempotency-key",
    "error_description": "error_description",
    "code": "code",
    "compatible": "compatible",
    "chat-completions": "chat-completions",
    "oauth": "oauth",
    "auth_token": "auth_token",
    "crypto": "crypto",
    "hours": "hours",
    "selfsigned": "selfsigned",
    "proxy_id": "proxy_id",
    "proxyId": "proxyId",
    "connectionId": "connectionId",
    "resolveConnectionId": "resolveConnectionId",
    "resolve_connection_id": "resolve_connection_id",
    "scope_id": "scope_id",
    "scopeId": "scopeId",
    "jwtSecret": "jwtSecret",
    "keytar": "keytar",
    "better-sqlite3": "better-sqlite3",
    "undici": "undici",
    "builder-id": "builder-id",
    "musicDesc": "musicDesc",
    "musicGeneration": "musicGeneration",
    "idc": "idc",
    "cloud-status-changed": "cloud-status-changed",
    "where_used": "where_used",
    "windowMs": "windowMs",
    "social-github": "GitHub",
    "social-google": "Google",
    "TOOL_ALLOWLIST": "Liste autorisée des outils",
    "TOOL_DENYLIST": "Liste de refus d'outils",
    "Failed to save pricing": "Échec de l'enregistrement des prix",
    "Failed to reset pricing": "Échec de la réinitialisation des prix",
    "apikey": "Clé API",
    "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": "Fournisseurs d'agents cloud",
    "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": "Gratuit uniquement",
    "addFirstProvider": "Ajoutez votre premier fournisseur",
    "addFirstProviderDesc": "Connectez un fournisseur d'IA pour démarrer le routage des demandes via OmniRoute. Vous pouvez utiliser des fournisseurs gratuits, des clés API ou des comptes OAuth.",
    "learnMore": "En savoir plus",
    "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": "Fournisseurs de niveau gratuit",
    "freeTierLabel": "Niveau gratuit disponible",
    "freeTierProvidersDesc": "Fournisseurs proposant des niveaux gratuits : certains nécessitent une inscription par clé API, d'autres n'ont besoin d'aucune information d'identification.",
    "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": "Administrateur de gamifications",
    "monitorAnomaliesAndHealth": "Surveiller les anomalies et la santé du système",
    "flaggedAnomalies": "Anomalies signalées",
    "noAnomaliesDetected": "Aucune anomalie détectée",
    "apiKey": "Clé API",
    "xpLastHour": "XP (1h)",
    "zScore": "Score Z",
    "tokensCommunityServers": "Serveurs communautaires",
    "tokensServerNamePlaceholder": "Nom du serveur",
    "tokensApiKeyPlaceholder": "Clé API",
    "tokensTokenBalance": "Solde des jetons",
    "tokensSendTokens": "Envoyer des jetons",
    "tokensRecipientApiKeyId": "ID de clé API du destinataire",
    "tokensRecipientApiKeyIdPlaceholder": "Saisissez l'ID de la clé API du destinataire",
    "tokensReasonOptional": "Raison (facultatif)",
    "tokensReasonPlaceholder": "par ex. bonus, récompense",
    "tokensTransactionHistory": "Historique des transactions",
    "tokensNoTransactionsYet": "Aucune transaction pour l'instant",
    "tokensInviteCodes": "Codes d'invitation",
    "tokensMaxUses": "Utilisations maximales",
    "tokensRedeemCode": "Utiliser le code",
    "tokensRedeemCodePlaceholder": "Entrez le code d'invitation",
    "tokensYourActiveInvites": "Vos invitations actives",
    "tierCoverageTitle": "Couverture par niveaux",
    "tierCoverageSubtitle": "Fournisseurs configurés par niveau de secours",
    "batchDetailCopyId": "Copier l'identifiant",
    "batchDetailClose": "Fermer",
    "batchDetailEndpoint": "Point de terminaison",
    "batchDetailModel": "Modèle",
    "batchDetailWindow": "Fenêtre",
    "batchDetailCreated": "Créé",
    "providerTopologyEmpty": "Aucun fournisseur connecté pour le moment",
    "badgeToastUnlocked": "Insigne débloqué !",
    "batchListSearchPlaceholder": "Recherche par ID, point de terminaison, modèle…",
    "batchListDeleteAllCompletedTitle": "Supprimer tous les lots terminés",
    "batchListBatchesTable": "Lots",
    "changelogViewerLoading": "Chargement du journal des modifications depuis GitHub...",
    "profileLoading": "Chargement du profil...",
    "profileHowToEarn": "Comment gagner",
    "bootstrapBannerDismiss": "Rejeter",
    "batchListDeleteBatchTitle": "Supprimer le lot et ses fichiers",
    "leaderboardYourRank": "Votre classement",
    "leaderboardLoading": "Chargement du classement...",
    "batchFileDetailCopyId": "Copier l'identifiant",
    "batchFileDetailClose": "Fermer",
    "batchFileDetailFailedToLoad": "Échec du chargement du contenu du fichier",
    "batchFilesListSearchPlaceholder": "Recherche par ID ou nom de fichier…",
    "batchFilesListFilesTable": "Fichiers",
    "batchPageLoadingMore": "Chargement plus…",
    "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": "Accueil",
    "dashboard": "Tableau de bord",
    "providers": "Fournisseurs",
    "combos": "Combinaisons",
    "usage": "Utilisation",
    "analytics": "Analyse",
    "costs": "Coûts",
    "health": "Santé",
    "proxy": "Proxy",
    "limits": "Limites et quotas",
    "cliTools": "Outils CLI",
    "media": "Médias",
    "settings": "Paramètres",
    "translator": "Traducteur",
    "playground": "Playground",
    "searchTools": "Search Tools",
    "agents": "Agents",
    "cloudAgents": "Agents cloud",
    "memory": "Memory",
    "skills": "Skills",
    "omniSkills": "OmniSkills",
    "agentSkills": "Compétences des agents",
    "docs": "Documentation",
    "issues": "Problèmes",
    "endpoints": "Points d'accès",
    "endpointsSubtitle": "Vos URL de connexion IA",
    "apiManager": "Gestionnaire d'API",
    "apiManagerSubtitle": "Gérer les clés API et l'accès",
    "embeddedServices": "__MISSING__:Embedded Services",
    "embeddedServicesSubtitle": "__MISSING__:Manage local proxy services",
    "logs": "Journaux",
    "webhooks": "Webhooks",
    "webhooksSubtitle": "Soyez informé des événements",
    "combosSubtitle": "Fournisseurs de groupe pour le basculement",
    "batchSubtitle": "Traiter plusieurs demandes",
    "contextCavemanSubtitle": "Compression rapide",
    "contextRtkSubtitle": "Filtrage de sortie",
    "auditLog": "Journal d'audit",
    "shutdown": "Arrêt",
    "restart": "Redémarrer",
    "shutdownConfirm": "Arrêter OmniRoute ?",
    "restartConfirm": "Redémarrer OmniRoute ?",
    "version": "v{version}",
    "debug": "Débogage",
    "system": "Système",
    "help": "Aide",
    "primarySection": "Main",
    "cliSection": "CLI",
    "debugSection": "Debug",
    "systemSection": "System",
    "helpSection": "Help",
    "serverDisconnected": "Serveur déconnecté",
    "serverDisconnectedMsg": "Le serveur proxy a été arrêté ou est en train de redémarrer.",
    "expandSidebar": "Développer la barre latérale",
    "collapseSidebar": "Réduire la barre latérale",
    "themes": "Thèmes",
    "presetColors": "Couleurs populaires",
    "createTheme": "Créer un thème",
    "chooseColor": "Choisissez une couleur",
    "themeCoral": "Corail",
    "themeBlue": "Bleu",
    "themeRed": "Rouge",
    "themeGreen": "Vert",
    "themeViolet": "Violette",
    "themeOrange": "Orange",
    "themeCyan": "Cyan",
    "cliToolsShort": "Outils",
    "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": "Audit A2A",
    "settingsGeneral": "General",
    "settingsAppearance": "Appearance",
    "settingsAi": "AI Settings",
    "settingsSecurity": "Security",
    "settingsFeatureFlags": "Indicateurs de fonctionnalités",
    "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": "Basculer les capacités du système",
    "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": "Configurez les rappels HTTP pour les événements système.",
    "configuredWebhooks": "Webhooks configurés",
    "configuredWebhooksDesc": "Gérez les points de terminaison de diffusion, les événements souscrits, le statut et les envois de test.",
    "addWebhook": "Ajouter un webhook",
    "editWebhook": "Modifier le webhook",
    "name": "Nom",
    "namePlaceholder": "Suivi de production",
    "unnamedWebhook": "Webhook sans nom",
    "url": "URL du point de terminaison",
    "events": "Événements",
    "allEvents": "Tous les événements",
    "secret": "Secret",
    "secretPlaceholder": "Laisser vide pour générer automatiquement un secret",
    "secretEditPlaceholder": "Laisser vide pour garder le secret actuel",
    "status": "Statut",
    "active": "Actif",
    "inactive": "Inactif",
    "errored": "Erreur",
    "total": "Total",
    "lastTriggered": "Dernier déclenché",
    "actions": "Actions",
    "enabled": "Activé",
    "enabledDesc": "Les webhooks désactivés restent enregistrés mais ne reçoivent pas de diffusions.",
    "refresh": "Actualiser",
    "loading": "Chargement des webhooks...",
    "never": "Jamais",
    "failureCount": "{count, plural, =0 {no failures} one {# failure} other {# failures}}",
    "testWebhook": "Envoyer le test",
    "testSuccess": "Test du webhook envoyé avec succès.",
    "testFailed": "Le test du webhook a échoué.",
    "saveSuccess": "Webhook enregistré avec succès.",
    "saveFailed": "Échec de l'enregistrement du webhook.",
    "loadFailed": "Échec du chargement des webhooks.",
    "delete": "Supprimer",
    "deleteConfirm": "Êtes-vous sûr de vouloir supprimer ce webhook ?",
    "deleteSuccess": "Webhook supprimé avec succès.",
    "deleteFailed": "Échec de la suppression du webhook.",
    "edit": "Modifier",
    "enable": "Activer",
    "disable": "Désactiver",
    "noWebhooks": "Aucun webhook configuré pour le moment.",
    "signatureTitle": "Signatures de webhooks",
    "signatureDescription": "Chaque livraison comprend un en-tête X-Webhook-Signature signé avec HMAC-SHA256 à l'aide du secret du webhook. Vérifiez la signature avant de faire confiance à la charge utile.",
    "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": "Vérification",
    "auditDescription": "Examinez les événements de conformité et les appels à l’outil MCP à partir d’une seule vue opérationnelle.",
    "complianceTab": "Conformité",
    "mcpTab": "Vérification MCP",
    "title": "Vérification de conformité",
    "description": "Événements de stratégie, d’accès, de fournisseur et de sécurité enregistrés par le journal d’audit de conformité.",
    "eventType": "Type d'événement",
    "eventTypePlaceholder": "Filtrer par action ou type d'événement",
    "severity": "Gravité",
    "allSeverities": "Toutes les sévérités",
    "info": "Informations",
    "warning": "Avertissement",
    "critical": "Critique",
    "sourceIp": "Adresse IP source",
    "userOrKey": "Utilisateur / Clé",
    "action": "Action",
    "result": "Résultat",
    "details": "Détails",
    "timestamp": "Horodatage",
    "from": "De",
    "to": "À",
    "refresh": "Actualiser",
    "export": "Exporter",
    "clearFilters": "Effacer les filtres",
    "loading": "Chargement des événements d'audit...",
    "showing": "Affichage de {count} sur {total} événements",
    "policyViolation": "Violation des règles",
    "accessDenied": "Accès refusé",
    "injectionBlocked": "Injection bloquée",
    "noEvents": "Aucun événement de conformité enregistré.",
    "failedFetch": "Échec de la récupération du journal d'audit de conformité.",
    "viewDetails": "Afficher les détails",
    "closeDetails": "Fermer les détails",
    "notAvailable": "—",
    "system": "système",
    "previous": "Précédent",
    "next": "Suivant",
    "mcpAudit": "Vérification MCP",
    "mcpAuditDesc": "Entrées d'audit des appels d'outils enregistrées par le serveur MCP.",
    "failedFetchMcpAudit": "Échec de la récupération du journal d'audit MCP.",
    "tool": "Outil",
    "toolPlaceholder": "Filtrer par nom d'outil",
    "duration": "Durée",
    "apiKey": "Clé API",
    "output": "Sortie",
    "allResults": "Tous les résultats",
    "success": "Succès",
    "failure": "Échec",
    "noMcpEvents": "Aucun événement d'audit MCP enregistré.",
    "a2aAudit": "Audit A2A",
    "a2aAuditDesc": "Piste d'audit de l'exécution des tâches enregistrée par le serveur A2A.",
    "a2aShowingTasks": "Affichage de {count} tâches sur {total}",
    "a2aSkill": "Compétence",
    "a2aSkillPlaceholder": "Filtrer par nom de compétence",
    "a2aState": "État",
    "a2aAllStates": "Tous les états",
    "a2aStateSubmitted": "Soumis",
    "a2aStateWorking": "Travailler",
    "a2aStateCompleted": "Terminé",
    "a2aStateFailed": "Échec",
    "a2aStateCancelled": "Annulé",
    "a2aTaskId": "ID de tâche",
    "a2aEvents": "Événements",
    "a2aArtifacts": "Artefacts",
    "a2aNoTasks": "Aucune tâche A2A enregistrée.",
    "a2aLoadingTasks": "Chargement des tâches A2A..."
  },
  "themesPage": {
    "title": "Thèmes",
    "description": "Choisissez un thème prédéfini ou créez le vôtre avec une seule couleur",
    "presetColors": "Couleurs populaires",
    "customTheme": "Thème personnalisé",
    "customThemeDesc": "Cliquez sur créer un thème et choisissez une couleur",
    "createTheme": "Créer un thème",
    "activePreset": "Thème actif"
  },
  "header": {
    "logout": "Déconnexion",
    "language": "Langue",
    "providers": "Fournisseurs",
    "providerDescription": "Gérez vos connexions aux fournisseurs d'IA",
    "combos": "Combinaisons",
    "comboDescription": "Combinaisons de modèles avec bascule de secours",
    "usage": "Utilisation et analyses",
    "usageDescription": "Surveillez l'utilisation de votre API, la consommation de jetons et les journaux de requêtes",
    "analytics": "Analytique",
    "analyticsDescription": "Graphiques, tendances et informations d'évaluation",
    "cliTools": "Outils CLI",
    "cliToolsDescription": "Configurer les outils CLI",
    "home": "Accueil",
    "homeDescription": "Bienvenue sur OmniRoute",
    "endpoint": "Points d'accès",
    "endpointDescription": "Gérer les points d'accès proxy, MCP, A2A et les points d'accès API",
    "mcp": "MCP",
    "mcpDescription": "Model Context Protocol server management and tools",
    "a2a": "A2A",
    "a2aDescription": "Agent-to-Agent protocol tasks and observability",
    "settings": "Paramètres",
    "settingsDescription": "Gérez vos préférences",
    "openaiCompatible": "Compatible avec OpenAI",
    "anthropicCompatible": "Compatible Anthropic",
    "media": "Médias",
    "mediaDescription": "Générez des images, des vidéos et de la musique",
    "themes": "Thèmes",
    "themesDescription": "Choisissez un thème de couleur pour l'ensemble du panneau du tableau de bord",
    "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": "Audit A2A",
    "auditA2aDescription": "Piste d'audit de l'exécution des tâches A2A, des transitions d'état et des enregistrements d'appel de compétences",
    "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": "Indicateurs de fonctionnalités",
    "featureFlagsDescription": "Capacités du système de contrôle et fonctionnalités expérimentales",
    "featureFlagsActive": "{count} actif",
    "featureFlagsInactive": "{count} inactif",
    "featureFlagsOverrides": "{count} Remplacements de base de données",
    "featureFlagsSearch": "Rechercher des drapeaux...",
    "featureFlagsCategoryAll": "Tout",
    "featureFlagsCategorySecurity": "Sécurité",
    "featureFlagsCategoryNetwork": "Réseau",
    "featureFlagsCategoryPolicies": "Politiques",
    "featureFlagsCategoryRuntime": "Durée d'exécution",
    "featureFlagsCategoryCli": "CLI",
    "featureFlagsCategoryHealth": "Santé",
    "featureFlagsSourceDb": "Base de données",
    "featureFlagsSourceEnv": "ENV",
    "featureFlagsSourceDefault": "DEF",
    "featureFlagsReset": "Réinitialiser",
    "featureFlagsResetAll": "Réinitialiser tous les remplacements",
    "featureFlagsResetAllConfirm": "Êtes-vous sûr de vouloir réinitialiser tous les remplacements d'indicateurs de fonctionnalités ? Cela rétablira tous les indicateurs à leurs valeurs ENV ou par défaut.",
    "featureFlagsRestartRequired": "Redémarrage requis pour postuler",
    "featureFlagsNoResults": "Aucun drapeau ne correspond à votre recherche",
    "featureFlagsSaved": "Drapeau mis à jour",
    "featureFlagsError": "Échec de la mise à jour de l'indicateur",
    "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": "Démarrage rapide",
    "quickStartDesc": "Démarrez en 4 étapes. Connectez des fournisseurs, routez les modèles et surveillez tout.",
    "fullDocs": "Documentation complète",
    "step1Title": "1. Créer une clé API",
    "step1Desc": "Allez dans <endpoint>Endpoint</endpoint> -> Clés enregistrées. Générez une clé par environnement.",
    "step2Title": "2. Connecter des fournisseurs",
    "step2Desc": "Ajoutez des comptes dans <providers>Providers</providers>. Prend en charge OAuth, API Key et paliers gratuits.",
    "step3Title": "3. Configurer votre client",
    "step3Desc": "Définissez l'URL de base sur {url} dans votre IDE ou client API.",
    "step4Title": "4. Surveiller et optimiser",
    "step4Desc": "Suivez les tokens, les coûts et les erreurs dans <logs>Journaux des requêtes</logs> et <analytics>Analytique</analytics>.",
    "providersOverview": "Présentation des fournisseurs",
    "configuredOf": "{configured} configuré parmi {total} fournisseurs disponibles",
    "noModelsAvailable": "Aucun modèle disponible pour ce fournisseur.",
    "noProvidersConfigured": "Aucun fournisseur configuré pour l'instant",
    "addProvider": "Ajouter un fournisseur",
    "configureFirst": "Configurez d'abord une connexion dans {providers}",
    "configureProvider": "Configurer le fournisseur",
    "modelAvailable": "Modèle {count} disponible",
    "modelsAvailable": "{count} modèles disponibles",
    "connectionsActive": "Connexion {count} active",
    "connectionsActivePlural": "{count} connexions actives",
    "copyModelName": "Copier le nom du modèle",
    "documentation": "Documentation",
    "healthMonitor": "Moniteur de santé",
    "reportIssue": "Signaler un problème",
    "activeError": "{active} actif · Erreur {errors}",
    "oauthLabel": "OAuth",
    "apiKeyLabel": "Clé API",
    "requestsShort": "{count} reqs",
    "providerModelsTitle": "{provider} - Modèles",
    "copiedModel": "Copié : {model}",
    "aliasLabel": "pseudonyme",
    "updateNow": "Mettre à jour",
    "updating": "Mise à jour...",
    "updateAvailableDesc": "Une nouvelle version est disponible. Cliquez pour mettre à jour.",
    "updateStarted": "Mise à jour démarrée...",
    "reloadingPageAutomatically": "Rechargement automatique de la page...",
    "providerTopology": "Topologie du fournisseur"
  },
  "analytics": {
    "title": "Analyse",
    "usageAnalyticsTitle": "__MISSING__:Usage Analytics",
    "diversityScoreTitle": "Diversité des fournisseurs",
    "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": "Surveillez vos modèles d'utilisation des API, la consommation de jetons, les coûts et les tendances d'activité sur tous les fournisseurs et modèles.",
    "evalsDescription": "Exécutez des suites d'évaluation pour tester et valider vos points de terminaison LLM. Comparez la qualité des modèles, détectez les régressions et évaluez la latence.",
    "overview": "Aperçu",
    "evals": "Évaluations",
    "utilization": "Utilisation",
    "utilizationDescription": "Tendances d'utilisation du quota fournisseur et suivi des limites de débit",
    "modelStatus": "Statut du modèle",
    "modelStatusCooldown": "Temps de recharge",
    "modelStatusUnavailable": "Indisponible",
    "modelStatusError": "Erreur",
    "comboHealth": "Santé du combo",
    "comboHealthDescription": "Quota au niveau combo, distribution de l'utilisation et métriques de performance",
    "compressionAnalyticsTitle": "Compression Analytics",
    "compressionAnalyticsDescription": "Compression analytics — token savings, mode breakdown, and provider stats.",
    "autoRoutingTotalAutoRequests": "Total des demandes automatiques",
    "autoRoutingAvgSelectionScore": "Score de sélection moyen",
    "autoRoutingExplorationRate": "Taux d'exploration",
    "autoRoutingLkgpHitRate": "Taux de réussite du LKGP",
    "autoRoutingRequestsByVariant": "Demandes par variante",
    "autoRoutingTopRoutedProviders": "Principaux fournisseurs acheminés",
    "comboHealthWorstQuotaLeft": "Le pire quota restant",
    "comboHealthUsageSkew": "Biais d'utilisation",
    "comboHealthSuccessRate": "Taux de réussite",
    "comboHealthQuotaHealth": "Santé des quotas",
    "comboHealthRequests": "Demandes",
    "comboHealthTokens": "Jetons",
    "comboHealthAvgLatency": "Latence moyenne",
    "comboHealthTotalRequests": "Total des demandes",
    "comboHealthExecutionTargets": "Objectifs d'exécution",
    "comboHealthSuccess": "Succès",
    "comboHealthLatency": "Latence",
    "comboHealthQuota": "Quota",
    "comboHealthTitle": "Santé combinée",
    "comboHealthUnableToLoad": "Impossible de charger la santé du combo",
    "comboHealthGettingStarted": "Commencer",
    "compressionAnalyticsTotalRequests": "Total des demandes",
    "compressionAnalyticsTokensSaved": "Jetons enregistrés",
    "compressionAnalyticsAvgSavings": "Économies moyennes",
    "compressionAnalyticsAvgDuration": "Durée moyenne",
    "compressionAnalyticsReceipts": "Reçus",
    "compressionAnalyticsFallbacks": "Solutions de repli",
    "compressionAnalyticsPromptTokens": "Jetons d'invite",
    "compressionAnalyticsCompletionTokens": "Jetons d'achèvement",
    "compressionAnalyticsTotalTokens": "Total des jetons",
    "compressionAnalyticsCacheTokens": "Jetons de cache",
    "compressionAnalyticsNoDataYet": "Aucune donnée de compression pour l'instant",
    "searchAnalyticsTotalSearches": "Total des recherches",
    "searchAnalyticsCacheHitRate": "Taux de réussite du cache",
    "searchAnalyticsTotalCost": "Coût total",
    "searchAnalyticsAvgResponse": "Réponse moyenne",
    "searchAnalyticsNoSearchesYet": "Aucune recherche pour l'instant",
    "providerUtilizationTitle": "Utilisation du fournisseur",
    "providerUtilizationFailedToLoad": "Échec du chargement des données d'utilisation",
    "providerUtilizationNoData": "Aucune donnée d'utilisation disponible",
    "providerUtilizationGettingStarted": "Commencer",
    "providerUtilizationLatestSnapshot": "Dernier instantané du quota",
    "providerUtilizationRemainingCapacity": "Capacité restante"
  },
  "apiManager": {
    "title": "Clés API",
    "createKey": "Créer une clé API",
    "key": "Clé",
    "revokeKey": "Révoquer la clé",
    "revokeConfirm": "Êtes-vous sûr de vouloir révoquer cette clé API ?",
    "noKeys": "Pas encore de clé API",
    "noKeysDesc": "Créez votre première clé API pour authentifier les requêtes sur votre point de terminaison",
    "keyLabel": "Étiquette de clé",
    "permissions": "Autorisations",
    "expiresAt": "Expire",
    "never": "Jamais",
    "revoke": "Révoquer",
    "showKey": "Afficher la clé",
    "hideKey": "Masquer la clé",
    "copyKey": "Copier la clé API",
    "allModels": "Tous les modèles",
    "selectedModels": "Modèles sélectionnés",
    "readOnly": "Lecture seule",
    "fullAccess": "Accès complet",
    "keyManagement": "Gestion des clés API",
    "keyManagementDesc": "Créez et gérez des clés API pour authentifier les requêtes sur votre point de terminaison",
    "totalKeys": "Clés totales",
    "restricted": "Restreint",
    "totalRequests": "Total des demandes",
    "modelsAvailable": "Modèles disponibles",
    "registeredKeys": "Clés enregistrées",
    "keysRegistered": "{count} clés enregistrées",
    "keyRegistered": "Clé {count} enregistrée",
    "keysSecurityNote": "Chaque clé isole le suivi de l'utilisation et peut être révoquée indépendamment. Les clés sont masquées après leur création pour des raisons de sécurité.",
    "createFirstKey": "Créez votre première clé",
    "name": "Nom",
    "usage": "Utilisation",
    "created": "Créé",
    "actions": "Actions",
    "reqs": "demandes",
    "neverUsed": "Jamais utilisé",
    "deleteConfirm": "Supprimer cette clé API ?",
    "usageTips": "Conseils d'utilisation",
    "tipAuth": "Utilisez les clés API dans l'en-tête d'autorisation en tant que Bearer YOUR_KEY",
    "tipSecure": "Les clés ne sont affichées qu'une seule fois lors de la création : stockez-les en toute sécurité",
    "tipSeparate": "Créer des clés distinctes pour différents clients ou environnements",
    "tipRestrict": "Restreindre les clés à des modèles spécifiques pour une meilleure sécurité et un meilleur contrôle des coûts",
    "keyName": "Nom de la clé",
    "keyNamePlaceholder": "par exemple, clé de production, clé de développement",
    "keyNameDesc": "Choisissez un nom descriptif pour identifier l'objectif de cette clé",
    "managementAccessDesc": "Autoriser cette clé API à gérer la configuration OmniRoute.",
    "selfServiceVisibility": "Visibilité en libre-service",
    "selfServiceVisibilityDesc": "Contrôle ce que cette clé peut voir sur sa propre utilisation et le quota upstream partagé.",
    "ownUsageVisibility": "Coût propre et utilisation des tokens",
    "ownUsageVisibilityDesc": "Autoriser cette clé à appeler son endpoint de statut pour consulter son utilisation en USD, son pourcentage de budget et ses totaux de tokens.",
    "sharedAccountQuotaVisibility": "Quota de compte partagé",
    "sharedAccountQuotaVisibilityDesc": "Autoriser cette clé à voir le quota du compte upstream partagé lorsqu’une connexion explicite est configurée.",
    "keyCreated": "Clé API créée",
    "keyCreatedSuccess": "Clé créée avec succès !",
    "keyCreatedNote": "Copiez et stockez cette clé maintenant – elle ne sera plus affichée.",
    "done": "Terminé",
    "savePermissions": "Enregistrer les autorisations",
    "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": "Tout autoriser",
    "restrict": "Restreindre",
    "allowAllInfo": "Cette clé peut accéder à tous les modèles disponibles.",
    "restrictInfo": "Cette clé peut accéder à {selected} des modèles {total}.",
    "selected": "{count} sélectionné",
    "all": "Tout",
    "clear": "Effacer",
    "searchModels": "Rechercher des modèles par nom ou fournisseur...",
    "noModelsFound": "Aucun modèle trouvé",
    "keyNameRequired": "Le nom de la clé est requis",
    "keyNameTooLong": "Le nom de la clé doit comporter {max} caractères ou moins.",
    "keyNameInvalid": "Le nom de la clé ne peut contenir que des lettres, des chiffres, des espaces, des traits d'union et des traits de soulignement.",
    "invalidKeyName": "Nom de clé invalide",
    "failedCreateKey": "Échec de la création de la clé",
    "failedCreateKeyRetry": "Échec de la création de la clé. Veuillez réessayer.",
    "invalidKeyId": "ID de clé invalide",
    "failedDeleteKey": "Échec de la suppression de la clé",
    "failedDeleteKeyRetry": "Échec de la suppression de la clé. Veuillez réessayer.",
    "invalidModelsSelection": "Sélection de modèles invalide",
    "cannotSelectMoreThanModels": "Impossible de sélectionner plus de {max} modèles",
    "failedUpdatePermissions": "Échec de la mise à jour des autorisations",
    "failedUpdatePermissionsRetry": "Échec de la mise à jour des autorisations. Veuillez réessayer.",
    "unknownProvider": "inconnu",
    "copyMaskedKey": "Copier la clé masquée",
    "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key",
    "modelsCount": "{count, plural, one {# model} other {# models}}",
    "lastUsedOn": "Dernier : {date}",
    "editPermissions": "Modifier les autorisations",
    "deleteKey": "Supprimer la clé",
    "regenerateKey": "Régénérer la clé",
    "regenerateConfirm": "Êtes-vous sûr de vouloir régénérer cette clé API ? L'ancienne clé sera immédiatement invalidée.",
    "failedRegenerateKey": "Échec de la régénération de la clé API",
    "failedRegenerateKeyRetry": "Échec de la régénération de la clé API. Veuillez réessayer.",
    "model": "Modèle {count}",
    "models": "Modèles {count}",
    "permissionsTitle": "Autorisations : {name}",
    "allowAllDesc": "Cette clé peut accéder à tous les modèles disponibles.",
    "restrictDesc": "Cette clé peut accéder à {selectedCount} des modèles {totalModels}.",
    "selectedCount": "{count} sélectionné",
    "maxActiveSessions": "Nombre maximum de sessions actives",
    "apiManagerCustomRateLimits": "Limites de taux personnalisées",
    "apiManagerCustomRateLimitsDesc": "Remplacez les limites globales par défaut. Laissez vide pour utiliser les valeurs par défaut.",
    "apiManagerRateLimitRequestsPlaceholder": "Demandes",
    "apiManagerRateLimitReqPer": "demande /",
    "apiManagerRateLimitSecondsPlaceholder": "Secondes",
    "apiManagerRemoveLimitTitle": "Supprimer la limite",
    "apiManagerTimezonePlaceholder": "Amérique/Sao_Paulo",
    "noLogPayloadPrivacy": "Confidentialité des charges utiles sans journal",
    "bannedStatus": "Statut banni",
    "managementApiAccess": "Accès à l'API de gestion",
    "expirationDate": "Date d'expiration",
    "managementAccess": "Accès à la gestion",
    "allowedConnections": "Connexions autorisées",
    "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": "Journal d'audit",
    "searchPlaceholder": "Actions de recherche...",
    "action": "Action",
    "actor": "Acteur",
    "target": "Cible",
    "ipAddress": "Adresse IP",
    "timestamp": "Horodatage",
    "noEntries": "Aucune entrée d'audit trouvée",
    "filterByAction": "Filtrer par action...",
    "filterByActor": "Filtrer par acteur...",
    "filterEntriesAria": "Filtrer les entrées du journal d'audit",
    "filterByActionTypeAria": "Filtrer par type d'action",
    "filterByActorAria": "Filtrer par acteur",
    "refreshAuditLogAria": "Actualiser le journal d'audit",
    "tableAria": "Entrées du journal d'audit",
    "failedFetchAuditLog": "Échec de la récupération du journal d'audit",
    "notAvailable": "—",
    "description": "Actions administratives et événements de sécurité",
    "showing": "Affichage des entrées {count} (décalage {offset})",
    "previous": "Précédent"
  },
  "media": {
    "title": "Espace média",
    "subtitle": "Générez des images, des vidéos et de la musique",
    "model": "Model",
    "prompt": "Prompt",
    "generate": "Générer",
    "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": "Copier",
    "resetToDefault": "Réinitialiser aux valeurs par défaut",
    "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": "Outils CLI",
    "noActiveProviders": "Aucun fournisseur actif",
    "noActiveProvidersDesc": "Veuillez d'abord ajouter et connecter des fournisseurs pour configurer les outils CLI.",
    "mapModels": "Modèles de cartes",
    "testConnection": "Tester la connexion",
    "connectionStatus": "État de la connexion",
    "configureEndpoint": "Configurer le point de terminaison",
    "instructions": "Instructions",
    "modelMapping": "Cartographie du modèle",
    "baseUrl": "URL de base",
    "apiKey": "Clé API",
    "configured": "Configuré",
    "notConfigured": "Non configuré",
    "notInstalled": "Non installé",
    "custom": "Personnalisé",
    "unknown": "Inconnu",
    "lastSavedAt": "Dernier enregistrement : {date}",
    "never": "Jamais",
    "justNow": "juste maintenant",
    "minutesAgoShort": "il y a {count}m",
    "hoursAgoShort": "il y a {count}h",
    "daysAgoShort": "Il y a {count}j",
    "monthsAgoShort": "Il y a {count}mo",
    "yearsAgoShort": "Il y a {count}ans",
    "runtimeCheckFailed": "La vérification de l'exécution a échoué",
    "yourApiKeyPlaceholder": "votre-clé-API",
    "modelPlaceholder": "fournisseur/identifiant de modèle",
    "configurationSaved": "Configuration enregistrée avec succès.",
    "failedToSave": "Échec de l'enregistrement de la configuration.",
    "noApiKeysCreateOne": "Aucune clé API – Créez-en une sur la page Clés",
    "defaultOmnirouteKey": "sk_omniroute (par défaut)",
    "selectModel": "Sélectionnez le modèle",
    "selectModelForAlias": "Sélectionnez le modèle pour {alias}",
    "selectModelForTool": "Sélectionnez le modèle pour {tool}",
    "select": "Sélectionnez",
    "clear": "Effacer",
    "comingSoon": "Bientôt disponible",
    "checkingRuntime": "Vérification de l'état d'exécution...",
    "guideOnlyIntegration": "Intégration avec guide uniquement (aucun runtime local requis)",
    "cliRuntimeDetected": "Runtime CLI détecté et prêt",
    "cliFoundNotRunnable": "CLI trouvée mais non exécutable{reason}",
    "cliRuntimeNotDetected": "L'exécution CLI n'est pas détectée",
    "binary": "Binaire",
    "configPath": "Chemin de configuration",
    "configPathShort": "Configuration",
    "failedCheckRuntimeStatus": "Échec de la vérification de l'état d'exécution.",
    "copy": "Copier",
    "copied": "Copié",
    "copyConfig": "Copier la configuration",
    "saveConfig": "Enregistrer la configuration",
    "selectionSaved": "Sélection enregistrée",
    "guide": "Guider",
    "detected": "Détecté",
    "notReady": "Pas prêt",
    "active": "Actif",
    "inactive": "Inactif",
    "startMitm": "Démarrer MITM",
    "stopMitm": "Arrêtez le MITM",
    "mitmStarted": "MITM a démarré avec succès !",
    "mitmStopped": "MITM s'est arrêté avec succès !",
    "failedStart": "Échec du démarrage de MITM",
    "failedStop": "Échec de l'arrêt de MITM",
    "saveMappings": "Enregistrer les mappages",
    "mappingsSaved": "Mappages enregistrés !",
    "failedSaveMappings": "Échec de l'enregistrement des mappages",
    "howItWorks": "Comment ça marche :",
    "antigravityHowWorksDesc": "Antigravity envoie des requêtes au point de terminaison de Google. MITM les intercepte et les redirige vers OmniRoute.",
    "antigravityStep1": "1. Démarrez MITM pour acheminer les demandes via OmniRoute.",
    "antigravityStep2Prefix": "2. Ajouter",
    "antigravityStep2Suffix": "à votre fichier hosts en tant que 127.0.0.1.",
    "antigravityStep3": "3. Ouvrez Antigravity et les requêtes seront proxy.",
    "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.",
    "mitmStep1": "1. Start MITM to route requests through OmniRoute.",
    "mitmStep2Prefix": "2. Add",
    "mitmStep2Suffix": "to your hosts file as 127.0.0.1.",
    "mitmStep3": "3. Open {toolName} and requests will be proxied.",
    "sudoPasswordRequiredTitle": "Mot de passe Sudo requis",
    "sudoPasswordHint": "Un mot de passe administrateur est requis pour modifier les paramètres du fichier hôte et du proxy système.",
    "enterSudoPassword": "Entrez le mot de passe sudo",
    "sudoPasswordRequiredError": "Le mot de passe Sudo est requis.",
    "cancel": "Annuler",
    "confirm": "Confirmer",
    "settingsApplied": "Paramètres appliqués avec succès !",
    "failedApplySettings": "Échec de l'application des paramètres",
    "settingsReset": "Les paramètres ont été réinitialisés avec succès !",
    "failedResetSettings": "Échec de la réinitialisation des paramètres",
    "backupRestored": "Sauvegarde restaurée !",
    "failedRestore": "Échec de la restauration",
    "checkingCli": "Vérification de {tool} CLI...",
    "cliNotRunnable": "{tool} CLI installé mais non exécutable",
    "cliNotInstalled": "{tool} CLI non installé",
    "cliNotDetected": "{tool} CLI non détectée",
    "cliDetectedReady": "{tool} CLI détecté et prêt",
    "cliFoundFailedHealthcheck": "{tool} CLI a été trouvée mais le contrôle de santé d'exécution a échoué{reason}.",
    "installCliPrompt": "Veuillez installer {tool} CLI pour utiliser cette fonctionnalité.",
    "installCodexPrompt": "Veuillez installer Codex CLI pour utiliser la fonctionnalité d'application automatique.",
    "hide": "Masquer",
    "howToInstall": "Comment installer",
    "installationGuide": "Guide d'installation",
    "platforms": "macOS/Linux/Windows :",
    "afterInstallationRun": "Après l'installation, exécutez",
    "toVerify": "à vérifier.",
    "current": "Actuel",
    "baseUrlPlaceholder": "https://.../v1",
    "resetToDefault": "Réinitialiser aux valeurs par défaut",
    "providerModelPlaceholder": "fournisseur/identifiant de modèle",
    "apply": "Postuler",
    "reset": "Réinitialiser",
    "manualConfig": "Configuration manuelle",
    "backups": "Sauvegardes",
    "configBackups": "Sauvegardes de configuration",
    "noBackupsYet": "Aucune sauvegarde pour l'instant. Les sauvegardes sont créées automatiquement avant chaque application ou réinitialisation.",
    "restore": "Restaurer",
    "backupRestoredReloading": "Sauvegarde restaurée ! Statut de rechargement...",
    "failedRestoreBackup": "Échec de la restauration de la sauvegarde",
    "applied": "Appliqué!",
    "failed": "Échec",
    "resetDone": "Réinitialisez !",
    "omnirouteConfiguredOpenAiCompatible": "OmniRoute est configuré en tant que fournisseur compatible OpenAI",
    "provider": "Fournisseur",
    "model": "Modèle",
    "providers": "Fournisseurs",
    "auth": "Authentification",
    "noApiKeysAvailable": "Aucune clé API disponible",
    "usingDefaultOmniroute": "Utilisation par défaut : sk_omniroute",
    "updateConfig": "Mettre à jour la configuration",
    "applyConfig": "Appliquer la configuration",
    "noBackupsAvailable": "Aucune sauvegarde disponible.",
    "profileSaved": "Profil \"{name}\" enregistré !",
    "failedSaveProfile": "Échec de l'enregistrement du profil",
    "profileActivated": "Profil activé !",
    "failedActivateProfile": "Échec de l'activation du profil",
    "profiles": "Profils",
    "savedProfiles": "Profils enregistrés",
    "noProfilesYet": "Aucun profil enregistré pour le moment. Enregistrez la configuration actuelle en tant que profil ci-dessous.",
    "activate": "Activer",
    "deleteProfile": "Supprimer le profil",
    "profileNamePlaceholder": "Nom du profil (par exemple, compte personnel)",
    "saveCurrent": "Enregistrer le courant",
    "codexAuthNotePrefix": "Utilisations du Codex",
    "codexAuthNoteMiddle": "avec",
    "codexAuthNoteSuffix": "Cliquez sur \"Appliquer\" pour effectuer la configuration automatique.",
    "claudeManualConfiguration": "Claude CLI - Configuration manuelle",
    "codexManualConfiguration": "CLI Codex - Configuration manuelle",
    "droidManualConfiguration": "Factory Droid - Configuration manuelle",
    "openClawManualConfiguration": "Griffe ouverte - Configuration manuelle",
    "clineManualConfiguration": "Configuration manuelle en ligne",
    "kiloManualConfiguration": "Configuration manuelle du code kilo",
    "whenToUseLabel": "Quand utiliser",
    "openToolDocs": "Ouvrir la documentation de l'outil",
    "toolUseCases": {
      "claude": "À utiliser lorsque vous souhaitez des flux de travail de planification solides et de longs refactors multi-fichiers avec Claude Code.",
      "codex": "À utiliser lorsque votre équipe est standardisée sur les flux CLI OpenAI Codex et l'authentification basée sur le profil.",
      "droid": "À utiliser lorsque vous avez besoin d'un agent de terminal léger axé sur des boucles de codage et d'exécution de commandes rapides.",
      "openclaw": "À utiliser lorsque vous souhaitez un agent de codage de style Open Claw mais acheminé via des stratégies OmniRoute.",
      "cline": "À utiliser lorsque vous configurez des agents de codage dans des éditeurs et que vous souhaitez une configuration guidée avec des modèles OmniRoute.",
      "kilo": "À utiliser lorsque votre flux de travail dépend des commandes Kilo Code et de modifications itératives rapides.",
      "cursor": "À utiliser lors du codage dans Cursor et vous avez besoin de modèles personnalisés compatibles OpenAI via OmniRoute.",
      "continue": "À utiliser lors de l'exécution de Continue dans les IDE et que vous avez besoin d'une configuration de fournisseur portable basée sur JSON.",
      "opencode": "À utiliser lorsque vous préférez les exécutions d'agents natifs du terminal et l'automatisation par script via OpenCode.",
      "kiro": "À utiliser lors de l'intégration de Kiro et du contrôle centralisé du routage de modèles à partir d'OmniRoute.",
      "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.",
      "antigravity": "À utiliser lorsque le trafic Antigravity/Kiro doit être intercepté via MITM et acheminé vers OmniRoute.",
      "copilot": "À utiliser lorsque vous souhaitez une UX de style chat Copilot tout en appliquant les clés OmniRoute et les règles de routage.",
      "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": "À utiliser lorsque vous avez besoin d’un assistant IA léger natif du terminal pour des tâches rapides.",
      "hermes-agent": "__MISSING__:Use when you need Hermes Agent (by Nousresearch) with default, delegation, vision and auxiliary models routed through OmniRoute.",
      "custom": "À utiliser pour les implémentations d'outils personnalisés ou les configurations génériques compatibles OpenAI."
    },
    "toolDescriptions": {
      "antigravity": "IDE Google Antigravity avec MITM",
      "claude": "Anthropique Claude Code CLI",
      "codex": "CLI du Codex OpenAI",
      "droid": "Assistant IA pour droïdes d'usine",
      "openclaw": "Assistant IA Open Claw",
      "cline": "CLI de l'assistant de codage Cline AI",
      "kilo": "CLI de l'assistant IA Kilo Code",
      "cursor": "Éditeur de code AI du curseur",
      "continue": "Continuer l'Assistant IA",
      "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": "Assistant de terminal Hermes AI",
      "hermes-agent": "__MISSING__:Hermes Agent (by Nousresearch) - Advanced terminal AI with multi-model support (delegation, vision, compression, etc.)",
      "custom": "Générateur de configuration générique CLI ou SDK compatible OpenAI"
    },
    "guides": {
      "cursor": {
        "notes": {
          "0": "Nécessite un compte Cursor Pro pour utiliser cette fonctionnalité.",
          "1": "Le curseur achemine les requêtes via son propre serveur, le point de terminaison local n'est donc pas pris en charge. Veuillez activer Cloud Endpoint dans les paramètres."
        },
        "steps": {
          "1": {
            "title": "Ouvrir les paramètres",
            "desc": "Allez dans Paramètres -> Modèles"
          },
          "2": {
            "title": "Activer l'API OpenAI",
            "desc": "Activer l'option \"Clé API OpenAI\""
          },
          "3": {
            "title": "URL de base"
          },
          "4": {
            "title": "Clé API"
          },
          "5": {
            "title": "Ajouter un modèle personnalisé",
            "desc": "Cliquez sur \"Afficher tous les modèles\" -> \"Ajouter un modèle personnalisé\""
          },
          "6": {
            "title": "Sélectionnez le modèle"
          }
        }
      },
      "continue": {
        "steps": {
          "1": {
            "title": "Ouvrir la configuration",
            "desc": "Ouvrir le fichier de configuration Continuer"
          },
          "2": {
            "title": "Clé API"
          },
          "3": {
            "title": "Sélectionnez le modèle"
          },
          "4": {
            "title": "Ajouter une configuration de modèle",
            "desc": "Ajoutez la configuration suivante à votre tableau models :"
          }
        },
        "notes": {
          "0": "Continue utilise un fichier de configuration JSON."
        }
      },
      "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 nécessite la configuration de la clé API.",
          "1": "Définissez l'URL de base sur votre endpoint OmniRoute."
        }
      },
      "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 nécessite un compte Amazon."
        }
      },
      "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": "CLI personnalisée",
    "toolCategories": "Tool Categories",
    "visibleToolsCount": "{count} outils disponibles",
    "customCliBuilderTitle": "Générateur CLI compatible OpenAI",
    "customCliBuilderDescription": "Générez des variables d'environnement et des extraits de code JSON pour toute CLI ou SDK qui accepte une URL de base, une clé API et un ID de modèle compatibles OpenAI.",
    "customCliNoModels": "Connectez au moins un fournisseur pour remplir les sélecteurs de modèles.",
    "customCliNameLabel": "Nom de la CLI",
    "customCliNamePlaceholder": "par ex. Mon équipe CLI",
    "customCliDefaultModelLabel": "Modèle par défaut",
    "customCliDefaultModelHelp": "Utilisez n’importe quel ID de modèle ou combo OmniRoute. La plupart des CLI compatibles OpenAI n'ont besoin que de l'URL de base /v1 plus une chaîne de modèle.",
    "customCliKeyHelper": "Pour les installations locales, OmniRoute peut utiliser sk_omniroute. En mode cloud, choisissez l'une de vos clés API de gestion.",
    "customCliAliasMappingsLabel": "Mappages d'alias",
    "customCliAliasMappingsHelp": "Alias d'assistance facultatifs pour les scripts wrapper ou les fichiers de configuration qui souhaitent des noms abrégés stables.",
    "customCliAddAlias": "Ajouter un alias",
    "customCliNoMappings": "Aucun mappage d'alias pour l'instant. Ajoutez-en un si votre wrapper ou vos scripts d'équipe utilisent des noms courts stables.",
    "customCliAliasPlaceholder": "par ex. examen",
    "customCliTargetModelLabel": "Modèle cible",
    "customCliEndpointHintLabel": "Comment câbler le point final",
    "customCliEndpointHint": "Pointez n’importe quel client compatible OpenAI vers l’URL de base OmniRoute /v1. Le point de terminaison brut des achèvements de chat est {endpoint}. Utilisez le bloc JSON lorsque l'outil souhaite un objet fournisseur, ou le script env lorsqu'il lit les variables OPENAI_*.",
    "customCliEnvBlockTitle": "Extrait d'environnement/shell",
    "customCliJsonBlockTitle": "Bloc JSON du fournisseur",
    "copilotConfigGenerator": "Générateur de configuration copilote GitHub",
    "copilotApiKey": "Clé API",
    "copilotFilterModelsPlaceholder": "Filtrer les modèles...",
    "copilotMaxInputTokens": "Jetons d'entrée maximum",
    "copilotMaxOutputTokens": "Jetons de sortie maximale",
    "copilotToolCalling": "Appel d'outil",
    "copilotPasteInto": "Coller dans : ",
    "wireApiChatCompletions": "Achèvements de chat (/chat/completions)",
    "wireApiResponses": "API de réponses (/réponses)"
  },
  "combos": {
    "title": "Combinaisons",
    "description": "Créez des combinaisons de modèles avec un routage pondéré et une prise en charge de secours",
    "autoCatalogTitle": "Catalogue de routage automatique",
    "autoCatalogTemplateCount": "Modèles {count}",
    "autoCatalogDescription": "Combos auto/* intégrés résolus dynamiquement à partir des fournisseurs connectés. Utilisez l’un de ces identifiants comme champ de modèle – aucune configuration n’est nécessaire.",
    "autoCatalogExpand": "Développer le catalogue de routage automatique",
    "autoCatalogCollapse": "Réduire le catalogue de routage automatique",
    "createCombo": "Créer une combinaison",
    "editCombo": "Modifier la combinaison",
    "deleteCombo": "Supprimer la combinaison",
    "noModels": "Aucun modèle",
    "noModelsYet": "Aucun modèle ajouté pour l'instant",
    "addModel": "Ajouter un modèle",
    "addModelToCombo": "Ajouter un modèle au combo",
    "routingStrategy": "Stratégie de routage",
    "maxRetries": "Nombre maximal de tentatives",
    "timeout": "Délai d'expiration (ms)",
    "healthcheck": "Bilan de santé",
    "priority": "Priorité",
    "fallback": "Repli",
    "roundRobin": "Tournoi à la ronde",
    "random": "Aléatoire",
    "leastLatency": "Moins de latence",
    "comboName": "Nom de la combinaison",
    "comboNamePlaceholder": "mon-combo",
    "deleteConfirm": "Supprimer cette combinaison ?",
    "noCombosYet": "Pas encore de combo",
    "comboCreated": "Combo créé avec succès",
    "comboUpdated": "Combo mis à jour avec succès",
    "comboDeleted": "Combinaison supprimée",
    "failedCreate": "Échec de la création du combo",
    "failedUpdate": "Échec de la mise à jour du combo",
    "errorCreating": "Erreur lors de la création du combo",
    "errorUpdating": "Erreur lors de la mise à jour du combo",
    "errorDeleting": "Erreur lors de la suppression du combo",
    "testFailed": "La demande de test a échoué",
    "failedToggle": "Impossible de basculer la combinaison",
    "testResults": "Résultats des tests — {name}",
    "resolvedBy": "Résolu par :",
    "more": "+{count} plus",
    "reqs": "demandes",
    "success": "succès",
    "proxyConfigured": "Proxy configuré",
    "copyComboName": "Copier le nom du combo",
    "enableCombo": "Activer la combinaison",
    "disableCombo": "Désactiver la combinaison",
    "testCombo": "Combinaison de tests",
    "duplicate": "Dupliquer",
    "proxyConfig": "Configuration du proxy",
    "nameRequired": "Le nom est requis",
    "nameInvalid": "Uniquement les lettres, chiffres, -, _, / et . autorisé",
    "nameHint": "Lettres, chiffres, -, _, / et . autorisé",
    "priorityDesc": "Repli séquentiel : essaie d'abord le modèle 1, puis le 2, etc.",
    "weightedDesc": "Répartit le trafic en pourcentage de poids avec repli",
    "roundRobinDesc": "Distribution circulaire : chaque demande va au modèle suivant en rotation",
    "contextRelay": "Context Relay",
    "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate",
    "randomDesc": "Sélection aléatoire uniforme, puis retour aux modèles restants",
    "leastUsedDesc": "Sélectionne le modèle avec le moins de demandes, en équilibrant la charge au fil du temps",
    "costOptimizedDesc": "Itinéraires vers le modèle le moins cher en premier en fonction du prix",
    "resetAware": "RR conscient de la réinitialisation",
    "resetAwareDesc": "Équilibre le quota restant par rapport aux réinitialisations de 5 heures et hebdomadaires, puis compare les scores similaires",
    "strictRandom": "Strict Random",
    "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling",
    "models": "Modèles",
    "autoBalance": "Équilibre automatique",
    "advancedSettings": "Paramètres avancés",
    "retryDelay": "Délai de nouvelle tentative (ms)",
    "concurrencyPerModel": "Concurrence / Modèle",
    "queueTimeout": "Délai d'expiration de la file d'attente (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": "Laissez vide pour utiliser les valeurs par défaut globales. Ceux-ci remplacent les paramètres de chaque fournisseur.",
    "failoverBeforeRetry": "Basculement avant nouvelle tentative",
    "maxSetRetries": "Nombre maximal de tentatives définies",
    "setRetryDelayMs": "Définir le délai de nouvelle tentative (ms)",
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "removeModel": "Supprimer",
    "saving": "Sauvegarde...",
    "weighted": "Pondéré",
    "leastUsed": "Le moins utilisé",
    "costOpt": "Option de coût",
    "strategyGuideTitle": "Comment utiliser cette stratégie",
    "strategyGuideWhen": "Quand utiliser",
    "strategyGuideAvoid": "A éviter quand",
    "strategyGuideExample": "Exemple",
    "strategyGuide": {
      "priority": {
        "when": "Vous avez un modèle préféré et souhaitez uniquement une solution de secours en cas d'échec.",
        "avoid": "Vous avez besoin d’une distribution des demandes entre les modèles.",
        "example": "Modèle de codage principal avec sauvegarde moins chère en cas de panne."
      },
      "weighted": {
        "when": "Vous avez besoin d’un trafic contrôlé réparti entre les modèles.",
        "avoid": "Vous ne pouvez pas maintenir des poids précis au fil du temps.",
        "example": "Modèle stable à 80 % + déploiement du modèle Canary à 20 %."
      },
      "round-robin": {
        "when": "Vous voulez une distribution prévisible et uniforme.",
        "avoid": "Les modèles diffèrent trop en termes de latence ou de coût.",
        "example": "Même modèle sur plusieurs comptes pour répartir le débit."
      },
      "random": {
        "when": "Vous souhaitez une distribution simple avec une configuration minimale.",
        "avoid": "Vous avez besoin de garanties de trafic strictes.",
        "example": "Prototypage rapide avec des modèles équivalents."
      },
      "least-used": {
        "when": "Vous souhaitez un équilibrage adaptatif basé sur la demande en direct.",
        "avoid": "Le trafic est trop faible pour bénéficier d’un équilibrage des usages.",
        "example": "Charges de travail mixtes où un modèle est souvent surchargé."
      },
      "cost-optimized": {
        "when": "La réduction des coûts est votre priorité absolue.",
        "avoid": "Les données de tarification sont manquantes ou obsolètes.",
        "example": "Travaux en arrière-plan ou par lots pour lesquels un coût inférieur est préféré."
      },
      "reset-aware": {
        "when": "Vous parcourez plusieurs comptes avec une télémétrie de quota et différentes fenêtres de réinitialisation.",
        "avoid": "La télémétrie des quotas n'est pas disponible pour la plupart des comptes.",
        "example": "Préférez une réinitialisation de compte hebdomadaire à 60 % demain plutôt qu'une réinitialisation de compte à 80 % plus tard."
      },
      "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": "À utiliser lorsque vous souhaitez épuiser complètement le quota d'un fournisseur avant de passer au suivant.",
        "avoid": "À éviter lorsque vous avez besoin d’un équilibrage de charge au niveau des requêtes entre les fournisseurs.",
        "example": "Exemple : utilisez tous les crédits Deepgram de 200 $ avant de revenir à Groq."
      },
      "auto": {
        "when": "À utiliser lorsque vous avez besoin d'un routage de notation multifacteur basé sur le coût, la latence et la qualité.",
        "avoid": "Évitez lorsque vous avez besoin d’un ordre de priorité strict ou d’une persistance historique.",
        "example": "Exemple : Équilibrez les demandes entre des modèles avec des points forts différents."
      },
      "lkgp": {
        "when": "À utiliser lorsque vous souhaitez effectuer un itinéraire en fonction des taux de réussite et des performances historiques.",
        "avoid": "À éviter lorsque les données historiques sont limitées ou peu fiables.",
        "example": "Exemple : orientez-vous vers des modèles ayant de bons antécédents sur des tâches spécifiques."
      },
      "context-optimized": {
        "when": "À utiliser lorsque vous devez optimiser l’utilisation de la fenêtre contextuelle sur tous les modèles.",
        "avoid": "À éviter lorsque les modèles ont des longueurs de contexte similaires ou que les tâches sont simples.",
        "example": "Exemple : distribuez de longues conversations sur des modèles dotés de fenêtres contextuelles plus grandes."
      }
    },
    "advancedHelp": {
      "maxRetries": "Combien de tentatives sont tentées avant l'échec d'une requête.",
      "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": "Lorsqu'elle est activée, toute erreur en amont déclenche un basculement immédiat vers la cible combinée suivante, ignorant toutes les tentatives et les URL de secours.",
      "maxSetRetries": "Nombre de fois où il faut réessayer l'ensemble de cibles complet lorsque chaque cible échoue. 0 = aucune nouvelle tentative de niveau défini.",
      "setRetryDelayMs": "Délai entre les tentatives de nouvelle tentative au niveau de l'ensemble, ce qui donne le temps aux problèmes transitoires de se résoudre."
    },
    "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": "Charge équilibrée",
    "templateBalancedDesc": "Routage le moins utilisé pour répartir la demande dans le temps.",
    "usageGuideHide": "Cacher",
    "usageGuideDontShowAgain": "Ne plus montrer",
    "usageGuideShow": "Afficher le guide",
    "quickTestTitle": "Combo prêt à valider",
    "quickTestDescription": "Exécutez un test maintenant pour confirmer le comportement de repli et de latence.",
    "testNow": "Testez maintenant",
    "pricingCoverage": "Couverture tarifaire",
    "pricingCoverageHint": "Les coûts optimisés fonctionnent mieux lorsque tous les modèles combinés ont des prix.",
    "pricingAvailable": "Tarifs disponibles",
    "pricingMissing": "Pas de prix",
    "pricingAvailableShort": "prix",
    "pricingMissingShort": "sans prix",
    "warningRoundRobinSingleModel": "Le round-robin est plus utile avec au moins 2 modèles.",
    "warningCostOptimizedPartialPricing": "Seuls {priced} des modèles {total} ont un prix. Le routage peut être partiellement axé sur les coûts.",
    "warningCostOptimizedNoPricing": "Aucune donnée de prix trouvée pour ce combo. Un itinéraire optimisé en termes de coûts peut être inattendu.",
    "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": "Prêt à enregistrer ?",
    "readinessDescription": "Vérifie la checklist avant de créer ou de mettre à jour ce combo.",
    "readinessCheckName": "Le nom du combo est valide",
    "readinessCheckModels": "Au moins un modèle est sélectionné",
    "readinessCheckWeights": "Le total des poids est à 100 %",
    "readinessCheckWeightsOptional": "Règle de pondération non requise",
    "readinessCheckPricing": "Les données de prix sont disponibles",
    "readinessCheckPricingOptional": "Règle de prix non requise",
    "saveBlockedTitle": "L’enregistrement est bloqué tant que ces points ne sont pas corrigés :",
    "saveBlockName": "Définis un nom pour le combo.",
    "saveBlockModels": "Ajoute au moins un modèle.",
    "saveBlockWeighted": "Ajuste les pondérations à 100 % (actuel : {total} %).",
    "saveBlockPricing": "Ajoute un prix pour au moins un modèle ou choisis une autre stratégie.",
    "recommendationsLabel": "Configuration recommandée",
    "applyRecommendations": "Appliquer les recommandations",
    "recommendationsUpdated": "Recommandations mises à jour pour {strategy}.",
    "recommendationsApplied": "Recommandations appliquées à ce 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": "Base tolérante aux pannes",
        "description": "Utilise un modèle principal et garde une chaîne de fallback courte et fiable.",
        "tip1": "Place ton modèle le plus fiable en premier.",
        "tip2": "Garde 1 à 2 modèles de secours avec une qualité proche.",
        "tip3": "Active des retries sûrs pour absorber les pannes transitoires."
      },
      "weighted": {
        "title": "Répartition de trafic contrôlée",
        "description": "Idéal pour les déploiements canary et les migrations progressives.",
        "tip1": "Commence avec une répartition prudente comme 90/10.",
        "tip2": "Garde le total à 100 % et auto-équilibre après chaque changement.",
        "tip3": "Surveille succès et latence avant d’augmenter le poids canary."
      },
      "round-robin": {
        "title": "Partage de charge prévisible",
        "description": "Parfait quand les modèles sont équivalents et qu’il faut une distribution stable.",
        "tip1": "Utilise au moins 2 modèles.",
        "tip2": "Définis des limites de concurrence pour éviter les pics.",
        "tip3": "Utilise un timeout de file pour échouer vite en saturation."
      },
      "random": {
        "title": "Répartition rapide avec peu de réglages",
        "description": "À utiliser pour une distribution simple sans garanties strictes.",
        "tip1": "Choisis des modèles avec des profils de latence similaires.",
        "tip2": "Garde les retries actifs pour absorber les échecs aléatoires.",
        "tip3": "À privilégier pour l’expérimentation, pas pour des SLA stricts."
      },
      "least-used": {
        "title": "Équilibrage adaptatif",
        "description": "Routage vers les modèles les moins utilisés pour réduire les points chauds.",
        "tip1": "Fonctionne mieux avec un trafic continu.",
        "tip2": "Combine avec les health checks pour un équilibrage plus sûr.",
        "tip3": "Suis l’usage par modèle pour valider la distribution."
      },
      "cost-optimized": {
        "title": "Routage orienté budget",
        "description": "Routage vers les modèles les moins coûteux si les prix sont disponibles.",
        "tip1": "Assure une couverture de prix pour tous les modèles sélectionnés.",
        "tip2": "Garde un fallback de qualité pour les prompts difficiles.",
        "tip3": "Idéal pour batch/tâches de fond où le coût est le KPI principal."
      },
      "reset-aware": {
        "title": "Rotation des comptes prenant en compte la réinitialisation",
        "description": "Équilibre le quota restant du fournisseur par rapport au calendrier de réinitialisation.",
        "tip1": "Utilisez des étapes de compte explicites ou un routage de balises de compte pour les fournisseurs disposant de télémétrie de quota.",
        "tip2": "Ajustez la séance par rapport aux poids hebdomadaires lorsque l’épuisement à court terme est plus risqué.",
        "tip3": "Gardez la bande de liaison petite afin que les comptes équivalents tournent toujours équitablement."
      },
      "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": "Épuisez les quotas des fournisseurs de manière séquentielle avant de revenir en arrière.",
        "tip1": "À utiliser pour le routage basé sur des quotas avec des chaînes de secours claires.",
        "tip2": "Définissez des quotas avec précision pour éviter un repli prématuré.",
        "tip3": "Fonctionne mieux avec les fournisseurs proposant des niveaux gratuits ou des tranches de crédit.",
        "title": "Épuisement des quotas"
      },
      "auto": {
        "description": "Itinéraire basé sur une notation en temps réel du coût, de la latence, de la qualité et de l'intégrité.",
        "tip1": "Laissez le moteur équilibrer automatiquement plusieurs facteurs.",
        "tip2": "Surveillez les facteurs qui déterminent les décisions de routage dans les journaux.",
        "tip3": "À utiliser pour les charges de travail complexes où aucun facteur ne domine.",
        "title": "Optimisation multifactorielle"
      },
      "lkgp": {
        "description": "Itinéraire basé sur les performances historiques et les modèles de réussite.",
        "tip1": "Nécessite un historique de requêtes suffisant pour des prédictions précises.",
        "tip2": "Idéal pour les charges de travail avec des modèles de performances de modèle cohérents.",
        "tip3": "Surveillez la précision des prévisions et ajustez les pondérations si nécessaire.",
        "title": "Routage basé sur l'historique"
      },
      "context-optimized": {
        "description": "Optimisez le routage en fonction de l'utilisation de la fenêtre contextuelle et de l'efficacité des jetons.",
        "tip1": "Acheminez les longues conversations vers des modèles dotés de fenêtres contextuelles plus grandes.",
        "tip2": "Surveillez l’utilisation du contexte pour éviter le gaspillage de jetons.",
        "tip3": "Idéal pour l’IA conversationnelle nécessitant une rétention de contexte étendue.",
        "title": "Optimisation du contexte"
      },
      "context-relay": {
        "description": "Idéal lorsqu'une rotation de compte est attendue et que le compte suivant doit hériter d'un résumé de tâche simplifié.",
        "tip1": "À utiliser avec les comptes tournants des fournisseurs pour la même famille de modèles.",
        "tip2": "Définissez le seuil de transfert en dessous des seuils de quota stricts pour le temps de génération du résumé.",
        "tip3": "Définissez un modèle récapitulatif dédié uniquement si le modèle principal est trop cher ou instable.",
        "title": "Priorité de continuité de session"
      },
      "p2c": {
        "description": "Acheminez vers le fournisseur avec la charge actuelle la plus faible en fonction de métriques en temps réel.",
        "tip1": "Surveillez les mesures de santé du fournisseur pour une évaluation précise de la charge.",
        "tip2": "Fonctionne mieux avec des pools de fournisseurs homogènes.",
        "tip3": "Ajustez la sensibilité pour éviter les oscillations lors des pics de trafic.",
        "title": "Le pouvoir de deux choix"
      }
    },
    "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": "Cette étape exacte fournisseur/modèle/compte est déjà dans la combinaison.",
    "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": "Terminez chaque étape afin de définir des combos, de créer des étapes, de sélectionner une stratégie de routage et d'examiner les résultats.",
    "builderStepsDescription": "Construisez chaque étape combinée dans l'ordre : fournisseur, modèle, puis compte. Cela permet de réutiliser le même fournisseur et le même modèle sur différents comptes.",
    "selectProvider": "Sélectionnez le fournisseur",
    "selectProviderPlaceholder": "Sélectionnez un fournisseur",
    "selectModel": "Sélectionnez le modèle",
    "selectModelPlaceholder": "Sélectionnez d'abord un fournisseur",
    "selectAccount": "Sélectionnez un compte",
    "selectComboToReference": "Sélectionnez la combinaison à référencer",
    "comboReference": "Référence combinée",
    "addComboReference": "Ajouter une référence combinée",
    "addStepBeforeContinue": "Veuillez ajouter au moins une étape avant de passer à l'étape suivante.",
    "previewNextStep": "Aperçu de l'étape suivante",
    "autoSelectAccount": "Sélectionner automatiquement le compte au moment de l'exécution",
    "modePackBalanced": "Équilibré",
    "modePackBudget": "Budget",
    "modePackPerformance": "Performances",
    "modePackCustom": "Personnalisé",
    "browseLegacyCatalog": "Parcourir le catalogue combo existant",
    "agentFeaturesTitle": "Fonctionnalités des agents",
    "agentFeaturesDescription": "Activer les fonctionnalités avancées pour les agents utilisant cette combinaison",
    "agentFeaturesSystemMessageOverride": "Remplacer le message système",
    "agentFeaturesSystemMessagePlaceholder": "Vous êtes un assistant expert...",
    "agentFeaturesSystemMessageHint": "Remplacement des messages système pour les agents",
    "agentFeaturesToolFilterRegex": "/modèle-regex/",
    "agentFeaturesToolFilterHint": "Outil de filtre regex pour les agents",
    "agentFeaturesContextCacheHint": "Activer le cache contextuel pour les outils d'agent",
    "agentFeaturesContextCacheProtection": "Protéger le cache des mutations de l'outil d'agent",
    "agentFeaturesContextLength": "Longueur du contexte",
    "agentFeaturesContextLengthPlaceholder": "par ex. 128000",
    "agentFeaturesContextLengthHint": "Définit la fenêtre contextuelle de ce combo dans /v1/models.",
    "agentFeaturesContextLengthErrorInteger": "La longueur du contexte doit être un entier valide",
    "agentFeaturesContextLengthErrorRange": "La longueur du contexte doit être comprise entre 1 000 et 2 000 000",
    "compressionOverride": "Remplacement de la compression",
    "modePack": "Pack de modes"
  },
  "costs": {
    "title": "Coûts",
    "pageDescription": "Suivez les dépenses, analysez les tendances et gérez votre budget IA chez tous les fournisseurs",
    "overview": "Aperçu",
    "budget": "Budget",
    "totalCost": "Coût total",
    "breakdown": "Répartition des coûts",
    "noData": "Aucune donnée sur les coûts",
    "byModel": "Par modèle",
    "byProvider": "Par fournisseur",
    "range7d": "7 jours",
    "range30d": "30 jours",
    "range90d": "90 jours",
    "rangeAll": "Tout le temps",
    "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": "Utilisation des jetons",
    "totalTokens": "Total des jetons",
    "inputTokens": "Jetons d'entrée",
    "outputTokens": "Jetons de sortie",
    "inputOutputRatio": "Rapport entrée/sortie",
    "tokens": "jetons",
    "routingEfficiency": "Efficacité du routage",
    "fallbackCount": "Demandes de secours",
    "fallbackRate": "Taux de repli",
    "modelCoverage": "Couverture du modèle",
    "modelCoverageDesc": "% de requêtes avec modèle explicite",
    "outOfRequests": "sur {total} requêtes",
    "costByApiKey": "Coût par clé API",
    "costByAccount": "Coût par compte",
    "apiKeyName": "Clé API",
    "account": "Compte",
    "requests": "Demandes",
    "cost": "Coût",
    "dayStreak": "séquence d'une journée",
    "weeklyUsagePattern": "Modèle d'utilisation hebdomadaire",
    "activityHeatmap": "Activité (365 jours)",
    "less": "Moins",
    "more": "Plus",
    "monthlyForecast": "Prévisions mensuelles",
    "forecastBasis": "Basé sur les {days} derniers jours",
    "avgDailyCost": "Moy. coût journalier",
    "daysRemaining": "{days} jours restants",
    "periodComparison": "Comparaison des périodes",
    "previousPeriod": "Moitié précédente",
    "currentPeriod": "Moitié actuelle",
    "exportCSV": "Exporter au format CSV",
    "exportJSON": "Exporter au format JSON",
    "legacyFreeLabel": "__MISSING__:Legacy / Free",
    "costExplorerTitle": "Cost Explorer",
    "costExplorerDescription": "Explore spend by provider, model, API key, account, or service tier.",
    "groupProvider": "Provider",
    "groupModel": "Model",
    "groupApiKey": "API Key",
    "groupAccount": "Account",
    "groupServiceTier": "Service Tier",
    "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": "Dimension",
    "share": "Share",
    "legacyOrFree": "Legacy / Free",
    "filterRows": "Filter rows…",
    "filterCostExplorerRows": "Filter Cost Explorer rows",
    "noMatchingCostRows": "No matching cost rows",
    "noMatchingCostRowsDescription": "Adjust the search text, grouping, or selected time window.",
    "showingCostRows": "Showing {shown} of {total} matching rows.",
    "showingTopCostRows": "Showing {shown} of {total} matching rows (top 50)."
  },
  "endpoint": {
    "title": "Point de terminaison de l'API",
    "available": "Points de terminaison disponibles",
    "cloudProxy": "Proxy cloud",
    "disableConfirm": "Êtes-vous sûr de vouloir désactiver le proxy cloud ?",
    "baseUrl": "URL de base",
    "apiKeyLabel": "Clé API",
    "registeredKeys": "Clés enregistrées",
    "chatCompletions": "Achèvements des discussions",
    "responses": "Réponses",
    "listModels": "Liste des modèles",
    "usingCloudProxy": "Utiliser le proxy cloud",
    "usingLocalServer": "Utiliser un serveur local",
    "machineId": "ID de l'ordinateur : {id}...",
    "disableCloud": "Désactiver le cloud",
    "enableCloud": "Activer le cloud",
    "modelsAcrossEndpoints": "Modèles {models} sur {endpoints} points de terminaison",
    "loadingModels": "Loading available models...",
    "chatDesc": "Chat en streaming et sans streaming avec tous les fournisseurs",
    "embeddings": "Intégrations",
    "embeddingsDesc": "Intégrations de texte pour les pipelines de recherche et RAG",
    "imageGeneration": "Génération d'images",
    "imageDesc": "Générer des images à partir d'invites de texte",
    "rerank": "Reclassement",
    "rerankDesc": "Reclasser les documents par pertinence par rapport à une requête",
    "audioTranscription": "Transcription audio",
    "audioTranscriptionDesc": "Transcrire des fichiers audio en texte (Whisper)",
    "textToSpeech": "Synthèse vocale",
    "textToSpeechDesc": "Convertir du texte en discours au son naturel",
    "musicGeneration": "Music Generation",
    "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)",
    "moderations": "Modérations",
    "moderationsDesc": "Modération du contenu et classification de sécurité",
    "responsesDesc": "API Responses d'OpenAI pour Codex et workflows agentiques avancés",
    "listModelsDesc": "Lister tous les modèles disponibles sur tous les fournisseurs connectés",
    "settingsApiDesc": "Lire et modifier la configuration d'OmniRoute via l'API",
    "settingsApi": "Settings API",
    "categoryCore": "APIs Principales",
    "categoryMedia": "Médias et Multi-Modal",
    "categorySearch": "Search & Discovery",
    "categoryUtility": "Utilitaires et Gestion",
    "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": "Activer le proxy cloud",
    "whatYouGet": "Ce que vous obtiendrez",
    "cloudBenefitAccess": "Accédez à votre API depuis n'importe où dans le monde",
    "cloudBenefitShare": "Partagez facilement le point de terminaison avec votre équipe",
    "cloudBenefitPorts": "Pas besoin d'ouvrir des ports ou de configurer un pare-feu",
    "cloudBenefitEdge": "Réseau périphérique mondial rapide",
    "cloudSessionNote": "Cloud conservera votre session d'authentification pendant 1 jour. S'il n'est pas utilisé, il sera automatiquement supprimé.",
    "cloudUnstableNote": "Cloud est actuellement instable avec Claude Code OAuth dans certains cas.",
    "cloudConnected": "Proxy Cloud connecté !",
    "connectingToCloud": "Connexion au cloud...",
    "verifyingConnection": "Vérification de la connexion...",
    "connecting": "Connexion...",
    "verifying": "Vérification...",
    "connected": "Connecté !",
    "disableCloudTitle": "Désactiver le proxy cloud",
    "disableWarning": "Toutes les sessions d'authentification seront supprimées du cloud.",
    "syncingData": "Synchronisation des dernières données...",
    "disablingCloud": "Désactivation du cloud...",
    "syncing": "Synchronisation...",
    "disabling": "Désactivation...",
    "cloudConnectedVerified": "Cloud Proxy connecté et vérifié !",
    "connectedVerificationPending": "Connecté – vérification en attente",
    "connectedVerificationPendingWithError": "Connecté — vérification en attente : {error}",
    "cloudDisabledSuccess": "Cloud désactivé avec succès",
    "syncedSuccess": "Synchronisé avec succès",
    "failedDisable": "Échec de la désactivation du cloud",
    "failedEnable": "Échec de l'activation du cloud",
    "cloudRequestTimeout": "Expiration du délai de demande cloud",
    "cloudRequestFailed": "La requête cloud a échoué",
    "cloudWorkerUnreachable": "Impossible d'atteindre le travailleur cloud. Assurez-vous que le service cloud est en cours d'exécution (npm run dev dans /cloud).",
    "connectionFailed": "La connexion a échoué",
    "syncFailed": "Échec de la synchronisation des données cloud",
    "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} — Modèles",
    "noModelsForProvider": "Aucun modèle disponible pour ce fournisseur.",
    "chat": "Discuter",
    "embedding": "Intégration",
    "image": "Images",
    "custom": "personnalisé",
    "modelsCount": "{count, plural, one {# model} other {# models}}",
    "sectionTitle": "Surface d'intégration",
    "sectionDescription": "API compatibles OpenAI et points de terminaison du protocole opérationnel",
    "tabApis": "API compatibles OpenAI",
    "tabProtocols": "Protocoles",
    "tabsAria": "Sections de point de terminaison",
    "protocolsTitle": "Protocoles",
    "protocolsDescription": "MCP et A2A sont des points de terminaison de première classe avec une observabilité et des contrôles dédiés.",
    "mcpCardTitle": "Serveur MCP",
    "mcpCardDescription": "Protocole de contexte de modèle sur stdio",
    "a2aCardTitle": "Serveur A2A",
    "a2aCardDescription": "Point de terminaison Agent2Agent JSON-RPC",
    "protocolToolsLabel": "Outils",
    "protocolTasksLabel": "Tâches",
    "protocolActiveStreamsLabel": "Flux actifs",
    "protocolLastActivity": "Dernière activité",
    "quickStart": "Démarrage rapide",
    "openMcpDashboard": "Gestion MCP ouverte",
    "openA2aDashboard": "Gestion A2A ouverte",
    "mcpQuickStartTitle": "Démarrage rapide MCP",
    "mcpQuickStartStep1": "Exécutez le serveur MCP via `omniroute --mcp`.",
    "mcpQuickStartStep2": "Configurez votre client MCP pour vous connecter via le transport stdio.",
    "mcpQuickStartStep3": "Invoquez des outils tels que `omniroute_get_health` et `omniroute_list_combos`.",
    "a2aQuickStartTitle": "Démarrage rapide A2A",
    "a2aQuickStartStep1": "Découvrez la carte d'agent sur `/.well-known/agent.json`.",
    "a2aQuickStartStep2": "Envoyez des requêtes JSON-RPC à `POST /a2a` en utilisant `message/send` ou `message/stream`.",
    "a2aQuickStartStep3": "Suivez et contrôlez les tâches à l’aide de `tasks/get` et `tasks/cancel`.",
    "completionsLegacy": "Completions (Legacy)",
    "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format",
    "messagesApi": "Messages",
    "messagesApiDesc": "Format API natif Anthropic Messages pour les fournisseurs compatibles Claude",
    "imageEdits": "Modifications d'images",
    "imageEditsDesc": "Éditer et modifier des images existantes avec l'IA (inpainting, outpainting, variations)",
    "batchApi": "API par lots",
    "batchApiDesc": "Traitez de gros lots de requêtes de manière asynchrone (compatible OpenAI)",
    "filesApi": "API de fichiers",
    "filesApiDesc": "Téléchargez et gérez des fichiers pour le traitement par lots",
    "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": "Mot de passe Sudo (obligatoire sur macOS/Linux)",
    "ngrokTitle": "Tunnel de Ngrok",
    "ngrokRunning": "Courir",
    "ngrokStarting": "Démarrage",
    "ngrokStoppedState": "Arrêté",
    "ngrokNeedsAuth": "Nécessite une authentification",
    "ngrokNotInstalled": "Non installé",
    "ngrokUnsupported": "Non pris en charge",
    "ngrokError": "Erreur",
    "ngrokEnable": "Activer le tunnel",
    "ngrokDisable": "Arrêter le tunnel",
    "ngrokUrlNotice": "Crée un tunnel ngrok public.",
    "ngrokAuthTokenLabel": "Authtoken (obligatoire si NGROK_AUTHTOKEN n'est pas défini)",
    "ngrokAuthTokenPlaceholder": "Entrez votre jeton d'authentification ngrok",
    "ngrokLastError": "Dernière erreur : {error}",
    "ngrokStarted": "Le tunnel ngrok a commencé",
    "ngrokStopped": "Le tunnel de Ngrok s'est arrêté",
    "ngrokRequestFailed": "Échec de la mise à jour du tunnel ngrok",
    "tokenSaverSubtitle": "Dépensez moins de jetons à chaque demande.",
    "tokenSaverToolOutput": "Sortie de l'outil",
    "tokenSaverLlmOutput": "Sortie LLM",
    "tokenSaverInputCompression": "Compression d'entrée",
    "apiEndpointsCatalogUnavailable": "Catalogue API indisponible",
    "apiEndpointsSearchPlaceholder": "Rechercher des points de terminaison...",
    "apiEndpointsRequiresAuth": "Nécessite une authentification",
    "apiEndpointsNoMatch": "Aucun point de terminaison ne correspond à votre filtre",
    "localServer": "Serveur local",
    "cloudOmniroute": "Cloud OmniRoute",
    "copyUrl": "Copier l'URL",
    "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": "Points d'accès API",
    "apiEndpointsTitle": "Points d'accès API",
    "apiEndpointsDescription": "Points d'accès API backend pouvant être consommés par d'autres applications et services.",
    "comingSoon": "Bientôt disponible",
    "plannedFeatures": "Fonctionnalités prévues",
    "featureRestApi": "Catalogue d'API REST avec documentation interactive",
    "featureWebhooks": "Configuration de webhooks et abonnements aux événements",
    "featureSwagger": "Génération automatique de spécifications OpenAPI / Swagger",
    "featureAuth": "Gestion des clés API et des portées OAuth par point d'accès"
  },
  "mcpDashboard": {
    "loading": "Chargement du tableau de bord MCP...",
    "activate": "activer",
    "deactivate": "désactiver",
    "confirmSwitchCombo": "Confirmer la combinaison {action} \"{combo}\" ?",
    "switchComboFailed": "Échec du changement d'état du combo.",
    "switchComboSuccess": "Combo \"{combo}\" mis à jour.",
    "confirmApplyProfile": "Appliquer le profil de résilience « {profile} » ?",
    "applyProfileFailed": "Échec de l'application du profil de résilience.",
    "applyProfileSuccess": "Profil \"{profile}\" appliqué.",
    "confirmResetBreakers": "Réinitialiser tous les disjoncteurs ?",
    "resetBreakersFailed": "Échec de la réinitialisation des disjoncteurs.",
    "resetBreakersSuccess": "Les disjoncteurs se réinitialisent.",
    "processStatus": "Statut du processus",
    "online": "En ligne",
    "offline": "Hors ligne",
    "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": "Copier l'URL",
    "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": "Disponibilité de la session",
    "lastHeartbeat": "Dernier battement de coeur",
    "activity24h": "Activité (24h)",
    "totalCalls": "Total des appels",
    "successRate": "Taux de réussite",
    "avgLatency": "Latence moyenne",
    "topTools": "Meilleurs outils",
    "noToolCalls24h": "Aucun outil n'a appelé au cours des dernières 24 heures.",
    "runtimeDetails": "Détails d'exécution",
    "transport": "Transports",
    "scopesEnforced": "Portées appliquées",
    "yes": "oui",
    "no": "non",
    "lastCall": "Dernier appel",
    "heartbeatPath": "Heartbeat path",
    "operationalControls": "Contrôles opérationnels",
    "switchCombo": "Changer de combinaison",
    "inactive": "inactif",
    "active": "actif",
    "activateCombo": "Activer le combo",
    "deactivateCombo": "Désactiver le combo",
    "applyResilienceProfile": "Appliquer le profil de résilience",
    "profileAggressive": "agressif",
    "profileBalanced": "équilibré",
    "profileConservative": "conservateur",
    "applyProfile": "Appliquer le profil",
    "resetCircuitBreakers": "Réinitialiser les disjoncteurs",
    "resetCircuitBreakersHelp": "Efface l’état actuel du disjoncteur et les compteurs de pannes pour les fournisseurs.",
    "resetAllBreakers": "Réinitialiser tous les disjoncteurs",
    "toolsAndScopes": "Outils et portées",
    "tableTool": "Outil",
    "tableScopes": "Portées",
    "tablePhase": "Phase",
    "tableAudit": "Vérification",
    "auditLog": "Journal d'audit",
    "auditSummary": "Appels : {total} | page {page} de {totalPages}",
    "allTools": "Tous les outils",
    "allResults": "Tous les résultats",
    "success": "Succès",
    "failure": "Échec",
    "apiKeyIdPlaceholder": "apiKeyId",
    "loadingAuditEntries": "Loading audit entries...",
    "noAuditEntriesForFilters": "No audit entries found for current filters.",
    "tableTimestamp": "Timestamp",
    "tableDuration": "Duration",
    "tableResult": "Result",
    "tableApiKey": "API key",
    "failed": "failed",
    "previous": "Previous",
    "next": "Next",
    "apiKeyId": "Api Key Id",
    "offset": "Offset",
    "limit": "Limit",
    "tool": "Tool"
  },
  "a2aDashboard": {
    "loading": "Loading A2A dashboard...",
    "confirmCancelTask": "Cancel task {taskId}?",
    "cancelTaskFailed": "Échec de l'annulation de la tâche.",
    "cancelTaskSuccess": "Tâche {taskId} annulée.",
    "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": "Flux actifs",
    "lastTask": "Last task",
    "taskStateOverview": "Task state overview",
    "state": {
      "submitted": "submitted",
      "working": "working",
      "completed": "completed",
      "failed": "failed",
      "cancelled": "annulé"
    },
    "agentCard": "Carte d'agent",
    "agentCardPath": "__MISSING__:/.well-known/agent.json",
    "version": "Version",
    "url": "URL",
    "capabilities": "Capacités",
    "agentCardNotAvailable": "Carte d'agent non disponible.",
    "quickValidation": "Validation rapide",
    "quickValidationDescription": "Executes smoke calls through the live `/a2a` endpoint.",
    "runMessageSend": "Run message/send",
    "runMessageStream": "Run message/stream",
    "taskManagement": "Task management",
    "taskSummary": "{total} tasks | page {page} of {totalPages}",
    "allStates": "all",
    "allSkills": "all skills",
    "loadingTasks": "Loading tasks...",
    "noTasksForFilters": "No tasks found for current filters.",
    "tableTask": "Task",
    "tableSkill": "Skill",
    "tableState": "State",
    "tableUpdated": "Updated",
    "tableActions": "Actes",
    "view": "Voir",
    "cancel": "Annuler",
    "previous": "Previous",
    "next": "Next",
    "taskDetail": "Détail de la tâche",
    "close": "Fermer",
    "metadata": "Métadonnées",
    "events": "Événements",
    "artifacts": "Artefacts",
    "tablePhase": "Table Phase",
    "offset": "Offset",
    "limit": "Limit",
    "skill": "Skill",
    "rpcEndpoint": "POSTER /a2a",
    "rpcMethodSend": "message/envoyer",
    "rpcMethodStream": "message/flux",
    "rpcMethodGet": "tâches/obtenir",
    "rpcMethodCancel": "tâches/annuler",
    "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": "Pipeline OK ({latencyMs}ms)",
    "pipelineError": "Erreur de pipeline",
    "healthUnknown": "Santé inconnue",
    "checkingHealth": "Vérification…",
    "checkHealth": "Vérifier la santé",
    "pageInfo": "Page {page} sur {totalPages} ({total} au total)",
    "previous": "Précédent",
    "next": "Suivant",
    "cancel": "Annuler",
    "save": "Enregistrer",
    "keyPlaceholder": "par ex. utilisateur.préférences.thème",
    "contentPlaceholder": "Valeur ou contenu JSON à retenir"
  },
  "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": "Filtrer les compétences par nom, description ou tag",
    "allModes": "Tous les modes",
    "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": "Marché des compétences",
    "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": "Installer la compétence"
  },
  "health": {
    "title": "Santé du système",
    "description": "Surveillance en temps réel de votre instance OmniRoute",
    "healthy": "Sain",
    "degraded": "Dégradé",
    "down": "Vers le bas",
    "uptime": "Temps de disponibilité",
    "memory": "Mémoire",
    "memoryRss": "Mémoire (RSS)",
    "heap": "Tas",
    "cpu": "Processeur",
    "database": "Base de données",
    "version": "Version",
    "lastCheck": "Dernière vérification",
    "providerHealth": "Santé du prestataire",
    "systemMetrics": "Métriques du système",
    "tokenHealth": "Santé du jeton",
    "refreshAll": "Actualiser tout",
    "checkNow": "Vérifiez maintenant",
    "loadingHealth": "Chargement des données de santé...",
    "failedToLoad": "Échec du chargement des données d'état : {error}",
    "retry": "Réessayer",
    "allOperational": "Tous les systèmes opérationnels",
    "issuesDetected": "Problèmes système détectés",
    "updatedAt": "{time} mis à jour",
    "latency": "Latence",
    "latencyP50": "p50",
    "latencyP95": "p95",
    "latencyP99": "p99",
    "millisecondsShort": "{value}ms",
    "notAvailable": "—",
    "totalRequests": "Total des demandes",
    "noDataYet": "Aucune donnée pour l'instant",
    "promptCache": "Cache d'invite",
    "entries": "Entrées",
    "hitRate": "Taux de réussite",
    "hitsMisses": "Coups réussis / Manqués",
    "signatureCache": "Cache de signatures",
    "signatureDefaults": "Valeurs par défaut",
    "signatureTool": "Outil",
    "signatureFamily": "Famille",
    "signatureSession": "Séance",
    "recovering": "Récupération",
    "noCBData": "Aucune donnée sur les disjoncteurs disponible. Faites d'abord quelques demandes.",
    "providerHealthStatusAria": "État de santé du prestataire",
    "issuesLabel": "Problèmes détectés",
    "operational": "Opérationnel",
    "providers": "Fournisseurs",
    "configuredProvidersLabel": "Configuré dans le tableau de bord",
    "configuredProvidersHint": "Fournisseurs dont les informations d’identification sont enregistrées dans /dashboard/providers, quel que soit l’état d’exécution.",
    "activeProviders": "{count} active",
    "activeProvidersHint": "Fournisseurs configurés actuellement activés pour les demandes de routage.",
    "monitoredProviders": "{count} monitored",
    "monitoredProvidersHint": "Fournisseurs actuellement suivis par des moniteurs de santé des disjoncteurs.",
    "healthyCount": "{count} en bonne santé",
    "nodeVersion": "Nœud {version}",
    "failures": "Échec de {count}",
    "failuresPlural": "{count} échecs",
    "lastFailure": "Dernier",
    "rateLimitStatus": "Statut de limite de débit",
    "activeLimiters": "{count} limiteur actif",
    "activeLimitersPlural": "{count} limiteurs actifs",
    "queued": "En file d'attente",
    "queuedCount": "{count} en file d'attente",
    "running": "courir",
    "runningCount": "{count} en cours d'exécution",
    "ok": "D'accord",
    "activeLockouts": "Verrouillages actifs",
    "resetConfirm": "Réinitialiser tous les disjoncteurs à l'état sain ? Cela effacera tous les décomptes d’échecs et restaurera tous les fournisseurs à l’état opérationnel.",
    "resetAllTitle": "Réinitialisez tous les disjoncteurs à l’état sain",
    "resetting": "Réinitialisation...",
    "resetAll": "Tout réinitialiser",
    "until": "Jusqu'au {time}",
    "limitExhausted": "Exhausted",
    "learnedFromHeaders": "Learned from headers",
    "remainingOfLimit": "{remaining}/{limit} remaining",
    "throttleStatus": "Throttle: {value}",
    "lastHeaderUpdate": "Header update: {age}",
    "databaseHealth": "Santé de la base de données",
    "stickyBoundSessions": "Séances collantes",
    "sessionsByApiKey": "Sessions par clé API",
    "noActiveSessionsTracked": "Aucune session active suivie pour le moment.",
    "noSessionQuotaMonitorsActive": "Aucun moniteur de quota de session n'est actif.",
    "gracefulDegradationStatus": "Statut de dégradation gracieuse",
    "additionalModels": "+{count} plus de modèles",
    "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": "Télémétrie du système",
    "description": "Signaux de demande continue, d'exécution, de session et de mémoire de ce processus OmniRoute.",
    "uptime": "Temps de disponibilité",
    "totalRequests": "Total des demandes",
    "avgLatency": "Latence moyenne",
    "errorRate": "Taux d'erreur",
    "activeConnections": "Connexions actives",
    "memoryUsage": "Utilisation de la mémoire",
    "latencyTrend": "Tendance de latence",
    "throughputTrend": "Tendance du débit",
    "memoryTrend": "Tendance mémoire",
    "refresh": "Actualiser",
    "updatedAt": "{time} mis à jour",
    "loadFailed": "Échec du chargement de la télémétrie.",
    "partialData": "La télémétrie est partiellement disponible : {error}"
  },
  "mitm": {
    "title": "Proxy MITM",
    "description": "Proxy transparent pour intercepter et acheminer les demandes des clients.",
    "enable": "Activer le proxy MITM",
    "enableDesc": "Démarrez ou arrêtez le processus d'interception local et le remplacement DNS.",
    "status": "Statut",
    "running": "Courir",
    "stopped": "Arrêté",
    "start": "Commencer",
    "stop": "Arrêter",
    "refresh": "Actualiser",
    "port": "Port proxy",
    "apiKey": "Clé API du routeur",
    "apiKeyPlaceholder": "Facultatif ; revient à une clé locale",
    "sudoPassword": "Mot de passe Sudo",
    "cachedPassword": "Mis en cache pour ce processus",
    "saveSettings": "Enregistrer les paramètres",
    "settingsSaved": "Paramètres MITM enregistrés.",
    "startedSuccess": "Le proxy MITM a démarré.",
    "stoppedSuccess": "Le proxy MITM s'est arrêté.",
    "saveFailed": "Échec de la mise à jour des paramètres MITM.",
    "loadFailed": "Échec du chargement des paramètres MITM.",
    "invalidPort": "L'interception transparente MITM nécessite actuellement le port 443.",
    "certificate": "Certificat d'autorité de certification",
    "certificateReady": "Le certificat est disponible pour l'installation de la confiance du client.",
    "certificateMissing": "Le certificat n'a pas encore été généré.",
    "available": "Disponible",
    "missing": "Manquant",
    "downloadCert": "Télécharger le certificat CA",
    "regenerateCert": "Régénérer le certificat",
    "regenerateConfirm": "Cela invalidera la confiance existante des clients. Continuer?",
    "regenerateSuccess": "Certificat MITM régénéré.",
    "regenerateFailed": "Échec de la régénération du certificat MITM.",
    "targetRoutes": "Itinéraires cibles",
    "interceptedRequests": "Demandes interceptées",
    "activeConnections": "Connexions actives",
    "dnsConfigured": "DNS configuré",
    "pid": "PID",
    "lastIntercept": "Dernière interception",
    "target": "Cible",
    "host": "Hôte",
    "localPort": "Port local",
    "endpoints": "Points de terminaison",
    "enabled": "Activé",
    "configured": "Configuré",
    "yes": "Oui",
    "no": "Non",
    "noTargets": "Aucune route cible configurée."
  },
  "limits": {
    "title": "Limites et quotas",
    "rateLimit": "Limite de taux",
    "remaining": "Restant",
    "requestsPerMinute": "Requêtes/min",
    "tokensPerMinute": "Jetons/min",
    "dailyLimit": "Limite quotidienne"
  },
  "logs": {
    "title": "Journaux",
    "requestLogs": "Journaux de demande",
    "proxyLogs": "Journaux proxy",
    "auditLog": "Journal d'audit",
    "console": "Console",
    "auditLogDesc": "Actions administratives et événements de sécurité",
    "loading": "Chargement...",
    "refresh": "Actualiser",
    "filterByAction": "Filtrer par action...",
    "filterByActor": "Filtrer par acteur...",
    "filterEntriesAria": "Filtrer les entrées du journal d'audit",
    "filterByActionTypeAria": "Filtrer par type d'action",
    "filterByActorAria": "Filtrer par acteur",
    "refreshAuditLogAria": "Actualiser le journal d'audit",
    "tableAria": "Entrées du journal d'audit",
    "failedFetchAuditLog": "Échec de la récupération du journal d'audit",
    "showing": "Affichage des entrées {count} (décalage {offset})",
    "search": "Rechercher",
    "timestamp": "Horodatage",
    "action": "Action",
    "actor": "Acteur",
    "target": "Cible",
    "details": "Détails",
    "ipAddress": "Adresse IP",
    "notAvailable": "—",
    "noEntries": "Aucune entrée du journal d'audit trouvée",
    "previous": "Précédent",
    "next": "Suivant",
    "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": "Tout effacer",
    "confirmClearActiveRequests": "Effacer toutes les demandes actives ?",
    "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": "Bienvenue",
    "security": "Sécurité",
    "test": "Tester",
    "ready": "Prêt !",
    "setPassword": "Définir le mot de passe",
    "addProvider": "Ajoutez votre premier fournisseur",
    "getStarted": "Commencer",
    "skip": "Sauter",
    "skipWizard": "Ignorer complètement l'assistant",
    "skipPassword": "Ignorer la configuration du mot de passe",
    "skipAndContinue": "Passer et continuer",
    "passwordLabel": "Mot de passe",
    "confirmPassword": "Confirmer le mot de passe",
    "enterPassword": "Entrez le mot de passe",
    "confirmPasswordPlaceholder": "Confirmer le mot de passe",
    "passwordsMismatch": "Les mots de passe ne correspondent pas",
    "setupComplete": "Configuration terminée !",
    "goToDashboard": "Accédez au tableau de bord →",
    "welcomeDesc": "OmniRoute est votre proxy API IA local. Il achemine les requêtes vers plusieurs fournisseurs d'IA avec équilibrage de charge, basculement et suivi de l'utilisation.",
    "multiProvider": "Multi-fournisseur",
    "usageTracking": "Suivi de l'utilisation",
    "securityDesc": "Définissez un mot de passe pour protéger votre tableau de bord ou ignorez-le pour l'instant.",
    "providerDesc": "Connectez votre premier fournisseur d'IA. Vous pourrez en ajouter d’autres plus tard.",
    "apiKeyRequired": "Clé API (obligatoire)",
    "customUrlOptional": "URL personnalisée (facultatif)",
    "testDesc": "Vérifions que la connexion de votre fournisseur fonctionne.",
    "runTest": "Exécuter le test de connexion",
    "testingConnection": "Test de connexion...",
    "connectionSuccessful": "Connexion réussie ! Votre fournisseur est prêt.",
    "noProviderFound": "Aucun fournisseur trouvé. Vous pourrez en ajouter un depuis le tableau de bord plus tard.",
    "testFailed": "Le test a échoué, mais vous pourrez le configurer ultérieurement.",
    "couldNotTest": "Impossible de tester pour le moment. Vous pouvez tester depuis le tableau de bord.",
    "doneDesc": "Vous êtes prêt ! Votre instance OmniRoute est configurée et prête à proxyer les requêtes IA.",
    "yourEndpoint": "Votre point de terminaison :",
    "continue": "Continuer",
    "retry": "Réessayer",
    "failedSetPassword": "Échec de la définition du mot de passe. Essayer à nouveau.",
    "failedAddProvider": "Échec de l'ajout du fournisseur. Essayer à nouveau.",
    "connectionError": "Erreur de connexion. Veuillez réessayer.",
    "provider": "Fournisseur",
    "apiKeyHelp": "Une clé API est un mot de passe pour les services d'IA. Obtenez-en un sur le site Web de votre fournisseur (par exemple, platform.openai.com, console.anthropic.com).",
    "tier": {
      "subtitle": "OmniRoute organise les fournisseurs en trois niveaux afin que le routage privilégie en premier le chemin le plus fiable et le moins coûteux.",
      "tier1": {
        "label": "Clients premium",
        "description": "CLI de première classe avec flux d’authentification natifs et modèles de raisonnement."
      },
      "tier2": {
        "label": "Coût optimisé",
        "description": "Fournisseurs bon marché et à haut débit utilisés pour le trafic quotidien."
      },
      "tier3": {
        "label": "Repli et spécialité",
        "description": "Points de terminaison hébergés localement ou spécialisés utilisés comme solutions de secours."
      },
      "configure": "Configurer les fournisseurs"
    },
    "tierFlowDiagramAlt": "Diagramme de secours OmniRoute à 3 niveaux",
    "apiKeyMgmt": "Gestion des clés API"
  },
  "providers": {
    "title": "Fournisseurs",
    "allProviders": "Tous les fournisseurs",
    "audioProviders": "Fournisseurs audio",
    "showFreeOnly": "Gratuit uniquement",
    "addProvider": "Ajouter un fournisseur",
    "addFirstProvider": "Ajoutez votre premier fournisseur",
    "addFirstProviderDesc": "Connectez un fournisseur d'IA pour démarrer le routage des demandes via OmniRoute. Vous pouvez utiliser des fournisseurs gratuits, des clés API ou des comptes OAuth.",
    "learnMore": "En savoir plus",
    "editProvider": "Modifier le fournisseur",
    "deleteProvider": "Supprimer le fournisseur",
    "noProviders": "Aucun fournisseur configuré",
    "modelAvailability": "Disponibilité du modèle",
    "accounts": "Comptes",
    "newAccount": "Nouveau compte",
    "deleteConfirm": "Êtes-vous sûr de vouloir supprimer ce fournisseur ?",
    "testing": "Test...",
    "testConnection": "Tester la connexion",
    "testSuccess": "Connexion réussie",
    "testFailed": "La connexion a échoué",
    "available": "Disponible",
    "cooldown": "Temps de recharge",
    "unavailable": "Indisponible",
    "unknown": "Inconnu",
    "oauthLabel": "OAuth",
    "compatibleLabel": "Compatible",
    "chat": "Discuter",
    "responses": "Réponses",
    "messages": "Messages",
    "oauthProviders": "Fournisseurs OAuth",
    "freeProviders": "Fournisseurs gratuits",
    "apiKeyProviders": "Fournisseurs de clés API",
    "compatibleProviders": "Fournisseurs compatibles avec les clés API",
    "testAll": "Tout tester",
    "testAllOAuth": "Testez toutes les connexions OAuth",
    "testAllFree": "Testez toutes les connexions gratuites",
    "testAllApiKey": "Testez toutes les connexions de clé API",
    "testAllCompatible": "Testez toutes les connexions compatibles",
    "connected": "{count} Connecté",
    "errorCount": "{count} Erreur ({code})",
    "errorCountNoCode": "{count} Erreur",
    "warningCount": "{count} Avertissement",
    "noConnections": "Aucune connexion",
    "expiredBadge": "Expired",
    "expiringSoonBadge": "Expiring Soon",
    "freeTier": "Niveau gratuit",
    "freeTierAvailable": "Niveau gratuit disponible",
    "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": "Obsolète",
    "deprecatedProvider": "Ce fournisseur est obsolète",
    "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": "Désactivé",
    "enableProvider": "Activer le fournisseur",
    "disableProvider": "Désactiver le fournisseur",
    "testResults": "Résultats des tests",
    "noCompatibleYet": "Aucun fournisseur compatible ajouté pour le moment",
    "compatibleHint": "Utilisez les boutons ci-dessus pour ajouter des points de terminaison compatibles OpenAI ou Anthropic",
    "addOpenAICompatible": "Ajouter la compatibilité OpenAI",
    "addAnthropicCompatible": "Ajouter une compatibilité anthropique",
    "addNewProvider": "Ajouter un nouveau fournisseur",
    "backToProviders": "Retour aux fournisseurs",
    "configureNewProvider": "Configurez un nouveau fournisseur d'IA à utiliser avec vos applications.",
    "providerLabel": "Fournisseur",
    "selectProvider": "Sélectionnez un fournisseur",
    "selectedProvider": "Fournisseur sélectionné",
    "authMethod": "Méthode d'authentification",
    "apiKeyLabel": "Clé API",
    "apiKeyRequired": "La clé API est requise",
    "selectProviderRequired": "Veuillez sélectionner un fournisseur",
    "enterApiKey": "Entrez votre clé API",
    "apiKeySecure": "Votre clé API sera cryptée et stockée en toute sécurité.",
    "oauth2Connect": "Connectez-vous avec OAuth2",
    "oauth2Label": "OAuth2",
    "oauth2Desc": "Connectez votre compte en utilisant l'authentification OAuth2.",
    "displayName": "Nom d'affichage",
    "displayNamePlaceholder": "par exemple, API de production, environnement de développement",
    "displayNameHint": "Facultatif. Un nom convivial pour identifier cette configuration.",
    "active": "Actif",
    "activeDescription": "Activez ce fournisseur pour l'utiliser dans vos applications",
    "cancel": "Annuler",
    "createProvider": "Créer un fournisseur",
    "failedCreate": "Échec de la création du fournisseur",
    "errorOccurred": "Une erreur s'est produite. Veuillez réessayer.",
    "modelStatus": "Statut du modèle",
    "showConfiguredOnly": "Configured only",
    "allModelsOperational": "Tous les modèles opérationnels",
    "modelsWithIssues": "{count} modèle(s) présentant des problèmes",
    "allModelsNormal": "Tous les modèles répondent normalement.",
    "cooldownCleared": "Temps de recharge effacé pour {model}",
    "failedClearCooldown": "Échec de la suppression du temps de recharge",
    "loadingAvailability": "Chargement de la disponibilité du modèle...",
    "clearCooldown": "Effacer",
    "clearing": "Dégagement...",
    "until": "Jusqu'au {time}",
    "providerTestFailed": "Le test du fournisseur a échoué",
    "providerTestTimeout": "Provider test timed out — too many connections to test at once",
    "modeTest": "{mode}Test",
    "passedCount": "{count} réussi",
    "failedCount": "{count} a échoué",
    "testedCount": "{count} testé",
    "millisecondsAbbr": "{value}ms",
    "okShort": "D'accord",
    "errorShort": "ERREUR",
    "noActiveConnectionsInGroup": "Aucune connexion active trouvée pour ce groupe.",
    "allTestsPassed": "Tous les tests {total} ont été réussis",
    "testSummary": "{passed}/{total} réussi, {failed} échoué",
    "nameLabel": "Nom",
    "prefixLabel": "Préfixe",
    "baseUrlLabel": "URL de base",
    "apiTypeLabel": "Type d'API",
    "prefixHint": "Obligatoire. Préfixe unique pour les noms de modèles.",
    "nameHint": "Obligatoire. Une étiquette conviviale pour ce nœud.",
    "baseUrlHint": "Obligatoire.  URL de base de l’API du fournisseur.",
    "anthropicPrefixPlaceholder": "ac-prod",
    "openaiPrefixPlaceholder": "oc-prod",
    "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1",
    "openaiBaseUrlPlaceholder": "https://api.openai.com/v1",
    "validateConnection": "Valider la connexion",
    "validating": "Validation...",
    "connectionValid": "La connexion est valide !",
    "connectionFailed": "La connexion a échoué. Vérifiez l'URL et la clé.",
    "testKeyLabel": "Clé API de test",
    "testKeyPlaceholder": "sk-... (pour validation uniquement)",
    "providerNotFound": "Fournisseur introuvable",
    "deleteConnectionConfirm": "Supprimer cette connexion ?",
    "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": "Échec de la définition de l'alias",
    "failedSaveConnection": "Échec de l'enregistrement de la connexion",
    "failedSaveConnectionRetry": "Échec de l'enregistrement de la connexion. Veuillez réessayer.",
    "failedRetestConnection": "Échec du nouveau test de connexion",
    "deleteCompatibleNodeConfirm": "Supprimer ce nœud compatible {type} ?",
    "anthropicCompatibleDetails": "Détails compatibles anthropiques",
    "openaiCompatibleDetails": "Détails compatibles avec OpenAI",
    "messagesApi": "API de messages",
    "responsesApi": "API de réponses",
    "embeddings": "Embeddings",
    "audioTranscriptions": "Audio Transcriptions",
    "audioSpeech": "Audio Speech",
    "imagesGenerations": "Images Generations",
    "chatCompletions": "Achèvements des discussions",
    "importingModels": "Importation...",
    "importFromModels": "Importer depuis /models",
    "modelsImported": "{count} models imported",
    "allModelsAlreadyImported": "Tous les modèles sont déjà importés",
    "noNewModelsToImport": "Aucun nouveau modèle à importer — tous les modèles sont déjà dans le registre ou la liste de modèles personnalisés",
    "skippingExistingModels": "Ignorance de {count} modèles existants",
    "autoSync": "Synchronisation automatique",
    "autoSyncTooltip": "Actualise automatiquement la liste des modèles toutes les 24h (configurable via MODEL_SYNC_INTERVAL_HOURS)",
    "autoSyncEnabled": "Synchronisation automatique activée — les modèles seront actualisés périodiquement",
    "autoSyncDisabled": "Synchronisation automatique désactivée",
    "autoSyncToggleFailed": "Échec de l'activation de la synchronisation automatique",
    "clearAllModels": "Effacer tous les modèles",
    "clearAllModelsConfirm": "Êtes-vous sûr de vouloir supprimer tous les modèles pour ce fournisseur?",
    "clearAllModelsSuccess": "Tous les modèles effacés",
    "clearAllModelsFailed": "Échec de l'effacement des modèles",
    "addConnectionToImport": "Ajoutez une connexion pour activer l'importation.",
    "noModelsConfigured": "Aucun modèle configuré",
    "connectionCount": "{count} connexion(s)",
    "fetchingModels": "Récupération des modèles disponibles...",
    "failedFetchModels": "Échec de la récupération des modèles",
    "noModelsFound": "Aucun modèle trouvé",
    "importFailed": "Échec de l'importation",
    "noNewModelsAdded": "Aucun nouveau modèle n'a été ajouté.",
    "adding": "Ajout...",
    "close": "Close",
    "importingModelsTitle": "Importation de modèles",
    "copyModel": "Copier le modèle",
    "filterModels": "Filtrer les modèles…",
    "modelsActive": "actifs",
    "showModel": "Afficher le modèle",
    "hideModel": "Masquer le modèle",
    "removeModel": "Supprimer le modèle",
    "rateLimitProtected": "Protégé",
    "rateLimitUnprotected": "Non protégé",
    "enableRateLimitProtection": "Cliquez pour activer la protection de limite de débit",
    "disableRateLimitProtection": "Cliquez pour désactiver la protection de limite de débit",
    "productionKey": "Clé de production",
    "enterNewApiKey": "Saisissez une nouvelle clé API",
    "codexApplyModalTitle": "Appliquer au Codex local",
    "codexApplyTargetLabel": "Chemin cible",
    "codexApplyBackupLabel": "Sauvegardes",
    "codexApplyWarning": "Cela remplacera le auth.json existant. Continuer?",
    "codexApplyConfirmCheckbox": "Je confirme que je souhaite remplacer le auth.json existant",
    "codexApply": "Postuler",
    "bulkTabSingle": "Célibataire",
    "bulkTabBulkAdd": "Ajout groupé",
    "bulkAddFormatHint": "Une clé par ligne. Format : nom|apiKey ou simplement apiKey (auto-nommé par index).",
    "bulkValidateKeys": "Validez chaque clé avant de sauvegarder (plus lent)",
    "bulkAddAllKeys": "Ajouter toutes les clés",
    "bulkAddedCount": "{count, plural, one {# key added} other {# keys added}}",
    "bulkFailedCount": "{count, plural, one {# failed} other {# failed}}",
    "optional": "Facultatif",
    "anthropicCompatibleName": "Compatible anthropique",
    "openaiCompatibleName": "Compatible avec OpenAI",
    "failedImportModels": "Échec de l'importation des modèles",
    "noModelsReturnedFromEndpoint": "Aucun modèle renvoyé par le point de terminaison /models.",
    "importingModelsProgress": "Importation de {current} des modèles {total}...",
    "foundModelsStartingImport": "Modèles {count} trouvés. Démarrage de l'importation...",
    "importingModelById": "Importation de {modelId}...",
    "importSuccessCount": "{count, plural, one {# model} other {# models}} a été importé avec succès !",
    "noNewModelsAddedExisting": "Aucun nouveau modèle n'a été ajouté (tous existent déjà).",
    "importDoneCount": "✓ C'est fait ! {count, plural, one {# model imported.} other {# models imported.}}",
    "unexpectedErrorOccurred": "Une erreur inattendue s'est produite",
    "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}",
    "messagesPath": "messages",
    "responsesPath": "réponses",
    "chatCompletionsPath": "chat/achèvements",
    "add": "Ajouter",
    "edit": "Modifier",
    "delete": "Supprimer",
    "anthropic": "Anthropique",
    "openai": "OpenAI",
    "singleConnectionPerCompatible": "Une seule connexion est autorisée par nœud compatible. Ajoutez un autre nœud si vous avez besoin de plus de connexions.",
    "connections": "Connexions",
    "providerProxyTitleConfigured": "Mandataire du fournisseur : {host}",
    "configured": "configuré",
    "providerProxyConfigureHint": "Configurer le proxy pour toutes les connexions de ce fournisseur",
    "providerProxy": "Proxy du fournisseur",
    "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": "Aucune connexion pour l'instant",
    "addFirstConnectionHint": "Ajoutez votre première connexion pour commencer",
    "addConnection": "Ajouter une connexion",
    "availableModels": "Modèles disponibles",
    "builtInModels": "Built-in models",
    "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.",
    "pageAutoRefresh": "La page s'actualisera automatiquement...",
    "statusDisabled": "désactivé",
    "statusConnected": "connecté",
    "statusRuntimeIssue": "problème d'exécution",
    "statusAuthFailed": "l'authentification a échoué",
    "statusRateLimited": "tarif limité",
    "statusNetworkIssue": "problème de réseau",
    "statusTestUnsupported": "test non pris en charge",
    "statusUnavailable": "indisponible",
    "statusFailed": "échoué",
    "statusError": "erreur",
    "oauthAccount": "Compte OAuth",
    "errorTypeRuntime": "Exécution locale",
    "errorTypeUpstreamAuth": "Authentification en amont",
    "errorTypeMissingCredential": "Identifiant manquant",
    "errorTypeRefreshFailed": "Échec de l'actualisation",
    "errorTypeTokenExpired": "Jeton expiré",
    "errorTypeRateLimited": "Tarif limité",
    "errorTypeUpstreamUnavailable": "Amont indisponible",
    "errorTypeNetworkError": "Erreur réseau",
    "errorTypeTestUnsupported": "Test non pris en charge",
    "errorTypeUpstreamError": "Erreur en amont",
    "proxySourceGlobal": "Mondial",
    "proxySourceProvider": "Fournisseur",
    "proxySourceKey": "Clé",
    "proxyConfiguredBySource": "Mandataire ({source}) : {host}",
    "autoPriority": "Automatique : {priority}",
    "proxy": "Procuration",
    "retestAuthentication": "Retester l'authentification",
    "retest": "Retester",
    "disableConnection": "Désactiver la connexion",
    "enableConnection": "Activer la connexion",
    "reauthenticateConnection": "Réauthentifier cette connexion",
    "proxyConfig": "Configuration du proxy",
    "aliasExistsAlert": "L'alias \"{alias}\" existe déjà. Veuillez utiliser un modèle différent ou modifier l'alias existant.",
    "openRouterAnyModelHint": "OpenRouter prend en charge n'importe quel modèle. Ajoutez des modèles et créez des alias pour un accès rapide.",
    "modelIdFromOpenRouter": "ID du modèle (depuis OpenRouter)",
    "openRouterModelPlaceholder": "anthropique/claude-3-opus",
    "customModels": "Modèles personnalisés",
    "customModelsHint": "Ajoutez des ID de modèle qui ne figurent pas dans la liste par défaut. Ceux-ci seront disponibles pour le routage.",
    "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": "Basculement du quota par modèle",
    "modelId": "ID du modèle",
    "customModelPlaceholder": "par ex. gpt-4.5-turbo",
    "loading": "Chargement...",
    "removeCustomModel": "Supprimer le modèle personnalisé",
    "noCustomModels": "Aucun modèle personnalisé ajouté pour l'instant.",
    "allSuggestedAliasesExist": "Tous les alias suggérés existent déjà. Veuillez choisir un autre modèle ou supprimer les alias conflictuels.",
    "failedSaveCustomModel": "Échec de l'enregistrement du modèle personnalisé",
    "modelAddedSuccess": "Modèle {modelId} ajouté avec succès",
    "failedAddModelTryAgain": "Échec de l'ajout du modèle. Veuillez réessayer.",
    "failedSaveImportedModel": "Échec de l'enregistrement du modèle importé dans la base de données personnalisée",
    "failedImportModelsTryAgain": "Échec de l'importation des modèles. Veuillez réessayer.",
    "failedRemoveModelFromDatabase": "Échec de la suppression du modèle de la base de données",
    "modelRemovedSuccess": "Modèle supprimé avec succès",
    "failedDeleteModelTryAgain": "Échec de la suppression du modèle. Veuillez réessayer.",
    "compatibleModelsDescription": "Ajoutez manuellement des modèles compatibles {type} ou importez-les à partir du point de terminaison /models.",
    "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229",
    "openaiCompatibleModelPlaceholder": "gpt-4o",
    "apiKeyValidationFailed": "La validation de la clé API a échoué. Veuillez vérifier votre clé et réessayer.",
    "addProviderApiKeyTitle": "Ajouter la clé API {provider}",
    "checking": "Vérification...",
    "check": "Vérifier",
    "valid": "Valide",
    "invalid": "Invalide",
    "creating": "Création...",
    "validationChecksAnthropicCompatible": "La validation vérifie {provider} en vérifiant la clé API.",
    "validationChecksOpenAiCompatible": "La validation vérifie {provider} via /models sur votre URL de base.",
    "priorityLabel": "Priorité",
    "saving": "Sauvegarde...",
    "save": "Enregistrer",
    "editConnection": "Modifier la connexion",
    "accountName": "Nom du compte",
    "email": "Courriel",
    "healthCheckMinutes": "Bilan de santé (min)",
    "healthCheckHint": "Intervalle d’actualisation proactif des jetons. 0 = désactivé.",
    "selectAllModels": "Select all",
    "deselectAllModels": "Deselect all",
    "modelsActiveCount": "{active}/{total} active",
    "noModelsMatch": "No models match \"{filter}\"",
    "groupLabel": "Environment",
    "groupPlaceholder": "e.g. eKaizen, Personal",
    "failedTestConnection": "Échec du test de connexion",
    "failed": "Échec",
    "leaveBlankKeepCurrentApiKey": "Laissez vide pour conserver la clé API actuelle.",
    "editCompatibleTitle": "Modifier {type} Compatible",
    "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.",
    "apiKeyForCheck": "Clé API (pour vérification)",
    "compatibleProdPlaceholder": "{type} Compatible (Prod)",
    "tokenRefreshed": "Token refreshed successfully",
    "tokenRefreshFailed": "Token refresh failed",
    "applyCodexAuthLocal": "Apply auth",
    "exportCodexAuthFile": "Export auth",
    "applyClaudeAuthLocal": "Appliquer l'authentification",
    "exportClaudeAuthFile": "Exporter l'autorisation",
    "importClaudeAuth": "Importer l'authentification",
    "claudeApplyModalTitle": "Appliquer au code Claude local",
    "claudeApplyTargetLabel": "Chemin cible",
    "claudeApplyBackupLabel": "Sauvegardes",
    "claudeApplyMcpHint": "L’état MCP OAuth existant sera conservé.",
    "claudeApplyWarning": "Cela remplacera la section claudeAiOauth existante. Continuer?",
    "claudeApplyConfirmCheckbox": "Je confirme que je souhaite remplacer la section claudeAiOauth existante",
    "claudeApply": "Postuler",
    "claudeAuthAppliedLocal": "Auth Claude appliquée localement",
    "claudeAuthApplyFailed": "Échec de l'application de l'authentification Claude localement",
    "claudeAuthExported": "Fichier d'authentification Claude exporté",
    "claudeAuthExportFailed": "Échec de l'exportation du fichier d'authentification Claude",
    "claudeImportModalTitle": "Importer Claude Auth",
    "claudeImportTabSingle": "Célibataire",
    "claudeImportTabBulk": "En vrac",
    "claudeImportTabUpload": "Télécharger le fichier",
    "claudeImportTabPaste": "Coller JSON",
    "claudeImportFileLabel": "Choisissez .credentials.json",
    "claudeImportPasteLabel": "Collez le contenu JSON",
    "claudeImportEmailLabel": "E-mail du compte",
    "claudeImportNameLabel": "Nom de la connexion (facultatif)",
    "claudeImportOverwriteLabel": "Remplacer la connexion existante si le compte existe déjà",
    "claudeImportSubmit": "Importer",
    "claudeImportSuccess": "Connexion Claude importée avec succès",
    "claudeImportInvalidJson": "Impossible d'analyser le fichier en JSON",
    "claudeImportInvalidShape": "Le fichier n'est pas un .credentials.json valide",
    "claudeImportDuplicate": "Le compte existe déjà : activez \"Remplacer l'existant\" pour l'écraser.",
    "claudeImportIdentityUnverified": "Bootstrap n'a pas pu vérifier le compte. Activez « Remplacer l'existant » ou fournissez un e-mail.",
    "claudeImportFailed": "Échec de l'importation de l'authentification Claude",
    "claudeImportBulkModeUpload": "Télécharger des fichiers",
    "claudeImportBulkModePaste": "Coller le tableau JSON",
    "claudeImportBulkModeZip": "Télécharger le code postal",
    "claudeImportBulkUploadHint": "Déposez ou récupérez jusqu'à 50 fichiers .credentials.json (256 Ko chacun, 10 Mo au total).",
    "claudeImportBulkPasteHint": "Collez un tableau d'objets : [{ json, name?, email? }, ...]",
    "claudeImportBulkZipHint": "ZIP contenant les entrées .json. Max 50 entrées, 10 Mo décompressés.",
    "claudeImportBulkSubmit": "Tout importer",
    "claudeImportBulkSuccess": "Connexions {count} Claude importées",
    "claudeImportBulkFailed": "Certaines entrées n'ont pas pu être importées",
    "claudeImportBulkZipExtracting": "Extraction du ZIP…",
    "claudeImportBulkZipError": "Échec de l'extraction du ZIP",
    "applyGeminiAuthLocal": "Appliquer l'authentification",
    "exportGeminiAuthFile": "Exporter l'autorisation",
    "importGeminiAuth": "Importer l'authentification",
    "geminiApplyModalTitle": "Appliquer à la CLI Gemini locale",
    "geminiApplyTargetLabel": "Chemin cible",
    "geminiApplyBackupLabel": "Sauvegardes",
    "geminiApplyAccountsHint": "Le compte actif google_accounts.json sera mis à jour pour correspondre à cette connexion.",
    "geminiApplyWarning": "Cela remplacera le fichier oauth_creds.json existant et mettra à jour google_accounts.json. Continuer?",
    "geminiApplyConfirmCheckbox": "Je confirme que je souhaite remplacer le fichier oauth_creds.json existant",
    "geminiApply": "Postuler",
    "geminiAuthAppliedLocal": "Authentification Gemini appliquée localement",
    "geminiAuthApplyFailed": "Échec de l'application de l'authentification Gemini localement",
    "geminiAuthExported": "Fichier d'authentification Gemini exporté",
    "geminiAuthExportFailed": "Échec de l'exportation du fichier d'authentification Gemini",
    "geminiImportModalTitle": "Importer l'authentification Gemini",
    "geminiImportTabSingle": "Célibataire",
    "geminiImportTabBulk": "En vrac",
    "geminiImportTabUpload": "Télécharger le fichier",
    "geminiImportTabPaste": "Coller JSON",
    "geminiImportFileLabel": "Choisissez oauth_creds.json",
    "geminiImportPasteLabel": "Collez le contenu JSON",
    "geminiImportEmailLabel": "E-mail du compte",
    "geminiImportNameLabel": "Nom de la connexion (facultatif)",
    "geminiImportOverwriteLabel": "Remplacer la connexion existante si le compte existe déjà",
    "geminiImportSubmit": "Importer",
    "geminiImportSuccess": "Connexion Gemini importée avec succès",
    "geminiImportInvalidJson": "Impossible d'analyser le fichier en JSON",
    "geminiImportInvalidShape": "Le fichier n'est pas un oauth_creds.json valide",
    "geminiImportDuplicate": "Le compte existe déjà : activez \"Remplacer l'existant\" pour l'écraser.",
    "geminiImportIdentityUnverified": "Impossible de vérifier l'identité à partir d'id_token. Activez « Remplacer l'existant » ou fournissez un e-mail.",
    "geminiImportFailed": "Échec de l'importation de l'authentification Gemini",
    "geminiImportBulkModeUpload": "Télécharger des fichiers",
    "geminiImportBulkModePaste": "Coller le tableau JSON",
    "geminiImportBulkModeZip": "Télécharger le code postal",
    "geminiImportBulkUploadHint": "Déposez ou récupérez jusqu'à 50 fichiers oauth_creds.json (256 Ko chacun, 10 Mo au total).",
    "geminiImportBulkPasteHint": "Collez un tableau d'objets : [{ json, name?, email? }, ...]",
    "geminiImportBulkZipHint": "ZIP contenant les entrées oauth_creds.json. Max 50 entrées, 10 Mo décompressés.",
    "geminiImportBulkSubmit": "Tout importer",
    "geminiImportBulkSuccess": "Connexions {count} Gemini importées",
    "geminiImportBulkFailed": "Certaines entrées n'ont pas pu être importées",
    "geminiImportBulkZipExtracting": "Extraction du ZIP…",
    "geminiImportBulkZipError": "Échec de l'extraction du ZIP",
    "codexAuthAppliedLocal": "Codex auth.json applied locally",
    "codexAuthApplyFailed": "Failed to apply Codex auth.json locally",
    "codexAuthExported": "Codex auth.json exported",
    "codexAuthExportFailed": "Failed to export Codex auth.json",
    "importCodexAuth": "Importer l'authentification",
    "codexImportModalTitle": "Importer l'authentification Codex",
    "codexImportTabSingle": "Célibataire",
    "codexImportTabBulk": "En vrac",
    "codexImportTabUpload": "Télécharger le fichier",
    "codexImportTabPaste": "Coller JSON",
    "codexImportFileLabel": "Choisissez auth.json",
    "codexImportFileHint": "Sélectionnez le fichier auth.json exporté depuis Codex ou depuis OmniRoute.",
    "codexImportPasteLabel": "Collez le contenu JSON",
    "codexImportEmailLabel": "E-mail du compte",
    "codexImportEmailHint": "Détecté automatiquement à partir du fichier ; modifier si nécessaire.",
    "codexImportNameLabel": "Nom de la connexion (facultatif)",
    "codexImportOverwriteLabel": "Remplacer la connexion existante si le compte existe déjà",
    "codexImportSubmit": "Importer",
    "codexImportSuccess": "Connexion Codex importée avec succès",
    "codexImportInvalidJson": "Impossible d'analyser le fichier en JSON",
    "codexImportInvalidShape": "Le fichier n'est pas un auth.json Codex valide",
    "codexImportDuplicate": "Le compte existe déjà : activez \"Remplacer l'existant\" pour l'écraser.",
    "codexImportFailed": "Échec de l'importation de l'authentification Codex",
    "codexImportDetectedEmail": "Détecté : {email}",
    "codexImportNoEmailDetected": "Aucun e-mail détecté dans le fichier",
    "codexImportBulkModeUpload": "Télécharger des fichiers",
    "codexImportBulkModePaste": "Coller la liste",
    "codexImportBulkModeZip": "Archives ZIP",
    "codexImportBulkUploadHint": "Sélectionnez plusieurs fichiers .json ou faites un glisser-déposer",
    "codexImportBulkPasteHint": "Tableau JSON [ {...}, {...} ] ou plusieurs JSON séparés par --- sur sa propre ligne",
    "codexImportBulkZipHint": "Téléchargez un fichier .zip contenant des fichiers auth.json (max 50 fichiers, 10 Mo)",
    "codexImportBulkSubmit": "Importer des comptes {count}",
    "codexImportBulkLimit": "Max 50 fichiers par importation",
    "codexImportBulkSuccess": "{count} importé",
    "codexImportBulkFailed": "{count} a échoué",
    "codexImportBulkZipExtracting": "Extraction du ZIP…",
    "codexImportBulkZipError": "Échec de l'extraction du ZIP",
    "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": "Entreprise et Cloud",
    "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": "Fournisseurs d'agents cloud",
    "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": "Ouvrez t3.chat → DevTools → Application → Stockage local → https://t3.chat, copiez 'convex-session-id'. Ensuite, ouvrez DevTools → Réseau, copiez l'en-tête complet du cookie de toute demande de chat. Collez les deux valeurs dans les champs ci-dessous.",
    "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": "Votre ID de projet Google Cloud. Obligatoire pour les comptes avec exceptions. Saisissez l'ID de votre projet GCP à utiliser avec Gemini CLI.",
    "geminiCliProjectIdLabel": "ID du projet Google Cloud",
    "geminiCliProjectIdPlaceholder": "mon-id-projet-gcp",
    "antigravityProjectIdHint": "Remplacement facultatif pour les requêtes Antigravity Cloud Code. Laissez vide pour utiliser le projet découvert lors de Google OAuth.",
    "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": "ID du projet Google Cloud",
    "antigravityProjectIdPlaceholder": "mon-id-projet-gcp",
    "grokWebCookieHint": "Grok Web Cookie Hint",
    "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder",
    "herokuBaseUrlHint": "Heroku Base Url Hint",
    "hideEmail": "Hide Email",
    "imageProviders": "Image Providers",
    "videoProviders": "Génération vidéo",
    "embeddingRerankProviders": "Intégrations et classement",
    "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": "Rechercher des fournisseurs...",
    "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": "Fournisseurs de niveau gratuit",
    "freeTierLabel": "Niveau gratuit disponible",
    "freeTierProvidersDesc": "Fournisseurs proposant des niveaux gratuits : certains nécessitent une inscription par clé API, d'autres n'ont besoin d'aucune information d'identification.",
    "providerSummaryAll": "Total",
    "ideProviders": "Fournisseurs IDE",
    "ideProvidersDesc": "Éditeurs avec abonnement IA intégré. Utilisez la page du fournisseur pour importer les informations d'identification directement à partir du trousseau IDE.",
    "noIdeProviders": "Aucun fournisseur IDE ne correspond aux filtres actuels.",
    "providerDetailFastTierTooltip": "Appliquer le niveau Codex Fast à toutes les connexions Codex par défaut",
    "providerDetailFastDefaultLabel": "Défaut rapide",
    "providerDetailBrowserManualConnect": "Connexion navigateur/manuelle",
    "providerDetailAuthUrl": "URL d'authentification",
    "providerDetailCallbackUrl": "URL de rappel",
    "providerDetailValidClaudeCredentialsFile": "Dossier d'identification Claude valide",
    "providerDetailPathAutoDetectedAllOs": "Le chemin est détecté automatiquement par système d'exploitation (Linux/Mac/Windows).",
    "providerDetailMyClaudeAccountPlaceholder": "Mon compte Claude",
    "providerDetailPathAutoDetected": "Le chemin est détecté automatiquement par système d'exploitation (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": "Ces fournisseurs utilisent des sessions Web de navigateur, des cookies ou des jetons Web au lieu de clés API. Ouvrez un fournisseur pour ajouter les informations d'identification de session requises.",
    "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": "Assistant d'intégration des fournisseurs",
    "onboardingWizardShort": "Assistant d'intégration",
    "onboardingWizardDescription": "Connectez les fournisseurs de clé API, compatibles personnalisés et OAuth avec validation, persistance et test de connexion immédiat.",
    "onboardingStepType": "Type",
    "onboardingStepProvider": "Fournisseur",
    "onboardingStepCredentials": "Informations d'identification",
    "onboardingStepResult": "Résultat",
    "onboardingTypeApiKeyTitle": "Fournisseur de clé API",
    "onboardingTypeApiKeyText": "Utilisez des fournisseurs intégrés tels que OpenAI, Anthropic, Gemini, Groq, Azure, etc.",
    "onboardingTypeCustomTitle": "Fournisseur compatible personnalisé",
    "onboardingTypeCustomText": "Créez un point de terminaison compatible OpenAI, Anthropic ou Claude Code et ajoutez sa clé.",
    "onboardingTypeOAuthTitle": "Fournisseur OAuth",
    "onboardingTypeOAuthText": "Réutilisez les flux d'importation OAuth, de code d'appareil ou locaux existants pour les fournisseurs de codage.",
    "onboardingChooseOAuthProvider": "Choisissez un fournisseur OAuth",
    "onboardingChooseApiKeyProvider": "Choisissez un fournisseur de clé API",
    "onboardingChooseProviderDescription": "Sélectionnez un fournisseur, puis l'assistant vous guidera à travers les informations d'identification et les tests.",
    "onboardingChangeType": "Changer de type",
    "onboardingChangeProvider": "Changer de fournisseur",
    "onboardingSearchProviders": "Fournisseurs de recherche…",
    "onboardingApiKeyOptional": "Clé API facultative",
    "onboardingProviderConnected": "Fournisseur connecté",
    "onboardingProviderSavedWithWarnings": "Fournisseur enregistré avec des avertissements",
    "onboardingProviderFinished": "Intégration du fournisseur terminée",
    "onboardingYourProviderConnection": "Connexion de votre fournisseur",
    "onboardingTestPassed": "Test réussi",
    "onboardingTestFailed": "Le test a échoué",
    "onboardingOpenProviderDetails": "Ouvrir les détails du fournisseur",
    "onboardingTryInPlayground": "Essayez dans la cour de récréation",
    "onboardingDefaultConnectionName": "{provider} Principal",
    "onboardingTestingConnection": "Test de la connexion du fournisseur…",
    "onboardingValidatingCredentials": "Validation des informations d'identification…",
    "onboardingSavingConnection": "Enregistrement de la connexion du fournisseur…",
    "onboardingProviderFailed": "L'intégration du fournisseur a échoué",
    "onboardingCreatingCompatibleProvider": "Création d'un fournisseur compatible…",
    "onboardingSavingCompatibleConnection": "Enregistrement de la connexion du fournisseur compatible…",
    "onboardingCustomProviderFallbackName": "Fournisseur personnalisé",
    "onboardingCustomProviderFailed": "L'intégration du fournisseur personnalisé a échoué",
    "onboardingLoadingOAuthConnection": "Chargement de la connexion OAuth…",
    "onboardingOAuthNoConnectionFound": "OAuth est terminé, mais aucune connexion de fournisseur n'a été trouvée.",
    "onboardingOAuthFailed": "L'intégration d'OAuth a échoué",
    "onboardingAddProvider": "Ajouter {provider}",
    "onboardingConnectionName": "Nom de la connexion",
    "onboardingApiKeyOptionalLabel": "Clé API (facultatif)",
    "onboardingBaseUrlOverride": "Remplacement de l'URL de base",
    "onboardingBaseUrlOverrideHint": "Facultatif. Stocké sous le nom supplierSpecificData.baseUrl.",
    "onboardingRegion": "Région",
    "onboardingSearchCx": "Rechercher CX / ID moteur",
    "onboardingProviderSpecificIdPlaceholder": "Identifiant spécifique au fournisseur facultatif",
    "onboardingCustomUserAgent": "Agent utilisateur personnalisé",
    "onboardingWorking": "Travailler…",
    "onboardingValidateSaveTest": "Valider, sauvegarder et tester",
    "onboardingBack": "Retour",
    "onboardingCreateCustomCompatibleProvider": "Créer un fournisseur compatible personnalisé",
    "onboardingCreateCustomCompatibleDescription": "L'assistant crée d'abord un nœud fournisseur, puis stocke et teste sa connexion par clé API.",
    "onboardingProtocol": "Protocole",
    "onboardingOpenAiCompatible": "Compatible OpenAI",
    "onboardingAnthropicCompatible": "Compatible Anthropic",
    "onboardingClaudeCodeCompatible": "Compatible avec Claude Code",
    "onboardingProviderPrefix": "Préfixe du fournisseur",
    "onboardingProviderPrefixHint": "Utilisé pour générer l’ID du fournisseur géré.",
    "onboardingChatPath": "Chemin de discussion",
    "onboardingModelsPath": "Chemin des modèles",
    "onboardingCreateSaveTest": "Créer, enregistrer et tester",
    "onboardingConnectProvider": "Connectez {provider}",
    "onboardingOAuthFlowDescription": "OmniRoute ouvrira le flux OAuth existant pour ce fournisseur. Après la connexion, l'assistant recharge la connexion enregistrée et exécute le même test de connexion que la page du fournisseur.",
    "onboardingStartOAuthFlow": "Démarrer le flux OAuth",
    "passthroughModelsDescription": "{provider} accepte les ID de modèle natifs du fournisseur. Importez depuis /models ou ajoutez des ID personnalisés pour le routage.",
    "bedrockModelsDescription": "Les modèles Amazon Bedrock sont définis par région AWS. Importez depuis /models ou ajoutez les ID de modèle Bedrock activés dans la région sélectionnée.",
    "bedrockModelPlaceholder": "anthropique.claude-sonnet-4-6",
    "addProviderSessionCookieTitle": "Ajouter le cookie de session {provider}",
    "addProviderWebTokenTitle": "Ajouter le jeton Web {provider}",
    "addProviderConnectionTitle": "Ajouter une connexion {provider}",
    "webTokenCredentialLabel": "Jeton de session Web",
    "webNoAuthCredentialLabel": "Aucun justificatif requis",
    "webCookieCredentialHint": "Cookie requis : {credential}. Collez la valeur d’en-tête Cookie de votre propre session Web {provider} connectée. N'incluez pas le préfixe Cookie:.",
    "webTokenCredentialHint": "Identifiant : {credential}. Collez la valeur du jeton à partir de votre propre session Web {provider} connectée ou d'une exportation DevTools HAR si le fournisseur le prend en charge.",
    "webCookieEditHint": "Laissez vide pour conserver le cookie de session en cours. Cookie requis : {credential}.",
    "webTokenEditHint": "Laissez vide pour conserver le jeton de session Web actuel. Identifiant : {credential}.",
    "webSessionGuideTitle": "Comment obtenir les informations d'identification de session",
    "webSessionGuideIntro": "{provider} utilise une session Web de navigateur au lieu d'une clé API.",
    "webCookieRequiredCredential": "Cookie requis : {credential}",
    "webTokenRequiredCredential": "Jeton requis : {credential}",
    "webSessionGuideStep1": "Connectez-vous à {provider} dans votre navigateur.",
    "webSessionGuideStep2": "Ouvrez les outils de développement du navigateur et inspectez une demande faite par l'application Web.",
    "webSessionGuideStep3": "Copiez les informations d'identification requises à partir du propre domaine du fournisseur. Pour les cookies, copiez uniquement la valeur d'en-tête Cookie et omettez Cookie :.",
    "webSessionGuideStep4": "Collez-le ici et vérifiez la connexion. S'il cesse de fonctionner, reconnectez-vous et remplacez-le par une nouvelle valeur.",
    "webSessionSecurityHint": "Traitez-le comme un mot de passe : il peut accéder à votre compte Web connecté jusqu'à son expiration ou sa révocation.",
    "webNoAuthGuideTitle": "Aucun justificatif requis",
    "webNoAuthGuideBody": "{provider} n'a pas besoin de clé API ni de cookie. Enregistrez la connexion pour utiliser son point de terminaison Web gratuit.",
    "webSessionCredentialValidationFailed": "La validation des informations d'identification de session a échoué. Connectez-vous à nouveau, copiez un nouvel identifiant et réessayez.",
    "checkCookie": "Vérifier les cookies",
    "checkWebToken": "Vérifier le jeton"
  },
  "settings": {
    "title": "Paramètres",
    "general": "Général",
    "security": "Sécurité",
    "appearance": "Apparence",
    "routing": "Routage",
    "cache": "Cache",
    "resilience": "Résilience",
    "routingSettingsIntro": "Contrôle la manière dont vos demandes sont acheminées, transformées et envoyées aux fournisseurs d'IA.",
    "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": "Nouvelle tentative automatique, temps de recharge et secours en cas de défaillance des fournisseurs.",
    "aiSettingsIntro": "Paramètres spécifiques à l'IA pour la réflexion sur le budget, le comportement du modèle et la compression.",
    "systemPrompt": "Invite système",
    "thinkingBudget": "Penser le budget",
    "proxy": "Procuration",
    "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": "Proxy MITM",
    "pricing": "Tarifs",
    "storage": "Stockage",
    "policies": "Politiques",
    "ipFilter": "Filtre IP",
    "comboDefaults": "Valeurs par défaut des combos",
    "fallbackChains": "Chaînes de secours",
    "changePassword": "Changer le mot de passe",
    "enablePassword": "Activer le mot de passe",
    "darkMode": "Mode sombre",
    "lightMode": "Mode lumière",
    "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": "juste maintenant",
    "modelsDevStats": "Sync Statistics",
    "modelsDevStatsDesc": "Current models.dev data coverage",
    "providers": "Fournisseurs",
    "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": "Thème système",
    "debugToggle": "Enable Debug Mode",
    "sidebarVisibilityToggle": "Show Sidebar Items",
    "enableCache": "Activer le cache",
    "cacheTTL": "Durée de vie du cache",
    "maxCacheSize": "Taille maximale du cache",
    "clearCache": "Vider le cache",
    "cacheCleared": "Cache cleared successfully",
    "clearCacheFailed": "Failed to clear cache",
    "cacheHits": "Accès au cache",
    "cacheMisses": "Manques de cache",
    "hitRate": "Taux de réussite",
    "cacheEntries": "Entrées du cache",
    "cacheSettings": "Cache Settings",
    "semanticCache": "Semantic Cache",
    "maxEntries": "Max Entries",
    "ttlMinutes": "TTL (minutes)",
    "promptCache": "Cache d'invite",
    "strategy": "Strategy",
    "preserveClientCache": "Preserve Client Cache",
    "enabled": "Enabled",
    "loading": "Loading...",
    "saving": "Sauvegarde...",
    "save": "Save",
    "circuitBreaker": "Disjoncteur",
    "retryPolicy": "Politique de nouvelle tentative",
    "maxRetries": "Nombre maximal de tentatives",
    "retryDelay": "Délai de nouvelle tentative",
    "timeoutMs": "Délai d'expiration (ms)",
    "enableSystemPrompt": "Activer l'invite système",
    "systemPromptText": "Texte d'invite du système",
    "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": "Cette page configure uniquement le comportement. L’état du disjoncteur actif est affiché sur la page Santé. Les nouvelles tentatives spécifiques aux combos et le contrôle des emplacements à tour de rôle restent sur les paramètres de combo.",
    "enableThinking": "Permettre la réflexion",
    "maxThinkingTokens": "Jetons de réflexion maximum",
    "enableProxy": "Activer le proxy",
    "proxyUrl": "URL du proxy",
    "pricingRates": "Format des tarifs",
    "currentPricing": "Aperçu des prix actuels",
    "loadingPricing": "Chargement des données de tarification...",
    "noPricing": "Aucune donnée de prix disponible",
    "input": "Entrée",
    "output": "Sortie",
    "cached": "En cache",
    "reasoning": "Raisonnement",
    "cacheCreation": "Création de cache",
    "customPricing": "Tarification personnalisée",
    "databaseSize": "Taille de la base de données",
    "backupDb": "Base de données de sauvegarde",
    "restoreDb": "Restaurer la base de données",
    "exportData": "Exporter des données",
    "importData": "Importer des données",
    "clearData": "Effacer toutes les données",
    "clearDataConfirm": "Cela supprimera définitivement toutes les données. Es-tu sûr?",
    "enableRequestLogs": "Activer les journaux de demandes",
    "logRetention": "Conservation des journaux",
    "ipWhitelist": "Liste blanche IP",
    "ipBlacklist": "Liste noire IP",
    "addIP": "Ajouter une adresse IP",
    "savedSuccessfully": "Paramètres enregistrés avec succès",
    "ai": "IA",
    "advanced": "Avancé",
    "localMode": "Mode local — Toutes les données stockées sur votre machine",
    "settingsSectionsAria": "Sections de paramètres",
    "switchThemes": "Basculer entre les thèmes clairs et sombres",
    "themeSelectionAria": "Sélection de thème",
    "themeLight": "Lumière",
    "themeDark": "Sombre",
    "themeSystem": "Système",
    "endpointTunnelVisibility": "Visibilité du tunnel de point de terminaison",
    "endpointTunnelVisibilityDesc": "Masquez les contrôles du tunnel sur la page Endpoint sans modifier l’état du tunnel.",
    "showCloudflareTunnel": "Tunnel rapide Cloudflare",
    "showCloudflareTunnelDesc": "Afficher les contrôles Cloudflare Quick Tunnel sur la page Endpoint.",
    "showTailscaleFunnel": "Entonnoir à écailles de queue",
    "showTailscaleFunnelDesc": "Afficher les contrôles Tailscale Funnel sur la page Endpoint.",
    "showNgrokTunnel": "Tunnel de Ngrok",
    "showNgrokTunnelDesc": "Afficher les contrôles ngrok Tunnel sur la page Endpoint.",
    "sidebarVisibility": "Hide sidebar items",
    "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter.",
    "sidebarVisibilityHint": "Any sidebar section is hidden automatically when a...",
    "hideHealthLogs": "Masquer les journaux de contrôle de santé",
    "hideHealthLogsDesc": "Lorsqu'il est activé, supprimez les messages [HealthCheck] dans la console du serveur",
    "themeAccent": "Couleur du thème",
    "themeAccentDesc": "Choisissez une couleur prédéfinie ou créez votre propre thème avec une seule couleur",
    "themeCreate": "Créer un thème",
    "themeCustom": "Thème personnalisé",
    "themeBlue": "Bleu",
    "themeRed": "Rouge",
    "themeGreen": "Vert",
    "themeViolet": "Violet",
    "themeOrange": "Orange",
    "themeCyan": "Cyan",
    "whitelabeling": "Branding",
    "whitelabelingDesc": "Customize the application name and logo",
    "appName": "Application Name",
    "appNameDesc": "Display name shown in sidebar and browser tab",
    "customLogo": "Custom Logo URL",
    "customLogoDesc": "URL to your custom logo image",
    "uploadLogo": "Upload Logo",
    "resetLogo": "Reset to Default",
    "logoPreview": "Preview",
    "customFavicon": "Browser Favicon",
    "customFaviconDesc": "URL to your custom favicon (shown in browser tab)",
    "uploadFavicon": "Upload Favicon",
    "resetFavicon": "Reset Favicon",
    "faviconPreview": "Favicon Preview",
    "flushCache": "Vider le cache",
    "flushing": "Rinçage…",
    "size": "Taille",
    "hits": "Clics",
    "evictions": "Expulsions",
    "loadingCacheStats": "Chargement des statistiques du cache…",
    "globalProxy": "Proxy mondial",
    "globalProxyDesc": "Configurez un proxy sortant global pour tous les appels d'API. Les fournisseurs individuels, les combos et les clés peuvent remplacer cela.",
    "noGlobalProxy": "Aucun proxy global configuré",
    "globalLabel": "Mondial",
    "configure": "Configurer",
    "globalSystemPrompt": "Invite système globale",
    "saved": "Enregistré",
    "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} caractères",
    "thinkingBudgetTitle": "Penser le budget",
    "thinkingBudgetDesc": "Contrôler l'utilisation des jetons de raisonnement IA pour toutes les requêtes",
    "passthrough": "Passage",
    "passthroughDesc": "Aucun changement — le client contrôle le budget en pensant",
    "auto": "Automatique",
    "autoDesc": "Supprimez toute configuration de réflexion - laissez le fournisseur décider",
    "custom": "Personnalisé",
    "customDesc": "Définir un budget de jetons fixe pour toutes les demandes",
    "adaptive": "Adaptatif",
    "adaptiveDesc": "Adaptez le budget en fonction de la complexité de la demande",
    "effortNone": "Aucun (0 jeton)",
    "effortLow": "Faible (1 000 jetons)",
    "effortMedium": "Moyen (10 000 jetons)",
    "effortHigh": "Élevé (128 000 jetons)",
    "tokenBudget": "Budget des jetons",
    "tokens": "jetons",
    "baseEffortLevel": "Niveau d'effort de base",
    "adaptiveHint": "Le mode adaptatif évolue à partir de ce niveau de base en fonction du nombre de messages, de l'utilisation des outils et de la longueur des invites.",
    "requireLogin": "Exiger une connexion",
    "requireLoginDesc": "Lorsqu'il est activé, le tableau de bord nécessite un mot de passe. Lorsqu'il est désactivé, accédez sans connexion.",
    "currentPassword": "Mot de passe actuel",
    "enterCurrentPassword": "Entrez le mot de passe actuel",
    "newPassword": "Nouveau mot de passe",
    "enterNewPassword": "Entrez le nouveau mot de passe",
    "confirmPassword": "Confirmer le nouveau mot de passe",
    "confirmPasswordPlaceholder": "Confirmer le nouveau mot de passe",
    "passwordsNoMatch": "Les mots de passe ne correspondent pas",
    "passwordUpdated": "Mot de passe mis à jour avec succès",
    "failedUpdatePassword": "Échec de la mise à jour du mot de passe",
    "errorOccurred": "Une erreur s'est produite",
    "updatePassword": "Mettre à jour le mot de passe",
    "setPassword": "Définir le mot de passe",
    "apiEndpointProtection": "Protection des points de terminaison API",
    "requireAuthModels": "Exiger une clé API pour /models",
    "requireAuthModelsDesc": "Lorsqu'il est activé, le point de terminaison /v1/models renvoie 404 pour les demandes non authentifiées. Empêche la découverte de modèles par des utilisateurs non autorisés.",
    "authModelHeading": "Modèle d'autorisation actif",
    "authModelClient": "Les points de terminaison de l'API client (/v1/*, /chat/*, /responses/*, /codex/*, /messages/*) nécessitent une clé API Bearer.",
    "authModelManagement": "Les points de terminaison de gestion (/dashboard, /api/*) nécessitent une session de tableau de bord ou des informations d'identification de gestion.",
    "authModelPublic": "Seules les routes de connexion, de santé et d’amorçage sont publiques.",
    "bruteForceProtection": "Protection de connexion par force brute",
    "bruteForceProtectionDesc": "Limitez et verrouillez /api/auth/login après des échecs répétés à partir de la même adresse IP.",
    "corsAllowedOrigins": "Origines autorisées CORS",
    "corsAllowedOriginsDesc": "Liste séparée par des virgules des origines de navigateur autorisées à appeler ce serveur. Liste vide = pas d'accès CORS au navigateur (le serveur à serveur fonctionne toujours). Utilisez CORS_ALLOW_ALL=true env var uniquement pour le développement.",
    "blockedProviders": "Fournisseurs bloqués",
    "blockedProvidersDesc": "Masquez les fournisseurs spécifiques de la réponse /v1/models. Les fournisseurs bloqués n'apparaîtront pas dans les listes de modèles.",
    "providersBlocked": "{count} fournisseur(s) bloqué(s) sur /models",
    "blockProviderTitle": "Bloquer {provider}",
    "unblockProviderTitle": "Débloquer {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": "Pipeline de transformation de blocs système",
    "systemTransformsDesc": "Pipeline de transformations ordonné par fournisseur appliqué au corps de la demande avant le transfert. Prend en charge n’importe quel ID de fournisseur.",
    "systemTransformsAddProvider": "Ajouter un fournisseur",
    "systemTransformsAddProviderPlaceholder": "Sélectionnez un fournisseur…",
    "systemTransformsAddProviderAllConfigured": "Tous les fournisseurs déjà configurés",
    "systemTransformsRemoveProvider": "Supprimer le fournisseur",
    "systemTransformsNoProviders": "Aucun fournisseur configuré. Ajoutez un fournisseur pour commencer.",
    "systemTransformsOpMoveUp": "Monter",
    "systemTransformsOpMoveDown": "Descendre",
    "systemTransformsOpDelete": "Supprimer l'opération",
    "routingStrategy": "Stratégie de routage",
    "routingAdvancedGuideTitle": "Guidage d'itinéraire avancé",
    "routingAdvancedGuideHint1": "Utilisez Fill First pour une priorité prévisible, Round Robin pour l’équité et P2C pour la résilience en matière de latence.",
    "routingAdvancedGuideHint2": "Si les prestataires varient en termes de qualité/coût, commencez par Opter pour le coût pour le travail de fond et par Moins utilisé pour une usure équilibrée.",
    "fillFirst": "Remplir d'abord",
    "fillFirstDesc": "Utiliser les comptes par ordre de priorité",
    "roundRobin": "Tournoi à la ronde",
    "roundRobinDesc": "Parcourez tous les comptes",
    "p2c": "P2C",
    "p2cDesc": "Choisissez-en 2 au hasard, utilisez le plus sain",
    "random": "Aléatoire",
    "randomDesc": "Compte aléatoire à chaque demande",
    "leastUsed": "Le moins utilisé",
    "leastUsedDesc": "Choisissez le compte le moins récemment utilisé",
    "costOpt": "Option de coût",
    "costOptDesc": "Préférer le compte disponible le moins cher",
    "resetAware": "RR conscient de la réinitialisation",
    "resetAwareDesc": "Préférez les comptes avec un quota restant sain et des réinitialisations plus proches",
    "strictRandom": "Strict Random",
    "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling",
    "stickyLimit": "Limite collante",
    "stickyLimitDesc": "Appels par compte avant de changer",
    "modelAliases": "Alias de modèle",
    "modelAliasesTitle": "Alias de Modèles",
    "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.",
    "addCustomAlias": "Ajouter un Alias Personnalisé",
    "deprecatedModelId": "ID du modèle obsolète",
    "newModelId": "Nouvel ID de modèle",
    "customAliases": "Alias Personnalisés",
    "builtInAliases": "Alias Intégrés",
    "backgroundDegradationTitle": "Dégradation des Tâches en Arrière-plan",
    "backgroundDegradationDesc": "Détecte automatiquement les tâches en arrière-plan (titres, résumés) et redirige vers des modèles moins chers",
    "enableDegradation": "Activer la Dégradation en Arrière-plan",
    "enableDegradationHint": "Lorsqu'activé, les tâches en arrière-plan comme la génération de titres et les résumés sont redirigées automatiquement vers des modèles moins chers",
    "tasksDetected": "Tâches détectées",
    "degradationMap": "Carte de Dégradation des Modèles",
    "premiumModel": "Modèle premium",
    "cheapModel": "Modèle économique",
    "detectionPatterns": "Modèles de Détection",
    "newPattern": "ex: \"générer un titre\"",
    "aliasPatternPlaceholder": "claude-sonnet-*",
    "aliasTargetPlaceholder": "claude-sonnet-4-20250514",
    "pattern": "Modèle",
    "targetModel": "Modèle cible",
    "add": "+ Ajouter",
    "session": "Séance",
    "sessionDetailsAria": "Détails de la séance",
    "status": "Statut",
    "authenticated": "Authentifié",
    "guest": "Invité",
    "loginTime": "Heure de connexion",
    "sessionAge": "Âge de la session",
    "browser": "Navigateur",
    "clearLocalData": "Effacer les données locales",
    "logout": "Déconnexion",
    "clearLocalDataConfirm": "Effacer toutes les données locales ? Cela réinitialisera vos préférences.",
    "unknown": "Inconnu",
    "systemActor": "système",
    "ipAccessControl": "Contrôle d'accès IP",
    "ipAccessControlDesc": "Bloquer ou autoriser des adresses IP spécifiques",
    "ipModeDisabled": "Désactivé",
    "ipModeBlacklist": "Liste noire",
    "ipModeWhitelist": "Liste blanche",
    "ipModeWhitelistPriority": "Priorité WL",
    "addIpAddress": "Ajouter une adresse IP",
    "ipAddressPlaceholder": "192.168.1.0/24 ou 10.0.*.*",
    "block": "+ Bloquer",
    "allow": "+ Autoriser",
    "blocked": "Bloqué ({count})",
    "allowed": "Autorisé ({count})",
    "temporaryBans": "Interdictions temporaires ({count})",
    "minLeft": "{min}m restant",
    "auditLog": "Journal d'audit",
    "searchAuditLogs": "Rechercher dans les journaux d'audit...",
    "failedLoadAuditLog": "Échec du chargement du journal d'audit",
    "noAuditEvents": "Aucun événement d'audit trouvé",
    "action": "Action",
    "actor": "Acteur",
    "details": "Détails",
    "time": "Temps",
    "fallbackChainsTitle": "Chaînes de secours",
    "fallbackChainsDesc": "Définir l'ordre de secours du fournisseur par modèle",
    "addChain": "+ Ajouter une chaîne",
    "modelName": "Nom du modèle",
    "modelNamePlaceholder": "claude-sonnet-4-20250514",
    "providersCommaSeparated": "Fournisseurs (séparés par des virgules, par ordre de priorité)",
    "providersCommaSeparatedPlaceholder": "anthropique, openai, gémeaux",
    "createChain": "Créer une chaîne",
    "noFallbackChains": "Aucune chaîne de repli",
    "noFallbackChainsDesc": "Créez une chaîne pour définir l'ordre de secours du fournisseur pour un modèle.",
    "loadingFallbackChains": "Chargement des chaînes de secours...",
    "deleteChainConfirm": "Supprimer la chaîne de secours pour « {model} » ?",
    "chainCreated": "Chaîne créée pour {model}",
    "chainDeleted": "Chaîne supprimée pour {model}",
    "failedCreateChain": "Échec de la création de la chaîne",
    "failedDeleteChain": "Échec de la suppression de la chaîne",
    "deleteChain": "Supprimer la chaîne",
    "fillModelAndProviders": "Veuillez remplir le nom du modèle et les fournisseurs",
    "addAtLeastOneProvider": "Ajouter au moins un fournisseur",
    "comboDefaultsTitle": "Valeurs par défaut des combos",
    "comboDefaultsGuideTitle": "Comment régler les paramètres par défaut du combo",
    "comboDefaultsGuideHint1": "Maintenez un faible nombre de tentatives dans les flux à faible latence ; augmentez le délai d'attente uniquement pour les tâches de génération longue.",
    "comboDefaultsGuideHint2": "Utilisez les remplacements de fournisseur lorsqu'un fournisseur a besoin d'un comportement de délai d'attente/nouvelle tentative différent de celui des valeurs par défaut globales.",
    "globalComboConfig": "Configuration combinée globale",
    "defaultStrategy": "Stratégie par défaut",
    "defaultStrategyDesc": "Appliqué aux nouveaux combos sans stratégie explicite",
    "comboStrategyAria": "Stratégie combinée",
    "priority": "Priorité",
    "weighted": "Pondéré",
    "contextRelay": "Context Relay",
    "contextRelayDesc": "Hands off context between providers with automatic summarization",
    "maxRetriesLabel": "Nombre maximal de tentatives",
    "retryDelayLabel": "Délai de nouvelle tentative (ms)",
    "timeoutLabel": "Délai d'expiration (ms)",
    "healthCheck": "Bilan de santé",
    "healthCheckDesc": "Pré-vérifier la disponibilité du fournisseur",
    "trackMetrics": "Suivre les métriques",
    "trackMetricsDesc": "Enregistrer les métriques de requête par combo",
    "providerOverrides": "Remplacements du fournisseur",
    "providerOverridesDesc": "Remplacez le délai d'attente et les tentatives par fournisseur. Les paramètres du fournisseur remplacent les valeurs par défaut globales.",
    "providerMaxRetriesAria": "{provider} tentatives maximales",
    "providerTimeoutAria": "{provider} délai d'expiration ms",
    "removeProviderOverrideAria": "Supprimer le remplacement de {provider}",
    "newProviderNamePlaceholder": "par ex. google, ouvre...",
    "newProviderNameAria": "Nom du nouveau fournisseur",
    "retries": "nouvelles tentatives",
    "ms": "Mme",
    "saveComboDefaults": "Enregistrer les valeurs par défaut du combo",
    "maxNestingDepth": "Profondeur maximale d'emboîtement",
    "concurrencyPerModel": "Concurrence / Modèle",
    "queueTimeout": "Délai d'expiration de la file d'attente (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": "Profils de fournisseurs",
    "providerProfilesDesc": "Paramètres de résilience séparés pour les fournisseurs OAuth (basés sur la session) et API Key (mesurés). Les fournisseurs OAuth ont des seuils plus stricts en raison de limites de débit plus basses.",
    "oauthProviders": "Fournisseurs OAuth",
    "apiKeyProviders": "Fournisseurs de clés API",
    "transientCooldown": "Temps de recharge transitoire",
    "rateLimitCooldown": "Temps de recharge de la limite de débit",
    "maxBackoffLevel": "Niveau d'attente maximum",
    "cbThreshold": "Seuil CB",
    "cbResetTime": "Temps de réinitialisation du CB",
    "rateLimiting": "Limitation du débit",
    "rateLimitingDesc": "Les fournisseurs de clés API sont automatiquement limités en débit avec des valeurs par défaut sûres. Les limites sont apprises à partir des en-têtes de réponse et s’adaptent au fil du temps.",
    "defaultSafetyNet": "Filet de sécurité par défaut",
    "rpm": "RPM",
    "minGap": "Écart minimum",
    "maxConcurrent": "Maximum simultané",
    "activeLimiters": "Limiteurs actifs",
    "noActiveLimiters": "Pas encore de limiteurs de débit actifs.",
    "reservoir": "Réservoir",
    "running": "Courir",
    "queued": "En file d'attente",
    "circuitBreakers": "Disjoncteurs",
    "breakerStateClosed": "Fermé",
    "breakerStateOpen": "Ouvert",
    "breakerStateHalfOpen": "Mi-ouvert",
    "tripped": "{count} déclenché",
    "healthy": "{count} en bonne santé",
    "resetAll": "Tout réinitialiser",
    "noCircuitBreakers": "Aucun disjoncteur n'est encore actif. Ils sont créés automatiquement lorsque les demandes transitent par le pipeline combo.",
    "failures": "{count} échec(s)",
    "policiesLocked": "Politiques et identifiants verrouillés",
    "allOperational": "Tous les systèmes opérationnels – pas de verrouillage ni de disjoncteur déclenché",
    "loadingPolicies": "Chargement des politiques...",
    "lockedIdentifiers": "Identifiants verrouillés",
    "unlockedIdentifier": "Débloqué : {identifier}",
    "sinceDate": "depuis {date}",
    "forceUnlock": "Forcer le déverrouillage",
    "unlocking": "Déverrouillage...",
    "failedUnlock": "Échec du déverrouillage",
    "failedLoadWithStatus": "Échec du chargement : {status}",
    "failedLoadResilience": "Échec du chargement de l'état de résilience",
    "saveFailed": "Échec de l'enregistrement",
    "resetFailed": "Échec de la réinitialisation",
    "loadingResilience": "Chargement de l'état de résilience...",
    "retry": "Réessayer",
    "systemStorage": "Système et stockage",
    "allDataLocal": "Toutes les données stockées localement sur votre machine",
    "databasePath": "Chemin de la base de données",
    "exportDatabase": "Exporter la base de données",
    "exportAll": "Exporter tout (.tar.gz)",
    "importDatabase": "Importer la base de données",
    "confirmDbImport": "Confirmer l'importation de la base de données",
    "confirmDbImportDesc": "Cela remplacera toutes les données actuelles par le contenu de {file}. Une sauvegarde sera créée automatiquement avant l'importation.",
    "yesImport": "Oui, importer",
    "lastBackup": "Dernière sauvegarde",
    "noBackupYet": "Pas encore de sauvegarde",
    "backupNow": "Sauvegarder maintenant",
    "backupRestore": "Sauvegarde et restauration",
    "viewBackups": "Afficher les sauvegardes",
    "hide": "Masquer",
    "backupRetentionDesc": "Les instantanés de la base de données sont créés automatiquement avant la restauration et toutes les 15 minutes lorsque les données changent. Rétention : 24 heures sur 24 + 30 sauvegardes quotidiennes avec rotation intelligente.",
    "loadingBackups": "Chargement des sauvegardes...",
    "noBackupsYet": "Aucune sauvegarde disponible pour le moment. Les sauvegardes seront créées automatiquement lorsque les données changent.",
    "backupsAvailable": "{count} sauvegarde(s) disponible(s)",
    "refresh": "Actualiser",
    "confirm": "Confirmer ?",
    "yes": "Oui",
    "no": "Non",
    "restore": "Restaurer",
    "invalidFileType": "Type de fichier invalide. Seuls les fichiers .sqlite sont acceptés.",
    "exportFailed": "Échec de l'exportation",
    "exportFailedWithError": "Échec de l'exportation : {error}",
    "fullExportFailedWithError": "Échec de l'exportation complète : {error}",
    "backupCreated": "Sauvegarde créée : {file}",
    "restoreSuccess": "Restauré ! Connexions {connections}, nœuds {nodes}, combos {combos}, clés API {apiKeys}.",
    "importSuccess": "Base de données importée ! Connexions {connections}, nœuds {nodes}, combos {combos}, clés API {apiKeys}.",
    "minutesAgo": "il y a {count}m",
    "hoursAgo": "il y a {count}h",
    "daysAgo": "Il y a {count}j",
    "backupReasonManual": "manuel",
    "backupReasonPreRestore": "pré-restauration",
    "connectionsCount": "{count, plural, one {# connection} other {# connections}}",
    "noChangesSinceBackup": "Aucun changement depuis la dernière sauvegarde",
    "backupFailed": "La sauvegarde a échoué",
    "restoreFailed": "La restauration a échoué",
    "importFailed": "Échec de l'importation",
    "errorDuringRestore": "Une erreur s'est produite lors de la restauration",
    "errorDuringImport": "Une erreur s'est produite lors de l'importation",
    "modelPricing": "Prix ​​du modèle",
    "modelPricingDesc": "Configurer les tarifs par modèle • Tous les tarifs en jetons $/1 M",
    "registry": "Registre",
    "priced": "Prix",
    "searchProvidersModels": "Rechercher des fournisseurs ou des modèles...",
    "showAll": "Afficher tout",
    "noProvidersMatch": "Aucun fournisseur ne correspond à votre recherche.",
    "howPricingWorks": "Comment fonctionne la tarification",
    "cacheWrite": "Écriture du cache",
    "unsaved": "non enregistré",
    "resetDefaults": "Réinitialiser les paramètres par défaut",
    "saveProvider": "Enregistrer le fournisseur",
    "model": "Modèle",
    "models": "modèles",
    "moreProviders": "{count} autres fournisseurs",
    "withPricing": "avec tarification configurée",
    "policiesCircuitBreakers": "Politiques et disjoncteurs",
    "activeIssuesDetected": "Problèmes actifs détectés",
    "off": "Désactivé",
    "resetPricingConfirm": "Réinitialiser tous les prix de {provider} aux valeurs par défaut ?",
    "pricingDescInput": "Entrée : jetons envoyés au modèle",
    "pricingDescOutput": "Sortie : jetons générés",
    "pricingDescCached": "En cache : entrée réutilisée (~ 50 % du taux d'entrée)",
    "pricingDescReasoning": "Raisonnement : penser aux jetons (revient à la sortie)",
    "pricingDescCacheWrite": "Cache Write : création d'entrées de cache (revient à Input)",
    "pricingDescFormula": "Coût = (entrée × input_rate) + (output × output_rate) + (mis en cache × cached_rate) par million de jetons.",
    "pricingSettingsTitle": "Paramètres de tarification",
    "totalModels": "Total des modèles",
    "active": "Actif",
    "costCalculation": "Calcul du coût",
    "costCalculationDesc": "Les coûts sont calculés en fonction de l'utilisation des jetons et des tarifs configurés pour chaque modèle.",
    "pricingFormat": "Format de tarification",
    "pricingFormatDesc": "Tous les tarifs sont en jetons $/1M (dollars par million de jetons).",
    "tokenTypes": "Types de jetons",
    "inputTokenDesc": "Jetons d'invite standard",
    "outputTokenDesc": "Jetons d'achèvement/réponse",
    "cachedTokenDesc": "Jetons d'entrée mis en cache (généralement 50 % du taux d'entrée)",
    "reasoningTokenDesc": "Jetons de raisonnement/réflexion spéciaux (repli au taux de sortie)",
    "cacheCreationTokenDesc": "Jetons utilisés pour créer des entrées de cache (repli sur le débit d'entrée)",
    "customPricingNote": "Vous pouvez remplacer le prix par défaut pour des modèles spécifiques. Les remplacements personnalisés ont la priorité sur les prix détectés automatiquement.",
    "editPricing": "Modifier le prix",
    "viewFullDetails": "Afficher tous les détails",
    "themeCoral": "Corail",
    "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": "Échec de l’effacement de la tarification synchronisée : {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": "Échec de la réinitialisation des prix: {reason}",
    "tab": "Tab",
    "pricingSavedProvider": "Prix ​​enregistré pour {provider}",
    "pricingSyncFailed": "Pricing Sync Failed",
    "pricingSaveFailedWithReason": "Échec de l'enregistrement du prix: {reason}",
    "pricingResetProvider": "Réinitialisation des prix pour {provider}",
    "nextSync": "Next Sync",
    "pricingSyncFailedWithReason": "Échec de la synchronisation des prix: {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": "Configuration de moteur agressive",
    "compressionAggressiveConfigDesc": "Affiner la synthèse, la compression des outils et les seuils de vieillissement",
    "compressionUltraConfig": "Configuration du moteur ultra",
    "compressionUltraConfigDesc": "Affinez l’élagage heuristique, le repli SLM et les seuils par message",
    "compressionUltraRate": "Conserver le taux",
    "compressionUltraMinScore": "Seuil de score minimum",
    "compressionUltraSlmFallback": "Repli vers l'agressivité",
    "compressionUltraModelPath": "Chemin du modèle SLM",
    "compressionSummarizerEnabled": "Activer le résumé",
    "compressionMaxTokensPerMessage": "Nombre maximum de jetons par message",
    "compressionMinSavings": "Seuil d'économies minimum",
    "compressionAgingThresholds": "Seuils de vieillissement",
    "compressionAgingThresholdsDesc": "Nombre de messages récents conservés à chaque niveau vieillissant (plus élevé = plus conservé)",
    "compressionToolStrategies": "Stratégies de résultats des outils",
    "compressionToolStrategiesDesc": "Basculer les stratégies de compression pour différents types de résultats d'outils",
    "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": "minutes",
    "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": "Facultatif",
    "current": "Actuel",
    "remove": "Supprimer",
    "search": "Rechercher",
    "oneproxyTitle": "Marché de proxy gratuit 1proxy",
    "oneproxyTotalProxies": "Total des procurations",
    "oneproxyAvgQuality": "Qualité moyenne",
    "resilienceScope": "Portée :",
    "resilienceTrigger": "Déclencheur :",
    "resilienceEffect": "Effet :",
    "resilienceRequestQueueTitle": "Request Queue & Rate",
    "resilienceAutoEnableApiKeyProviders": "Auto-enable for API-key providers",
    "resilienceRequestsPerMinute": "Requests per minute",
    "resilienceMinTimeBetweenRequests": "Minimum time between requests",
    "resilienceConcurrentRequests": "Concurrent requests",
    "resilienceMaxQueueWaitTime": "Temps d'attente maximum dans la file d'attente",
    "resilienceBaseCooldown": "Base cooldown",
    "resilienceUseUpstreamRetryHints": "Use upstream retry hints",
    "resilienceDefaultPerProvider": "Default (per provider)",
    "resilienceAlwaysOn": "Always on",
    "resilienceAlwaysOff": "Always off",
    "routingRemoveEntry": "Supprimer l'entrée",
    "routingNeedlesSubstrings": "Aiguilles (sous-chaînes correspondant)",
    "routingCaseSensitive": "Sensible à la casse",
    "routingPrefixes": "Préfixes",
    "routingMatch": "Correspondance",
    "routingReplacement": "Remplacement",
    "routingReplaceAllOccurrences": "Remplacer toutes les occurrences",
    "routingPatternRegex": "Modèle (regex)",
    "routingFlags": "Drapeaux",
    "routingNeedles": "Aiguilles",
    "routingBlockText": "Bloquer le texte",
    "routingIdempotencyKey": "Clé d'idempotence",
    "routingEntrypoint": "Point d'entrée",
    "routingVersionFormat": "Format des versions",
    "routingCchAlgorithm": "Algorithme CCH",
    "routingWordsToObfuscate": "Mots à obscurcir (ZWJ inséré après le premier caractère)",
    "logsSettingsTitle": "Paramètres des journaux",
    "detailedLogsLabel": "Journaux détaillés activés",
    "detailedLogsDesc": "Activer la journalisation détaillée des demandes/réponses",
    "callLogPipelineLabel": "Pipeline du journal des appels",
    "callLogPipelineDesc": "Activer le pipeline de traitement du journal des appels",
    "maxDetailSizeLabel": "Taille maximale des détails (Ko)",
    "maxDetailSizeDesc": "Taille maximale des entrées de journal détaillées",
    "ringBufferSizeLabel": "Taille du tampon annulaire",
    "ringBufferSizeDesc": "Taille du tampon en anneau pour les journaux",
    "semanticCacheEnabledLabel": "Cache sémantique activé",
    "semanticCacheMaxSizeLabel": "Taille maximale du cache sémantique",
    "semanticCacheMaxSizeDesc": "Nombre maximum d'entrées de cache sémantique",
    "semanticCacheTTLLabel": "Durée de vie du cache sémantique",
    "promptCacheEnabledLabel": "Cache d'invite activé",
    "promptCacheEnabledDesc": "Activer la mise en cache des invites",
    "promptCacheStrategyLabel": "Stratégie de cache d'invite",
    "promptCacheStrategyDesc": "Stratégie de mise en cache rapide",
    "alwaysPreserveClientCacheLabel": "Préservez toujours le cache client",
    "alwaysPreserveClientCacheDesc": "Politique de préservation du cache client",
    "logRetentionPolicyTitle": "Politique de conservation des journaux",
    "resilienceUseUpstream429HintsForBreaker": "Utiliser les indices 429 en amont (disjoncteur)",
    "appearanceLogoPreviewAlt": "Aperçu du logo",
    "appearanceFaviconPreviewAlt": "Aperçu du favicon",
    "oneproxyLastSync": "Dernière synchronisation",
    "oneproxyAllProtocols": "Tous les protocoles",
    "oneproxyCountryCodePlaceholder": "Code du pays (par exemple, États-Unis)",
    "oneproxyMinQualityPlaceholder": "Qualité minimale",
    "oneproxyLoadingProxies": "Chargement des proxys...",
    "oneproxyLastSyncLabel": "Dernière synchronisation :",
    "oneproxyProxiesFetched": "Proxies récupérées :",
    "oneproxyConsecutiveFailures": "Échecs consécutifs :",
    "oneproxyErrorLabel": "Erreur :",
    "oneproxyNever": "Jamais",
    "oneproxySyncStatusTitle": "Statut de synchronisation",
    "oneproxySuccess": "Succès",
    "oneproxyFailed": "Échec",
    "routingAntigravitySignatureTitle": "Mode cache de signature antigravité",
    "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": "Empreinte digitale d'en-tête (par fournisseur)",
    "routingServerRejectedSave": "⚠ Sauvegarde rejetée par le serveur :",
    "routingAddTransformOp": "Ajouter une opération de transformation",
    "routingClientCacheControlTitle": "Contrôle du cache client",
    "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": "Routage automatique sans configuration",
    "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": "Variante automatique par défaut",
    "visionBridge": "Pont visuel",
    "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": "Modèle de pont",
    "visionBridgeModelPlaceholder": "openai/gpt-4o-mini",
    "visionBridgeModelHint": "__MISSING__:Any OmniRoute model ID that supports vision can be used here.",
    "visionBridgePrompt": "Invite de pont",
    "visionBridgePromptPlaceholder": "Décrivez cette image de manière concise.",
    "visionBridgePromptHint": "__MISSING__:Sent to the vision model before the extracted description is injected back into the original request.",
    "visionBridgeTimeoutMs": "Délai d'expiration (ms)",
    "visionBridgeMaxImagesPerRequest": "Nombre maximum d'images par demande",
    "resilienceMaxBackoffSteps": "Max backoff steps",
    "resilienceProviderBreakerTitle": "Circuit Breaker per Provider",
    "resilienceFailureThreshold": "Failure threshold",
    "resilienceResetTimeout": "Réinitialiser le délai d'attente",
    "resilienceFailureThresholdLabel": "Seuil de défaillance",
    "resilienceResetTimeoutLabel": "Réinitialiser le délai d'attente",
    "resilienceConnectionCooldownTitle": "Connection Cooldown",
    "resilienceUseUpstreamRetryHintsLabel": "Utiliser les conseils de nouvelle tentative en amont",
    "resilienceUseUpstream429BreakerLabel": "Utiliser les indices 429 en amont (disjoncteur)",
    "resilienceMaxBackoffStepsLabel": "Étapes d'attente maximales",
    "resilienceYes": "Oui",
    "resilienceNo": "Non",
    "resilienceDefault": "Default",
    "storageDatabaseBackupRetention": "Conservation des sauvegardes de base de données",
    "storagePurgeData": "Purger les données",
    "retentionQuotaSnapshots": "Instantanés de quota (jours)",
    "retentionMcpAudit": "Audit MCP (jours)",
    "retentionA2aEvents": "Événements A2A (jours)",
    "retentionCallLogs": "Journaux d'appels (jours)",
    "retentionUsageHistory": "Historique d'utilisation (jours)",
    "retentionMemoryEntries": "Entrées de mémoire (jours)",
    "storageAutoVacuumMode": "Mode aspirateur automatique",
    "storageScheduledVacuum": "Vide programmé",
    "storageVacuumHour": "Heure de vide (0-23)",
    "storagePageSize": "Taille de la page (octets)",
    "storageDatabaseSize": "Taille de la base de données",
    "storagePageCount": "Nombre de pages",
    "storageFreelistCount": "Nombre de listes libres",
    "storageLastVacuum": "Dernier vide",
    "storageLastOptimization": "Dernière optimisation",
    "storageIntegrityCheck": "Contrôle d'intégrité",
    "storageIntegrityOk": "✓ D'accord",
    "storageIntegrityError": "✗ Erreur",
    "storageUsageTokenBuffer": "Tampon de jeton d'utilisation",
    "compressionSettingsAutoTriggerMode": "Mode de déclenchement automatique",
    "compressionSettingsMcpDescriptionCompression": "Compression des descriptions MCP",
    "compressionSettingsCavemanIntensity": "Intensité de l'homme des cavernes",
    "compressionSettingsCavemanOutputMode": "Mode de sortie homme des cavernes",
    "compressionSettingsOutputIntensity": "Intensité de sortie",
    "compressionSettingsAutoClarityBypass": "Contournement automatique de la clarté",
    "resilienceWaitForCooldown": "Attendez le temps de recharge",
    "resilienceEnableServerSideWait": "Activer l'attente côté serveur",
    "resilienceMaximumRetries": "Nombre maximal de tentatives",
    "resilienceMaximumWaitPerRetry": "Attente maximale par nouvelle tentative",
    "memorySkillsSkillsmpMarketplace": "Marché des compétencesMP",
    "memorySkillsFailedToSave": "Échec de l'enregistrement",
    "memorySkillsApiKey": "Clé API",
    "memorySkillsActiveSkillsProvider": "Fournisseur de compétences actif",
    "cliproxyapiFallback": "CLIProxyAPI de secours",
    "cliproxyapiEnableFallback": "Activer le repli CLIProxyAPI",
    "cliproxyapiUrl": "URL CLIProxyAPI",
    "cliproxyapiStatus": "Statut CLIProxyAPI",
    "cliproxyapiNotDetected": "Non détecté",
    "payloadRulesTitle": "Règles de charge utile",
    "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": "Modèles en temps de recharge",
    "modelCooldownsEmpty": "Aucun modèle en temps de recharge pour le moment.",
    "codexFastTierTitle": "Codex Fast Tier",
    "codexFastTierDesc": "Injecter globalement service_tier=priority pour les requêtes OpenAI Codex.",
    "codexFastTierHint": "Lorsqu'activé, OmniRoute ajoute service_tier=priority aux requêtes Codex sortantes pour les connexions qui n'ont pas déjà défini un tier. Le tier priority nécessite une clé API OpenAI Enterprise ou le chemin Codex avec authentification ChatGPT ; les autres types de clés recevront une erreur liée au tier de la part d'OpenAI. Les paramètres par connexion sur la page du provider Codex prévalent.",
    "codexFastTierSaveError": "Échec de la mise à jour du paramètre Codex Fast Tier",
    "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": "Activer le Fast Mode Anthropic (speed:\"fast\") pour les requêtes Claude sélectionnées.",
    "claudeFastModeHint": "Anthropic ne prend pas officiellement en charge le Fast Mode pour les clients de type SDK. Lorsque activé, OmniRoute transmet un en-tête X-CPA-Force-Fast-Mode permettant à un CLIProxyAPI compatible de réécrire l'entrypoint. Seuls les modèles Opus listés sont autorisés par la vérification côté binaire d'Anthropic. L'abonnement, le plan Max et le solde de crédits Fast Mode restent appliqués côté serveur — Anthropic peut renvoyer out_of_credits même lorsque le toggle est activé.",
    "claudeFastModeModelsLabel": "Appliqué aux modèles ({count})",
    "claudeFastModeModelCheckbox": "Activer le Fast Mode pour {model}",
    "claudeFastModeSaveError": "Échec de la mise à jour du paramètre Claude Fast Mode",
    "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": "Temps de recharge de base",
    "scopeLabel": "Portée",
    "triggerLabel": "Déclencheur",
    "effectLabel": "Effet",
    "statusEnabled": "Activé",
    "statusDisabled": "Désactivé",
    "resilienceRequestQueueScope": "Par file d'attente de requêtes",
    "resilienceRequestQueueTrigger": "Avant d'envoyer vers l'amont",
    "resilienceRequestQueueEffect": "Met les requêtes en file d'attente, limite la simultanéité et espace les appels",
    "resilienceRequestQueueDesc": "Cette couche contrôle uniquement la file d’attente et le rythme. Il ne stocke pas les temps de recharge ni les disjoncteurs ouverts.",
    "resilienceAutoEnableApiKeyProvidersDesc": "Active la protection de la file d'attente par défaut pour les connexions de clé API actives.",
    "resilienceMaxQueueWait": "Temps d'attente maximum dans la file d'attente",
    "resilienceConnectionCooldownScope": "Connexion individuelle",
    "resilienceConnectionCooldownTrigger": "Lorsqu'une connexion renvoie un échec transitoire en amont",
    "resilienceConnectionCooldownEffect": "Ignore temporairement cette connexion et augmente l'intervalle en cas d'échecs répétés",
    "resilienceConnectionCooldownDesc": "Le temps de recharge de base couvre les échecs de connexion transitoires. Lorsque les conseils de nouvelle tentative en amont sont activés, la fenêtre explicite du fournisseur remplace le temps de recharge local.",
    "resilienceUseUpstreamRetryHintsDesc": "Utilise les valeurs de nouvelle tentative/réinitialisation du fournisseur en amont lorsqu'elles sont disponibles.",
    "resilienceUseUpstream429BreakerHints": "Utilisez les astuces 429 en amont pour le temps de recharge du disjoncteur",
    "resilienceUseUpstream429BreakerHintsShort": "Utiliser les indices 429 en amont",
    "resilienceUseUpstream429BreakerHintsDesc": "Appliquez les signaux de réessai après/quota épuisé à partir de 429 réponses à la durée de refroidissement du disjoncteur. La valeur par défaut utilise une politique par fournisseur : les fournisseurs de cloud direct sont activés par défaut ; Les fournisseurs de proxy inverse, auto-hébergés et soutenus par CLI sont désactivés par défaut. Indépendant de « Utiliser les conseils de nouvelle tentative en amont ».",
    "resilienceProviderBreakerScope": "Fournisseur complet",
    "resilienceProviderBreakerTrigger": "Pannes finales de transport/serveur une fois la connexion de secours épuisée",
    "resilienceProviderBreakerEffect": "Bloque temporairement ce fournisseur jusqu'à l'expiration du délai de réinitialisation",
    "resilienceProviderBreakerDesc": "L’état du disjoncteur actif apparaît uniquement sur la page Santé. Les limites de débit 429 au niveau de la connexion restent dans le temps de recharge de la connexion et ne déclenchent pas le disjoncteur du fournisseur.",
    "resilienceResetTime": "Temps de réinitialisation",
    "resilienceWaitForCooldownTitle": "Attendez le temps de recharge",
    "resilienceWaitForCooldownScope": "Demande client actuelle",
    "resilienceWaitForCooldownTrigger": "Quand toutes les connexions candidates sont déjà en train de se refroidir",
    "resilienceWaitForCooldownEffect": "Attend sur le serveur et réessaye à l'expiration du premier temps de recharge",
    "resilienceWaitForCooldownDesc": "Cela n'affecte que la demande en cours. Il ne stocke pas l’état de la connexion ou du fournisseur.",
    "resilienceEnableServerWait": "Activer l'attente côté serveur",
    "resilienceEnableServerWaitDesc": "Lorsqu'il est activé, OmniRoute attend l'expiration du premier temps de recharge et réessaye automatiquement.",
    "resilienceMaxAttempts": "Tentatives maximales",
    "resilienceMaxWaitPerAttempt": "Attente maximale par tentative",
    "forcedFingerprintTitle": "Toujours activé pour {provider} — requis pour la sécurité des comptes OAuth ; ne peut pas être désactivé.",
    "forcedFingerprintBadge": "Obligatoire",
    "codexSessionAffinityTitle": "Affinité de session Codex",
    "codexSessionAffinityDesc": "Conserve une conversation Codex sur le même compte pendant ce nombre de secondes. 0 le désactive.",
    "codexSessionAffinityTtl": "TTL d'affinité (secondes)",
    "resetAwareQuotaCacheTitle": "Cache de quota compatible avec la réinitialisation",
    "resetAwareQuotaCacheDesc": "Met en cache la télémétrie des quotas pour les commandes prenant en charge la réinitialisation uniquement. Le contrôle en amont des quotas protège toujours les demandes. 0/0 continue la récupération en direct.",
    "resetAwareQuotaCacheTtl": "Nouveau TTL (secondes)",
    "resetAwareQuotaCacheMaxStale": "Max obsolète (secondes)",
    "qdrantCleanupSuccess": "OK : supprimé {count} point(s) (conservation : {days} jours)",
    "qdrantCleanupFailed": "Échec du nettoyage",
    "qdrantCleanupError": "Erreur : {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": "Filtrer le catalogue",
    "filterCatalogDesc": "Filtres de sortie disponibles par catégorie",
    "guidedConfig": "Configuration",
    "guidedConfigDesc": "Ajustez la façon dont RTK filtre la sortie de votre terminal",
    "maxLines": "Max lines",
    "maxChars": "Max chars",
    "deduplicateThreshold": "Seuil de déduplication",
    "customFilters": "Filtres personnalisés",
    "detectedType": "Type détecté",
    "confidence": "Confiance",
    "beforeAfter": "Avant/Après",
    "trustProjectFilters": "Filtres de projet de confiance",
    "rawOutputRetention": "Rétention de la production brute",
    "rawOutputNever": "Jamais",
    "rawOutputFailures": "Échecs",
    "rawOutputAlways": "Toujours",
    "rawOutputMaxBytes": "Octets maximum de sortie brute",
    "filterTesting": "Filter Testing",
    "pasteOutput": "Paste tool output to test filtering...",
    "presetHigh": "Agressif",
    "presetLow": "Lumière",
    "presetMaxChars": "Caractères de sortie maximum",
    "presetMaxLines": "Lignes de sortie maximales",
    "presetMedium": "Norme",
    "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": "Simple",
    "advancedMode": "Avancé",
    "searchFilters": "Filtres de recherche...",
    "tooltipDedup": "Avec quelle agressivité supprimer les lignes répétées.",
    "tooltipMaxChars": "Nombre maximum de caractères par bloc de sortie.",
    "tooltipMaxLines": "Nombre maximum de lignes à conserver dans la sortie de commande. L'excédent est tronqué."
  },
  "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": "Configuration avancée",
    "advancedConfigDesc": "Affiner le comportement de compression",
    "aggressiveSettings": "Paramètres agressifs",
    "aggressiveSettingsDesc": "Compression maximale avec des compromis potentiels en matière de qualité",
    "requests": "Requests",
    "tokensSaved": "Tokens saved",
    "savingsPercent": "Savings %",
    "avgLatency": "Avg latency",
    "languagePacks": "Language Packs",
    "languagePacksDesc": "Enable compression rules for specific languages.",
    "labelAutoTrigger": "Compresser automatiquement lorsque le contexte dépasse",
    "labelCompressionRate": "Résistance à la compression",
    "labelMaxTokens": "Cibler les jetons par message",
    "labelMinLength": "Longueur minimale du message",
    "labelMinSavings": "Minimum de jetons à enregistrer",
    "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": "Mode de sortie",
    "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.",
    "outputModeTitle": "Output Mode",
    "quickSettings": "Paramètres rapides",
    "quickSettingsDesc": "Paramètres de compression de base pour commencer",
    "autoClarity": "Auto-Clarity Bypass",
    "bypassConditions": "Bypass conditions",
    "bypassConditionsList": "sécurité, irréversible, clarification, sensible à l'ordre",
    "simpleMode": "Simple",
    "advancedMode": "Avancé",
    "tooltipAutoTrigger": "Compresser automatiquement lorsque le contexte dépasse cette taille.",
    "tooltipCompressionRate": "0,0 = aucun, 1,0 = maximum. 0,5 = équilibré.",
    "tooltipMaxTokens": "Nombre de jetons cible après compression. Inférieur = plus agressif.",
    "tooltipMinLength": "Les messages plus courts ne sont pas compressés. Plus faible = plus de compression.",
    "tooltipMinSavings": "Compressez uniquement si vous enregistrez au moins autant de jetons.",
    "ultraSettings": "Paramètres ultra",
    "ultraSettingsDesc": "Compression sémantique basée sur SLM",
    "preview": {
      "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.",
      "full": "Respond terse and compact. Preserve all technical substance.",
      "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols."
    }
  },
  "translator": {
    "title": "Traducteur",
    "metaTitle": "Aire de jeux pour traducteurs | OmniRoute",
    "metaDescription": "Déboguer, tester et visualiser les traductions au format API entre les fournisseurs",
    "playgroundTitle": "Terrain de jeu des traducteurs",
    "playground": "Aire de jeux",
    "realtime": "Activité de traduction en temps réel",
    "chatTester": "Testeur de chat",
    "testBench": "Banc d'essai",
    "liveMonitor": "Moniteur en direct",
    "modeDescriptionPlayground": "Collez n'importe quel corps de requête d'API et voyez comment OmniRoute le traduit entre les formats de fournisseur (OpenAI ↔ Claude ↔ Gemini ↔ API Responses)",
    "modeDescriptionChatTester": "Envoyez de vraies demandes de chat via OmniRoute et inspectez l'aller-retour complet : entrée, demande traduite, réponse du fournisseur et sortie traduite.",
    "modeDescriptionTestBench": "Exécutez des scénarios prédéfinis et comparez la compatibilité entre les fournisseurs et les modèles.",
    "modeDescriptionLiveMonitor": "Regardez les événements de traduction en temps réel à mesure que les demandes transitent par OmniRoute.",
    "modeDescriptionFallback": "Déboguez, testez et visualisez comment OmniRoute traduit les requêtes API entre les fournisseurs.",
    "recentTranslations": "Traductions récentes",
    "noTranslations": "Pas encore de traductions",
    "source": "Source",
    "target": "Cible",
    "time": "Temps",
    "model": "Modèle",
    "status": "Statut",
    "latency": "Latence",
    "totalTranslations": "Traductions totales",
    "successful": "Réussi",
    "errors": "Erreurs",
    "avgLatency": "Latence moyenne",
    "millisecondsShort": "{value}ms",
    "notAvailableSymbol": "—",
    "liveAutoRefreshing": "En direct – Actualisation automatique",
    "paused": "En pause",
    "eventsAppearHint": "Les événements de traduction apparaissent ici à mesure que les demandes transitent par OmniRoute. Utilisez l'une de ces méthodes pour générer des événements :",
    "chatTesterTab": "Onglet Testeur de chat",
    "testBenchTab": "Onglet Banc de Test",
    "externalApiCalls": "Appels d'API externes",
    "ideCliIntegrations": "Intégrations IDE/CLI",
    "inMemoryNote": "Remarque : Les événements sont stockés en mémoire et réinitialisés au redémarrage du serveur.",
    "ok": "D'accord",
    "errorShort": "ERREUR",
    "formatConverter": "Convertisseur de formats",
    "formatConverterDescription": "Collez ou saisissez un corps de requête JSON. Le traducteur détectera automatiquement le format source et le convertira au format cible. Utilisez-le pour déboguer la façon dont OmniRoute traduit les requêtes entre les formats (OpenAI ↔ Claude ↔ Gemini ↔ API Responses).",
    "translationPathHubSpoke": "{source} → OpenAI (intermédiaire) → {target}",
    "translationPathDirect": "{source} → {target} (traducteur direct)",
    "translationPathPassthrough": "Même format — aucune traduction nécessaire",
    "openaiIntermediatePanel": "Intermédiaire OpenAI",
    "autoFeaturesTitle": "Ce que fait automatiquement OmniRoute",
    "autoFeaturesCount": "8 fonctionnalités",
    "featureReasoningCache": "Cache de raisonnement",
    "featureReasoningCacheDesc": "Réinjecte Reasoning_Contenu mis en cache pour les modèles en mode réflexion (DeepSeek V4, Kimi K2, Qwen) lorsque les clients l'omettent de l'historique des conversations.",
    "featureSchemaCoercion": "Coercition de schéma",
    "featureSchemaCoercionDesc": "Corrige les schémas d'outils cassés : ajoute des propriétés supplémentaires manquantes, nettoie les longues descriptions, normalise les objets imbriqués.",
    "featureRoleNormalization": "Normalisation des rôles",
    "featureRoleNormalizationDesc": "Développeur de cartes → système pour les cibles non OpenAI. Système Maps → utilisateur pour les modèles qui ne prennent pas en charge le rôle système.",
    "featureToolCallIds": "Normalisation de l'ID d'appel d'outil",
    "featureToolCallIdsDesc": "Génère des ID d'appel d'outil uniques en cas d'absence. Normalise au format 9 caractères pour les fournisseurs comme Mistral.",
    "featureMissingToolResponse": "Injection de réponse de l'outil",
    "featureMissingToolResponseDesc": "Injecte des messages tool_result vides lorsque les clients envoient des tool_calls sans réponses correspondantes.",
    "featureThinkingBudget": "Penser le budget",
    "featureThinkingBudgetDesc": "Gère automatiquement la configuration de réflexion. Supprime les paramètres de réflexion lorsque le dernier message ne provient pas de l'utilisateur.",
    "featureDirectPaths": "Chemins de traduction directs",
    "featureDirectPathsDesc": "Certaines paires de formats (Claude → Gemini) ont des traducteurs directs qui contournent le hub OpenAI, produisant une sortie plus précise.",
    "featureImageMapping": "Mappage de la taille de l'image",
    "featureImageMappingDesc": "Traduit les conventions de dimension d'image entre les formats API (par exemple, niveaux de détail OpenAI → dimensions Gemini).",
    "input": "Entrée",
    "output": "Sortie",
    "auto": "Automatique",
    "swapFormats": "Changer de format",
    "translateAction": "Traduire",
    "clear": "Effacer",
    "inputPlaceholder": "Collez le corps d'une demande ici ou sélectionnez un modèle ci-dessous...",
    "exampleTemplates": "Exemples de modèles",
    "exampleTemplatesHint": "— Cliquez pour charger",
    "templateLoadHint": "Le modèle charge la requête au format {format}. Modifiez le format source pour charger dans un format différent.",
    "compatibilityTester": "Testeur de compatibilité",
    "compatibilityReport": "Rapport de compatibilité",
    "testBenchDescription": "Exécutez des scénarios prédéfinis (Simple Chat, Tool Calling, etc.) pour vérifier la traduction et la compatibilité des fournisseurs. Sélectionnez un format source et un fournisseur cible, puis exécutez tous les tests pour voir un pourcentage de compatibilité. Utilisez-le pour découvrir les fonctionnalités qui fonctionnent entre les fournisseurs.",
    "targetProvider": "Fournisseur cible",
    "runAllTests": "Exécuter tous les tests",
    "runTest": "Exécuter le test",
    "reRun": "Réexécuter",
    "running": "Courir...",
    "passed": "réussi",
    "failed": "échoué",
    "passedIconLabel": "✅ Réussi",
    "chunks": "morceaux",
    "scenarioSimpleChat": "Discussion simple",
    "scenarioToolCalling": "Appel d'outil",
    "scenarioMultiTurn": "Multi-tours",
    "scenarioThinking": "Penser",
    "scenarioSystemPrompt": "Invite système",
    "scenarioStreaming": "Diffusion en continu",
    "templateNames": {
      "simple-chat": "Discussion simple",
      "tool-calling": "Appel d'outil",
      "multi-turn": "Multi-tours",
      "thinking": "Penser",
      "system-prompt": "Invite système",
      "streaming": "Diffusion en continu",
      "vision": "Vision",
      "schema-coercion": "Coercition de schéma"
    },
    "templateDescriptions": {
      "simple-chat": "Message texte de base",
      "tool-calling": "Invocation de fonction/outil",
      "multi-turn": "Conversation avec l'histoire",
      "thinking": "Pensée/raisonnement étendu",
      "system-prompt": "Instructions système complexes",
      "streaming": "Demande de streaming SSE",
      "vision": "Requête multimodale avec saisie d'image",
      "schema-coercion": "Application du schéma de sortie structurée/JSON"
    },
    "templatePayloads": {
      "simpleChat": {
        "system": "Vous êtes un assistant utile.",
        "userGreeting": "Bonjour ! Comment allez-vous aujourd'hui?"
      },
      "toolCalling": {
        "userWeather": "Quel temps fait-il à São Paulo ?",
        "toolDescription": "Obtenir la météo actuelle pour un emplacement",
        "cityNameDescription": "Nom de la ville"
      },
      "multiTurn": {
        "system": "Vous êtes assistant de codage.",
        "userInitial": "Écrivez une fonction pour trier un tableau en Python.",
        "assistantExample": "Voici une fonction de tri simple :\n\n```python\ndef sort_array(arr):\n    retour trié (arr)\n```",
        "userFollowUp": "Maintenant, faites-le trier par ordre décroissant."
      },
      "thinking": {
        "question": "Quelle est la somme des 100 premiers nombres premiers ?"
      },
      "systemPrompt": {
        "systemInstruction": "Vous êtes un ingénieur logiciel senior spécialisé dans les systèmes distribués. Répondez aux questions de manière concise en utilisant les meilleures pratiques de l’industrie. Fournissez toujours des exemples de code lorsque cela est pertinent. Formatez vos réponses en utilisant le markdown.",
        "question": "Comment mettre en œuvre un modèle de disjoncteur ?"
      },
      "streaming": {
        "prompt": "Racontez-moi une courte histoire sur un robot qui apprend à peindre."
      },
      "vision": {
        "system": "Vous êtes un assistant qui décrit les images avec précision.",
        "userPrompt": "Que montre cette image ?",
        "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/600px-PNG_transparency_demonstration_1.png"
      },
      "schemaCoercion": {
        "userPrompt": "Recherchez la météo de Tokyo en utilisant des unités métriques et incluez la répartition horaire.",
        "toolDescription": "Récupérez la météo d'une ville avec des options structurées.",
        "cityDescription": "La ville à interroger, par ex. « Tokyo » ou « New York »."
      }
    },
    "openaiCompatibleLabel": "Compatible avec OpenAI",
    "anthropicCompatibleLabel": "Compatible anthropique",
    "noTemplateForFormat": "Aucun modèle pour ce format",
    "translationFailed": "Échec de la traduction : {error}",
    "pipelineDebugger": "Débogueur de pipeline",
    "translationPipeline": "Pipeline de traduction",
    "pipelineVisualization": "Visualisation des pipelines",
    "pipelineVisualizationHint": "Envoyez un message pour voir comment votre demande passe par la détection → traduction → appel du fournisseur.",
    "chatTesterDescription": "Envoyez des messages dans un format client spécifique et inspectez chaque étape du pipeline de traduction.",
    "chatTesterFlow": "Demande client → Détection de format → OpenAI Intermédiaire → Format du fournisseur → Réponse",
    "clickStepToInspect": "Cliquez sur n’importe quelle étape pour inspecter les données à ce stade.",
    "clientFormat": "Format client",
    "provider": "Fournisseur",
    "modelPlaceholder": "Sélectionnez ou saisissez un nom de modèle...",
    "sendMessageToSeePipeline": "Envoyez un message pour voir le pipeline de traduction",
    "chatMessageHintPrefix": "Votre message sera formaté comme un",
    "chatMessageHintSuffix": "demande, traduite via le pipeline et envoyée au fournisseur sélectionné.",
    "youWithFormat": "Vous ({format})",
    "assistant": "Assistante",
    "typeMessage": "Tapez un message...",
    "send": "Envoyer",
    "clientRequest": "Demande du client",
    "clientRequestDescription": "Le corps de la requête tel que votre client l'enverrait",
    "formatDetected": "Format détecté",
    "formatDetectedDescription": "OmniRoute détecte automatiquement le format de l'API à partir de la structure de la demande",
    "openaiIntermediate": "Intermédiaire OpenAI",
    "openaiIntermediateDescription": "Tous les formats sont d'abord normalisés au format OpenAI (le pont universel)",
    "providerFormat": "Format du fournisseur",
    "providerFormatDescription": "Le format OpenAI est traduit au format natif du fournisseur",
    "providerResponse": "Réponse du fournisseur",
    "providerResponseRawDescription": "La réponse brute de l'API du fournisseur",
    "providerResponseSseDescription": "Le flux SSE brut de l'API du fournisseur",
    "unexpectedError": "Une erreur inattendue s'est produite",
    "error": "Erreur",
    "errorMessage": "Erreur : {message}",
    "requestFailed": "La demande a échoué",
    "noTextExtracted": "(Aucun texte extrait)",
    "liveMonitorMemoryNote": "Les événements sont stockés en mémoire et perdus au redémarrage.",
    "liveMonitorMemoryCapNote": "Max 200 événements conservés.",
    "eventSourcesLabel": "Sources d'événements :",
    "eventSourceTranslatorPage": "• Page du traducteur (Testeur de chat, Banc de test)",
    "eventSourceMainPipeline": "• Pipeline de requêtes principal (trafic CLI/IDE/API)",
    "liveMonitorDescriptionPrefix": "Affiche les événements de traduction lorsque les appels d'API transitent par OmniRoute. Les événements proviennent du tampon en mémoire (réinitialisation au redémarrage). Utiliser",
    "liveMonitorDescriptionSuffix": ", ou des appels d'API externes pour générer des événements.",
    "streamTransformer": "Transformateur de flux",
    "modeDescriptionStreamTransformer": "Exécutez les flux SSE de complétion de chat via le transformateur Réponses.",
    "streamTransformerTitle": "Transformateur de flux de réponses",
    "streamTransformerDescription": "Collez un flux SSE de fin de discussion, exécutez-le via le transformateur Réponses d'OmniRoute et inspectez les événements de réponse.* émis avant de câbler un client.",
    "loadTextSample": "Charger un exemple de texte",
    "loadToolSample": "Charger un exemple d'appel d'outil",
    "transformToResponses": "Transformez-vous en réponses",
    "rawChatSseInput": "Achèvements de chat bruts SSE",
    "transformedResponsesSse": "API de réponses transformées SSE",
    "noResultsYet": "Aucun résultat pour l'instant",
    "transformedEvents": "Des événements transformés",
    "uniqueEventTypes": "Types d'événements uniques",
    "inputLines": "Lignes d'entrée",
    "outputLines": "Lignes de sortie",
    "transformedEventTimeline": "Chronologie des événements transformée",
    "transformerTimelineHint": "Exécutez le transformateur pour inspecter les événements Response.output_* émis dans l'ordre.",
    "eventType": "Type d'événement",
    "eventPreview": "Aperçu",
    "comboRouted": "Combo routé",
    "uniqueEndpoints": "Points de terminaison uniques",
    "routeDetails": "Détails de l'itinéraire",
    "comboBadge": "Combo",
    "routeEndpointLabel": "Point de terminaison",
    "routeConnectionLabel": "Connexion",
    "scenarioVision": "Vision (compréhension de l'image)",
    "scenarioSchemaCoercion": "Coercition de schéma (sortie structurée)",
    "techniques": "Techniques :"
  },
  "usage": {
    "title": "Utilisation",
    "loggerTab": "Enregistreur",
    "proxyTab": "Procuration",
    "budgetManagement": "Gestion budgétaire",
    "budgetSaved": "Limites budgétaires enregistrées",
    "budgetSaveFailed": "Échec de la sauvegarde du budget",
    "loadingBudgetData": "Chargement des données budgétaires...",
    "noApiKeysTitle": "Aucune clé API",
    "noApiKeysDescription": "Ajoutez d'abord des clés API pour définir des limites budgétaires.",
    "apiKey": "Clé API",
    "todaysSpend": "Dépenses du jour",
    "thisMonth": "Ce mois-ci",
    "setLimits": "Fixer des limites",
    "dailyLimitUsd": "Limite quotidienne (USD)",
    "monthlyLimitUsd": "Limite mensuelle (USD)",
    "warningThresholdPercent": "Seuil d'avertissement (%)",
    "dailyLimitPlaceholder": "par ex. 5h00",
    "monthlyLimitPlaceholder": "par ex. 50.00",
    "warningThresholdPlaceholder": "80",
    "saveLimits": "Enregistrer les limites",
    "budgetOk": "Budget OK — {remaining} restant",
    "budgetExceeded": "Budget dépassé : les demandes peuvent être bloquées",
    "totalRequests": "Total des demandes",
    "noDataYet": "Aucune donnée pour l'instant",
    "latency": "Latence",
    "latencyP50": "p50",
    "latencyP95": "p95",
    "latencyP99": "p99",
    "promptCache": "Cache d'invite",
    "systemHealth": "Santé du système",
    "entries": "Entrées",
    "activeCount": "{count} actif",
    "openCircuitBreakersDetected": "Disjoncteurs ouverts détectés",
    "hitRate": "Taux de réussite",
    "hitsMisses": "Coups réussis / Manqués",
    "circuitBreakers": "Disjoncteurs",
    "lockedIPs": "IP verrouillées",
    "lockoutsAutoRefreshHint": "Verrouillage de la limite de débit par modèle • Actualisation automatique toutes les 10 s",
    "lockedCount": "{count, plural, one {# locked} other {# locked}}",
    "timeLeft": "{time} restant",
    "howItWorks": "Comment ça marche",
    "howItWorksSubtitle": "Découvrez comment les évaluations valident vos réponses LLM",
    "define": "Définir",
    "defineStepDescription": "Créez des scénarios de test avec des invites de saisie et des critères de sortie attendus à l'aide de stratégies telles que le contenu, l'expression régulière ou la correspondance exacte.",
    "run": "Courir",
    "runStepDescription": "Exécutez des cas de test sur vos points de terminaison LLM via OmniRoute. Chaque cas est envoyé comme une véritable requête API.",
    "evaluate": "Évaluer",
    "evaluateStepDescription": "Les réponses sont comparées aux critères attendus. Voir réussite/échec pour chaque cas avec des mesures de latence et des commentaires détaillés.",
    "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": "Suites d'évaluation",
    "evalSuitesHint": "Cliquez sur une suite pour afficher les cas de test, puis exécutez-la pour évaluer vos points de terminaison LLM.",
    "evalsLoading": "Chargement des suites d'évaluation...",
    "noEvalSuitesFound": "Aucune suite d'évaluation trouvée",
    "noEvalSuitesDescription": "Les suites d'évaluation peuvent être définies via l'API ou dans le code. Ils testent les sorties du modèle par rapport aux résultats attendus à l'aide de stratégies telles que le contenu, l'expression régulière, la correspondance exacte et les fonctions personnalisées.",
    "columnCase": "Cas",
    "columnStatus": "Statut",
    "columnLatency": "Latence",
    "columnDetails": "Détails",
    "columnModel": "Modèle",
    "columnStrategy": "Stratégie",
    "columnExpected": "Attendu",
    "statsSuites": "Suites",
    "statsTestCases": "Cas de test",
    "statsModels": "Modèles",
    "statsCoverage": "Couverture",
    "statsStrategiesCount": "Stratégies {count}",
    "evaluationStrategies": "Stratégies d'évaluation",
    "modelsUnderTest": "Modèles en test",
    "searchSuitesPlaceholder": "Rechercher des suites...",
    "passSuffix": "passer",
    "casesCount": "{count, plural, one {# case} other {# cases}}",
    "runEval": "Exécuter l'évaluation",
    "runAllSuites": "Exécuter tout",
    "runAllRunning": "Exécuter tout...",
    "runAllProgress": "Exécution de {current}/{total} : {name}",
    "runAllFailedSuites": "{count, plural, one {# suite failed} other {# suites failed}}",
    "runAllCompleted": "Exécution des suites {suites} — {passed} réussi, {failed} échoué",
    "runAllCompletedWithFailures": "A exécuté {completed} suites ; {failedSuites} n'a pas réussi à se terminer",
    "runningProgress": "Exécution de {current}/{total}...",
    "passRate": "taux de réussite",
    "summaryBreakdown": "{passed} réussi · {failed} échoué · {total} total",
    "passedIconLabel": "✅ Réussi",
    "failedIconLabel": "❌ Échec",
    "resultPassed": "Réussi",
    "resultFailed": "Échec",
    "expandResult": "Développer les détails du résultat",
    "collapseResult": "Réduire les détails des résultats",
    "detailsContains": "Contient : \"{term}\"",
    "detailsRegex": "Expression régulière : {pattern}",
    "detailsExpected": "Attendu : \"{expected}\"",
    "expectedOutputLabel": "Résultat attendu",
    "noResultsYet": "Aucun résultat pour l'instant",
    "testCasesCount": "Cas de test ({count})",
    "noTestCasesDefined": "Aucun cas de test défini",
    "runEvalHint": "Cliquez sur « Exécuter l'évaluation » pour exécuter tous les cas sur votre point de terminaison LLM. Chaque test envoie une requête réelle via OmniRoute.",
    "notifyNoTestCases": "Aucun cas de test défini pour cette suite",
    "notifyAllCasesPassed": "Tous les {total} cas ont été réussis ✅",
    "notifySomeCasesFailed": "{passed}/{total} réussi, {failed} échoué",
    "notifyEvalRunFailed": "Échec de l'exécution de l'évaluation",
    "notifyEvalTitle": "Évaluation : {name}",
    "modelEvals": "Évaluations de modèles",
    "evalsHeroDescription": "Testez et validez vos points de terminaison LLM en exécutant des suites d'évaluation prédéfinies. Chaque suite contient des cas de test qui envoient des invites réelles via OmniRoute et comparent les réponses aux critères attendus, vous aidant ainsi à détecter les régressions, à comparer les modèles et à garantir la qualité des réponses entre les fournisseurs.",
    "qualityValidation": "Validation de la qualité",
    "modelComparison": "Comparaison des modèles",
    "regressionDetection": "Détection de régression",
    "latencyBenchmarks": "Benchmarks de latence",
    "modelLockouts": "Modèles de verrouillage",
    "noLockouts": "Aucun modèle actuellement verrouillé",
    "activeSessions": "Séances actives",
    "noSessions": "Aucune session active",
    "sessionsHint": "Les sessions apparaissent au fur et à mesure que les demandes transitent par le proxy",
    "sessionsTrackedHint": "Suivi via une demande d'empreinte digitale • Actualisation automatique 5 s",
    "session": "Séance",
    "age": "Âge",
    "requests": "Demandes",
    "connection": "Connexion",
    "durationMillisecondsShort": "{value}ms",
    "durationSecondsShort": "{value}s",
    "durationMinutesShort": "{value}m",
    "durationHoursShort": "{value}h",
    "reasonSeparator": " - ",
    "notAvailableSymbol": "-",
    "providerLimits": "Limites du fournisseur",
    "noProviders": "Aucun fournisseur connecté",
    "connectProvidersForQuota": "Connectez-vous aux fournisseurs avec OAuth pour suivre les limites de quota et l'utilisation de vos API.",
    "accountsCount": "{count, plural, one {# account} other {# accounts}}",
    "filteredFromCount": "(filtré à partir de {count})",
    "autoRefresh": "Actualisation automatique",
    "refreshAll": "Actualiser tout",
    "loadingQuotas": "Chargement...",
    "account": "Compte",
    "modelQuotas": "Quotas de modèles",
    "lastUsed": "Last Refreshed",
    "actions": "Actions",
    "refreshQuota": "Actualiser le quota",
    "today": "Aujourd'hui",
    "tomorrow": "Demain",
    "dayTimeFormat": "{day}, {time}",
    "inDuration": "dans {duration}",
    "notApplicable": "N/D",
    "rawPlanWithValue": "Plan brut : {plan}",
    "noPlanFromProvider": "Aucun plan du fournisseur",
    "noQuotaData": "Aucune donnée de quota",
    "cardExpand": "__MISSING__:Expand",
    "cardCollapse": "__MISSING__:Collapse",
    "moreQuotas": "__MISSING__:+{count} more",
    "ungrouped": "Ungrouped",
    "viewFlat": "Flat",
    "viewByEnvironment": "By Environment",
    "noQuotaDataAvailable": "Aucune donnée de quota disponible",
    "noAccountsForTierFilter": "Aucun compte trouvé pour le filtre de niveau",
    "tierAll": "Tout",
    "tierEnterprise": "Entreprise",
    "tierTeam": "Équipe",
    "tierBusiness": "Affaires",
    "tierUltra": "Ultra",
    "tierPro": "Pro",
    "tierPlus": "Plus",
    "tierFree": "Gratuit",
    "tierLite": "__MISSING__:Lite",
    "tierUnknown": "Inconnu",
    "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": "Modifier les seuils",
    "forceRefresh": "Actualiser maintenant",
    "suiteBuilderSaveFailed": "Failed to save suite",
    "clone": "Cloner",
    "exportSuite": "Exporter",
    "importSuite": "Importer",
    "suiteExported": "Suite exportée",
    "suiteExportFailed": "Échec de l'exportation de la suite",
    "suiteImportReady": "Importation de suite chargée pour examen",
    "suiteImportFailed": "Échec de l'importation de la suite",
    "suiteImportInvalid": "Suite d'évaluation JSON non valide",
    "suiteBuilderCloneSuffix": "copie",
    "suiteBuilderImportedSuite": "Suite importée",
    "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": "par ex. définitivement Fibonacci",
    "suiteBuilderCaseExpectedPlaceholderExact": "Collez la réponse exacte attendue",
    "suiteBuilderCaseExpectedPlaceholderRegex": "par ex. ^\\\\s*\\\\{.*\\\\}\\\\s*$",
    "suiteBuilderCaseExpectedHintRegex": "Utilisez une expression régulière JavaScript sans envelopper les barres obliques.",
    "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": "Dupliquer",
    "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 restant",
    "quotaCutoffsColumnHelp": "Arrêtez les demandes lorsque le quota restant tombe à ce pourcentage ou en dessous.",
    "quotaCutoffsButtonDefault": "Par défaut",
    "quotaCutoffsButtonHelp": "Modifiez les seuils de quota minimum restant pour ce compte.",
    "quotaCutoffsButtonDisabled": "Aucune fenêtre de quota n'est encore disponible pour ce compte.",
    "quotaCutoffsTitle": "Limites de quota pour {name} ({provider})",
    "quotaCutoffsExplainer": "Remplacez le pourcentage de quota minimum restant auquel ce compte cesse d'être sélectionné pour chaque fenêtre de quota. Laissez vide pour hériter de la valeur par défaut du fournisseur.",
    "quotaCutoffsDefaultHint": "Minimum restant par défaut : {default} %",
    "quotaCutoffsResetAll": "Tout réinitialiser",
    "quotaCutoffsNoWindows": "Aucune fenêtre de quota n'est encore disponible pour ce compte.",
    "quotaThresholdInvalid": "Entrez un nombre entier de 0 à 100.",
    "budgetKpiToday": "Aujourd'hui",
    "budgetKpiThisMonth": "Ce mois-ci",
    "budgetKpiProjEom": "Projet MOE",
    "budgetKpiBlocked": "Bloqué",
    "budgetKpiAtRisk": "À risque",
    "budgetKpiActiveKeys": "Clés actives",
    "budgetSearchKeysPlaceholder": "Clés de recherche...",
    "budgetSortPctUsed": "Trier : % utilisé ↓",
    "budgetSortTodayDollar": "Trier : Aujourd'hui $ ↓",
    "budgetSortMonthDollar": "Trier : Mois $ ↓",
    "budgetSortNameAZ": "Trier : Nom (A–Z)",
    "budgetColDailyLim": "Lim quotidien",
    "budgetColMonthlyLim": "Limite mensuelle",
    "budgetColUsedPct": "% utilisé",
    "budgetLoading": "Chargement…",
    "budgetNoKeysMatch": "Aucune clé ne correspond aux filtres",
    "budgetLinearExtrapolation": "extrapolation linéaire",
    "budgetThisMonthSoFar": "Ce mois-ci jusqu'à présent",
    "budgetProjectedEndOfMonth": "Fin de mois prévue",
    "budgetByProvider": "par fournisseur",
    "budgetDailyDollar": "Quotidien $",
    "budgetWeeklyDollar": "Hebdomadaire $",
    "budgetMonthlyDollar": "Mensuel $",
    "budgetWarnAtPct": "Avertir à %",
    "quotaAlerts": "Alertes de quotas",
    "quotaTableRefreshing": "⟳ Rafraîchissant...",
    "noSpendLast30Days": "Aucune dépense au cours des 30 derniers jours",
    "updatedShort": "__MISSING__:Updated",
    "lastRefreshed": "__MISSING__:Last refreshed",
    "providerQuota": "__MISSING__:Provider Quota",
    "providerQuotaHomeHint": "__MISSING__:Live status across connected accounts"
  },
  "modals": {
    "waitingAuth": "En attente d'autorisation",
    "verificationUrl": "URL de vérification",
    "yourCode": "Votre code",
    "remoteAccess": "Accès à distance :",
    "connectedSuccess": "Connecté avec succès !",
    "connectionFailed": "Échec de la connexion",
    "chooseAuthMethod": "Choisissez votre méthode d'authentification :",
    "awsBuilderId": "ID du constructeur AWS",
    "awsIamIdentity": "Centre d'identité AWS IAM",
    "googleAccount": "Compte Google",
    "githubAccount": "Compte GitHub",
    "importToken": "Jeton d'importation",
    "pasteToken": "Collez le jeton d'actualisation de Kiro IDE.",
    "awsRegion": "Région AWS",
    "autoDetecting": "Jetons à détection automatique...",
    "readingFromCache": "Lecture à partir du cache AWS SSO",
    "readingFromCursor": "Lecture à partir de la base de données Cursor IDE",
    "initializing": "Initialisation...",
    "pricingConfig": "Configuration des prix",
    "loadingPricing": "Chargement des données de tarification...",
    "pricingRatesFormat": "Format des tarifs",
    "noPricingData": "Aucune donnée de prix disponible",
    "noModelsFound": "Aucun modèle trouvé"
  },
  "loggers": {
    "allProviders": "Tous les fournisseurs",
    "allModels": "Tous les modèles",
    "allAccounts": "Tous les comptes",
    "allApiKeys": "Toutes les clés API",
    "allTypes": "Tous types",
    "allLevels": "Tous les niveaux",
    "modelAZ": "Modèle A-Z",
    "modelZA": "Modèle ZA",
    "loadingLogs": "Chargement des journaux...",
    "loadingProxyLogs": "Chargement des journaux proxy...",
    "noLogEntries": "Aucune entrée de journal trouvée",
    "noPayloadData": "Aucune donnée utile disponible pour cette entrée de journal.",
    "proxyEvent": "Événement proxy",
    "proxy": "Procuration",
    "level": "Niveau",
    "directNative": "Direct (natif)",
    "combo": "Combo",
    "inputTokens": "Moi :",
    "outputTokens": "O :"
  },
  "stats": {
    "usageOverview": "Aperçu de l'utilisation",
    "outputTokens": "Jetons de sortie",
    "totalCost": "Coût total",
    "usageByModel": "Utilisation par modèle",
    "usageByAccount": "Utilisation par compte",
    "failedToLoad": "Échec du chargement des statistiques d'utilisation.",
    "tokenHealth": "Santé du jeton",
    "totalOAuth": "OAuth total",
    "healthy": "Sain",
    "warning": "Avertissement",
    "errored": "Erreur",
    "lastCheck": "Dernière vérification",
    "noData": "Aucune donnée",
    "share": "Partager",
    "unableToLoad": "Impossible de charger les métriques du système",
    "product": "Produit",
    "resources": "Ressources",
    "company": "Entreprise"
  },
  "auth": {
    "welcome": "Bienvenue",
    "signIn": "Connectez-vous",
    "enterPassword": "Entrez votre mot de passe pour continuer",
    "password": "Mot de passe",
    "unifiedProxy": "Proxy API IA unifié",
    "unifiedAiApiProxy": "Proxy API IA unifié",
    "unifiedAiApiProxyDesc": "Acheminez les requêtes vers plusieurs fournisseurs d’IA via un seul point de terminaison. Équilibrage de charge, basculement et suivi de l'utilisation intégrés.",
    "passwordNotEnabled": "La protection par mot de passe n'est pas activée",
    "loading": "Chargement...",
    "invalidPassword": "Mot de passe invalide",
    "errorOccurredRetry": "Une erreur s'est produite. Veuillez réessayer.",
    "configureInstance": "Configureons votre instance OmniRoute",
    "runOnboardingWizard": "Exécutez l'assistant d'onboarding pour configurer votre mot de passe et connecter votre premier fournisseur d'IA.",
    "startOnboarding": "Commencer l'intégration",
    "secureYourInstance": "Sécurisez votre instance",
    "setPasswordDescription": "Définissez un mot de passe pour protéger votre tableau de bord et sécuriser vos points de terminaison d'API contre tout accès non autorisé.",
    "configurePassword": "Configurer le mot de passe",
    "continue": "Continuer",
    "windowWillClose": "Cette fenêtre se fermera automatiquement...",
    "closeTabNow": "Vous pouvez fermer cet onglet maintenant.",
    "copyUrlManual": "Copiez l'URL depuis la barre d'adresse et collez-la dans l'application.",
    "accessDeniedDescription": "Vous n'êtes pas autorisé à accéder à cette ressource. Vérifiez votre clé API ou contactez l'administrateur.",
    "goToDashboard": "Aller au tableau de bord",
    "featureMultiProviderTitle": "Multi-fournisseur",
    "featureMultiProviderDesc": "OpenAI, Anthropic, Google et plus",
    "featureLoadBalancingTitle": "Équilibrage de charge",
    "featureLoadBalancingDesc": "Distribuez intelligemment les demandes",
    "featureUsageTrackingTitle": "Suivi de l'utilisation",
    "featureUsageTrackingDesc": "Surveiller les coûts et les jetons",
    "resetPassword": "Réinitialiser le mot de passe",
    "resetDescription": "Choisissez une méthode pour récupérer l'accès à votre tableau de bord",
    "stopServer": "Arrêtez le serveur OmniRoute",
    "processing": "Traitement...",
    "pleaseWait": "Veuillez patienter pendant que nous finalisons l'autorisation.",
    "authSuccess": "Autorisation réussie !",
    "copyUrl": "Copiez cette URL",
    "accessDenied": "Accès refusé",
    "methodCliTitle": "Méthode 1 : réinitialisation de la CLI",
    "methodCliDescription": "Exécutez la commande suivante sur le serveur sur lequel OmniRoute est exécuté :",
    "methodCliHint": "Cela vous demandera de définir un nouveau mot de passe. Le serveur doit d'abord être arrêté.",
    "methodManualTitle": "Méthode 2 : réinitialisation manuelle",
    "methodManualDescription": "Supprimez le mot de passe de la base de données et définissez-en un nouveau au démarrage :",
    "setPasswordInYour": "Définissez un nouveau mot de passe dans votre",
    "fileLabelSuffix": "fichier :",
    "newPasswordPlaceholder": "votre_nouveau_mot_de_passe",
    "deleteSettingsFile": "Supprimer",
    "orRemovePasswordHashField": "ou supprimez le champ passwordHash",
    "restartServerWithNewPassword": "Redémarrez le serveur - il utilisera le nouveau mot de passe",
    "backToLogin": "Retour à la connexion",
    "forgotPassword": "Mot de passe oublié ?",
    "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)",
    "Authorization": "Autorisation",
    "Content-Disposition": "Disposition du contenu",
    "waitingForAuthorization": "Waiting for authorization...",
    "waitingForGoogleAuthorization": "Waiting for Google authorization...",
    "waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...",
    "waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...",
    "waitingForQoderAuthorization": "Waiting for Qoder authorization...",
    "exchangingCodeForTokens": "Exchanging code for tokens...",
    "nodeIncompatibleTitle": "Incompatible Node.js Version",
    "nodeIncompatibleDesc": "You are running Node.js {version}, which is outside OmniRoute's supported secure runtime policy. Use a patched Node.js 20.x or 22.x LTS release.",
    "nodeIncompatibleFixLabel": "Fix: install a patched Node.js 22 LTS release",
    "nodeIncompatibleHint": "OmniRoute requires Node.js 20.20.2+ (20.x LTS), 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended."
  },
  "landing": {
    "brandName": "OmniRoute",
    "navigateHome": "Accédez à la maison",
    "toggleMenu": "Changer de menu",
    "featuresLink": "Caractéristiques",
    "docsLink": "Documents",
    "github": "GitHub",
    "versionLive": "La v1.0 est maintenant disponible",
    "oneEndpoint": "Un point de terminaison pour",
    "allProviders": "Tous les fournisseurs d'IA",
    "heroDescription": "Proxy de point de terminaison IA avec tableau de bord Web : un port JavaScript de CLIProxyAPI. Fonctionne de manière transparente avec Claude Code, OpenAI Codex, Cline, RooCode et d'autres outils CLI.",
    "getStarted": "Commencer",
    "viewOnGithub": "Voir sur GitHub",
    "powerfulFeatures": "Fonctionnalités puissantes",
    "featuresSubtitle": "Tout ce dont vous avez besoin pour gérer votre infrastructure d'IA en un seul endroit, conçu pour évoluer.",
    "featureUnifiedEndpointTitle": "Point de terminaison unifié",
    "featureUnifiedEndpointDesc": "Accédez à tous les fournisseurs via une seule URL API standard.",
    "featureEasySetupTitle": "Installation facile",
    "featureEasySetupDesc": "Soyez opérationnel en quelques minutes avec la commande npx.",
    "featureModelFallbackTitle": "Modèle de secours",
    "featureModelFallbackDesc": "Changez automatiquement de fournisseur en cas de panne ou de latence élevée.",
    "featureUsageTrackingTitle": "Suivi de l'utilisation",
    "featureUsageTrackingDesc": "Analyses détaillées et surveillance des coûts sur tous les modèles.",
    "featureOAuthApiKeysTitle": "Clés OAuth et API",
    "featureOAuthApiKeysDesc": "Gérez en toute sécurité les informations d’identification dans un seul coffre-fort.",
    "featureCloudSyncTitle": "Synchronisation dans le cloud",
    "featureCloudSyncDesc": "Synchronisez instantanément vos configurations sur tous les appareils.",
    "featureCliSupportTitle": "Prise en charge de l'interface CLI",
    "featureCliSupportDesc": "Fonctionne avec Claude Code, Codex, Cline, Cursor et plus encore.",
    "featureDashboardTitle": "Tableau de bord",
    "featureDashboardDesc": "Tableau de bord visuel pour une analyse du trafic en temps réel.",
    "howItWorks": "Comment fonctionne OmniRoute",
    "howItWorksDescription": "Les données circulent de manière transparente depuis votre application via notre couche de routage intelligente jusqu'au meilleur fournisseur pour le travail.",
    "howItWorksStep1Title": "1. CLI et SDK",
    "howItWorksStep1Description": "Vos demandes partent de vos outils préférés ou de notre SDK unifié. Changez simplement l'URL de base.",
    "howItWorksStep2Title": "2. Centre OmniRoute",
    "howItWorksStep2Description": "Notre moteur analyse l'invite, vérifie l'état du fournisseur et trace les itinéraires pour obtenir la latence ou le coût le plus faible.",
    "howItWorksStep3Title": "3. Fournisseurs d'IA",
    "howItWorksStep3Description": "La demande est satisfaite instantanément par OpenAI, Anthropic, Gemini ou autres.",
    "getStartedIn30Seconds": "Commencez en 30 secondes",
    "getStartedDescription": "Installez OmniRoute, configurez vos fournisseurs via le tableau de bord Web et commencez à acheminer les demandes d'IA.",
    "installOmniRoute": "Installer OmniRoute",
    "installStepDescription": "Exécutez la commande npx pour démarrer le serveur instantanément",
    "openDashboard": "Ouvrir le tableau de bord",
    "openDashboardStepDescription": "Configurer les fournisseurs et les clés API via l'interface Web",
    "routeRequests": "Demandes d'itinéraire",
    "routeRequestsStepDescription": "Pointez vos outils CLI vers {endpoint}",
    "terminal": "borne",
    "copy": "Copier",
    "copied": "✓ Copié",
    "startingOmniRoute": "Démarrage d'OmniRoute...",
    "serverRunningOnLabel": "Serveur fonctionnant sur",
    "dashboardLabel": "Tableau de bord",
    "readyToRoute": "Prêt à rouler ! ✓",
    "configureProvidersNote": "📝 Configurez les fournisseurs dans le tableau de bord ou utilisez des variables d'environnement",
    "dataLocation": "Emplacement des données :",
    "dataLocationMacLinux": " macOS/Linux :",
    "dataLocationWindows": " Fenêtres :",
    "product": "Produit",
    "dashboardLink": "Tableau de bord",
    "changelog": "Journal des modifications",
    "resources": "Ressources",
    "documentation": "Documentation",
    "npm": "MNP",
    "legal": "Juridique",
    "mitLicense": "Licence MIT",
    "footerTagline": "Le point de terminaison unifié pour la génération d’IA. Connectez, acheminez et gérez vos fournisseurs d'IA en toute simplicité.",
    "copyright": "© {year} OmniRoute. Tous droits réservés.",
    "flowToolClaudeCode": "Claude Code",
    "flowToolOpenAICodex": "Codex OpenAI",
    "flowToolCline": "Clin",
    "flowToolCursor": "Curseur",
    "flowProviderOpenAI": "OpenAI",
    "flowProviderAnthropic": "Anthropique",
    "flowProviderGemini": "Gémeaux",
    "flowProviderGithubCopilot": "Copilote GitHub",
    "interactiveDiagram": "Diagramme interactif visible sur le bureau",
    "ctaTitle": "Prêt à simplifier votre infrastructure d'IA ?",
    "ctaDescription": "Rejoignez les développeurs qui rationalisent leurs intégrations d'IA avec OmniRoute. Open source et démarrage gratuit.",
    "startFree": "Commencez gratuitement",
    "readDocumentation": "Lire la documentation"
  },
  "docs": {
    "title": "Documentation",
    "quickStart": "Démarrage rapide",
    "deploymentGuides": "Guides de déploiement",
    "features": "Caractéristiques",
    "supportedProviders": "Fournisseurs pris en charge",
    "supportedProvidersToc": "Fournisseurs",
    "commonUseCases": "Cas d'utilisation courants",
    "clientCompatibility": "Compatibilité client",
    "protocolsToc": "Protocoles",
    "apiReference": "Référence API",
    "managementApiReference": "Management API Reference",
    "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.",
    "method": "Méthode",
    "path": "Chemin",
    "notes": "Remarques",
    "modelPrefixes": "Préfixes de modèle",
    "prefix": "Préfixe",
    "troubleshooting": "Dépannage",
    "supportsChat": "Prend en charge les points de terminaison de chat et de réponses.",
    "oauthAutoRefresh": "Connexion OAuth avec actualisation automatique des jetons.",
    "fullStreaming": "Prise en charge complète du streaming pour tous les modèles.",
    "docsLabel": "Documents",
    "docsHeroDescription": "Passerelle IA pour les LLM multi-fournisseurs. Un point de terminaison pour OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor et plus de 20 autres fournisseurs.",
    "openDashboard": "Ouvrir le tableau de bord",
    "endpointPage": "Page de point de terminaison",
    "github": "GitHub",
    "reportIssue": "Signaler un problème",
    "onThisPage": "Sur cette page",
    "documentationVersion": "Documentation-v{version}",
    "quickStartStep1Title": "1. Installez et exécutez",
    "quickStartStep1Prefix": "Courir",
    "quickStartStep1Middle": "ou clonez depuis GitHub et exécutez",
    "quickStartStep2Title": "2. Créer une clé API",
    "quickStartStep2Text": "Accédez à Endpoint -> Clés enregistrées. Générez une clé par environnement.",
    "quickStartStep3Title": "3. Connectez les fournisseurs",
    "quickStartStep3Text": "Ajoutez des comptes de fournisseur via une connexion OAuth, une clé API ou une connexion automatique de niveau gratuit.",
    "quickStartStep4Title": "4. Définir l'URL de la base de clients",
    "quickStartStep4Prefix": "Pointez votre client IDE ou API vers",
    "quickStartStep4Suffix": "Utilisez le préfixe du fournisseur, par exemple",
    "deploySetupTitle": "Guide de configuration",
    "deploySetupText": "Installation étape par étape, configuration de l'environnement et présentation pas à pas de la première exécution d'OmniRoute.",
    "deployElectronTitle": "Bureau électronique",
    "deployElectronText": "Exécutez OmniRoute en tant qu'application de bureau native sous Windows, macOS et Linux.",
    "deployDockerTitle": "Docker",
    "deployDockerText": "Déploiement conteneurisé avec Docker Compose ; prêt pour les piles de production et Kubernetes.",
    "deployVmTitle": "Machine virtuelle",
    "deployVmText": "Auto-hébergé sur n’importe quelle machine virtuelle Linux. Comprend l'unité systemd, la rotation des journaux et les outils de sauvegarde.",
    "deployFlyTitle": "Fly.io",
    "deployFlyText": "Déployez sur le runtime Fly.io Edge avec un fly.toml et une seule commande de déploiement.",
    "deployPwaTitle": "PWA",
    "deployPwaText": "Installez OmniRoute en tant qu'application Web progressive sur les navigateurs Android, iOS et de bureau.",
    "deployTermuxTitle": "Termux (Android)",
    "deployTermuxText": "Run OmniRoute headless on Android via Termux. Access the dashboard from your mobile browser.",
    "featureRoutingTitle": "Routage multi-fournisseurs",
    "featureRoutingText": "Acheminez les requêtes vers plus de 30 fournisseurs d’IA via un seul point de terminaison compatible OpenAI. Prend en charge les API de chat, de réponses, d'audio et d'image.",
    "featureCombosTitle": "Combos et équilibrage",
    "featureCombosText": "Créez des combinaisons de modèles avec des chaînes de secours et des stratégies d'équilibrage : round-robin, priorité, aléatoire, moins utilisé et coût optimisé.",
    "featureUsageTitle": "Suivi de l'utilisation et des coûts",
    "featureUsageText": "Comptage des jetons en temps réel, calcul des coûts par fournisseur/modèle et répartition détaillée de l'utilisation par clé API et compte.",
    "featureAnalyticsTitle": "Tableau de bord d'analyse",
    "featureAnalyticsText": "Analyses visuelles avec des graphiques pour les requêtes, les jetons, les erreurs, la latence, les coûts et la popularité du modèle au fil du temps.",
    "featureHealthTitle": "Surveillance de la santé",
    "featureHealthText": "Contrôles de santé en direct, statut du fournisseur, états des disjoncteurs et détection automatique des limites de débit avec interruption exponentielle.",
    "featureCliTitle": "Outils CLI",
    "featureCliText": "Gérez les configurations IDE, exportez/importez des sauvegardes, découvrez les profils codex et configurez les paramètres à partir du tableau de bord.",
    "featureSecurityTitle": "Sécurité et politiques",
    "featureSecurityText": "Authentification par clé API, filtrage IP, protection contre l'injection rapide, politiques de domaine, gestion de session et journalisation d'audit.",
    "featureCloudSyncTitle": "Synchronisation dans le cloud",
    "featureCloudSyncText": "Synchronisez votre configuration avec Cloudflare Workers pour un accès à distance avec des informations d'identification cryptées et un basculement automatique.",
    "providersAcrossConnectionTypes": "Fournisseurs {count} sur trois types de connexion.",
    "manageProviders": "Gérer les fournisseurs",
    "providersCount": "{count} fournisseurs",
    "providerTypeFree": "Niveau gratuit",
    "providerTypeOAuth": "OAuth",
    "providerTypeApiKey": "Clé API",
    "useCaseSingleEndpointTitle": "Point de terminaison unique pour de nombreux fournisseurs",
    "useCaseSingleEndpointText": "Dirigez les clients vers une URL de base et acheminez-les par préfixe de modèle (par exemple : gh/, cc/, kr/, openai/).",
    "useCaseFallbackTitle": "Repli et changement de modèle avec des combos",
    "useCaseFallbackText": "Créez des modèles combinés dans le tableau de bord et maintenez la configuration client stable pendant que les fournisseurs effectuent une rotation en interne.",
    "useCaseUsageVisibilityTitle": "Visibilité de l'utilisation, du coût et du débogage",
    "useCaseUsageVisibilityText": "Suivez les jetons et le coût par fournisseur, compte et clé API dans les onglets Utilisation et Analyse.",
    "clientCherryStudioTitle": "Studio Cerise",
    "baseUrlLabel": "URL de base",
    "chatEndpointLabel": "Point de terminaison de discussion",
    "modelRecommendationLabel": "Recommandation de modèle : préfixe explicite",
    "clientCodexTitle": "Modèles de copilote Codex / GitHub",
    "clientCodexBullet1": "Utiliser les ID de modèle avec",
    "clientCodexBullet2": "Les modèles de la famille Codex sont acheminés automatiquement vers",
    "clientCodexBullet3": "Les modèles non-Codex continuent",
    "clientCursorTitle": "Curseur IDE",
    "clientCursorBullet1": "Utiliser",
    "clientCursorBullet1Suffix": "préfixe pour les modèles Cursor.",
    "clientCursorBullet2": "Connexion OAuth - connectez-vous à partir de la page Fournisseurs.",
    "clientClaudeTitle": "Claude Code / Antigravité",
    "clientClaudeBullet1Prefix": "Utiliser",
    "clientClaudeBullet1Middle": "(Claude) ou",
    "clientClaudeBullet1Suffix": "Préfixe (Antigravité).",
    "clientWindsurfTitle": "Planche à voile",
    "clientWindsurfBullet1": "Utilisez OmniRoute comme URL de base compatible OpenAI et conservez les préfixes de fournisseur explicites pour le routage déterministe.",
    "clientWindsurfBullet2": "Pointez les modèles vers `/v1/chat/completions` pour le trafic général et conservez `/v1/responses` pour les flux de style Codex.",
    "clientWindsurfBullet3": "Utilisez Dashboard -> CLI Tools pour un guide de configuration Windsurf prêt à l'emploi.",
    "clientClineTitle": "Clin",
    "clientClineBullet1": "Cline fonctionne mieux avec des préfixes explicites de fournisseur/modèle afin que le routeur n'ait jamais à deviner le backend.",
    "clientClineBullet2": "Utilisez `/v1/chat/completions` pour les modèles généraux et réutilisez la même URL de base OmniRoute sur différents comptes.",
    "clientClineBullet3": "Utilisez le tableau de bord des fournisseurs pour valider la clé OAuth/API avant de déboguer les problèmes d'exécution de Cline.",
    "clientKimiTitle": "Kimi Codage",
    "clientKimiBullet1": "Utilisez OmniRoute comme URL de base stable lors de la rotation des comptes ou des combinaisons de fournisseurs en dessous.",
    "clientKimiBullet2": "Préférez les modèles préfixés dans les flux de codage afin que les replis et les pistes d’audit restent explicites.",
    "clientKimiBullet3": "Utilisez `/v1/responses` lorsque vous souhaitez un routage natif de style Responses pour les clients utilisant des outils.",
    "protocolsTitle": "Protocoles : MCP et A2A",
    "protocolsDescription": "OmniRoute expose deux protocoles opérationnels en plus des API compatibles OpenAI : MCP pour l'exécution des outils et A2A pour les flux de travail d'agent à agent.",
    "protocolMcpTitle": "MCP (protocole de contexte de modèle)",
    "protocolMcpDesc": "Utilisez MCP sur stdio pour permettre aux clients de découvrir et d'appeler les outils OmniRoute avec une visibilité d'audit.",
    "protocolMcpStep1": "Démarrez le transport MCP avec `omniroute --mcp`.",
    "protocolMcpStep2": "Pointez votre client MCP vers le transport stdio.",
    "protocolMcpStep3": "Appelez `omniroute_get_health` et `omniroute_list_combos` pour valider la connectivité.",
    "protocolA2aTitle": "A2A (Agent2Agent)",
    "protocolA2aDesc": "Utilisez A2A JSON-RPC pour soumettre des tâches de manière synchrone ou via le streaming SSE.",
    "protocolA2aStep1": "Lisez `/.well-known/agent.json` pour la découverte d'agents.",
    "protocolA2aStep2": "Envoyez les requêtes `message/send` ou `message/stream` à `POST /a2a`.",
    "protocolA2aStep3": "Gérez le cycle de vie des tâches avec `tasks/get` et `tasks/cancel`.",
    "protocolTroubleshootingTitle": "Dépannage du protocole",
    "protocolTroubleshooting1": "Si l'état MCP est hors ligne, vérifiez que le processus stdio est en cours d'exécution et que le fichier de pulsation est mis à jour.",
    "protocolTroubleshooting2": "Si les tâches A2A restent dans `working`, inspectez `/api/a2a/tasks/:id` et diffusez les événements pour connaître l'état du terminal.",
    "protocolTroubleshooting3": "Utilisez `/dashboard/mcp` et `/dashboard/a2a` pour les contrôles opérationnels et la visibilité des audits.",
    "endpointChatNote": "Point de terminaison de discussion compatible OpenAI (par défaut).",
    "endpointResponsesNote": "Point de terminaison de l’API de réponses (Codex, série o).",
    "endpointModelsNote": "Catalogue modèle pour tous les fournisseurs connectés.",
    "endpointAudioNote": "Transcription audio (Deepgram, AssemblyAI).",
    "endpointSpeechNote": "Génération texte-vers-discours (ElevenLabs, OpenAI TTS).",
    "endpointEmbeddingsNote": "Génération d'embeddings texte (OpenAI, Cohere, Voyage).",
    "endpointImagesNote": "Génération d'images (NanoBanana).",
    "endpointRewriteChatNote": "Aide à la réécriture pour les clients sans /v1.",
    "endpointRewriteResponsesNote": "Assistant de réécriture pour les réponses sans /v1.",
    "endpointRewriteModelsNote": "Aide à la réécriture pour la découverte de modèles sans /v1.",
    "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).",
    "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.",
    "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.",
    "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.",
    "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.",
    "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.",
    "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.",
    "modelPrefixesDescriptionStart": "Utilisez le préfixe du fournisseur avant le nom du modèle pour acheminer vers un fournisseur spécifique. Exemple :",
    "modelPrefixesDescriptionEnd": "itinéraires vers GitHub Copilot.",
    "provider": "Fournisseur",
    "type": "Tapez",
    "troubleshootingModelRouting": "Si le client échoue avec le routage du modèle, utilisez un fournisseur/modèle explicite (par exemple : gh/gpt-5.1-codex).",
    "troubleshootingAmbiguousModels": "Si vous recevez des erreurs de modèle ambiguës, choisissez un préfixe de fournisseur au lieu d'un simple ID de modèle.",
    "troubleshootingCodexFamily": "Pour les modèles de la famille GitHub Codex, conservez le modèle sous la forme gh/codex-model ; Le routeur sélectionne /réponses automatiquement.",
    "troubleshootingTestConnection": "Utilisez Tableau de bord > Fournisseurs > Tester la connexion avant de tester à partir d'IDE ou de clients externes.",
    "troubleshootingCircuitBreaker": "Si un fournisseur indique que le disjoncteur est ouvert, attendez le temps de recharge ou consultez la page Santé pour plus de détails.",
    "troubleshootingOAuth": "Pour les fournisseurs OAuth, réauthentifiez-vous si les jetons expirent. Vérifiez l'indicateur d'état de la carte du fournisseur.",
    "endpointCompletionsNote": "Point de terminaison de complétion hérité pour la génération de texte.",
    "endpointModerationsNote": "Modération du contenu et classification de sécurité.",
    "endpointRerankNote": "Reclassement des documents pour la génération augmentée par récupération (Cohere, Jina).",
    "endpointSearchNote": "Recherche Web avec 5 fournisseurs (Serper, Brave, Exa, Tavily, Perplexity).",
    "endpointSearchAnalyticsNote": "Analyses et métriques pour les demandes de recherche.",
    "endpointVideoNote": "Génération vidéo (workflows ComfyUI, SD WebUI).",
    "endpointMusicNote": "Génération de musique via les workflows ComfyUI.",
    "endpointMessagesNote": "Point de terminaison des messages anthropiques natifs.",
    "endpointCountTokensNote": "Comptez les jetons pour une charge utile de message donnée.",
    "endpointFilesNote": "Téléchargement de fichiers pour les entrées multimodales.",
    "endpointBatchesNote": "Traitement par lots pour les requêtes API en masse.",
    "endpointWsNote": "Point de terminaison WebSocket pour le streaming en temps réel.",
    "mgmtProvidersListNote": "Répertoriez toutes les connexions de fournisseur enregistrées.",
    "mgmtProvidersCreateNote": "Créez une nouvelle connexion fournisseur.",
    "mgmtProvidersUpdateNote": "Mettez à jour une connexion de fournisseur existante.",
    "mgmtProvidersDeleteNote": "Supprimez une connexion fournisseur.",
    "mgmtProvidersTestNote": "Testez la connectivité et l’authentification pour un fournisseur.",
    "mgmtProvidersModelsNote": "Répertoriez les modèles disponibles pour un fournisseur spécifique.",
    "mgmtSettingsGetNote": "Récupérez les paramètres actuels de l’application.",
    "mgmtSettingsUpdateNote": "Mettez à jour les paramètres de l'application.",
    "mgmtPayloadRulesGetNote": "Obtenez les règles de transformation de la charge utile.",
    "mgmtPayloadRulesUpdateNote": "Mettez à jour les règles de transformation de charge utile.",
    "mcpToolsTitle": "Outils MCP",
    "mcpToolsDescription": "OmniRoute expose les outils {count} via Model Context Protocol pour l'orchestration des agents.",
    "mcpToolsCount": "Outils {count}",
    "mcpToolsToc": "Outils MCP",
    "mcpToolsRoutingTitle": "Routage et découverte",
    "mcpToolsRoutingDesc": "Bilans de santé, gestion des combos, surveillance des quotas, rapports sur les coûts et accès au catalogue de modèles.",
    "mcpToolsOperationsTitle": "Opérations et stratégie",
    "mcpToolsOperationsDesc": "Simulation d'itinéraire, gardes budgétaires, changement de stratégie, profils de résilience et mesures des fournisseurs.",
    "mcpToolsCacheTitle": "Gestion du cache",
    "mcpToolsCacheDesc": "Affichez les statistiques du cache et videz les caches sémantiques ou de signature.",
    "mcpToolsCompressionTitle": "Moteurs à compression",
    "mcpToolsCompressionDesc": "Configurez la compression RTK/Brotli, échangez les moteurs et inspectez les analyses de compression par combinaison.",
    "mcpToolsOneProxyTitle": "1Procuration / Tunnels",
    "mcpToolsOneProxyDesc": "Gérez les proxys sortants, alternez les adresses IP résidentielles et inspectez l’état des proxys.",
    "mcpToolsMemoryTitle": "Mémoire",
    "mcpToolsMemoryDesc": "Recherchez, ajoutez et effacez les entrées de mémoire conversationnelle persistantes.",
    "mcpToolsSkillsTitle": "Compétences",
    "mcpToolsSkillsDesc": "Répertoriez, activez, exécutez et surveillez les exécutions de compétences personnalisées.",
    "featureAutoComboTitle": "Combo automatique",
    "featureAutoComboText": "Créez automatiquement des combinaisons optimisées en fonction de vos fournisseurs connectés, de vos modèles d'utilisation et des capacités de votre modèle.",
    "featureSearchTitle": "Recherche sur le Web",
    "featureSearchText": "Recherche Web intégrée avec 5 fournisseurs (Serper, Brave, Exa, Tavily, Perplexity), y compris l'analyse et le suivi des coûts.",
    "featureMemoryTitle": "Système de mémoire",
    "featureMemoryText": "Mémoire conversationnelle persistante avec extraction, injection, récupération et synthèse au fil des sessions.",
    "featureSkillsTitle": "Cadre de compétences",
    "featureSkillsText": "Système de compétences extensible avec compétences intégrées et personnalisées, exécution sandbox, interception de requêtes et injection de contexte.",
    "featureAcpTitle": "Communication des agents",
    "featureAcpText": "Registre ACP (Agent Communication Protocol) pour la gestion des flux de travail d'agent à agent et l'orchestration des outils.",
    "protocolAcpTitle": "ACP (Communication des Agents)",
    "protocolAcpDesc": "Enregistrez et gérez les agents via le registre ACP pour la communication inter-agents et le partage d'outils.",
    "protocolAcpStep1": "Accédez à Tableau de bord → Agents pour afficher les agents ACP enregistrés.",
    "protocolAcpStep2": "Enregistrez de nouveaux agents avec des capacités et une configuration de point de terminaison.",
    "protocolAcpStep3": "Utilisez les outils CLI pour configurer les canaux de communication de l'agent."
  },
  "legal": {
    "privacyPolicy": "Politique de confidentialité",
    "termsOfService": "Conditions d'utilisation",
    "providerConfigurations": "Configurations du fournisseur",
    "apiKeys": "Clés API",
    "usageLogs": "Journaux d'utilisation",
    "applicationSettings": "Paramètres de l'application",
    "viewExportAnalytics": "Afficher et exporter les analyses d'utilisation",
    "clearHistory": "Effacer l'historique d'utilisation à tout moment",
    "configureRetention": "Configurer les politiques de conservation des journaux",
    "backupRestore": "Sauvegardez et restaurez votre base de données",
    "privacyMetadataTitle": "Politique de confidentialité | OmniRoute",
    "privacyMetadataDescription": "Politique de confidentialité pour le routeur proxy OmniRoute AI API.",
    "termsMetadataTitle": "Conditions d'utilisation | OmniRoute",
    "termsMetadataDescription": "Conditions d'utilisation du routeur proxy de l'API OmniRoute AI.",
    "backToHome": "Retour à la maison",
    "lastUpdated": "Dernière mise à jour : {date}",
    "policyLastUpdatedDate": "13 février 2026",
    "listSeparator": "-",
    "questionsVisit": "Des questions ? Visitez notre",
    "githubRepository": "Dépôt GitHub",
    "privacySection1Title": "1. Architecture locale d’abord",
    "privacySection1Text": "OmniRoute est conçu comme une application locale. Tout le traitement et le stockage des données s'effectuent entièrement sur votre machine. Il n'y a pas de serveur centralisé collectant vos informations.",
    "privacySection2Title": "2. Données que nous stockons",
    "privacyDataStoredIn": "Les données suivantes sont stockées localement dans",
    "privacyDataProviderConfigurationsDesc": "URL de connexion, types de fournisseurs et paramètres de priorité",
    "privacyDataApiKeysDesc": "crypté et stocké localement pour l'authentification auprès des fournisseurs d'IA",
    "privacyDataUsageLogsDesc": "nombre de requêtes, utilisation des jetons, noms de modèles, horodatages et temps de réponse",
    "privacyDataApplicationSettingsDesc": "préférences de thème, stratégie de routage et configurations combo",
    "privacySection3Title": "3. Pas de télémétrie",
    "privacySection3Text": "OmniRoute ne collecte pas de rapports de télémétrie, d'analyse ou d'erreur. Aucune donnée n'est envoyée à nous ou à un tiers. Vos modèles d'utilisation, appels API et configurations restent entièrement privés.",
    "privacySection4Title": "4. Fournisseurs d'IA tiers",
    "privacySection4Text": "Lorsque vous effectuez des appels API via OmniRoute, vos requêtes sont transmises aux fournisseurs d'IA que vous avez configurés (par exemple : OpenAI, Anthropic, Google). Ces fournisseurs ont leurs propres politiques de confidentialité qui régissent la manière dont ils traitent vos données. Veuillez consulter :",
    "privacyOpenAiPolicy": "Politique de confidentialité d'OpenAI",
    "privacyAnthropicPolicy": "Politique de confidentialité anthropique",
    "privacyGooglePolicy": "Politique de confidentialité de Google",
    "privacySection5Title": "5. Synchronisation cloud (facultatif)",
    "privacySection5Text": "Si vous activez la fonctionnalité facultative de synchronisation dans le cloud, les configurations du fournisseur et les clés API peuvent être transmises à un point de terminaison cloud configuré. Cette fonctionnalité est désactivée par défaut et nécessite une inscription explicite.",
    "privacySection6Title": "6. Journalisation",
    "privacyLoggingIntro": "Les journaux de demandes peuvent être configurés via les paramètres du tableau de bord. Vous pouvez :",
    "privacySection7Title": "7. Vos droits",
    "privacySection7TextStart": "Puisque toutes les données sont stockées localement, vous avez le contrôle total. Vous pouvez supprimer vos données à tout moment en supprimant le",
    "privacySection7TextEnd": "répertoire ou en utilisant les fonctionnalités de sauvegarde et de restauration de la base de données dans le tableau de bord.",
    "termsSection1Title": "1. Aperçu",
    "termsSection1Text": "OmniRoute est un premier routeur proxy API AI local qui fonctionne entièrement sur votre machine. Il achemine les requêtes vers plusieurs fournisseurs d'IA avec équilibrage de charge, basculement et suivi de l'utilisation.",
    "termsSection2Title": "2. Responsabilités de l'utilisateur",
    "termsResponsibilityApiKeys": "Vous êtes seul responsable de la gestion de vos propres clés API et informations d'identification pour les fournisseurs d'IA tiers (OpenAI, Anthropic, Google, etc.).",
    "termsResponsibilityCompliance": "Vous devez respecter les conditions de service de chaque fournisseur d'IA dont vous accédez à l'API via OmniRoute.",
    "termsResponsibilitySecurity": "Vous êtes responsable de la sécurité de votre installation OmniRoute locale, notamment en définissant un mot de passe et en restreignant l'accès au réseau.",
    "termsSection3Title": "3. Comment ça marche",
    "termsSection3Text": "OmniRoute agit en tant que proxy intermédiaire. Les appels API envoyés à OmniRoute sont traduits et transmis à vos fournisseurs d'IA configurés. OmniRoute ne modifie pas le contenu de vos demandes ou réponses au-delà de la traduction du protocole nécessaire.",
    "termsSection4Title": "4. Traitement des données",
    "termsDataStoredLocally": "Toutes les données sont stockées localement sur votre machine dans une base de données SQLite.",
    "termsNoTransmission": "OmniRoute ne transmet aucune donnée aux serveurs externes, sauf si vous activez explicitement les fonctionnalités de synchronisation dans le cloud.",
    "termsDataLocationText": "Les journaux d'utilisation, les clés API et la configuration sont stockés dans",
    "termsSection5Title": "5. Avis de non-responsabilité",
    "termsSection5Text": "OmniRoute est fourni « tel quel », sans garantie d'aucune sorte. Nous ne sommes pas responsables des coûts occasionnés par l'utilisation de l'API, les interruptions de service ou la perte de données. Conservez toujours des sauvegardes de votre configuration.",
    "termsSection6Title": "6. Ouvrir la source",
    "termsSection6Text": "OmniRoute est un logiciel open source. Vous êtes libre de l'inspecter, de le modifier et de le distribuer selon les termes de sa licence."
  },
  "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": "Outils CLI et cibles d'agent : quelle est la différence ?",
    "comparisonCliToolsLabel": "Page Outils CLI",
    "comparisonCliToolsTitle": "Votre IDE envoie des requêtes via OmniRoute",
    "comparisonCliToolsDesc": "Configurez Claude Code, Codex, Cursor et d'autres IDE pour utiliser OmniRoute comme URL de base de leur API. OmniRoute agit comme un proxy, acheminant les demandes vers vos fournisseurs configurés.",
    "comparisonAgentsLabel": "Cette page (Cibles des agents)",
    "comparisonAgentsTitle": "OmniRoute envoie des requêtes aux outils CLI locaux",
    "comparisonAgentsDesc": "OmniRoute peut générer des binaires CLI locaux (claude, codex, goose) comme backends d'exécution. L'outil CLI traite la demande en utilisant sa propre authentification et renvoie le résultat.",
    "comparisonSummary": "En bref : CLI Tools = vous configurez les outils pour pointer vers OmniRoute. Cibles de l'agent = OmniRoute utilise des outils comme points de terminaison.",
    "agentUseCaseHint": "Peut être utilisé comme cible d'exécution via le protocole ACP",
    "flowDiagramClient": "Application cliente",
    "flowDiagramClientDesc": "SDK, API ou service en amont",
    "flowDiagramOmniRoute": "OmniRoute",
    "flowDiagramOmniRouteDesc": "Reçoit la demande et sélectionne la cible",
    "flowDiagramSpawn": "Processus d'apparition",
    "flowDiagramSpawnDesc": "Lance le binaire CLI via stdio",
    "flowDiagramCli": "Agent CLI",
    "flowDiagramCliDesc": "Processus avec propre authentification/modèle",
    "fingerprintSettingsHint": "La correspondance d'empreintes digitales CLI (demandes de déguisement en outils CLI spécifiques) peut être configurée dans",
    "settingsRoutingLink": "Paramètres/Routage",
    "openSettings": "Paramètres",
    "copyRawUrlTitle": "Copier l'URL brute dans le presse-papiers",
    "copied": "Copié!",
    "copyUrl": "Copier l'URL",
    "startHere": "Commencez ici",
    "badgeNew": "Nouveau",
    "viewOnGithub": "Voir sur GitHub",
    "howToUse": "Comment utiliser",
    "browseAllSkillsOnGithub": "Parcourez toutes les compétences sur GitHub",
    "apiSkills": "Compétences API",
    "cliSkills": "Compétences CLI",
    "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": "Agents cloud",
    "description": "Gérer des agents de codage autonomes (Jules, Devin, Codex Cloud)",
    "loading": "Chargement des tâches...",
    "aboutTitle": "À propos des agents cloud",
    "aboutDescription": "Les agents cloud sont des assistants de codage d'IA à distance qui peuvent exécuter des tâches de manière autonome. Ils fonctionnent différemment des agents CLI locaux : vous interagissez avec eux via l'API d'OmniRoute.",
    "howItWorksTitle": "Comment ça marche :",
    "howItWorksDesc": "Créer une tâche → L'agent analyse et propose un plan → Vous approuvez → L'agent exécute → Résultats renvoyés",
    "newTaskTitle": "Créer une nouvelle tâche",
    "newTaskDescription": "Démarrer une nouvelle tâche avec un agent cloud",
    "selectAgent": "Sélectionnez un agent",
    "taskDescription": "Description de la tâche",
    "taskDescriptionPlaceholder": "Décrivez ce que vous voulez que l'agent fasse...",
    "startTask": "Démarrer la tâche",
    "tasks": "Tâches",
    "taskDetail": "Détail de la tâche",
    "noTasks": "Aucune tâche pour l'instant. Créez-en un pour commencer.",
    "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": "Tâche sans titre",
    "created": "Créé",
    "conversation": "Conversation",
    "result": "Résultat",
    "error": "Erreur",
    "planReady": "Plan prêt à être approuvé",
    "approvePlan": "Approuver le plan",
    "rejectPlan": "Rejeter et annuler",
    "sendMessagePlaceholder": "Envoyez un message à l'agent...",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "selectTaskPrompt": "Sélectionnez une tâche pour afficher les détails",
    "statusPending": "En attente",
    "statusRunning": "Courir",
    "statusWaitingApproval": "En attente d'approbation",
    "statusCompleted": "Terminé",
    "statusFailed": "Échec",
    "statusCancelled": "Annulé",
    "repositoryName": "Nom du référentiel",
    "repositoryUrl": "URL du référentiel",
    "branch": "Branche"
  },
  "templateNames": {
    "simple-chat": "Simple Chat",
    "streaming": "Streaming",
    "system-prompt": "System Prompt",
    "thinking": "Thinking",
    "tool-calling": "Tool Calling",
    "multi-turn": "Multi-turn",
    "vision": "Vision",
    "schema-coercion": "Coercition de schéma"
  },
  "templateDescriptions": {
    "simple-chat": "Basic chat template",
    "streaming": "Streaming template",
    "system-prompt": "System prompt template",
    "thinking": "Thinking template",
    "tool-calling": "Tool calling template",
    "multi-turn": "Multi-turn template",
    "vision": "Modèle multimodal avec saisie d'image",
    "schema-coercion": "Application du schéma de sortie structurée/JSON"
  },
  "templatePayloads": {
    "simpleChat": {
      "system": "Vous êtes un assistant IA utile.",
      "userGreeting": "Bonjour ! Comment puis-je vous aider aujourd'hui ?"
    },
    "streaming": {
      "prompt": "Écrire une histoire sur"
    },
    "systemPrompt": {
      "question": "Quel est le sens de la vie ?",
      "systemInstruction": "Fournissez une réponse réfléchie et philosophique."
    },
    "thinking": {
      "question": "Expliquer l'informatique quantique"
    },
    "toolCalling": {
      "cityNameDescription": "Le nom de la ville pour laquelle obtenir la météo",
      "toolDescription": "Obtenir la météo actuelle pour un emplacement",
      "userWeather": "Quel temps fait-il à Tokyo ?"
    },
    "multiTurn": {
      "system": "Vous êtes un assistant utile.",
      "assistantExample": "Je serais heureux de vous aider avec cela.",
      "userInitial": "J'ai besoin d'aide pour",
      "userFollowUp": "Pouvez-vous développer cela ?"
    }
  },
  "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": "Relecture du raisonnement",
    "reasoningCacheDesc": "Préserve la pensée modèle pour les flux d’appel d’outils multi-tours",
    "reasoningEntries": "Entrées actives",
    "reasoningReplayRate": "Taux de relecture",
    "reasoningReplays": "Rediffusions totales",
    "reasoningCharsCached": "Caractères mis en cache",
    "reasoningMisses": "Manques de cache",
    "reasoningByProvider": "Par fournisseur",
    "reasoningByModel": "Par modèle",
    "reasoningRecentEntries": "Entrées récentes",
    "reasoningToolCallId": "ID d'appel d'outil",
    "reasoningChars": "Personnages",
    "reasoningAge": "Âge",
    "reasoningView": "Voir",
    "reasoningDetail": "Contenu de raisonnement",
    "reasoningBehavior": "Comportement",
    "reasoningBehaviorCapture": "Capture le contenu du raisonnement à partir des réponses en streaming",
    "reasoningBehaviorReplay": "Réinjecte au prochain tour lorsque le client l'oublie",
    "reasoningBehaviorFallback": "Priorité à la mémoire avec solution de secours SQLite pour la récupération après incident",
    "reasoningBehaviorTtl": "TTL : 2 heures | Entrées maximales : 2 000 (mémoire)",
    "reasoningBehaviorModels": "Pris en charge : DeepSeek, Kimi, Qwen-Thinking, GLM",
    "reasoningClearAll": "Effacer le cache de raisonnement",
    "reasoningClearSuccess": "Effacement des entrées du cache de raisonnement {count}",
    "reasoningClearError": "Échec de la suppression du cache de raisonnement",
    "reasoningNoData": "Aucune entrée de raisonnement mise en cache pour l'instant. Les entrées apparaissent lorsque les modèles pensants utilisent l’appel d’outils.",
    "cachePerformanceRetry": "Réessayer",
    "cachePerformanceHitRate": "Taux de réussite",
    "cachePerformanceAvgLatency": "Latence moyenne (ms)",
    "cachePerformanceP95Latency": "p95 Latence (ms)",
    "retry": "Réessayer",
    "reasoningAvgChars": "Caractères moy.",
    "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": "Mondial",
    "levelProvider": "Fournisseur",
    "levelCombo": "Combo",
    "levelKey": "Clé",
    "levelDirect": "Direct (pas de proxy)",
    "titleGlobal": "Configuration globale du proxy",
    "titleLevel": "{level} Proxy — {label}",
    "loading": "Chargement de la configuration du proxy...",
    "inheritingFrom": "Hériter de",
    "source": "Origine",
    "savedProxy": "Proxy enregistré",
    "custom": "Personnalisé",
    "selectSavedProxyPlaceholder": "Sélectionnez le proxy enregistré...",
    "proxyType": "Type de mandataire",
    "host": "Hôte",
    "hostPlaceholder": "1.2.3.4 ou proxy.example.com",
    "port": "Port",
    "authOptional": "Authentification (facultatif)",
    "username": "Nom d'utilisateur",
    "usernamePlaceholder": "Nom d'utilisateur",
    "password": "Mot de passe",
    "passwordPlaceholder": "Mot de passe",
    "connected": "Connecté",
    "ip": "IP :",
    "connectionFailed": "La connexion a échoué",
    "testConnection": "Tester la connexion",
    "clear": "Effacer",
    "cancel": "Annuler",
    "save": "Enregistrer",
    "errorSelectSavedProxy": "Veuillez d'abord sélectionner un proxy enregistré.",
    "errorSelectProxyFirst": "Veuillez d'abord sélectionner un proxy.",
    "errorProxyNotFound": "Proxy sélectionné introuvable.",
    "errorClearSavedProxy": "Échec de la suppression du proxy enregistré",
    "errorSaveProxy": "Échec de l'enregistrement de la configuration du proxy",
    "errorClearProxy": "Échec de la suppression de la configuration du proxy",
    "errorSocks5Hidden": "SOCKS5 est configuré mais masqué car NEXT_PUBLIC_ENABLE_SOCKS5_PROXY=false."
  },
  "oauthModal": {
    "title": "Connectez {providerName}",
    "waiting": "En attente d'autorisation",
    "completeAuthInPopup": "Autorisation complète dans une fenêtre contextuelle.",
    "popupClosedHint": "Si la fenêtre contextuelle se ferme sans redirection (par exemple Qoder), cette boîte de dialogue passera automatiquement en mode de saisie manuelle de l'URL.",
    "popupBlocked": "Popup bloqué ? Saisir l'URL manuellement",
    "deviceCodeVisitUrl": "Visitez l'URL ci-dessous et entrez le code :",
    "deviceCodeVerificationUrl": "URL de vérification",
    "deviceCodeYourCode": "Votre code",
    "deviceCodeWaiting": "En attente d'autorisation...",
    "googleOAuthWarning": "Accès à distance + Google OAuth : les informations d'identification par défaut n'acceptent que les redirections vers <code>localhost</code>. Après autorisation, votre navigateur tentera d'ouvrir <code>localhost</code> — copiez cette URL complète et collez-la ci-dessous. Pour une utilisation entièrement à distance sans cette étape manuelle, <a>configurez vos propres informations d'identification OAuth</a>.",
    "remoteAccessInfo": "Accès à distance : puisque vous accédez à OmniRoute à distance, après autorisation, vous verrez une page d'erreur (localhost introuvable). C'est normal : copiez simplement l'URL complète depuis la barre d'adresse de votre navigateur et collez-la ci-dessous.",
    "step1OpenUrl": "Étape 1 : ouvrez cette URL dans votre navigateur",
    "copy": "Copier",
    "step2PasteCallback": "Étape 2 : Collez l'URL de rappel ou le code d'autorisation ici",
    "step2Hint": "Après autorisation, collez l'URL de rappel complète. Pour Claude Code et Cline, vous pouvez également coller directement le code d'authentification, par ex. <code>code#state</code>.",
    "connect": "Se connecter",
    "cancel": "Annuler",
    "success": "Connexion réussie !",
    "successMessage": "Votre compte {providerName} a été connecté.",
    "done": "Terminé",
    "error": "La connexion a échoué",
    "tryAgain": "Réessayez"
  },
  "cursorAuthModal": {
    "title": "Connecter l'IDE du curseur",
    "autoDetecting": "Jetons à détection automatique...",
    "readingFromCursor": "Lecture à partir de Cursor IDE ou de Cursor-Agent",
    "tokensAutoDetected": "Jetons détectés automatiquement avec succès à partir de Cursor IDE !",
    "cursorNotDetected": "Curseur IDE non détecté. Veuillez coller manuellement votre jeton.",
    "accessToken": "Jeton d'accès",
    "required": "*",
    "accessTokenPlaceholder": "Le jeton d'accès se remplira automatiquement...",
    "machineId": "ID de l'ordinateur",
    "optional": "(facultatif)",
    "machineIdPlaceholder": "L'ID de la machine sera automatiquement renseigné...",
    "importing": "Importation...",
    "importToken": "Jeton d'importation",
    "cancel": "Annuler",
    "errorAutoDetect": "Impossible de détecter automatiquement les jetons",
    "errorAutoDetectFailed": "Échec de la détection automatique des jetons",
    "errorEnterToken": "Veuillez saisir le jeton d'accès",
    "errorImportFailed": "Échec de l'importation"
  },
  "pricingModal": {
    "title": "Configuration des prix",
    "loading": "Chargement des données de tarification...",
    "pricingRatesFormat": "Format des tarifs",
    "ratesDescription": "Tous les tarifs sont en <strong>dollars par million de jetons</strong> ($/1 million de jetons). Exemple : un taux d'entrée de 2,50 signifie 2,50 $ pour 1 000 000 de jetons d'entrée.",
    "model": "Modèle",
    "input": "Entrée",
    "output": "Sortie",
    "cached": "En cache",
    "reasoning": "Raisonnement",
    "cacheCreation": "Création de cache",
    "noPricingData": "Aucune donnée de tarification disponible",
    "resetToDefaults": "Réinitialiser aux valeurs par défaut",
    "cancel": "Annuler",
    "saving": "Sauvegarde...",
    "saveChanges": "Enregistrer les modifications",
    "resetConfirm": "Réinitialiser tous les prix aux valeurs par défaut ? Cela ne peut pas être annulé.",
    "errorSaveFailed": "Échec de l'enregistrement des prix",
    "errorResetFailed": "Échec de la réinitialisation des prix"
  },
  "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": "Tapez",
    "labelHost": "Hôte",
    "labelPort": "Port",
    "labelUsername": "Nom d'utilisateur",
    "labelPassword": "Mot de passe",
    "labelRegion": "Région",
    "labelStatus": "Statut",
    "labelNotes": "Remarques",
    "usernamePlaceholderEdit": "Laisser vide pour conserver le nom d'utilisateur actuel",
    "passwordPlaceholderEdit": "Laisser vide pour conserver le mot de passe actuel",
    "statusActive": "Actif",
    "statusInactive": "Inactif",
    "cancel": "Annuler",
    "save": "Enregistrer",
    "bulkModalTitle": "Attribution de proxy en masse",
    "bulkLabelScope": "Portée",
    "bulkLabelProxy": "Procuration",
    "bulkClearAssignment": "(Tâche claire)",
    "bulkLabelScopeIds": "ID de portée (séparés par des virgules ou des sauts de ligne)",
    "bulkScopeIdsPlaceholder": "fournisseur-openai,fournisseur-anthropique",
    "bulkApply": "Postuler",
    "labelScope": "__MISSING__:Scope",
    "labelProxy": "__MISSING__:Proxy",
    "scopeGlobal": "__MISSING__:global",
    "scopeProvider": "__MISSING__:provider",
    "scopeAccount": "__MISSING__:account",
    "scopeCombo": "__MISSING__:combo",
    "bulkImportErrorMissingName": "NOM manquant",
    "bulkImportErrorMissingHost": "HÔTE manquant",
    "bulkImportErrorInvalidPort": "PORT invalide (doit être 1-65535)",
    "bulkImportErrorInvalidType": "TYPE invalide (utilisez http, https ou chaussettes5)",
    "bulkImportErrorInvalidStatus": "STATUT invalide (utiliser actif ou inactif)",
    "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} % de réussite",
    "avgLatency": "{latency}ms moyenne",
    "assignmentsCount": "{count} affectations",
    "noData": "No Data",
    "testSuccess": "✓ {ip}",
    "testLatency": "{latency}ms",
    "testFailure": "✗ {error}",
    "bulkImport": "Importation en masse",
    "bulkImportTitle": "Proxy d’importation en masse",
    "bulkImportDescription": "Collez les profils de proxy en utilisant le format délimité par des barres verticales. Un proxy par ligne. Les proxys existants (même hôte + port) seront mis à jour.",
    "bulkImportParse": "Analyser",
    "bulkImportImport": "Importer des proxys {count}",
    "bulkImportImporting": "Importation...",
    "bulkImportParsed": "{count} proxys analysés",
    "bulkImportSkipped": "{count} lignes ignorées",
    "bulkImportParseErrors": "Erreurs {count}",
    "bulkImportNoValidEntries": "Aucune entrée valide trouvée. Vérifiez le format et réessayez.",
    "bulkImportSuccess": "Importation terminée : {created} créé, {updated} mis à jour, {failed} a échoué",
    "bulkImportErrorLine": "Ligne {line} : {reason}",
    "bulkImportMaxExceeded": "Maximum 100 proxys par importation",
    "bulkImportPreview": "Aperçu",
    "clearAssignment": "(affectation claire)",
    "bulkProxyAssignment": "Attribution de proxy en masse"
  },
  "playground": {
    "title": "Title",
    "description": "Description",
    "endpoint": "Endpoint",
    "provider": "Provider",
    "model": "Model",
    "accountKey": "Account Key",
    "autoAccounts": "Automatique ({count} comptes)",
    "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": "{count} images générées",
    "generatedImage": "Image générée {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": "Chat conversationnel",
    "clearChat": "Effacer le chat",
    "typeMessagePlaceholder": "Tapez un message... (Maj+Entrée pour une nouvelle ligne)",
    "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": "Compression",
      "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": "Bêta – Aperçu de l’interface utilisateur.",
    "betaConfigSavedPrefix": "La configuration est enregistrée dans",
    "betaConfigSavedSuffix": "(pas encore persisté sur le serveur). L’application du plafond par demande n’est pas encore intégrée au pipeline proxy. Cet écran vous permet de concevoir et de visualiser la répartition des quotas ; une véritable application arrivera dans une itération future avec la persistance de la base de données et l'interception des appels en amont.",
    "policyLabel": "Politique :",
    "resetIn": "réinitialiser dans",
    "quotaTotal": "total"
  },
  "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"
  }
}
