{
  "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"
  },
  "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",
    "settings": "Paramètres",
    "translator": "Traducteur",
    "docs": "Documentation",
    "issues": "Problèmes",
    "endpoint": "Point de terminaison",
    "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"
  },
  "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": "Point de terminaison",
    "endpointDescription": "Configuration du point de terminaison de l'API",
    "settings": "Paramètres",
    "settingsDescription": "Gérez vos préférences",
    "openaiCompatible": "Compatible avec OpenAI",
    "anthropicCompatible": "Compatible Anthropic"
  },
  "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"
  },
  "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é"
  },
  "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"
  },
  "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"
    },
    "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 :"
          }
        }
      }
    }
  },
  "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",
    "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"
  },
  "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é",
    "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}}"
  },
  "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}"
  },
  "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",
    "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é.",
    "failedTestConnection": "Échec du test de connexion",
    "failed": "Échec",
    "leaveBlankKeepCurrentApiKey": "Laissez vide pour conserver la clé API actuelle.",
    "editCompatibleTitle": "Modifier {type} Compatible",
    "compatibleBaseUrlHint": "Utilisez l'URL de base (se terminant par /v1) pour votre API compatible {type}.",
    "apiKeyForCheck": "Clé API (pour vérification)",
    "compatibleProdPlaceholder": "{type} Compatible (Prod)"
  },
  "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",
    "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",
    "stickyLimit": "Limite collante",
    "stickyLimitDesc": "Appels par compte avant de changer",
    "modelAliases": "Alias de modèle",
    "modelAliasesDesc": "Modèles génériques pour remapper les noms de modèles • Utilisez * et ?",
    "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"
  },
  "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",
    "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é ?"
  },
  "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",
    "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é).",
    "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."
  },
  "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."
  }
}
