omniroute 3.3.6 → 3.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/prerender-manifest.json +3 -3
- package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +2 -2
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__46e00e59._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__6e52619e._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__7ace0fcd._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__950558b8._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__9698d25e._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__a32d3818._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__bc251fbe._.js +1 -1
- package/app/.next/server/chunks/[root-of-the-server]__d5a064d5._.js +1 -1
- package/app/.next/server/chunks/_05c48915._.js +1 -1
- package/app/.next/server/chunks/_06515a8a._.js +1 -1
- package/app/.next/server/chunks/_2115d8de._.js +1 -1
- package/app/.next/server/chunks/_3ac953eb._.js +1 -1
- package/app/.next/server/chunks/_4b8fd853._.js +1 -1
- package/app/.next/server/chunks/_68683848._.js +1 -1
- package/app/.next/server/chunks/_ee9b677b._.js +1 -1
- package/app/.next/server/chunks/ssr/[root-of-the-server]__9ef96d20._.js +1 -1
- package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ar_json_e1d5145b._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_bg_json_34495a0f._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_cs_json_db6f9ebc._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_da_json_7500ed02._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_de_json_b2a40318._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_es_json_82775c4a._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_fi_json_dcc6745e._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_fr_json_fe904570._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_he_json_3e3c1e1b._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_hi_json_83a0b9e5._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_hu_json_651e00d3._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_id_json_725d4a34._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_in_json_2d7cd177._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_it_json_e23882ae._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ja_json_fc6af4d8._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ko_json_0ffdbdc6._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ms_json_610df819._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_nl_json_55ad1507._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_no_json_9f484a8c._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_phi_json_871ece45._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_pl_json_79d0be4b._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_pt-BR_json_e7b9e8db._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_pt_json_2fc13a82._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ro_json_d1a5f5ee._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_ru_json_9d7a9dfe._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_sk_json_1c5bff4a._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_sv_json_e8ae9f28._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_th_json_6ed546bd._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_tr_json_c8d78b01._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_uk-UA_json_c72cdf08._.js +1 -1
- package/app/.next/server/chunks/ssr/src_i18n_messages_vi_json_03ec9dfd._.js +1 -1
- package/app/.next/server/pages/500.html +2 -2
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/{b9999bd9d2b99bf6.js → d3c3a9266158d9b0.js} +1 -1
- package/app/CHANGELOG.md +19 -1
- package/app/docs/openapi.yaml +1 -1
- package/app/open-sse/handlers/responseTranslator.ts +1 -1
- package/app/open-sse/package.json +1 -1
- package/app/package-lock.json +3 -3
- package/app/package.json +1 -1
- package/app/src/i18n/messages/ar.json +2 -1
- package/app/src/i18n/messages/bg.json +2 -1
- package/app/src/i18n/messages/cs.json +2 -1
- package/app/src/i18n/messages/da.json +2 -1
- package/app/src/i18n/messages/de.json +2 -1
- package/app/src/i18n/messages/es.json +2 -1
- package/app/src/i18n/messages/fi.json +2 -1
- package/app/src/i18n/messages/fr.json +2 -1
- package/app/src/i18n/messages/he.json +2 -1
- package/app/src/i18n/messages/hi.json +2 -1
- package/app/src/i18n/messages/hu.json +2 -1
- package/app/src/i18n/messages/id.json +2 -1
- package/app/src/i18n/messages/in.json +2 -1
- package/app/src/i18n/messages/it.json +2 -1
- package/app/src/i18n/messages/ja.json +2 -1
- package/app/src/i18n/messages/ko.json +2 -1
- package/app/src/i18n/messages/ms.json +2 -1
- package/app/src/i18n/messages/nl.json +2 -1
- package/app/src/i18n/messages/no.json +2 -1
- package/app/src/i18n/messages/phi.json +2 -1
- package/app/src/i18n/messages/pl.json +2 -1
- package/app/src/i18n/messages/pt-BR.json +2 -1
- package/app/src/i18n/messages/pt.json +2 -1
- package/app/src/i18n/messages/ro.json +2 -1
- package/app/src/i18n/messages/ru.json +2 -1
- package/app/src/i18n/messages/sk.json +2 -1
- package/app/src/i18n/messages/sv.json +2 -1
- package/app/src/i18n/messages/th.json +2 -1
- package/app/src/i18n/messages/tr.json +2 -1
- package/app/src/i18n/messages/uk-UA.json +2 -1
- package/app/src/i18n/messages/vi.json +2 -1
- package/app/src/shared/services/opencodeConfig.ts +14 -13
- package/app/tests/unit/t40-opencode-cli-tools-integration.test.mjs +5 -5
- package/package.json +1 -1
- /package/app/.next/static/{1ny0VWnN2mDf-NnjRzXAY → NYBYaP3-LK80ViNPwi7dC}/_buildManifest.js +0 -0
- /package/app/.next/static/{1ny0VWnN2mDf-NnjRzXAY → NYBYaP3-LK80ViNPwi7dC}/_clientMiddlewareManifest.json +0 -0
- /package/app/.next/static/{1ny0VWnN2mDf-NnjRzXAY → NYBYaP3-LK80ViNPwi7dC}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
module.exports=[744263,a=>{a.v(JSON.parse('{"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","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":"Dernière utilisation","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","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"},"sidebar":{"home":"Accueil","dashboard":"Tableau de bord","providers":"Fournisseurs","combos":"Combinaisons","usage":"Utilisation","analytics":"Analyse","costs":"Coûts","health":"Santé","limits":"Limites et quotas","cliTools":"Outils CLI","media":"Médias","settings":"Paramètres","translator":"Traducteur","docs":"Documentation","issues":"Problèmes","apiManager":"Gestionnaire d\'API","logs":"Journaux","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","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","endpoints":"Points d\'accès","playground":"Playground","agents":"Agents","cliToolsShort":"Outils","autoCombo":"Auto Combo","searchTools":"Search Tools","cache":"Cache","cacheShort":"Cache"},"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","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","mcp":"MCP","mcpDescription":"Model Context Protocol server management and tools","a2a":"A2A","a2aDescription":"Agent-to-Agent protocol tasks and observability"},"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.","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..."},"analytics":{"title":"Analyse","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"},"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é","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","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","modelsCount":"{count, plural, one {# model} other {# models}}","lastUsedOn":"Dernier : {date}","editPermissions":"Modifier les autorisations","deleteKey":"Supprimer la clé","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é","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","keyOnlyAvailableAtCreation":"Full key available only at creation time — copy it when you first create the key"},"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."},"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.","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","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"},"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"}},"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."}}},"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.","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.","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."}},"combos":{"title":"Combinaisons","description":"Créez des combinaisons de modèles avec un routage pondéré et une prise en charge de secours","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","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","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)","advancedHint":"Laissez vide pour utiliser les valeurs par défaut globales. Ceux-ci remplacent les paramètres de chaque fournisseur.","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é."}},"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."},"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.","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.","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."}},"templateFreeStack":"Free Stack ($0)","templateFreeStackDesc":"Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."},"costs":{"title":"Coûts","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"},"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","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","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","categoryUtility":"Utilitaires et Gestion","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","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","categorySearch":"Search & Discovery","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."},"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","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"},"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","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"},"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","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}","activeProviders":"{count} active","monitoredProviders":"{count} monitored","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.","activeProvidersHint":"Fournisseurs configurés actuellement activés pour les demandes de routage.","monitoredProvidersHint":"Fournisseurs actuellement suivis par des moniteurs de santé des disjoncteurs."},"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"},"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","apiKeyMgmt":"Gestion des clés API","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"},"providers":{"title":"Fournisseurs","addProvider":"Ajouter un fournisseur","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","noConnections":"Aucune connexion","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","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é","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 ?","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","chatCompletions":"Achèvements des discussions","importingModels":"Importation...","importFromModels":"Importer depuis /models","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...","importingModelsTitle":"Importation de modèles","copyModel":"Copier 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","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","noConnectionsYet":"Aucune connexion pour l\'instant","addFirstConnectionHint":"Ajoutez votre première connexion pour commencer","addConnection":"Ajouter une connexion","availableModels":"Modèles disponibles","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.","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é.","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)","providerTestTimeout":"Provider test timed out — too many connections to test at once","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)","builtInModels":"Built-in models","builtInModelsHint":"Registry models for this provider. Use the pencil to set compatibility options.","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","tokenRefreshed":"Token refreshed successfully","tokenRefreshFailed":"Token refresh failed","compatBadgeUpstreamHeaders":"Headers","compatUpstreamAddRow":"Add header","compatUpstreamHeaderName":"Header name","compatUpstreamHeaderValue":"Value","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.","compatUpstreamHeadersLabel":"Extra upstream headers","compatUpstreamRemoveRow":"Remove row","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","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"},"settings":{"title":"Paramètres","general":"Général","security":"Sécurité","appearance":"Apparence","routing":"Routage","cache":"Cache","resilience":"Résilience","systemPrompt":"Invite système","thinkingBudget":"Penser le budget","proxy":"Procuration","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","systemTheme":"Thème système","enableCache":"Activer le cache","cacheTTL":"Durée de vie du cache","maxCacheSize":"Taille maximale du cache","clearCache":"Vider le cache","cacheHits":"Accès au cache","cacheMisses":"Manques de cache","hitRate":"Taux de réussite","cacheEntries":"Entrées du cache","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","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","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","promptCache":"Cache d\'invite","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","systemPromptDesc":"Injecté dans toutes les requêtes au niveau du proxy","saved":"Enregistré","systemPromptPlaceholder":"Entrez l\'invite du système pour injecter dans toutes les requêtes...","systemPromptHint":"Cette invite est ajoutée au message système de chaque demande. À utiliser pour les instructions globales, les consignes de sécurité ou les règles de formatage des réponses.","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.","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}","routingStrategy":"Stratégie de routage","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","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":"Modèles génériques pour remapper les noms de modèles • Utilisez * et ?","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","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é","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)","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}.","justNow":"juste maintenant","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","providers":"Fournisseurs","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","saving":"Sauvegarde...","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","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}","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.","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."},"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).","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"},"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"},"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."}},"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)","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."},"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.","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","runningProgress":"Exécution de {current}/{total}...","passRate":"taux de réussite","summaryBreakdown":"{passed} réussi · {failed} échoué · {total} total","passedIconLabel":"✅ Réussi","failedIconLabel":"❌ Échec","detailsContains":"Contient : \\"{term}\\"","detailsRegex":"Expression régulière : {pattern}","detailsExpected":"Attendu : \\"{expected}\\"","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":"Dernière utilisation","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","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","tierUnknown":"Inconnu"},"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: 123456 (unless INITIAL_PASSWORD was set)","waitingForAuthorization":"Waiting for authorization...","waitingForGoogleAuthorization":"Waiting for Google authorization...","waitingForOpenAIAuthorization":"Waiting for OpenAI authorization...","waitingForAntigravityAuthorization":"Waiting for Antigravity authorization...","waitingForIFlowAuthorization":"Waiting for iFlow authorization...","exchangingCodeForTokens":"Exchanging code for tokens...","Authorization":"Autorisation","Content-Disposition":"Disposition du contenu"},"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","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","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","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é).","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).","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.","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.","managementApiReference":"Management API Reference","managementApiDescription":"Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.","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.","endpointSpeechNote":"Génération texte-vers-discours (ElevenLabs, OpenAI TTS).","endpointEmbeddingsNote":"Génération d\'embeddings texte (OpenAI, Cohere, Voyage)."},"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."},"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"},"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."},"autoCombo":{"title":"Auto-Combo Engine","statusNormal":"Normal","statusIncident":"Incident Mode","modePack":"Mode Pack","providerScores":"Provider Scores","noAutoCombo":"No auto-combo configured.","excludedProviders":"Excluded Providers","noExclusions":"No providers currently excluded.","factorQuota":"Quota","factorHealth":"Health","factorCost":"Cost","factorLatency":"Latency","factorTaskFit":"Task Fit","factorStability":"Stability","factorTierPriority":"Tier Priority","factorTierPriorityDesc":"Prefers accounts with higher quota tiers (Ultra/Pro over Free)","scoreFactorBreakdown":"Scoring Factors","modePackShipFast":"Ship Fast","modePackCostSaver":"Cost Saver","modePackQualityFirst":"Quality First","modePackOfflineFriendly":"Offline Friendly"},"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","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","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"},"templateNames":{"simple-chat":"Simple Chat","streaming":"Streaming","system-prompt":"System Prompt","thinking":"Thinking","tool-calling":"Tool Calling","multi-turn":"Multi-turn"},"templateDescriptions":{"simple-chat":"Basic chat template","streaming":"Streaming template","system-prompt":"System prompt template","thinking":"Thinking template","tool-calling":"Tool calling template","multi-turn":"Multi-turn template"},"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","dbEntries":"DB Entries","cacheHits":"Cache Hits","tokensSaved":"Tokens Saved","hitRate":"Hit Rate","performance":"Cache Performance","behavior":"Cache Behavior","idempotency":"Idempotency Layer","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.","memoryEntriesSub":"In-memory LRU","dbEntriesSub":"Persisted (SQLite)","cacheHitsSub":"of {total} total","tokensSavedSub":"Estimated from hits","autoRefresh":"Auto-refreshes every {seconds}s","hits":"Hits","misses":"Misses","total":"Total","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}.","activeDedupKeys":"Active Dedup Keys","dedupWindow":"Dedup Window"}}'))}];
|
|
1
|
+
module.exports=[744263,a=>{a.v(JSON.parse('{"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","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":"Dernière utilisation","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","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"},"sidebar":{"home":"Accueil","dashboard":"Tableau de bord","providers":"Fournisseurs","combos":"Combinaisons","usage":"Utilisation","analytics":"Analyse","costs":"Coûts","health":"Santé","limits":"Limites et quotas","cliTools":"Outils CLI","media":"Médias","settings":"Paramètres","translator":"Traducteur","docs":"Documentation","issues":"Problèmes","apiManager":"Gestionnaire d\'API","logs":"Journaux","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","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","endpoints":"Points d\'accès","playground":"Playground","agents":"Agents","cliToolsShort":"Outils","autoCombo":"Auto Combo","searchTools":"Search Tools","cache":"Cache","cacheShort":"Cache"},"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","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","mcp":"MCP","mcpDescription":"Model Context Protocol server management and tools","a2a":"A2A","a2aDescription":"Agent-to-Agent protocol tasks and observability"},"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.","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..."},"analytics":{"title":"Analyse","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"},"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é","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","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","modelsCount":"{count, plural, one {# model} other {# models}}","lastUsedOn":"Dernier : {date}","editPermissions":"Modifier les autorisations","deleteKey":"Supprimer la clé","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é","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","keyOnlyAvailableAtCreation":"Full key available only at creation time — copy it when you first create the key"},"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."},"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.","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","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"},"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"}},"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."}}},"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.","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.","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."}},"combos":{"title":"Combinaisons","description":"Créez des combinaisons de modèles avec un routage pondéré et une prise en charge de secours","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","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","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)","advancedHint":"Laissez vide pour utiliser les valeurs par défaut globales. Ceux-ci remplacent les paramètres de chaque fournisseur.","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é."}},"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."},"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.","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.","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."}},"templateFreeStack":"Free Stack ($0)","templateFreeStackDesc":"Round-robin across all free providers: Kiro (Claude), iFlow (5 models), Qwen (4 models), Gemini CLI. Zero cost, never stops coding."},"costs":{"title":"Coûts","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"},"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","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","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","categoryUtility":"Utilitaires et Gestion","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","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","categorySearch":"Search & Discovery","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.","cloudflaredUrlNotice":"Creates a temporary Cloudflare Quick Tunnel. The URL changes after every restart."},"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","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"},"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","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"},"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","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}","activeProviders":"{count} active","monitoredProviders":"{count} monitored","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.","activeProvidersHint":"Fournisseurs configurés actuellement activés pour les demandes de routage.","monitoredProvidersHint":"Fournisseurs actuellement suivis par des moniteurs de santé des disjoncteurs."},"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"},"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","apiKeyMgmt":"Gestion des clés API","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"},"providers":{"title":"Fournisseurs","addProvider":"Ajouter un fournisseur","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","noConnections":"Aucune connexion","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","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é","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 ?","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","chatCompletions":"Achèvements des discussions","importingModels":"Importation...","importFromModels":"Importer depuis /models","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...","importingModelsTitle":"Importation de modèles","copyModel":"Copier 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","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","noConnectionsYet":"Aucune connexion pour l\'instant","addFirstConnectionHint":"Ajoutez votre première connexion pour commencer","addConnection":"Ajouter une connexion","availableModels":"Modèles disponibles","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.","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é.","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)","providerTestTimeout":"Provider test timed out — too many connections to test at once","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)","builtInModels":"Built-in models","builtInModelsHint":"Registry models for this provider. Use the pencil to set compatibility options.","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","tokenRefreshed":"Token refreshed successfully","tokenRefreshFailed":"Token refresh failed","compatBadgeUpstreamHeaders":"Headers","compatUpstreamAddRow":"Add header","compatUpstreamHeaderName":"Header name","compatUpstreamHeaderValue":"Value","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.","compatUpstreamHeadersLabel":"Extra upstream headers","compatUpstreamRemoveRow":"Remove row","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","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"},"settings":{"title":"Paramètres","general":"Général","security":"Sécurité","appearance":"Apparence","routing":"Routage","cache":"Cache","resilience":"Résilience","systemPrompt":"Invite système","thinkingBudget":"Penser le budget","proxy":"Procuration","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","systemTheme":"Thème système","enableCache":"Activer le cache","cacheTTL":"Durée de vie du cache","maxCacheSize":"Taille maximale du cache","clearCache":"Vider le cache","cacheHits":"Accès au cache","cacheMisses":"Manques de cache","hitRate":"Taux de réussite","cacheEntries":"Entrées du cache","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","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","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","promptCache":"Cache d\'invite","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","systemPromptDesc":"Injecté dans toutes les requêtes au niveau du proxy","saved":"Enregistré","systemPromptPlaceholder":"Entrez l\'invite du système pour injecter dans toutes les requêtes...","systemPromptHint":"Cette invite est ajoutée au message système de chaque demande. À utiliser pour les instructions globales, les consignes de sécurité ou les règles de formatage des réponses.","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.","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}","routingStrategy":"Stratégie de routage","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","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":"Modèles génériques pour remapper les noms de modèles • Utilisez * et ?","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","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é","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)","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}.","justNow":"juste maintenant","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","providers":"Fournisseurs","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","saving":"Sauvegarde...","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","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}","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.","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."},"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).","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"},"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"},"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."}},"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)","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."},"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.","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","runningProgress":"Exécution de {current}/{total}...","passRate":"taux de réussite","summaryBreakdown":"{passed} réussi · {failed} échoué · {total} total","passedIconLabel":"✅ Réussi","failedIconLabel":"❌ Échec","detailsContains":"Contient : \\"{term}\\"","detailsRegex":"Expression régulière : {pattern}","detailsExpected":"Attendu : \\"{expected}\\"","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":"Dernière utilisation","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","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","tierUnknown":"Inconnu"},"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: 123456 (unless INITIAL_PASSWORD was set)","waitingForAuthorization":"Waiting for authorization...","waitingForGoogleAuthorization":"Waiting for Google authorization...","waitingForOpenAIAuthorization":"Waiting for OpenAI authorization...","waitingForAntigravityAuthorization":"Waiting for Antigravity authorization...","waitingForIFlowAuthorization":"Waiting for iFlow authorization...","exchangingCodeForTokens":"Exchanging code for tokens...","Authorization":"Autorisation","Content-Disposition":"Disposition du contenu"},"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","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","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","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é).","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).","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.","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.","managementApiReference":"Management API Reference","managementApiDescription":"Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.","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.","endpointSpeechNote":"Génération texte-vers-discours (ElevenLabs, OpenAI TTS).","endpointEmbeddingsNote":"Génération d\'embeddings texte (OpenAI, Cohere, Voyage)."},"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."},"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"},"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."},"autoCombo":{"title":"Auto-Combo Engine","statusNormal":"Normal","statusIncident":"Incident Mode","modePack":"Mode Pack","providerScores":"Provider Scores","noAutoCombo":"No auto-combo configured.","excludedProviders":"Excluded Providers","noExclusions":"No providers currently excluded.","factorQuota":"Quota","factorHealth":"Health","factorCost":"Cost","factorLatency":"Latency","factorTaskFit":"Task Fit","factorStability":"Stability","factorTierPriority":"Tier Priority","factorTierPriorityDesc":"Prefers accounts with higher quota tiers (Ultra/Pro over Free)","scoreFactorBreakdown":"Scoring Factors","modePackShipFast":"Ship Fast","modePackCostSaver":"Cost Saver","modePackQualityFirst":"Quality First","modePackOfflineFriendly":"Offline Friendly"},"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","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","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"},"templateNames":{"simple-chat":"Simple Chat","streaming":"Streaming","system-prompt":"System Prompt","thinking":"Thinking","tool-calling":"Tool Calling","multi-turn":"Multi-turn"},"templateDescriptions":{"simple-chat":"Basic chat template","streaming":"Streaming template","system-prompt":"System prompt template","thinking":"Thinking template","tool-calling":"Tool calling template","multi-turn":"Multi-turn template"},"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","dbEntries":"DB Entries","cacheHits":"Cache Hits","tokensSaved":"Tokens Saved","hitRate":"Hit Rate","performance":"Cache Performance","behavior":"Cache Behavior","idempotency":"Idempotency Layer","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.","memoryEntriesSub":"In-memory LRU","dbEntriesSub":"Persisted (SQLite)","cacheHitsSub":"of {total} total","tokensSavedSub":"Estimated from hits","autoRefresh":"Auto-refreshes every {seconds}s","hits":"Hits","misses":"Misses","total":"Total","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}.","activeDedupKeys":"Active Dedup Keys","dedupWindow":"Dedup Window"}}'))}];
|
|
2
2
|
|
|
3
3
|
//# sourceMappingURL=src_i18n_messages_fr_json_fe904570._.js.map
|