{
  "nav": {
    "models": "Modèles",
    "playground": "Bac à sable",
    "keys": "Clés",
    "analytics": "Analytique",
    "premium": "Premium",
    "signOut": "Se déconnecter",
    "openMenu": "Ouvrir le menu de navigation",
    "theme": "Thème",
    "switchLight": "Passer au thème clair",
    "switchDark": "Passer au thème sombre",
    "language": "Changer de langue",
    "switchToChinese": "Passer au chinois",
    "switchToEnglish": "Passer à l'anglais",
    "modelsMenu": "Parcourir les types de modèles"
  },
  "auth": {
    "createYourAccount": "Créez votre compte",
    "signIn": "Se connecter",
    "email": "E-mail",
    "password": "Mot de passe",
    "emailPlaceholder": "vous@exemple.com",
    "passwordPlaceholderSetup": "au moins 8 caractères",
    "passwordPlaceholderLogin": "votre mot de passe",
    "setupDescription": "Définissez l'e-mail et le mot de passe qui protégeront ce tableau de bord.",
    "loginDescription": "Connectez-vous pour gérer vos clés, le routage et l'analytique.",
    "createAccount": "Créer un compte",
    "creating": "Création…",
    "signingIn": "Connexion…",
    "loading": "Chargement…",
    "newPasswordAutoComplete": "new-password",
    "currentPasswordAutoComplete": "current-password",
    "serverUnreachableBefore": "Impossible de joindre le serveur. Vérifiez que le backend est démarré (",
    "serverUnreachableAfter": ")."
  },
  "common": {
    "save": "Enregistrer",
    "saving": "Enregistrement…",
    "cancel": "Annuler",
    "discard": "Abandonner",
    "delete": "Supprimer",
    "confirm": "Confirmer",
    "copy": "Copier",
    "copied": "Copié",
    "show": "Afficher",
    "hide": "Masquer",
    "apply": "Appliquer",
    "applied": "Appliqué",
    "applying": "Application…",
    "active": "Actif",
    "inactive": "Inactif",
    "never": "jamais",
    "loading": "Chargement…",
    "error": "Erreur",
    "noData": "Aucune donnée pour l'instant",
    "unsavedChanges": "Modifications non enregistrées",
    "saveChanges": "Enregistrer les modifications",
    "remove": "Supprimer",
    "unknownError": "Erreur inconnue",
    "model": "Modèle",
    "provider": "Fournisseur",
    "success": "Réussite",
    "failures": "Échecs",
    "dismiss": "Fermer",
    "status": "Statut"
  },
  "models": {
    "title": "Modèles",
    "chatModelsTab": "Modèles de chat",
    "fusionTab": "Fusion",
    "embeddingsTab": "Embeddings",
    "imageTab": "Image",
    "audioTab": "Audio",
    "imageTitle": "Modèles d'image",
    "audioTitle": "Modèles audio",
    "imageDesc": "Modèles de génération texte-image.",
    "audioDesc": "Modèles de synthèse vocale.",
    "mediaHint": "Générer via",
    "mediaEmpty": "Aucun modèle pour l'instant. Ils se synchronisent depuis le catalogue.",
    "newBadge": "Nouveau",
    "monthlyTokenBudget": "Budget mensuel de tokens",
    "remaining": "restant",
    "used": "utilisés",
    "of": "sur",
    "showAllModels": "Afficher les {count} modèles",
    "showLess": "Afficher moins",
    "vision": "Vision",
    "visionTitle": "Accepte les images en entrée",
    "tools": "Outils",
    "toolsTitle": "Émet des appels d'outils structurés, il est donc éligible aux requêtes avec outils",
    "penalty": "pénalité de −{value}",
    "obs": "{count} obs",
    "tokPerMonth": "{count} tok/mois",
    "rpmLimit": "{count} rpm",
    "rpdLimit": "{count} rpd",
    "noKey": "aucune clé",
    "dragToReorder": "Glisser pour réordonner",
    "columnModel": "Modèle",
    "columnOn": "Actif",
    "noModelsBefore": "Aucun modèle disponible. Ajoutez des clés API sur la ",
    "keysPageLink": "page Clés",
    "noModelsAfter": " au préalable.",
    "hiddenNoKeys": "Masqués (aucune clé) : {platforms}",
    "searchPlaceholder": "Rechercher un modèle ou un fournisseur…",
    "clearSearch": "Effacer la recherche",
    "ctxAny": "Tout contexte",
    "ctxBadge": "{size} ctx",
    "ctxTitle": "Fenêtre de contexte",
    "copyModelId": "Copier l'identifiant du modèle",
    "showingCount": "{shown} sur {total} modèles",
    "clearFilters": "Effacer les filtres",
    "noMatches": "Aucun modèle ne correspond à vos filtres.",
    "noModelsTitle": "Aucun modèle configuré",
    "dragToReorderGroup": "Glisser pour réorganiser le modèle",
    "providerCount": "{count} fournisseurs",
    "servedBy": "Fourni par {providers}",
    "viewProviders": "Voir les fournisseurs",
    "backToModels": "Retour aux modèles",
    "providersHeading": "Fournisseurs de ce modèle",
    "codeSnippetHeading": "Utiliser ce modèle",
    "modelNotFound": "Ce modèle n'est pas disponible, ou il n'a aucun fournisseur configuré.",
    "providerIdsHeading": "Identifiants du modèle par fournisseur",
    "providerIdsHint": "Envoyez l'identifiant unifié du modèle pour basculer entre tous les fournisseurs, ou un identifiant spécifique à un fournisseur pour épingler ce fournisseur.",
    "copyModelName": "Copier le nom du modèle",
    "settingsHeading": "Paramètres du fournisseur",
    "settingsHint": "Les modifications locales apportées aux modèles du catalogue sont conservées lors des synchronisations du catalogue. Les modèles du catalogue supprimés restent supprimés jusqu'à ce que vous les rajoutiez via la configuration.",
    "catalogModel": "catalogue",
    "customModel": "personnalisé",
    "localOverride": "remplacement local",
    "displayName": "Nom affiché",
    "contextWindow": "Contexte",
    "inFallback": "Dans la chaîne",
    "saveModelSettings": "Enregistrer les paramètres du modèle",
    "aggregateBudget": "{count}/mois",
    "aggregateBudgetTitle": "Total de tokens gratuits par mois pour l'ensemble des fournisseurs de ce modèle",
    "rateRpm": "{count} RPM",
    "rateRpd": "{count} RPD",
    "rateTitle": "Limité en débit : pas de budget mensuel de tokens fixe",
    "unifyToggle": "Unifier les modèles en double",
    "unifyToggleHint": "Afficher un modèle fourni par plusieurs fournisseurs comme un seul élément, et basculer entre ses fournisseurs lorsqu'il est sélectionné."
  },
  "strategies": {
    "title": "Stratégie de routage",
    "description": "Choisissez une stratégie de routage. En mode manuel, glissez pour définir l'ordre ; les autres stratégies routent selon un score en direct combinant fiabilité, vitesse et intelligence.",
    "manual": "Manuel",
    "manualBlurb": "Routage dans l'ordre exact que vous définissez ci-dessous. Glissez les poignées pour réordonner. Aucun score ; la chaîne est suivie de haut en bas.",
    "balanced": "Équilibré",
    "balancedBlurb": "La fiabilité prime (50 %), la vitesse et l'intelligence étant pondérées à parts égales (25 % chacune). Un choix par défaut polyvalent et raisonnable.",
    "smartest": "Le plus intelligent",
    "smartestBlurb": "Préférer le modèle le plus capable qui fonctionne encore. Intelligence 55 %, fiabilité 35 %, vitesse 10 %.",
    "fastest": "Le plus rapide",
    "fastestBlurb": "Préférer le modèle le plus rapide qui fonctionne encore. Vitesse 55 %, fiabilité 35 %, intelligence 10 %.",
    "reliable": "Le plus fiable",
    "reliableBlurb": "Maximiser le taux de réussite avant tout. Fiabilité 70 %, vitesse et intelligence 15 % chacune.",
    "custom": "Personnalisé",
    "customBlurb": "Définissez votre propre équilibre entre fiabilité, vitesse et intelligence à l'aide de curseurs. Le même moteur que les préréglages, avec vos pondérations.",
    "adjust": "Ajuster",
    "customWeights": "Pondérations personnalisées",
    "customWeightsHelp": "Les curseurs sont indépendants ; les parts s'équilibrent automatiquement à 100 %.",
    "weightReliability": "Fiabilité",
    "weightSpeed": "Vitesse",
    "weightIntelligence": "Intelligence",
    "weightRequired": "Au moins une pondération doit être supérieure à zéro.",
    "scoreColumn": "Score",
    "weightsSummary": "fiabilité {reliability}% · vitesse {speed}% · intelligence {intelligence}%",
    "guardrails": "Garde-fous",
    "guardrailsTooltip": "Garde-fous permanents : marge de quota gratuit × pénalité de limite de débit en direct. En dessous de 1,0, le modèle est freiné.",
    "scoreTooltip": "Score de routage final = moyenne pondérée des trois axes, multipliée par les garde-fous. Le plus élevé est routé en premier.",
    "modeManualHint": "Mode manuel : les requêtes suivent l'ordre ci-dessous, de haut en bas. Glissez pour réordonner.",
    "modeScoreHint": "Les scores se mettent à jour à partir du trafic réel. L'ordre ci-dessous correspond au routage actuel."
  },
  "keys": {
    "pageTitle": "Clés",
    "pageDescription": "Les identifiants des fournisseurs et la clé API unifiée à laquelle vos applications se connectent.",
    "tabProviders": "Fournisseurs",
    "tabQuotaSignals": "Signaux de quota",
    "tabApiKey": "Clé d'API unifiée",
    "tabAnthropic": "Anthropic",
    "unifiedKey": "Votre clé API unifiée",
    "regenerate": "Régénérer",
    "showKey": "Afficher",
    "hideKey": "Masquer",
    "copyKey": "Copier",
    "copiedKey": "Copié",
    "baseUrl": "URL de base",
    "endpointChat": "Chat",
    "endpointResponses": "Responses",
    "endpointEmbeddings": "Embeddings",
    "endpointEmbeddingsHint": "model : « auto » ou une famille de l'onglet Embeddings",
    "endpointMessages": "Messages",
    "endpointMessagesHint": "Compatible Anthropic (Claude)",
    "anthropicTitle": "Modèles Claude (Anthropic)",
    "anthropicDesc": "Pointez un client SDK Claude ou Anthropic vers ce serveur. Les clients Anthropic envoient des noms de modèles Claude — associez chacun à Auto (le routeur choisit un modèle gratuit) ou fixez-en un précis.",
    "anthropicBaseUrl": "URL de base",
    "anthropicAuth": "En-tête d'authentification",
    "anthropicAuto": "Auto — le routeur choisit le meilleur modèle",
    "anthropicSave": "Enregistrer le mappage",
    "anthropicSaved": "Enregistré",
    "anthropicNote": "Les clients Anthropic conservent leurs noms de modèles Claude intégrés ; le mappage ci-dessus décide de l'acheminement de chacun vers votre pool.",
    "familyDefault": "Par défaut",
    "familyOpus": "Opus",
    "familySonnet": "Sonnet",
    "familyHaiku": "Haiku",
    "selectPlatform": "Sélectionner un fournisseur",
    "addKey": "Ajouter une clé",
    "keyAdded": "Clé ajoutée",
    "adding": "Ajout…",
    "selectProvider": "Sélectionner un fournisseur…",
    "accountId": "ID de compte",
    "label": "Libellé",
    "noKeyNeeded": "(aucune clé requise)",
    "outboundProxy": "Proxy sortant",
    "outboundProxyDescription": "Acheminer les requêtes LLM sortantes via un proxy. Prend en charge SOCKS5, HTTP et HTTPS.",
    "proxyUrl": "URL du proxy",
    "saveProxy": "Enregistrer",
    "savingProxy": "Enregistrement…",
    "proxyLoadFailed": "Impossible de charger les paramètres du proxy.",
    "addCustom": "Ajouter un modèle personnalisé compatible OpenAI",
    "addCustomDescription": "Pointez vers n'importe quel endpoint compatible OpenAI : llama.cpp, LM Studio, vLLM, un Ollama local ou une passerelle distante. Indiquez un modèle par ligne (ou séparés par des virgules) pour en ajouter plusieurs à la fois ; ils partagent tous le même endpoint. La clé API est facultative (la plupart des serveurs locaux n'en ont pas besoin).",
    "customBaseUrl": "URL de base",
    "customModels": "Modèles",
    "customDisplayName": "Nom affiché",
    "customDisplayNamePerModel": "par modèle",
    "customDisplayNameOptional": "facultatif",
    "customApiKey": "Clé API",
    "customCapabilities": "Capacités",
    "addModel": "Ajouter un modèle",
    "modelAdded": "Modèle ajouté",
    "addModels": "Ajouter {count} modèles",
    "addingCustom": "Ajout…",
    "getApiKey": "Obtenir une clé API",
    "deleteKeyConfirm": "Supprimer cette clé ? Cette action est irréversible.",
    "checkAll": "Tout vérifier",
    "checking": "Vérification…",
    "editLabel": "Modifier le libellé",
    "saveLabel": "Enregistrer le libellé",
    "unifiedKeyDescBefore": "Utilisez-la comme votre ",
    "unifiedKeyDescAfter": " OpenAI ; elle authentifie les requêtes vers ce proxy.",
    "serverUnreachableBefore": "Impossible de joindre le serveur sur ",
    "serverUnreachableAfter": ". Vérifiez que le backend est démarré. npm run dev lance les deux, et les journaux du serveur s'affichent sous le préfixe server.",
    "paneProviderKey": "Clé de fournisseur",
    "paneImportFile": "Importer un fichier",
    "paneCustomEndpoint": "Endpoint personnalisé",
    "platform": "Plateforme",
    "apiToken": "Jeton API",
    "noKeyNeededPlaceholder": "Aucune clé API requise",
    "bearerTokenPlaceholder": "Jeton Bearer",
    "pasteKeyPlaceholder": "collez la clé ici",
    "keylessHint": "Aucune clé API requise : l'offre gratuite de ce fournisseur est anonyme (limitée par IP).",
    "enable": "Activer",
    "noProviderKeys": "Aucune clé de fournisseur pour l'instant. Ajoutez-en une ci-dessus pour commencer le routage.",
    "filterPlaceholder": "Filtrer les fournisseurs ou les clés",
    "filterAll": "Tous",
    "filterHealthy": "Sains",
    "filterIssues": "Problèmes",
    "filterDisabled": "Désactivés",
    "noFilterMatch": "Aucun fournisseur ne correspond à vos filtres.",
    "providerCountSummary": "{providers} fournisseurs · {keys} clés",
    "summaryHealthy": "{count} sains",
    "summaryIssueOne": "{count} problème",
    "summaryIssueOther": "{count} problèmes",
    "providerActions": "Actions du fournisseur",
    "routeViaProxy": "Acheminer via le proxy",
    "checkNow": "Vérifier maintenant",
    "proxyEnvHintBefore": "Également configurable via la variable d'environnement ",
    "proxyEnvHintAfter": " (prioritaire). Laissez vide pour désactiver. Exemples :",
    "confirmRemove": "Confirmer ?",
    "quotaSignalsTitle": "Signaux de quota",
    "quotaSignalsEmptyTitle": "Aucune observation de quota pour le moment",
    "quotaSignalsEmptyDesc": "Cette section se remplit quand les fournisseurs renvoient des en-têtes de limite, des erreurs de quota ou des signaux de validation.",
    "quotaKeyRef": "clé n° {id}",
    "quotaPoolRef": "pool {pool}",
    "quotaLimit": "Limite",
    "quotaRemaining": "Restant",
    "quotaReset": "Réinitialisation",
    "quotaObserved": "Observé",
    "customType": "Type",
    "customTypeChat": "Chat",
    "customTypeEmbedding": "Embedding",
    "customTypeImage": "Image",
    "customTypeAudio": "Audio",
    "customModel": "Modèle",
    "customFamily": "Famille",
    "customFamilyPlaceholder": "identifiant du modèle par défaut",
    "addEmbeddingModel": "Ajouter un embedding",
    "addImageModel": "Ajouter un modèle d'image",
    "addAudioModel": "Ajouter un modèle audio",
    "importKeys": "Importer des clés de fournisseur",
    "importKeysDescription": "Téléversez des fichiers .env, JSON, JSONC, CSV, Markdown ou texte.",
    "importFiles": "Fichiers",
    "importFileCount": "{count} sélectionnés",
    "previewFiles": "Aperçu",
    "previewing": "Aperçu en cours…",
    "selected": "Sélectionné",
    "provider": "Fournisseur",
    "keyName": "Nom de la clé",
    "keyValue": "Valeur de la clé",
    "chooseProvider": "Choisir un fournisseur",
    "noPreviewKeys": "Aucune clé trouvée dans ces fichiers.",
    "skippedItems": "Ignorés :",
    "moreItems": "+{count} de plus",
    "importSelected": "Importer {count}",
    "importing": "Importation en cours…",
    "noImportSelection": "Sélectionnez au moins une ligne avec un fournisseur.",
    "duplicate": "Doublon",
    "duplicatesFound": "{count} doublon(s) détecté(s) — existent déjà et seront ignorés.",
    "importResult": "Importés : {imported}. Échecs : {failed}.",
    "export": {
      "json": "JSON",
      "env": ".env",
      "csv": "CSV"
    },
    "exportAll": "All keys",
    "exportHealthy": "Healthy only",
    "exportKeys": "Export API keys",
    "exportFormat": "Format",
    "exportHealthyOnly": "Healthy keys only",
    "exportHealthyOnlyDesc": "Exclude keys that are currently failing health checks",
    "exportWillExport": "Will export",
    "exportKey": "key",
    "exportKeys plural": "keys",
    "exporting": "Exporting…",
    "exportDownload": "Download",
    "exportSuccess": "Exported {count} keys"
  },
  "status": {
    "healthy": "sain",
    "rateLimited": "limité",
    "invalid": "invalide",
    "error": "erreur",
    "unchecked": "non vérifié"
  },
  "analytics": {
    "title": "Analytique",
    "description": "Volume de requêtes, latence, consommation de tokens et échecs.",
    "range24h": "24 h",
    "range7d": "7 j",
    "range30d": "30 j",
    "range90d": "90 j",
    "requests": "Requêtes",
    "successRate": "Taux de réussite",
    "inputTokens": "Tokens en entrée",
    "outputTokens": "Tokens en sortie",
    "avgLatency": "Latence moy.",
    "p95Latency": "Latence P95",
    "avgTtft": "TTFT moy.",
    "estSavings": "Économies est.",
    "requestsByProvider": "Requêtes par fournisseur",
    "avgLatencyByProvider": "Latence moy. par fournisseur",
    "ttftByProvider": "Temps jusqu'au premier token par fournisseur",
    "ttftEmpty": "Aucun temps jusqu'au premier token enregistré pour l'instant.",
    "requestsOverTime": "Requêtes au fil du temps",
    "tokensOverTime": "Tokens au fil du temps",
    "byModel": "Par modèle",
    "byPlatform": "Par plateforme",
    "errors": "Erreurs",
    "errorDistribution": "Répartition des erreurs",
    "pinnedRequests": "Requêtes épinglées",
    "pinnedHonored": "Honorées",
    "fallbackAttempts": "Tentatives de repli",
    "savingsHint": "Vous avez réellement économisé {actual} $ sur les {range} derniers. C'est ce que les mêmes tokens auraient coûté sur des API payantes, tarifés par modèle. Le chiffre affiché projette votre rythme des {span} de données les plus récentes sur 30 jours complets.",
    "savingsHintExact": "Vous avez réellement économisé {actual} $ sur les {range} derniers. C'est ce que les mêmes tokens auraient coûté sur des API payantes, tarifés par modèle. Le chiffre affiché est votre total réel sur 30 jours.",
    "requestsHintPinned": "{pinned} de ces requêtes ont épinglé un modèle précis par son nom. {honored} ont été traitées par le modèle épinglé ; {failed} ont basculé vers un autre. Les autres ont été routées automatiquement.",
    "requestsHintAuto": "Toutes les requêtes de cette période ont été routées automatiquement ; aucun client n'a épinglé de modèle précis par son nom.",
    "requestsHintTypes": "{chat} requêtes de chat et {embedding} d'embeddings.",
    "rangeLabel24h": "24 heures",
    "rangeLabel7d": "7 jours",
    "rangeLabel30d": "30 jours",
    "rangeLabel90d": "90 jours",
    "spanDays": "{count} jours",
    "spanHours": "{count} heures",
    "latencyMs": "Latence (ms)",
    "latency": "Latence",
    "pinned": "Épinglé",
    "inTokens": "Tokens en entrée",
    "outTokens": "Tokens en sortie",
    "saved": "Économisé",
    "message": "Message",
    "time": "Heure",
    "perModelBreakdown": "Détail par modèle",
    "usageByKey": "Utilisation par clé",
    "keyColumn": "Clé",
    "keyLabelFallback": "Clé n° {id}",
    "errorsByProvider": "Erreurs par fournisseur",
    "recentErrors": "Erreurs récentes",
    "noErrors": "Aucune erreur",
    "recentCalls": "Appels récents",
    "clientIp": "IP du client",
    "clientAgent": "Application cliente",
    "requestedModelHint": "{model} demandé, servi par repli"
  },
  "playground": {
    "title": "Bac à sable",
    "description": "Envoyez une complétion de chat via le routeur et voyez quel fournisseur la traite.",
    "autoModel": "Auto (chaîne de repli)",
    "fusionModel": "Fusion (synthèse multi-modèles)",
    "send": "Envoyer",
    "sending": "Envoi…",
    "clear": "Effacer",
    "inputPlaceholder": "Tapez un message… (⏎ pour envoyer, ⇧⏎ pour un retour à la ligne)",
    "emptyTitle": "Envoyez un message pour commencer.",
    "emptyDescription": "Utilise {model}. Changez de modèle dans le sélecteur ci-dessus.",
    "noModels": "Aucun modèle pour l'instant. Ajoutez une clé API sur la page Clés pour remplir cette liste.",
    "copyReply": "Copier la réponse",
    "fallback": "repli",
    "fallbacks": "replis",
    "fusionPanel": "Panel",
    "fusionJudge": "Juge",
    "fusionTrace": "{count} réponses de modèles",
    "fusionFailed": "aucune réponse",
    "fusionJudgeSynth": "a synthétisé la réponse finale",
    "errorPrefix": "Erreur :",
    "errorTitle": "La requête a échoué",
    "selectModel": "Sélectionner un modèle",
    "searchModels": "Rechercher des modèles…",
    "noModelsFound": "Aucun modèle trouvé",
    "systemPromptLabel": "Prompt système",
    "systemPromptPlaceholder": "Facultatif. Envoyé comme message système avant votre conversation."
  },
  "embeddings": {
    "title": "Modèles",
    "description": "Les embeddings basculent uniquement au sein d'une même famille : le même modèle servi par un autre fournisseur. Les vecteurs de modèles différents sont incompatibles, le routeur ne change donc jamais de modèle à votre insu.",
    "defaultBadge": "Par défaut · auto",
    "makeDefault": "Définir par défaut",
    "moveUp": "Monter",
    "moveDown": "Descendre",
    "usageToday": "{count} req aujourd'hui",
    "usageMonth": "{count} tok ce mois-ci",
    "autoDescription": "model : « auto » sur POST /v1/embeddings achemine vers la famille par défaut. Nommer une famille (ou un id de modèle de fournisseur) épingle cette famille ; les fournisseurs qu'elle contient sont essayés dans l'ordre.",
    "unsavedChanges": "Modifications non enregistrées",
    "saveChanges": "Enregistrer les modifications",
    "savingChanges": "Enregistrement…",
    "tokMax": "{tokens} tok max.",
    "emptyTitle": "Aucun modèle d'embeddings pour l'instant",
    "emptyDesc": "Les familles d'embeddings apparaissent ici dès que vous ajoutez une clé de fournisseur prenant en charge les embeddings.",
    "dragToReorder": "Glisser pour réorganiser le fournisseur"
  },
  "fusion": {
    "title": "Fusion",
    "description": "Un panel de modèles répond en parallèle, puis un juge synthétise une réponse plus solide. Utilisez-la en appelant l’API avec le modèle « fusion ».",
    "panelSource": "Source du panel",
    "panelSourceHelp": "D’où proviennent les modèles du panel lorsqu’une requête n’en spécifie pas.",
    "mode": {
      "auto": "Auto (chaîne de repli)",
      "autoHelp": "Sélectionne un ensemble varié de modèles depuis votre chaîne de repli, classés selon votre stratégie de routage active.",
      "explicit": "Panel explicite",
      "explicitHelp": "Toujours utiliser les modèles spécifiques que vous choisissez ci-dessous."
    },
    "panelModels": "Modèles du panel",
    "selectedCount": "{count} sur {max} sélectionnés",
    "noModels": "Aucun modèle connecté pour l’instant. Ajoutez une clé API, puis activez des modèles dans la chaîne de repli.",
    "panelSize": "Taille du panel",
    "panelSizeHelp": "Nombre de modèles variés à sélectionner automatiquement (1–{max}).",
    "judge": "Modèle juge",
    "judgeHelp": "Le modèle qui synthétise les réponses du panel en une seule. « Auto » utilise votre meilleur modèle disponible.",
    "judgeAuto": "Auto (meilleur disponible)",
    "strategy": "Stratégie",
    "strategySynthesize": "Synthèse : fusionne le panel en une seule réponse",
    "strategyBestOf": "Meilleure réponse : renvoie la réponse la plus solide (sans appel au juge)",
    "strategySynthesizeShort": "Synthèse",
    "strategyBestOfShort": "Meilleure réponse",
    "exposePanel": "Exposer les détails du panel",
    "exposePanelHelp": "Joint la réponse de chaque modèle et les métadonnées du juge dans un champ x_fusion de la réponse.",
    "howToUse": "Comment l’utiliser",
    "howToUseHelp": "Envoyez une requête de chat normale avec le modèle « fusion ». Ces réglages sont les valeurs par défaut ; toute requête peut les remplacer via un champ « fusion ».",
    "unsavedChanges": "Modifications non enregistrées",
    "save": "Enregistrer"
  },
  "premium": {
    "title": "Premium",
    "description": "Le catalogue de modèles en direct, sur tous vos appareils.",
    "loading": "Chargement…",
    "checkForUpdates": "Vérifier les mises à jour",
    "syncing": "Synchronisation…",
    "catalogFeed": "Flux du catalogue",
    "liveFeed": "Flux en direct",
    "monthlySnapshot": "Instantané mensuel",
    "lastChecked": "Dernière vérification : {when}",
    "liveDescription": "Les nouveaux modèles gratuits, les changements de quota et les correctifs arrivent ici quelques heures après leur déploiement. L'application vérifie automatiquement deux fois par jour ; rien à faire.",
    "snapshotDescription": "Offre gratuite : le catalogue se rafraîchit à partir d'un instantané mensuel, vérifié automatiquement deux fois par jour. Premium bascule sur le flux en direct, mis à jour tous les 2 à 3 jours.",
    "lastSyncProblem": "Problème lors de la dernière synchronisation : {error}",
    "license": "Licence",
    "planAnnual": "Premium Annuel",
    "planLifetime": "Premium à vie",
    "expired": "Expiré",
    "inactive": "Inactif",
    "lifetimeNote": "Licence à vie : n'expire jamais.",
    "renewsOn": "Se renouvelle le {date}.",
    "willNotRenew": "Ne se renouvellera pas. Premium jusqu'au {date}, puis cette installation reviendra au catalogue mensuel gratuit.",
    "keyInactive": "Cette clé n'est plus active. L'application continue de fonctionner avec le catalogue mensuel gratuit.",
    "manageSubscription": "Gérer l'abonnement",
    "openingPortal": "Ouverture…",
    "removeKey": "Retirer la clé de cet appareil",
    "manageHint": "« Gérer l'abonnement » ouvre le portail de facturation Stripe : annuler, mettre à jour votre carte ou télécharger vos factures. Retirer la clé ne désactive que cet appareil ; votre achat reste intact.",
    "licenseKey": "Clé de licence",
    "licenseKeyPlaceholder": "fla_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "activate": "Activer",
    "activating": "Activation…",
    "keyHint": "Votre clé figure dans votre e-mail d'achat et sur la page de confirmation. Égarée ?",
    "recoverKey": "Récupérez-la sur le site web",
    "upsellTitle": "Passez en direct pour 19 $ par an",
    "upsellDescription": "De nouveaux modèles gratuits dès leur sortie, au lieu de 30 jours plus tard. Une seule clé, tous vos appareils. Annulable à tout moment ; le routeur reste gratuit pour toujours.",
    "goPremium": "Passer à Premium",
    "bundled": "intégré",
    "planGeneric": "Premium"
  },
  "languages": {
    "en": "English",
    "zh-CN": "中文 (简体)",
    "fr": "Français",
    "es": "Español",
    "pt-BR": "Português (Brasil)",
    "it": "Italiano"
  },
  "errors": {
    "boundaryTitle": "Une erreur est survenue",
    "boundaryDescription": "Le tableau de bord a rencontré une erreur inattendue. Vos données sont en sécurité. Réessayez ou revenez à la page des modèles.",
    "tryAgain": "Réessayer",
    "goHome": "Retour aux modèles"
  },
  "notFound": {
    "title": "Page introuvable",
    "description": "Cette page n'existe pas ou a peut-être été déplacée."
  },
  "setup": {
    "title": "Premiers pas",
    "subtitle": "Trois étapes pour router votre première requête.",
    "progress": "{done} sur {total}",
    "step1Title": "Ajoutez une clé de fournisseur",
    "step1Desc": "Connectez au moins un compte fournisseur. Les clés gratuites fonctionnent.",
    "step1Cta": "Ajouter des clés",
    "step2Title": "Envoyez une requête de test",
    "step2Desc": "Choisissez un modèle dans le Playground et dites bonjour.",
    "step2Cta": "Ouvrir le Playground",
    "step3Title": "Connectez votre application",
    "step3Desc": "Utilisez votre clé API unifiée avec n'importe quel client compatible OpenAI.",
    "copyKey": "Copier la clé API",
    "copyUrl": "Copier l'URL de base",
    "copiedKey": "Clé API copiée dans le presse-papiers",
    "copiedUrl": "URL de base copiée dans le presse-papiers"
  },
  "palette": {
    "title": "Palette de commandes",
    "placeholder": "Rechercher des pages, modèles, actions…",
    "empty": "Aucun résultat",
    "groupPages": "Pages",
    "groupActions": "Actions",
    "groupModels": "Modèles",
    "toggleTheme": "Basculer le mode sombre"
  },
  "penaltyInspector": {
    "title": "Pression sur le routeur",
    "subtitle": "Pénalités, cooldowns et échecs des {minutes} dernières minutes",
    "rowCount": "{count} actifs",
    "offChain": "hors chaîne",
    "penaltyValue": "Pénalité {value}",
    "factor": "score x{factor}",
    "noCooldown": "Aucun cooldown",
    "cooldownChip": "{key} - {time}",
    "errorsHeading": "{count} erreurs récentes",
    "noRecentErrors": "Aucune erreur récente",
    "noKey": "aucune clé",
    "reasons": {
      "penalty": "pénalisé",
      "cooldown": "en cooldown",
      "recent_errors": "en échec"
    }
  },
  "validation": {
    "required": "Obligatoire",
    "url": "Saisissez une URL valide commençant par http:// ou https://",
    "email": "Saisissez une adresse e-mail valide",
    "passwordMin": "Au moins {min} caractères"
  }
}
