import type { TranslationDictionary } from '@/types/i18n.types';

export const fr: TranslationDictionary = {
  common: {
    save: 'Enregistrer',
    cancel: 'Annuler',
    delete: 'Supprimer',
    edit: 'Modifier',
    create: 'Créer',
    search: 'Rechercher',
    filter: 'Filtrer',
    loading: 'Chargement...',
    noResults: 'Aucun résultat trouvé',
    confirm: 'Confirmer',
    back: 'Retour',
    next: 'Suivant',
    previous: 'Précédent',
    close: 'Fermer',
    retry: 'Réessayer',
    error: 'Erreur',
    success: 'Succès',
    warning: 'Avertissement',
    info: 'Info',
    healthy: 'Opérationnel',
    degraded: 'Dégradé',
    unhealthy: 'Défaillant',
    up: 'En ligne',
    down: 'Hors ligne',
    responseTime: 'Temps de réponse',
    unknown: 'Inconnu',
    operational: 'Opérationnel',
    notAvailable: 'N/D',
    yes: 'Oui',
    no: 'Non',
    never: 'Jamais',
    accessDenied: "Vous n'avez pas la permission d'accéder à cette page.",
    brandName: 'Claw',
    brandVersion: 'Claw v{version}',
    select: 'Sélectionner',
    download: 'Télécharger',
    noDataAvailable: 'Aucune donnée disponible',
    showingPage: 'Affichage de la page {page} sur {total}',
  },
  auth: {
    login: 'Connexion',
    logout: 'Déconnexion',
    email: 'Adresse e-mail',
    password: 'Mot de passe',
    loginTitle: 'Se connecter à Claw',
    loginSubtitle: 'Saisissez vos identifiants pour continuer',
    loginButton: 'Se connecter',
    logoutButton: 'Se déconnecter',
    sessionExpired: 'Votre session a expiré. Veuillez vous reconnecter.',
    invalidCredentials: 'E-mail ou mot de passe invalide',
    welcomeTitle: 'Bienvenue sur Claw',
    welcomeSubtitle: "Plateforme d'orchestration IA",
    passwordPlaceholder: 'Saisissez votre mot de passe',
    signingIn: 'Connexion en cours...',
    loginFailed: 'Échec de la connexion. Veuillez réessayer.',
    tagline: "Claw - Orchestration IA locale d'abord",
    authenticating: 'Authentification...',
    emailPlaceholder: 'you@example.com',
  },
  nav: {
    dashboard: 'Tableau de bord',
    chat: 'Chat',
    compareModels: 'Comparer les modèles',
    consensusMode: 'Mode consensus',
    escalationChain: "Chaîne d'escalade",
    repairLab: 'Labo de réparation',
    decomposeLab: 'Décomposeur de tâches',
    bestOfNLab: 'Génération Best-of-N',
    verifierLab: 'Vérificateur',
    pipelineLab: 'Labo pipeline',
    costEnsemble: 'Ensemble économique',
    rolePackLab: 'Pack de rôles',
    connectors: 'Connecteurs',
    models: 'Modèles',
    modelCatalog: 'Catalogue de modèles',
    modelLocalFrontier: 'Modèles frontier',
    localModels: 'Modèles locaux',
    routing: 'Routage',
    replayLab: 'Labo de relecture',
    recoveryLab: 'Moteur de récupération',
    adaptiveInsights: 'Insights adaptatifs',
    memory: 'Mémoire',
    context: 'Packs de contexte',
    files: 'Fichiers',
    observability: 'Observabilité',
    audits: "Journaux d'audit",
    logs: 'Journaux',
    admin: 'Administration',
    settings: 'Paramètres',
    workspace: 'Espace de travail',
    workspaceActions: 'Actions',
    workspaceApprovals: 'Approbations',
    workspaceSyncHealth: 'Santé de synchronisation',
    agent: 'Agent',
    agentTerminal: 'Terminal',
    agentRepos: 'Dépôts',
    agentCapabilities: 'Capacités',
    agentActivity: 'Activité',
    agentRecipes: 'Recettes',
    agentMarketplace: 'Marché',
    agentActivityMemory: "Mémoire d'activité",
    discovery: 'Découverte de modèles',
    workspaceProviders: 'Fournisseurs',
    workspaceAppConfigs: "Configurations d'applications",
    workspaceGmail: 'Gmail',
    workspaceJira: 'Jira',
    workspaceSourceControl: 'Contrôle de version',
    workspaceSlack: 'Slack',
    workspaceDocs: 'Documents',
    workspaceConfluence: 'Confluence',
    workspaceFigma: 'Figma',
    workspaceWorkflows: 'Flux de travail',
    researchProviders: 'Fournisseurs de recherche',
    researchRuns: 'Exécutions de recherche',
    research: 'Recherche',
    workspaceInbox: 'Boîte de réception',
    workspaceSemanticSearch: 'Recherche sémantique',
    workspaceDigest: 'Récap',
    workspaceAutomationPreferences: 'Préférences d’automatisation',
    workspaceEmailSignatures: 'Signatures e-mail',
    workspaceEmailTemplates: 'Modèles d’e-mail',
    workspaceImplHandoffs: 'Remises de code',
    adminAiActionPolicies: 'Politiques d’actions IA',
    adminSuggestionRules: 'Règles de suggestion',
    adminWebhookDeliveries: 'Livraisons webhook',
  },
  chat: {
    newThread: 'Nouveau chat',
    threads: 'Fils',
    searchThreads: 'Rechercher des fils...',
    noThreads: "Aucun fil pour l'instant",
    noThreadsDesc: 'Démarrez une nouvelle conversation pour commencer',
    sendMessage: 'Envoyer le message',
    typeMessage: 'Tapez un message...',
    deleteThread: 'Supprimer le fil',
    deleteThreadConfirm: 'Êtes-vous sûr de vouloir supprimer ce fil ?',
    threadCreated: 'Fil créé',
    threadCreateFailed: 'Échec de la création du fil',
    threadDeleted: 'Fil supprimé',
    threadDeleteFailed: 'Échec de la suppression du fil',
    threadUpdateFailed: 'Échec de la mise à jour du fil',
    messageSendFailed: "Échec de l'envoi du message",
    feedbackFailed: "Échec de l'enregistrement du retour",
    regenerateFailed: 'Échec de la régénération du message',
    aiThinking: "L'IA réfléchit...",
    fallbackRetrying: 'Nouvelle tentative avec le repli...',
    providerFailed: 'échoué',
    tryingProvider: 'tentative',
    allProvidersFailed: 'Tous les fournisseurs ont échoué à générer une réponse',
    imageGeneration: "Génération d'image",
    generatedImage: 'Image générée',
    downloadImage: "Télécharger l'image",
    fileGeneration: 'Génération de fichier',
    generatingFile: 'Génération du fichier...',
    fileGenerationFailed: 'Échec de la génération du fichier',
    downloadFile: 'Télécharger le fichier',
    convertingFile: 'Conversion du fichier',
    providerModel: 'Fournisseur / Modèle',
    pinThread: 'Épingler le fil',
    unpinThread: 'Désépingler le fil',
    archiveThread: 'Archiver le fil',
    unarchiveThread: 'Désarchiver le fil',
    threadPinned: 'Fil épinglé',
    threadUnpinned: 'Fil désépinglé',
    threadArchived: 'Fil archivé',
    threadUnarchived: 'Fil désarchivé',
    pinFailed: "Échec de la mise à jour de l'épinglage",
    archiveFailed: "Échec de la mise à jour de l'archivage",
    showArchived: 'Afficher les archivés',
    hideArchived: 'Masquer les archivés',
    provenance: 'Provenance du message',
    provenanceProvider: 'Fournisseur',
    provenanceModel: 'Modèle',
    provenanceLatency: 'Latence',
    provenanceInputTokens: "Jetons d'entrée",
    provenanceOutputTokens: 'Jetons de sortie',
    provenanceEstimatedCost: 'Coût estimé',
    provenanceRoutingMode: 'Mode de routage',
    provenanceFallbackUsed: 'Repli utilisé',
    provenanceYes: 'Oui',
    provenanceNo: 'Non',
    globalSearch: 'Rechercher des fils',
    globalSearchPlaceholder: 'Rechercher dans tous les fils...',
    globalSearchNoResults: 'Aucun fil trouvé',
    systemPrompt: 'Invite système',
    systemPromptPlaceholder: "Instructions pour l'IA...",
    temperature: 'Température',
    temperatureDescription:
      "Contrôle l'aléatoire. Plus bas = plus focalisé, plus haut = plus créatif.",
    maxTokens: 'Jetons maximum',
    maxTokensDescription: "Longueur maximale de la réponse de l'IA.",
    threadSettings: 'Paramètres du fil',
    preferredModel: 'Modèle IA par défaut',
    preferredModelDescription: 'Modèle par défaut pour ce fil. Peut être remplacé par message.',
    settingsSaved: 'Paramètres du fil enregistrés',
    helpful: 'Utile',
    notHelpful: 'Pas utile',
    feedbackSaved: 'Retour enregistré',
    attachFiles: 'Joindre des fichiers',
    noFiles: 'Aucun fichier téléchargé',
    selectedFiles: '{count} fichier(s) joint(s)',
    contextPacks: 'Packs de contexte',
    contextPacksDescription: 'Sélectionnez les packs de contexte à inclure dans ce fil.',
    noContextPacks: 'Aucun pack de contexte créé',
    reRouted: 'Réacheminé',
    reRoutedFrom: 'Réacheminé depuis {provider}/{model}',
    weakResponse: 'Réponse faible détectée',
    qualityScore: 'Qualité : {score} %',
    judgeReferee: 'Juge et arbitre',
    judgeRefereeDescription:
      'Activez la critique et la vérification par IA des réponses pour une meilleure précision.',
    judgeVerified: 'Vérifié',
    judgeRevised: 'Révisé',
    judgeEscalated: 'Escaladé',
    judgeCriticFeedback: 'Retour du critique',
    judgeReasoning: 'Raisonnement du juge',
    judgeEvaluating: 'Vérification de la réponse...',
    judgeModelLabel: 'Modèle juge',
    judgeModelAuto: 'Auto (qwen3:1.7b)',
    judgeModelDescription: 'Remplacer le modèle local utilisé pour le verdict final',
    judgeOpenReview: 'Voir la réponse du juge',
    judgeReviewTitle: 'Revue du juge',
    judgeReviewDescription:
      'Inspectez la réponse originale, la décision du juge et la réponse générée par le juge.',
    judgeDecisionLabel: 'Décision',
    judgeConfidenceLabel: 'Confiance',
    judgeSummary: 'Résumé du juge',
    judgeResponse: 'Réponse du juge',
    judgeOriginalAnswer: 'Réponse originale',
    judgeRevisedAnswer: 'Réponse révisée',
    judgeEscalatedAnswer: 'Réponse escaladée',
    judgeExecutionModel: "Modèle d'exécution",
    judgeJudgeModel: 'Modèle juge',
    judgeCriticModel: 'Modèle critique',
    judgeCriticScore: 'Score critique',
    judgeJudgeLatency: 'Latence du juge',
    judgeTotalLatency: 'Latence totale de revue',
    judgeRecommendedChanges: 'Modifications recommandées',
    judgeNoCriticFeedback: "Aucun retour critique n'a été enregistré pour cette revue.",
    judgeResponseTypeSummary: 'Résumé',
    judgeResponseTypeRevisedAnswer: 'Réponse révisée',
    judgeResponseTypeEscalatedAnswer: 'Réponse escaladée',
    judgeResponseTypeVerificationNote: 'Note de vérification',
    qualityThreshold: 'Seuil de qualité',
    qualityThresholdDescription:
      'Score de qualité minimum avant réacheminement (0 = tout accepter, 1 = très strict)',
    maxReRouteAttempts: 'Tentatives de réacheminement max',
    maxReRouteAttemptsDescription:
      'Nombre maximum de tentatives de réacheminement par message (0-5)',
    reRouteReasonShort: 'Trop court',
    reRouteReasonRefusal: 'Refus détecté',
    reRouteReasonRepetition: 'Répétition excessive',
    reRouteReasonEcho: "Écho de l'invite",
    reRouteReasonLowWords: 'Trop peu de mots',
    backToThreads: 'Retour aux fils',
    loadingThread: 'Chargement du fil...',
    selectOrStartTitle: 'Sélectionnez un fil ou démarrez un nouveau chat',
    selectOrStartDesc:
      'Choisissez une conversation existante dans la barre latérale ou créez-en une nouvelle pour interagir avec vos modèles IA configurés.',
    untitled: 'Sans titre',
    attachedFile: 'Fichier joint',
    beginningOfConversation: 'Début de la conversation',
    composerPlaceholder: 'Saisissez votre message...',
    currentAiProgress: "Progression actuelle de l'IA",
    fileGenerationCancelled: 'Génération de fichier annulée',
    fileGenerationFailedRetry: 'Échec de la génération du fichier. Réessayer ?',
    generationCancelled: 'Génération annulée',
    imageGenerationFailedRetry: "Échec de la génération de l'image. Réessayer ?",
    judge: 'Juge',
    live: 'En direct',
    loadingImage: "Chargement de l'image...",
    loadingMessages: 'Chargement des messages...',
    loadingMoreThreads: "Chargement d'autres fils...",
    loadingOlderMessages: 'Chargement des anciens messages...',
    loadingThreads: 'Chargement des fils...',
    manyMemories: '{count} mémoires',
    modelThinking: 'Le modèle réfléchit...',
    noMatchingThreads: 'Aucun fil correspondant',
    noMessagesYet: 'Aucun message pour le moment',
    noVisibleAnswer: 'Aucune réponse visible',
    oneMemory: '1 mémoire',
    open: 'Ouvrir',
    preparingDownload: 'Préparation du téléchargement...',
    regenerate: 'Régénérer',
    searching: 'Recherche...',
    threadActions: 'Actions du fil',
    toggleProvenance: 'Basculer la provenance',
    tryAnotherModel: 'Essayer un autre modèle',
    tryingFallback: 'Tentative de secours...',
    verifyingWith: 'Vérification avec {model}',
    visibleAiProgress: "Progression visible de l'IA",
    useMemoryLabel: 'Utiliser la mémoire dans cette conversation',
    useMemoryDescription: "Lorsque désactivé, aucune mémoire n'est injectée dans l'invite.",
    useContextLabel: 'Utiliser les paquets de contexte dans cette conversation',
    useContextDescription: 'Lorsque désactivé, les paquets attachés sont ignorés.',
  },
  receipt: {
    openLabel: "Voir ce que l'IA a utilisé",
    contextUsed: 'Contexte utilisé',
    dialogTitle: 'Pourquoi cette réponse',
    dialogDescription: 'Mémoires et éléments de paquet qui ont influencé cette réponse.',
    loading: 'Chargement du reçu...',
    notAvailable: 'Aucun reçu disponible pour ce message.',
    memoriesCount: '{value} mémoires',
    packItemsCount: '{value} éléments de paquet',
    tokenBudget: 'Jetons : {used} / {total}',
    memoriesHeading: 'Mémoires',
    packItemsHeading: 'Éléments du paquet',
    warningsHeading: 'Avertissements',
    scoreLabel: 'score {value}',
    pinnedBadge: 'épinglé',
    redactedPlaceholder: '(expurgé — contenu masqué)',
  },
  preview: {
    openLabel: 'Aperçu du contexte',
    dialogTitle: "Ce que l'IA verrait",
    dialogDescription:
      'Simulation de la récupération de mémoire et de paquets de contexte pour le brouillon actuel.',
    loading: "Création de l'aperçu...",
    failed: "L'aperçu a échoué ; le prochain envoi fonctionnera quand même.",
    empty: 'Aucun contexte ne sera injecté pour ce brouillon.',
    memoryCount: '{value} mémoires',
    packCount: '{value} éléments de paquet',
    tokenBudget: 'Jetons : {used} / {total}',
    memoriesHeading: 'Mémoires',
    packItemsHeading: 'Éléments du paquet',
    redactedPlaceholder: '(expurgé — contenu masqué)',
  },
  connectors: {
    title: 'Connecteurs',
    description: "Gérez vos connexions aux fournisseurs d'IA",
    createConnector: 'Créer un connecteur',
    editConnector: 'Modifier le connecteur',
    deleteConnector: 'Supprimer le connecteur',
    testConnection: 'Tester la connexion',
    testingConnection: 'Test en cours...',
    syncModels: 'Synchroniser les modèles',
    name: 'Nom',
    nameHelp: 'Un nom convivial pour identifier ce connecteur dans votre tableau de bord.',
    provider: 'Fournisseur',
    providerHelp: 'Le fournisseur IA avec lequel ce connecteur communiquera.',
    authType: "Type d'authentification",
    authTypeHelp: "Comment s'authentifier auprès du fournisseur. La plupart utilisent une clé API.",
    apiKey: 'Clé API',
    apiKeyHelp: 'Votre clé API secrète du fournisseur. Elle sera chiffrée au repos.',
    baseUrl: 'URL de base',
    baseUrlHelp:
      'Remplacez le point de terminaison API par défaut. Laissez vide pour utiliser celui du fournisseur.',
    region: 'Région',
    regionHelp: 'La région AWS où votre point de terminaison Bedrock est déployé.',
    status: 'Statut',
    healthy: 'Opérationnel',
    degraded: 'Dégradé',
    error: 'Erreur',
    noConnectors: 'Aucun connecteur configuré',
    noConnectorsDesc: 'Ajoutez un connecteur pour commencer à utiliser les fournisseurs IA',
    connectorCreated: 'Connecteur créé',
    connectorCreateFailed: 'Échec de la création du connecteur',
    connectorUpdated: 'Connecteur mis à jour',
    connectorUpdateFailed: 'Échec de la mise à jour du connecteur',
    connectorDeleted: 'Connecteur supprimé',
    connectorDeleteFailed: 'Échec de la suppression du connecteur',
    testSuccessful: 'Test de connexion réussi',
    testFailed: 'Échec du test de connexion',
    modelsSynced: 'Modèles synchronisés avec succès',
    syncFailed: 'Échec de la synchronisation des modèles',
    testBeforeCreate:
      "Enregistrez d'abord le connecteur, puis testez depuis la liste des connecteurs.",
    loadingConnectors: 'Chargement des connecteurs...',
    loadingConnector: 'Chargement du connecteur...',
    addConnector: 'Ajouter un connecteur',
    loadFailed: 'Échec du chargement des connecteurs.',
    connectorDetail: 'Détail du connecteur',
    connectorNotFound: 'Connecteur introuvable',
    backToConnectors: 'Retour aux connecteurs',
    syncing: 'Synchronisation...',
    enabled: 'Activé',
    disabled: 'Désactivé',
    configuration: 'Configuration',
    healthHistory: 'Historique de santé',
    healthHistoryDesc:
      "Le suivi de l'historique de santé sera disponible dans une future mise à jour.",
    models: 'Modèles',
    oneModel: '{count} modèle',
    manyModels: '{count} modèles',
    updatedAt: 'Mis à jour {date}',
    addConnectorDesc: "Ajouter un nouveau connecteur de fournisseur d'IA",
    apiKeyPlaceholder: 'Saisissez la clé API',
    apiKeyPlaceholderEdit: "Laissez vide pour conserver l'existante",
    baseUrlOptional: 'URL de base (facultatif)',
    baseUrlPlaceholder: 'https://api.example.com',
    defaultLabel: 'Par défaut',
    editConnectorDesc: 'Mettre à jour la configuration du connecteur',
    namePlaceholder: 'ex. OpenAI Production',
    regionPlaceholder: 'ex. us-east-1',
    saveFirstThenTest: "Enregistrez d'abord le connecteur, puis testez",
    selectProvider: 'Sélectionnez un fournisseur',
  },
  memory: {
    title: 'Mémoire',
    description: "Gérez les enregistrements de mémoire de l'IA",
    createMemory: 'Créer une mémoire',
    editMemory: 'Modifier la mémoire',
    deleteMemory: 'Supprimer la mémoire',
    type: 'Type',
    content: 'Contenu',
    enabled: 'Activé',
    disabled: 'Désactivé',
    noMemories: 'Aucun enregistrement de mémoire',
    noMemoriesDesc: "Créez des enregistrements de mémoire pour donner du contexte à l'IA",
    memoryCreated: 'Mémoire créée',
    memoryCreateFailed: 'Échec de la création de la mémoire',
    memoryUpdated: 'Mémoire mise à jour',
    memoryUpdateFailed: 'Échec de la mise à jour de la mémoire',
    memoryDeleted: 'Mémoire supprimée',
    memoryDeleteFailed: 'Échec de la suppression de la mémoire',
    memoryToggled: 'Mémoire basculée',
    memoryToggleFailed: 'Échec du basculement de la mémoire',
    loadFailed: 'Échec du chargement des enregistrements de mémoire.',
    loadingMemories: 'Chargement des enregistrements de mémoire...',
    addMemory: 'Ajouter une mémoire',
    contentPlaceholder: 'Saisissez le contenu de la mémoire...',
    createMemoryDesc: 'Créer une nouvelle entrée de mémoire',
    editMemoryDesc: 'Mettre à jour les détails de la mémoire',
    source: 'Source',
    typeSummary: 'Résumé',
    typeFact: 'Fait',
    typePreference: 'Préférence',
    typeInstruction: 'Instruction',
    filterAllTypes: 'Tous les types',
    tabSaved: 'Enregistrés',
    tabSuggestions: 'Suggestions',
    tabAudit: 'Audit',
    searchPlaceholder: 'Rechercher des mémoires...',
    filterAllScopes: 'Tous les périmètres',
    filterAllSources: 'Toutes les sources',
    filterAllSensitivities: 'Toutes les sensibilités',
    scopeUser: 'Personnel',
    scopeThread: 'Cette conversation',
    scopeWorkspace: 'Espace de travail',
    scopeProject: 'Projet',
    sourceUserManual: 'Créée manuellement',
    sourceAiExtracted: 'Extraite du chat',
    sourceAutomation: 'Apprise par automatisation',
    sourceImported: 'Importée',
    sensitivityNormal: 'Normal',
    sensitivitySensitive: 'Sensible',
    sensitivityRedacted: 'Expurgée',
    loadingSuggestions: 'Chargement des suggestions...',
    loadingAudit: "Chargement de l'audit...",
    noSuggestions: 'Aucune suggestion pour le moment',
    noAudit: "Aucune entrée d'audit pour l'instant",
    auditNoMemoryId: '(mémoire supprimée)',
    approveSuggestion: 'Approuver',
    rejectSuggestion: 'Rejeter',
    rejectAndSuppress: 'Rejeter et masquer les similaires',
    suggestionConfidence: 'Confiance : {value}%',
    suggestionReason: 'Raison : {value}',
  },
  files: {
    title: 'Fichiers',
    description: 'Téléchargez et gérez les fichiers pour le contexte IA',
    uploadFile: 'Téléverser un fichier',
    deleteFile: 'Supprimer le fichier',
    dragDrop: 'Glissez-déposez les fichiers ici, ou cliquez pour parcourir',
    maxSize: 'Taille maximale du fichier : 50 Mo',
    noFiles: 'Aucun fichier téléversé',
    noFilesDesc: 'Téléversez des fichiers à utiliser comme contexte IA',
    fileUploaded: 'Fichier téléversé',
    fileUploadFailed: 'Échec du téléversement du fichier',
    fileDeleted: 'Fichier supprimé',
    fileDeleteFailed: 'Échec de la suppression du fichier',
    uploadFailed: 'Échec du téléversement du fichier',
    loadFailed: 'Échec du chargement des fichiers.',
    loadingFiles: 'Chargement des fichiers...',
    allTypesAccepted: 'Tous les types de fichiers acceptés',
    chunkIndex: 'Fragment n°{index}',
    chunksTitle: 'Fragments du fichier',
    dropFileHere: 'Déposez le fichier ici',
    dropOrClick: 'Déposez le fichier ici ou cliquez pour parcourir',
    fileFallback: 'Fichier',
    noChunks: 'Aucun fragment disponible',
    uploading: 'Téléversement...',
    uploadNewFile: 'Téléverser un nouveau fichier',
    viewChunks: 'Voir les fragments',
    statusPending: 'En attente',
    statusProcessing: 'Traitement',
    statusCompleted: 'Terminé',
    statusFailed: 'Échec',
  },
  context: {
    title: 'Packs de contexte',
    description: 'Organisez le contexte pour les conversations IA',
    createPack: 'Créer un pack de contexte',
    addItem: 'Ajouter un élément',
    name: 'Nom',
    scope: 'Portée',
    noContextPacks: 'Aucun pack de contexte',
    noContextPacksDesc: 'Créez des packs de contexte pour organiser le contexte IA',
    packCreated: 'Pack de contexte créé',
    packCreateFailed: 'Échec de la création du pack de contexte',
    packUpdated: 'Pack de contexte mis à jour',
    packUpdateFailed: 'Échec de la mise à jour du pack de contexte',
    packDeleted: 'Pack de contexte supprimé',
    packDeleteFailed: 'Échec de la suppression du pack de contexte',
    itemAdded: 'Élément ajouté au pack de contexte',
    itemAddFailed: "Échec de l'ajout de l'élément",
    itemUpdated: 'Élément du pack de contexte mis à jour',
    itemUpdateFailed: "Échec de la mise à jour de l'élément",
    itemRemoved: 'Élément retiré du pack de contexte',
    itemRemoveFailed: "Échec du retrait de l'élément",
    loadFailed: 'Échec du chargement des packs de contexte.',
    contextPack: 'Pack de contexte',
    packDetailsDesc: 'Détails et éléments du pack',
    backToPacks: 'Retour aux packs',
    deletePack: 'Supprimer le pack',
    deleting: 'Suppression...',
    loadingPackDetails: 'Chargement des détails du pack...',
    noItems: 'Aucun élément dans ce pack',
    noItemsDesc:
      'Ajoutez des notes de texte, des instructions ou des références de fichiers à ce pack de contexte.',
    loadingContextPacks: 'Chargement des packs de contexte...',
    addItemDesc:
      'Ajoutez une note de texte, une instruction ou une référence de fichier à ce pack de contexte.',
    adding: 'Ajout...',
    content: 'Contenu',
    contentPlaceholder: 'Saisissez le contenu...',
    fileId: 'ID du fichier',
    fileIdPlaceholder: "Saisissez l'ID du fichier",
    itemType: 'Type',
    selectType: 'Sélectionnez un type',
    createPackDesc: 'Créer un nouveau pack de contexte',
    creating: 'Création...',
    descriptionOptional: 'Description (facultatif)',
    descriptionPlaceholder: "Décrivez l'usage de ce pack",
    namePlaceholder: 'ex. Contexte Projet Alpha',
    scopeOptional: 'Portée (facultatif)',
    scopePlaceholder: 'ex. global, projet, utilisateur',
    typeNote: 'Note',
    typeInstruction: 'Instruction',
    typeFileReference: 'Référence de fichier',
  },
  routing: {
    title: 'Politiques de routage',
    description: 'Configurez le routage des modèles IA',
    createPolicy: 'Créer une politique',
    editPolicy: 'Modifier la politique',
    deletePolicy: 'Supprimer la politique',
    name: 'Nom',
    mode: 'Mode de routage',
    priority: 'Priorité',
    active: 'Actif',
    noPolicies: 'Aucune politique de routage',
    noPoliciesDesc: 'Créez des politiques de routage pour contrôler la sélection des modèles',
    policyCreated: 'Politique créée',
    policyCreateFailed: 'Échec de la création de la politique',
    policyUpdated: 'Politique mise à jour',
    policyUpdateFailed: 'Échec de la mise à jour de la politique',
    policyDeleted: 'Politique supprimée',
    policyDeleteFailed: 'Échec de la suppression de la politique',
    status: 'Statut',
    inactive: 'Inactif',
    activate: 'Activer',
    deactivate: 'Désactiver',
    loadFailed: 'Échec du chargement de la configuration de routage.',
    defaultRoutingMode: 'Mode de routage par défaut',
    defaultRoutingModeDesc:
      'Choisissez comment le routeur local distribue les requêtes entre les modèles',
    defaultMode: 'Mode par défaut',
    fallbackSettings: 'Paramètres de repli',
    fallbackSettingsDesc: 'Configurez le comportement de nouvelle tentative et de délai',
    maxRetries: 'Tentatives max',
    timeoutMs: 'Délai (ms)',
    loadingPolicies: 'Chargement des politiques...',
    noPoliciesConfigured: 'Aucune politique de routage configurée.',
    complexityLabel: 'Complexité',
    complexitySimple: 'Simple',
    complexityMedium: 'Moyenne',
    complexityComplex: 'Complexe',
    complexityExpert: 'Expert',
    routingExplanation: 'Explication du routage',
    explanationSummary: 'Résumé de la décision',
    explanationFactors: 'Facteurs de décision',
    routingDurationMs: 'Durée du routage',
    modalityLabel: 'Modalité détectée',
    modalityText: 'Texte',
    modalityCode: 'Code',
    modalityImageInput: "Compréhension d'image",
    modalityImageOutput: "Génération d'image",
    modalityAudioInput: 'Audio / Parole',
    modalityVideoInput: 'Analyse vidéo',
    modalityPdfInput: 'Document / PDF',
    modalityWebSearch: 'Recherche web',
    modalityToolCalling: "Appel d'outils",
    modalityStructuredOutput: 'Sortie structurée',
    modalityOcr: 'OCR / Extraction de texte',
    modalityReasoning: 'Raisonnement profond',
    namePlaceholder: 'Ma politique de routage',
    selectModePlaceholder: 'Sélectionnez le mode de routage',
    editPolicyDesc: 'Mettez à jour la configuration de la politique de routage.',
    createPolicyDesc:
      'Créez une nouvelle politique de routage pour contrôler la distribution des requêtes.',
    weightsJsonLabel: 'Poids de notation (JSON, optionnel)',
    weightsJsonPlaceholder: '{"capability": 0.2, "domain": 0.1, ...}',
    weightsJsonHelp:
      'Optionnel. Remplace les poids par défaut du mode. Doit inclure les 14 dimensions et leur somme doit être égale à 1,0.',
    weightsJsonError: {
      invalidJson: 'Le JSON de poids n’est pas un JSON valide.',
      notAnObject: 'Les poids doivent être un objet JSON.',
      missingDimension: 'Le JSON de poids doit inclure chaque dimension sous forme de nombre.',
      sumNotOne: 'Les poids doivent totaliser 1,0 (±0,001).',
    },
    models: {
      title: 'Registre des modèles',
      description:
        'Parcourez tous les modèles connus du routeur. Outrepassez le coût, le cycle de vie ou les indicateurs de routage.',
      updateSucceeded: 'Modèle mis à jour.',
      updateFailed: 'Impossible de mettre à jour le modèle.',
      overrideCleared: 'Outrepassement supprimé.',
      overrideClearFailed: 'Impossible de supprimer l’outrepassement.',
      softDeleteSucceeded: 'Modèle marqué comme supprimé.',
      softDeleteFailed: 'Impossible de supprimer le modèle.',
      columnProvider: 'Fournisseur',
      columnModelKey: 'Modèle',
      columnLifecycle: 'Cycle de vie',
      columnQuality: 'Qualité',
      columnCost: 'Coût',
      columnLatency: 'Latence',
      filterByProvider: 'Filtrer par fournisseur',
      filterByLifecycle: 'Filtrer par cycle de vie',
    },
  },
  models: {
    title: 'Modèles',
    description: 'Voir tous les modèles IA disponibles',
    localTitle: 'Modèles locaux',
    localDescription: 'Gérez les modèles IA installés localement',
    pullModel: 'Télécharger le modèle',
    assignRole: 'Assigner un rôle',
    noModels: 'Aucun modèle disponible',
    noModelsDesc: 'Connectez un fournisseur ou téléchargez des modèles locaux',
    modelPullStarted: 'Téléchargement du modèle démarré',
    modelPullFailed: 'Échec du téléchargement du modèle',
    roleAssigned: 'Rôle assigné',
    roleAssignFailed: "Échec de l'assignation du rôle",
    loadFailed: 'Échec du chargement des modèles.',
    loadingModels: 'Chargement des modèles...',
    allProviders: 'Tous les fournisseurs',
    allLifecycle: 'Tous les cycles de vie',
    noModelsMatch: 'Aucun modèle ne correspond aux filtres actuels.',
    localLoadFailed: 'Échec du chargement des modèles locaux.',
    runtimeHealth: 'Santé du runtime',
    runtimeHealthDesc: 'Statut actuel du runtime des modèles locaux',
    pullModelDesc: 'Téléchargez un nouveau modèle depuis le registre',
    modelName: 'Nom du modèle',
    runtime: 'Runtime',
    pulling: 'Téléchargement...',
    pull: 'Télécharger',
    installedModels: 'Modèles installés',
    loadingLocalModels: 'Chargement des modèles locaux...',
    noLocalModels: 'Aucun modèle local installé',
    noLocalModelsDesc:
      "Téléchargez un modèle via le formulaire ci-dessus pour commencer l'inférence locale.",
    colModel: 'Modèle',
    colRuntime: 'Runtime',
    colSize: 'Taille',
    colFamily: 'Famille',
    colParameters: 'Paramètres',
    colRoles: 'Rôles',
    noneRole: 'Aucun',
    modelNamePlaceholder: 'llama3:8b',
    capabilities: 'Capacités',
    context: 'Contexte',
    lifecycle: 'Cycle de vie',
    noSyncedModels: 'Aucun modèle synchronisé',
    streaming: 'Diffusion',
    tools: 'Outils',
    vision: 'Vision',
  },
  observability: {
    title: 'Observabilité',
    description: "Surveillez l'utilisation et les performances de l'IA",
    totalRequests: 'Requêtes totales',
    totalCost: 'Coût total',
    avgLatency: 'Latence moy.',
    activeModels: 'Modèles actifs',
    clientLogs: 'Journaux client',
    serverLogs: 'Journaux serveur',
    auditTrail: "Piste d'audit",
    loadingData: "Chargement des données d'observabilité...",
    failedToLoad: 'Échec du chargement des données',
    failedToLoadDesc:
      "Impossible de récupérer les données d'observabilité. Veuillez réessayer plus tard.",
    noDataYet: "Aucune donnée d'observabilité",
    noDataDesc:
      "Les métriques et les données de performance apparaîtront ici dès que les requêtes commenceront à circuler dans la couche d'orchestration.",
    fullDescription:
      'Surveillez la santé du système, les latences de requêtes et les performances des modèles',
    totalRequestsLabel: 'Requêtes totales',
    acrossProviders: 'Tous fournisseurs confondus',
    estimatedCost: 'Coût estimé',
    estimatedCostLabel: 'Coût estimé',
    recentFailures: 'Échecs récents',
    highCriticalSeverity: 'Événements de sévérité HIGH + CRITICAL',
    providerUsage: 'Utilisation par fournisseur',
    modelUsage: 'Utilisation par modèle',
    latencyBreakdown: 'Répartition de la latence',
    costSummary: 'Résumé des coûts',
    avg: 'Moyenne',
    p50Median: 'P50 (médiane)',
    p95: 'P95',
    totalTokens: 'Jetons totaux',
    requests: 'requêtes',
    tokens: 'jetons',
    noData: 'Aucune donnée',
  },
  audits: {
    title: "Journaux d'audit",
    description: "Consultez les journaux d'activité du système",
    action: 'Action',
    severity: 'Sévérité',
    entity: 'Entité',
    timestamp: 'Horodatage',
    noAudits: "Aucun journal d'audit",
    noAuditsDesc: "L'activité apparaîtra ici à mesure que vous utilisez la plateforme",
    actor: 'Acteur',
    details: 'Détails',
    loadingAudits: "Chargement des journaux d'audit...",
    loadFailed: 'Échec du chargement des audits',
    loadFailedDesc: "Impossible de récupérer les journaux d'audit. Veuillez réessayer plus tard.",
    noMatchingAudits: "Aucun journal d'audit ne correspond à vos filtres.",
    allActions: 'Toutes les actions',
    allSeverities: 'Toutes les sévérités',
    searchPlaceholder: 'Rechercher...',
    ipAddress: 'Adresse IP',
  },
  admin: {
    title: 'Administration',
    description: 'Gérez les utilisateurs et les paramètres système',
    users: 'Utilisateurs',
    createUser: 'Créer un utilisateur',
    changeRole: 'Changer le rôle',
    deactivate: 'Désactiver',
    reactivate: 'Réactiver',
    noUsers: 'Aucun utilisateur trouvé',
    checkingServices: 'Vérification des services...',
    healthUnreachable: "Impossible d'atteindre le service de santé.",
    loadingUsers: 'Chargement des utilisateurs...',
    loadUsersFailed: 'Échec du chargement des utilisateurs',
    loadUsersFailedDesc:
      'Impossible de récupérer la liste des utilisateurs. Veuillez réessayer plus tard.',
    userRoleUpdated: 'Rôle utilisateur mis à jour',
    userRoleUpdateFailed: 'Échec de la mise à jour du rôle utilisateur',
    userDeactivated: 'Utilisateur désactivé',
    userDeactivateFailed: "Échec de la désactivation de l'utilisateur",
    userStats: 'Statistiques utilisateurs',
    userStatsDesc: "Vue d'ensemble des utilisateurs de la plateforme",
    totalUsers: 'Utilisateurs totaux',
    activeUsers: 'Utilisateurs actifs',
    platformHealth: 'Santé de la plateforme',
    systemStatusOverview: "Vue d'ensemble du statut système",
    userManagement: 'Gestion des utilisateurs',
    colUsername: "Nom d'utilisateur",
    colEmail: 'E-mail',
    colRole: 'Rôle',
    colStatus: 'Statut',
    colJoined: 'Inscrit le',
    colActions: 'Actions',
    roleAdmin: 'Administration',
    roleOperator: 'Opérateur',
    roleViewer: 'Observateur',
  },
  settings: {
    title: 'Paramètres',
    description: 'Gérez les paramètres de votre compte',
    profile: 'Profil',
    profileDescription: 'Vos informations personnelles. Ces champs sont en lecture seule.',
    username: "Nom d'utilisateur",
    email: 'E-mail',
    emailReadOnly: 'Contactez un administrateur pour modifier votre e-mail.',
    role: 'Rôle',
    selectLanguage: 'Sélectionner la langue',
    preferences: 'Préférences',
    language: 'Langue',
    languageDescription: "Sélectionnez votre langue d'affichage préférée",
    appearance: 'Apparence',
    appearanceDescription: "Choisissez l'apparence de l'application",
    system: 'Système',
    light: 'Clair',
    dark: 'Sombre',
    theme: 'Thème',
    changePassword: 'Changer le mot de passe',
    currentPassword: 'Mot de passe actuel',
    newPassword: 'Nouveau mot de passe',
    confirmPassword: 'Confirmer le mot de passe',
    passwordChanged: 'Mot de passe modifié avec succès',
    passwordChangeFailed: 'Échec du changement de mot de passe',
    passwordRequirements:
      'Le mot de passe doit comporter au moins 8 caractères avec majuscule, minuscule et un chiffre',
    preferencesUpdated: 'Préférences mises à jour avec succès',
    preferencesUpdateFailed: 'Échec de la mise à jour des préférences',
    devices: {
      title: 'Appareils',
      description: 'Gérez les agents de bureau appairés avec votre compte.',
      emptyTitle: 'Aucun appareil appairé',
      emptyBody: 'Exécutez `claw-agent login` sur votre machine pour appairer un appareil.',
      revoke: 'Révoquer',
      rename: 'Renommer',
      scopesHeading: 'Portées',
      revokedBanner: 'Cet appareil a été révoqué',
    },
    langEnglish: 'Anglais',
    langArabic: 'Arabe',
    langFrench: 'Français',
    langItalian: 'Italien',
    langGerman: 'Allemand',
    langSpanish: 'Espagnol',
    langRussian: 'Russe',
    langPortuguese: 'Portugais',
    langHindi: 'Hindi',
    appearanceSystem: 'Système',
    appearanceLight: 'Clair',
    appearanceDark: 'Sombre',
  },
  dashboard: {
    title: 'Tableau de bord',
    description: "Vue d'ensemble de votre plateforme IA",
    quickActions: 'Actions rapides',
    recentActivity: 'Activité récente',
    totalThreads: 'Fils totaux',
    activeConnectors: 'Connecteurs actifs',
    localModels: 'Modèles locaux',
    systemHealth: 'Santé du système',
    startNewChat: 'Démarrer un nouveau chat',
    addConnector: 'Ajouter un connecteur',
    configureRouting: 'Configurer le routage',
    serviceStatus: 'Statut des services',
    checkingHealth: 'Vérification de la santé des services...',
    healthUnreachable:
      "Impossible d'atteindre l'agrégateur de santé. Vérifiez que le service de santé fonctionne.",
    servicesOperational: '{up} sur {total} services opérationnels',
    responseTimeMs: '{ms} ms',
    unreachable: 'inaccessible',
    newChatLabel: 'Nouvelle discussion',
    newChatDesc: 'Démarrer une nouvelle conversation',
    manageConnectorsLabel: 'Gérer les connecteurs',
    manageConnectorsDesc: 'Configurer les connecteurs de fournisseurs IA',
    routingSettingsLabel: 'Paramètres de routage',
    routingSettingsDesc: 'Configurez le routage des requêtes',
  },
  catalog: {
    title: 'Catalogue de modèles',
    description: 'Parcourez et téléchargez des modèles IA',
    searchPlaceholder: 'Rechercher des modèles...',
    allCategories: 'Toutes',
    coding: 'Codage',
    fileGeneration: 'Génération de fichiers',
    imageGeneration: "Génération d'images",
    routing: 'Routage',
    reasoning: 'Raisonnement',
    thinking: 'Réflexion et recherche',
    download: 'Télécharger',
    downloading: 'Téléchargement...',
    installed: 'Installé',
    failed: 'Échoué',
    unavailable: 'Indisponible',
    cloudOnly: 'Cloud uniquement',
    cancel: 'Annuler',
    recommended: 'Recommandé',
    noModels: 'Aucun modèle trouvé',
    activeDownloads: 'Téléchargements actifs',
    parameterCount: 'Paramètres',
    modelSize: 'Taille',
    capabilities: 'Capacités',
    models: 'modèles',
    scrollForMore: 'Faites défiler pour plus',
    allLoaded: 'Tous les modèles chargés',
    searchBrowserHelpers: 'Assistants recherche/navigateur',
    searchBrowserScoreLabel: 'Assistant',
    searchBrowserScoreTooltip:
      "Adéquation pour les workflows d'assistant recherche et navigateur (score basé sur les métadonnées, 0.00–1.00)",
    cancelDownloadFailed: "Échec de l'annulation du téléchargement",
    downloadCancelled: 'Téléchargement annulé',
    downloadStarted: 'Téléchargement démarré',
    downloadStartFailed: 'Échec du démarrage du téléchargement',
    modelRemoved: 'Modèle supprimé',
    modelRemoveFailed: 'Échec de la suppression du modèle',
  },
  replay: {
    title: 'Labo de relecture de routage',
    description:
      'Ré-exécutez les décisions de routage historiques sur le routeur actuel et comparez les résultats',
    runReplay: 'Lancer la relecture',
    running: 'Relecture en cours...',
    totalReplayed: 'Total rejoué',
    changed: 'Modifiées',
    unchanged: 'Inchangées',
    oldRoute: "Route d'origine",
    newRoute: 'Nouvelle route',
    improvement: 'Amélioration',
    noResults: 'Aucun résultat de relecture',
    confidenceOld: 'Confiance moy. (ancienne)',
    confidenceNew: 'Confiance moy. (nouvelle)',
    replayComplete: 'Relecture de routage terminée',
    replayFailed: 'Échec de la relecture de routage',
    saveRun: "Enregistrer l'exécution",
    runName: "Nom de l'exécution",
    runNamePlaceholder: 'ex. baseline-2026-04',
    threadIdFilter: 'ID du fil',
    threadIdPlaceholder: 'Filtrer par fil...',
    startDate: 'Date de début',
    endDate: 'Date de fin',
    suspicious: 'Suspectes',
    avgImprovement: 'Amélioration moy.',
    needsReview: 'À examiner',
    noSuspiciousCases: 'Aucun cas suspect détecté',
    noSuspiciousCasesDesc: 'Tous les résultats de relecture semblent corrects',
    confirmedRegression: 'Régression confirmée',
    markConfirmedRegression: 'Marquer comme régression',
    caseReviewed: 'Cas examiné avec succès',
    caseReviewFailed: "Échec de l'examen du cas",
    copyBundle: "Copier le paquet d'export",
    bundleCopied: "Paquet d'export copié dans le presse-papiers",
    exportFailed: "Échec de l'export du paquet",
    runsHistory: 'Historique des exécutions',
    noRunsHistory: 'Aucune exécution enregistrée',
    noRunsHistoryDesc:
      "Activez « Enregistrer l'exécution » lors d'une relecture pour suivre l'historique",
    runResults: 'Résultats',
    correct_improvement: 'Amélioration',
    bad_regression: 'Régression',
    cost_win: 'Gain de coût',
    quality_win: 'Gain de qualité',
    uncertain: 'Incertain',
    badRegression: 'Régressions',
    noOriginalContent: 'Aucune invite originale stockée',
    promoteCase: 'Promouvoir en test',
    promoted: 'Cas promu en fixture de test',
    promoteFailed: 'Échec de la promotion du cas',
    compareRuns: 'Comparer les exécutions',
    compareRunsTitle: "Comparaison d'exécutions",
    compareRunsDesc: 'Sélectionnez deux exécutions pour comparer les décisions de routage',
    selectRunToCompare: 'Sélectionnez une exécution à comparer',
    runA: 'Exécution A',
    runB: 'Exécution B',
    improved: 'Améliorées',
    regressed: 'Régressées',
    suspiciousReasons: {
      empty_message_content: 'Invite originale manquante',
      large_confidence_drop: 'Chute importante de confiance',
      large_cost_increase: 'Augmentation importante du coût',
      route_changed_with_negative_improvement: 'Route modifiée avec impact négatif',
    },
  },
  compare: {
    title: 'Comparer les modèles',
    description:
      'Sélectionnez 2 à 5 modèles et saisissez une invite pour comparer les réponses côte à côte',
    selectModels: 'Sélectionner les modèles',
    minModels: 'Sélectionnez au moins {min} modèles',
    maxModels: 'Maximum {max} modèles autorisés',
    sendPrompt: 'Comparer les modèles',
    comparing: 'Comparaison...',
    compareFailed: 'Échec de la comparaison des modèles',
    results: 'Résultats',
    fastest: 'Le plus rapide',
    completed: 'Terminé',
    failed: 'Échoué',
    latency: 'Latence',
    tokens: 'Jetons',
    noResults: 'Aucun résultat de comparaison',
    modelCount: '{count} modèles',
    expand: 'Agrandir',
    bestResponse: 'Meilleure réponse',
    viewInThread: 'Voir dans le fil',
    totalTokens: 'Jetons totaux',
    avgLatencyLabel: 'Latence moy.',
    completedCount: '{count} terminés',
    failedCount: '{count} échoués',
    timeoutCount: '{count} expirés',
    modelsCompared: 'Modèles comparés',
    summaryTitle: 'Résumé de la comparaison',
    showMore: 'Afficher plus',
    showLess: 'Afficher moins',
    timeout: 'Expiré',
    noContent: 'Aucun contenu disponible',
    noJudge: 'Pas de juge',
    judgeAwaiting: 'En attente du juge',
    judgeSkipped: 'Juge ignoré',
    judgeFailed: 'Juge échoué',
    judgeUnavailable: 'Juge indisponible',
    judgeVerified: 'Vérifié',
    judgeRevised: 'Révisé',
    judgeEscalated: 'Escaladé',
    modelsProcessing: 'Traitement des modèles...',
    processingMessage: 'Traitement de votre message...',
  },
  consensus: {
    title: 'Mode consensus',
    description: "Sélectionnez 2 à 5 modèles et laissez l'IA synthétiser une réponse consensuelle",
    selectModels: 'Sélectionner les modèles',
    minModels: 'Sélectionnez au moins {min} modèles',
    maxModels: 'Maximum {max} modèles autorisés',
    sendPrompt: 'Lancer le consensus',
    running: 'Consensus en cours...',
    sendFailed: 'Échec du démarrage du consensus',
    synthesizing: 'Synthèse des réponses...',
    synthesisReady: 'Synthèse prête',
    synthesisTitle: 'Synthèse du consensus',
    agreementScore: "Score d'accord",
    confidenceLevel: 'Confiance',
    agreements: 'Accords',
    disagreements: 'Désaccords',
    contradictions: 'Contradictions',
    synthesisRationale: 'Justification',
    modelBreakdown: 'Répartition par modèle',
    completed: 'Terminé',
    failed: 'Échoué',
    timeout: 'Expiré',
    contentLength: 'Longueur du contenu',
    noResults: 'Aucun résultat de consensus',
    viewInThread: 'Voir dans le fil',
    high: 'Élevée',
    medium: 'Moyenne',
    low: 'Faible',
    modelsSelected: '{count} modèles sélectionnés',
    synthesisRationaleLabel: 'Justification de la synthèse',
  },
  escalation: {
    title: "Chaîne d'escalade",
    description:
      "Définissez une chaîne de modèles — le moins cher d'abord, le plus puissant en dernier. L'IA escalade automatiquement quand la qualité est faible",
    chainBuilder: 'Construisez votre chaîne',
    addModel: 'Ajouter un modèle',
    removeModel: 'Retirer',
    moveUp: 'Monter',
    moveDown: 'Descendre',
    minSteps: 'Ajoutez au moins {min} modèles',
    maxSteps: 'Maximum {max} modèles dans la chaîne',
    sendPrompt: 'Lancer la chaîne',
    running: 'Chaîne en cours...',
    sendFailed: "Échec du démarrage de la chaîne d'escalade",
    synthesizing: 'Escalade en cours...',
    synthesisReady: 'Résultat prêt',
    resultTitle: "Résultat d'escalade",
    stepUsed: 'Étape utilisée',
    totalSteps: 'Étapes totales',
    escalated: 'Escaladé',
    notEscalated: 'Aucune escalade nécessaire',
    status: 'Statut',
    statusSingleStep: 'Résolu à la première étape',
    statusResolved: 'Résolu après escalade',
    statusExhausted: 'Toutes les étapes épuisées',
    qualityScore: 'Score de qualité',
    latency: 'Latence',
    step: 'Étape',
    passed: 'Réussi',
    failed: 'Échoué',
    finalModel: 'Modèle final',
    noResults: "Aucun résultat d'escalade",
    viewInThread: 'Voir dans le fil',
    stepsTimeline: 'Chronologie des étapes',
    finalAnswer: 'Réponse finale',
  },
  repair: {
    title: 'Labo de réparation de réponse',
    description:
      'Réparez des réponses malformées, superficielles, incomplètes ou hallucinées sans tout recommencer.',
    contentLabel: 'Réponse à réparer',
    contentPlaceholder: 'Collez la réponse que vous voulez réparer...',
    repairTypes: 'Types de réparation',
    schemaLabel: 'Schéma',
    schemaDesc:
      'Corrigez le JSON malformé, la structure incorrecte ou les problèmes de format de données.',
    formatLabel: 'Format',
    formatDesc:
      'Corrigez le formatage markdown, les en-têtes, les listes, les blocs de code et la structure globale.',
    completenessLabel: 'Exhaustivité',
    completenessDesc:
      'Développez les sections superficielles ou incomplètes, ajoutez les points clés manquants.',
    factualityLabel: 'Véracité',
    factualityDesc:
      'Identifiez et corrigez les erreurs factuelles, les hallucinations ou les affirmations incorrectes.',
    sendPrompt: 'Réparer la réponse',
    running: 'Réparation...',
    sendFailed: 'Échec du démarrage de la réparation. Veuillez réessayer.',
    synthesizing: 'Réparation en cours...',
    resultTitle: 'Réponse réparée',
    noResults: 'Aucun résultat de réparation',
    viewInThread: 'Voir dans le fil',
    finalAnswer: 'Réponse finale',
    provider: 'Fournisseur',
    model: 'Modèle',
  },
  decompose: {
    title: 'Routeur de décomposition de tâches',
    description:
      'Divisez des tâches complexes en sous-tâches, exécutez chacune avec le meilleur modèle, puis synthétisez les résultats.',
    contentLabel: 'Tâche complexe',
    contentPlaceholder:
      "Décrivez une tâche complexe à décomposer, ex. « Recherchez les tendances IA en 2025, créez un plan d'action en 3 points et rédigez un résumé exécutif. »",
    maxSubTasks: 'Sous-tâches max',
    sendPrompt: 'Décomposer et exécuter',
    running: 'Décomposition...',
    synthesizing: 'Exécution des sous-tâches et synthèse des résultats...',
    resultTitle: 'Résultat synthétisé',
    viewInThread: 'Voir dans le fil',
    subTasksHeader: 'Résultats des sous-tâches',
    subTaskResult: 'Résultat',
    category: 'Catégorie',
    model: 'Modèle',
    latencyMs: 'Latence',
    noResults: 'Aucun résultat de décomposition',
    sendFailed: 'Échec de la décomposition de la tâche. Veuillez réessayer.',
  },
  bestOfN: {
    title: 'Génération de candidats Best-of-N',
    description:
      'Générez plusieurs réponses candidates et sélectionnez automatiquement la réponse de la plus haute qualité.',
    contentLabel: 'Invite',
    contentPlaceholder: 'Saisissez votre invite pour générer plusieurs candidats...',
    nCandidates: 'Candidats (N)',
    sendPrompt: 'Générer Best-of-N',
    running: 'Génération des candidats...',
    synthesizing: 'Notation et sélection du meilleur candidat...',
    resultTitle: 'Meilleur candidat',
    viewInThread: 'Voir dans le fil',
    candidatesHeader: 'Tous les candidats',
    rank: 'Rang',
    score: 'Score',
    model: 'Modèle',
    latency: 'Latence',
    noResults: 'Aucun candidat généré',
    sendFailed: 'Échec de la génération des candidats. Veuillez réessayer.',
  },
  recovery: {
    title: "Récupération d'échec de route",
    description:
      'Surveillez les échecs de fournisseurs et les événements de récupération automatique par repli.',
    totalDecisions: 'Décisions totales',
    totalFallbacks: 'Événements de repli',
    fallbackRate: 'Taux de repli',
    providerTable: 'Répartition des échecs par fournisseur',
    provider: 'Fournisseur',
    fallbackCount: 'Replis',
    rate: 'Taux',
    recentFallbacks: 'Événements de repli récents',
    originalProvider: 'Original',
    originalModel: 'Modèle',
    fallbackProvider: 'Repli',
    fallbackModel: 'Modèle de repli',
    mode: 'Mode',
    time: 'Heure',
    noFallbacks: 'Aucun événement de repli',
    noData: 'Aucune décision de routage enregistrée.',
    loading: 'Chargement des données de récupération...',
    error: 'Échec du chargement des statistiques de récupération.',
  },
  verify: {
    title: 'Vérificateur',
    description: "Générez et vérifiez une réponse avant l'envoi",
    contentLabel: 'Votre invite',
    contentPlaceholder: 'Saisissez votre question ou tâche...',
    maxRevisionsLabel: 'Révisions max',
    sendPrompt: 'Vérifier et envoyer',
    running: 'Vérification...',
    synthesizing: 'Génération et vérification de la réponse...',
    noResults: 'Aucune réponse vérifiée',
    sendFailed: 'Échec de la vérification. Veuillez réessayer.',
    verified: 'Vérifié',
    verifierScore: 'Score de qualité',
    revisions: 'Révisions',
    issues: 'Problèmes',
    viewInThread: 'Voir dans le fil',
  },
  adaptiveLearning: {
    title: 'Apprentissage adaptatif de routage',
    description: "Insights dérivés de l'historique de routage pour améliorer les décisions futures",
    loading: 'Chargement des insights...',
    error: 'Échec du chargement des insights',
    windowDays: 'Fenêtre',
    days: 'jours',
    totalDecisions: 'Décisions totales',
    avgConfidence: 'Confiance moy.',
    topReasonTags: 'Principales raisons',
    providerTable: 'Performance par fournisseur',
    modeBreakdown: 'Répartition par mode',
    noData: 'Aucune décision de routage dans cette fenêtre',
    provider: 'Fournisseur',
    fallbackRate: 'Taux de repli',
    totalCalls: 'Appels totaux',
    topModes: 'Modes principaux',
    mode: 'Mode',
    count: 'Nombre',
    percentage: 'Pourcentage',
  },
  pipeline: {
    title: 'Pipeline multi-étapes',
    description: "Acheminez votre requête à travers une chaîne d'étapes spécialisées",
    contentLabel: 'Votre requête',
    contentPlaceholder: 'Décrivez ce dont vous avez besoin...',
    templateLabel: 'Modèle de pipeline',
    templateAnalyze: 'Analyser → Raisonner → Formater',
    templateCode: 'Coder → Déboguer → Réviser',
    templateDraft: 'Brouillon → Critique → Réviser',
    sendPrompt: 'Lancer le pipeline',
    running: 'Pipeline en cours...',
    synthesizing: 'Traitement des étapes...',
    noResults: 'Aucun résultat de pipeline',
    sendFailed: 'Échec du pipeline. Veuillez réessayer.',
    stageBreakdown: 'Répartition par étape',
    stage: 'Étape',
    model: 'Modèle',
    latency: 'Latence',
    viewInThread: 'Voir dans le fil',
  },
  costEnsemble: {
    title: 'Ensemble économique',
    description:
      'Exécution intelligente : utilisez un, deux ou trois modèles selon la complexité de la tâche',
    contentLabel: 'Votre invite',
    contentPlaceholder: 'Saisissez votre question ou tâche...',
    sendPrompt: 'Analyser et envoyer',
    running: 'Analyse du coût...',
    synthesizing: "Sélection de l'ensemble optimal...",
    noResults: 'Aucun résultat',
    sendFailed: "Échec de l'ensemble économique. Veuillez réessayer.",
    tier: 'Niveau',
    tierSingle: 'Seul',
    tierDuo: 'Duo',
    tierTrio: 'Trio',
    complexity: 'Complexité',
    risk: 'Risque',
    ambiguity: 'Ambiguïté',
    reasoning: 'Raisonnement',
    candidates: 'Candidats',
    viewInThread: 'Voir dans le fil',
  },
  rolePack: {
    title: 'Ensemble par rôles',
    description: 'Soumettez votre requête à une équipe de rôles IA spécialisés',
    contentLabel: 'Votre requête',
    contentPlaceholder: 'Décrivez ce dont vous avez besoin...',
    packLabel: "Sélectionner l'équipe",
    packCoding: 'Équipe codage',
    packResearch: 'Équipe recherche',
    packMarketing: 'Équipe marketing',
    packLegal: 'Équipe juridique',
    sendPrompt: "Lancer l'équipe",
    running: 'Équipe en traitement...',
    synthesizing: 'Exécution de tous les rôles en parallèle...',
    noResults: "Aucun résultat d'équipe",
    sendFailed: "Échec de l'exécution de l'équipe. Veuillez réessayer.",
    teamBreakdown: "Résultats d'équipe",
    role: 'Rôle',
    model: 'Modèle',
    latency: 'Latence',
    viewInThread: 'Voir dans le fil',
  },
  advancedModelSelector: {
    label: "Modèle d'exécution",
    auto: 'Auto (choisir le meilleur modèle local)',
    loading: 'Chargement des modèles...',
    description: 'Choisissez Auto ou un modèle Ollama installé localement pour ce labo.',
    empty: 'Aucun modèle texte local disponible pour ce labo.',
  },
  workspaceConnectors: {
    title: "Connecteurs d'espace de travail",
    description:
      "Connectez vos outils d'espace de travail — GitHub, Slack, Jira, Google Drive et plus.",
    createConnector: 'Créer un connecteur',
    editConnector: 'Modifier le connecteur',
    deleteConnector: 'Supprimer le connecteur',
    testHealth: 'Tester la santé',
    triggerSync: 'Synchroniser',
    name: 'Nom',
    nameHelp: "Un nom d'affichage pour ce connecteur",
    provider: 'Fournisseur',
    providerHelp: "L'outil d'espace de travail à connecter",
    permissionLevel: 'Niveau de permission',
    permissionLevelHelp: "Le niveau d'accès accordé à ce connecteur",
    status: 'Statut',
    connected: 'Connecté',
    degraded: 'Dégradé',
    disconnected: 'Déconnecté',
    pendingAuth: 'Authentification en attente',
    unknown: 'Inconnu',
    noConnectors: "Aucun connecteur d'espace de travail",
    noConnectorsDesc: "Connectez votre premier outil d'espace de travail pour commencer.",
    noConnectorsGuidance:
      "Les connexions démarrent depuis les Configurations d'applications. Enregistrez-y votre application OAuth, puis cliquez sur Connecter pour l'associer ici.",
    overviewDescription:
      "Vos outils d'espace de travail connectés. Ajoutez-en de nouveaux depuis les Configurations d'applications.",
    manageAppConfigs: "Gérer les configurations d'applications",
    goToAppConfigs: "Aller aux configurations d'applications",
    connectorCreated: 'Connecteur créé avec succès.',
    connectorCreateFailed: 'Échec de la création du connecteur.',
    connectorDeleted: 'Connecteur supprimé avec succès.',
    connectorDeleteFailed: 'Échec de la suppression du connecteur.',
    healthCheckStarted: 'Vérification de santé démarrée.',
    healthCheckFailed: 'Échec de la vérification de santé.',
    syncStarted: 'Synchronisation démarrée.',
    syncFailed: 'Échec du démarrage de la synchronisation.',
    loadFailed: 'Échec du chargement des connecteurs.',
    loadingConnectors: 'Chargement des connecteurs...',
    addConnector: 'Ajouter un connecteur',
    connectViaOAuth: 'Connecter via OAuth',
    lastSync: 'Dernière synchronisation',
    never: 'Jamais',
    syncRuns: 'Exécutions de synchronisation',
    healthEvents: 'Événements de santé',
    enabled: 'Activé',
    disabled: 'Désactivé',
    deleteConfirm:
      'Êtes-vous sûr de vouloir supprimer ce connecteur ? Cette action est irréversible.',
    namePlaceholder: 'ex. GitHub Workspace',
    paused: 'En pause',
  },
  workspaceObjects: {
    title: 'Objets synchronisés',
    description: "Objets synchronisés depuis vos outils d'espace de travail connectés.",
    loading: 'Chargement des objets...',
    loadFailed: "Échec du chargement des objets d'espace de travail.",
    noObjects: 'Aucun objet synchronisé.',
    noObjectsDesc: 'Déclenchez une synchronisation sur un connecteur pour importer des objets.',
    selectConnector: 'Sélectionnez un connecteur pour voir ses objets synchronisés.',
    source: 'Source',
    viewObject: "Voir l'objet",
  },
  workspaceSearch: {
    title: "Recherche d'espace de travail",
    description: "Rechercher dans tous les objets synchronisés de l'espace de travail.",
    placeholder: 'Rechercher des documents, tickets, messages...',
    searching: 'Recherche...',
    noResults: 'Aucun résultat trouvé.',
    noResultsDesc: 'Essayez un autre terme de recherche ou synchronisez plus de connecteurs.',
    searchFailed: 'Échec de la recherche. Veuillez réessayer.',
    resultCount: '{count} résultat(s)',
    viewSource: 'Voir la source',
    score: 'Pertinence',
  },
  workspaceObjectDetail: {
    title: "Détail de l'objet",
    description:
      "Inspectez un objet d'espace de travail synchronisé et actualisez-le depuis son fournisseur.",
    loadFailed: "Échec du chargement de l'objet.",
    refresh: 'Actualiser depuis le fournisseur',
    refreshing: 'Actualisation...',
    refreshFailed: "Échec de l'actualisation.",
    content: 'Contenu',
    metadata: 'Métadonnées',
    externalCreated: 'Créé en amont',
    externalUpdated: 'Mis à jour en amont',
    openInProvider: 'Ouvrir chez le fournisseur',
    author: 'Auteur : {author}',
  },
  connectorDetail: {
    title: 'Détail du connecteur',
    description:
      'Historique de synchronisation, événements de santé et objets récemment synchronisés pour ce connecteur.',
    loadFailed: 'Échec du chargement du connecteur.',
    never: 'jamais',
    lastSync: 'Dernière synchronisation : {value}',
    syncRunsCount: '{count} exécutions de synchronisation',
    objectsCount: '{count} objets',
    recentObjects: 'Objets récents',
    noObjects:
      'Aucun objet synchronisé. Déclenchez une synchronisation pour en importer depuis le fournisseur.',
    syncHistory: 'Historique de synchronisation',
    noSyncRuns: 'Aucune exécution de synchronisation.',
    syncRunLine: '{synced} synchronisés · {failed} échoués',
    healthHistory: 'Historique de santé',
    noHealthEvents: 'Aucune vérification de santé enregistrée.',
    healthOk: 'OK',
    activating:
      "Activation de ce connecteur — import du premier ensemble d'objets depuis le fournisseur. Vous pouvez continuer à utiliser Claw pendant ce temps.",
    askAi: "Demander à l'IA",
    askAiTitle: 'À propos de {name}',
    reconnect: 'Reconnecter',
    reconnectTitle: 'Ce connecteur est déconnecté',
    reconnectDescription:
      "Les identifiants stockés ne sont plus valides. Ré-autorisez depuis les Configurations d'applications pour rétablir l'accès.",
  },
  workspaceSyncRuns: {
    title: 'Exécutions de synchronisation',
    description: 'Historique récent de synchronisation pour ce connecteur.',
    loading: 'Chargement des exécutions de synchronisation...',
    loadFailed: 'Échec du chargement des exécutions de synchronisation.',
    empty: 'Aucune exécution de synchronisation.',
    started: 'Démarré',
    status: 'Statut',
    type: 'Type',
    delta: 'Delta',
    found: 'Trouvés',
    synced: 'Synchronisés',
    failed: 'Échoués',
    duration: 'Durée',
  },
  workspaceSync: {
    dashboard: {
      title: "Santé de synchronisation d'espace de travail",
      description:
        "Vue en direct des tâches de synchronisation planifiées sur chaque connecteur d'espace de travail.",
      error_title: 'Impossible de charger le tableau de bord de synchronisation',
      empty_title: 'Aucun connecteur',
      empty_description:
        "Dès que vous connectez un outil d'espace de travail, sa santé de synchronisation apparaîtra ici.",
      scheduler_title: 'Planificateur',
      scheduler_enabled: 'Planificateur activé',
      last_tick: 'Dernier tick',
      active_runs: 'Exécutions actives',
      dlq_backlog: 'Arriéré DLQ',
      connectors_title: 'Connecteurs',
      col: {
        connector: 'Connecteur',
        freshness: 'Fraîcheur',
        last_sync: 'Dernière synchronisation',
        cadence: 'Cadence',
        success_rate: 'Taux de succès 24h',
        avg_duration: 'Durée moy.',
        status: 'Statut',
      },
    },
    band: {
      fresh: 'Récente',
      slow: 'Lente',
      stale: 'Obsolète',
    },
    cadence: {
      label: 'Synchroniser toutes les',
      '1m': '1 minute',
      '5m': '5 minutes',
      '10m': '10 minutes',
      '30m': '30 minutes',
      '1h': '1 heure',
      save: 'Enregistrer la cadence',
      saving: 'Enregistrement...',
      saved: 'Cadence mise à jour',
    },
    pause: {
      pause: 'Mettre en pause',
      resume: 'Reprendre',
      paused_label: 'Synchronisation en pause',
      reason_placeholder: 'Raison (facultative)',
    },
    chip: {
      synced_ago: 'Synchronisé il y a {ago}',
      stale: 'Obsolète',
      paused: 'En pause',
    },
  },
  aiActions: {
    dialog: {
      title: "Lancer l'action IA · {action}",
      description:
        "Choisissez un modèle et générez. AUTO laisse le routeur choisir selon le type d'action et la classe de confidentialité.",
      model_label: 'Modèle',
      generate: 'Générer',
      regenerate: 'Régénérer',
      resolving: 'Génération…',
      cancel: 'Annuler',
      close: 'Fermer',
      copy: 'Copier',
      copied: 'Copié',
      generated_by: 'Généré par {model}',
      resolution_mode: 'Mode : {mode}',
      resolution_primary: 'Primaire : {model}',
      resolution_fallback: 'Modèles de repli en attente : {count}',
    },
  },
  approvals: {
    page: {
      title: "Centre d'approbations",
      description:
        "Examinez et approuvez les actions en attente rédigées par l'IA sur vos connecteurs d'espace de travail.",
      empty_title: 'Aucune approbation en attente',
      empty_description:
        "Lorsque l'IA rédige une action en votre nom, elle apparaîtra ici pour examen.",
      error_title: 'Impossible de charger les approbations',
      error_description:
        'Une erreur est survenue lors du chargement de la liste des approbations. Réessayez.',
    },
    card: {
      approve: 'Approuver',
      reject: 'Rejeter',
      edit: 'Modifier',
      edited: 'Modifié · v{version}',
      source_stale: 'Source obsolète',
      attribution_auto: 'AUTO · {model}',
      attribution_manual: 'Manuel · {model}',
    },
    bulk: {
      selected: '{count} sélectionnés',
      approve_all: 'Approuver toute la sélection',
      clear: 'Effacer la sélection',
    },
    edit: {
      title: 'Modifier le brouillon',
      description:
        "Modifiez la charge utile de l'action. Le brouillon original est conservé dans l'historique.",
      payload_label: 'Charge utile (JSON)',
      reason_placeholder: 'Raison de la modification (facultative)',
      save: 'Enregistrer et ré-approuver plus tard',
      cancel: 'Annuler',
      invalid_json: 'La charge utile doit être un JSON valide',
    },
    reject: {
      title: "Rejeter l'action",
      description: 'Vous pouvez décrire pourquoi vous rejetez cette action.',
      reason_placeholder: 'Raison (facultative)',
      confirm: 'Rejeter',
      cancel: 'Annuler',
    },
  },
  automationPreferences: {
    page: {
      title: "Préférences d'automatisation",
      description:
        "Contrôles par type d'action. Le plus restrictif gagne : la politique admin est le socle ; vos préférences ne peuvent que la durcir.",
      loading: 'Chargement des préférences…',
      error: 'Impossible de charger les préférences. Essayez d’actualiser.',
      empty: 'Aucun type d’action disponible.',
    },
    row: {
      enabled: 'Activé',
      disabled: 'Désactivé',
      toggleAria: 'Basculer l’automatisation pour {kind}',
      autoApproveBelowRisk: 'Auto-approuver quand le risque est ≤ au seuil',
      autoApproveDisabled: 'Auto-approbation désactivée (toujours en file de revue)',
      autoApproveAt: 'Auto-approuver risque ≤ {score}',
      perDayBudget: 'Plafond quotidien',
      perDayBudgetPlaceholder: 'unlimited',
      clear: 'Effacer',
    },
  },
  connectorGrants: {
    title: 'Partage',
    description:
      'Partagez ce connecteur avec d’autres utilisateurs. Le propriétaire a toujours un accès complet ; les bénéficiaires voient le niveau d’accès que vous choisissez.',
    loading: 'Chargement des accès…',
    error: 'Impossible de charger les accès.',
    empty: "Aucun accès pour l'instant. Ce connecteur n'est accessible qu'à vous.",
    granteeUserIdLabel: 'ID utilisateur du bénéficiaire',
    granteeUserIdPlaceholder: 'cmnkgdc2c00009w92riuztmmd',
    accessLevelLabel: "Niveau d'accès",
    grant: "Accorder l'accès",
    granting: 'Octroi en cours…',
    revoke: 'Révoquer',
    revoking: 'Révocation…',
    grantedBy: 'accordé par',
    levelReadOnly: 'Lecture seule',
    levelAiActions: 'Actions IA',
    levelFull: 'Complet',
  },
  emailSignatures: {
    page: {
      title: 'Signatures e-mail',
      description:
        "Gérez les signatures ajoutées aux e-mails rédigés par l'IA. Marquez-en une comme par défaut pour qu'elle soit utilisée automatiquement.",
      loading: 'Chargement des signatures…',
      error: 'Impossible de charger les signatures. Actualisez la page.',
      empty: "Aucune signature pour l'instant. Créez-en une pour commencer.",
      create: 'Nouvelle signature',
      edit: 'Modifier',
      delete: 'Supprimer',
      deleting: 'Suppression…',
      defaultBadge: 'Par défaut',
    },
    dialog: {
      createTitle: 'Créer une signature',
      editTitle: 'Modifier la signature',
      nameLabel: 'Nom',
      namePlaceholder: 'Signature professionnelle',
      bodyLabel: 'Contenu',
      bodyPlaceholder: 'Cordialement,\nAlice\nVP Ingénierie · Example Inc.',
      defaultLabel: 'Utiliser par défaut',
      save: 'Enregistrer',
      saving: 'Enregistrement…',
      cancel: 'Annuler',
    },
  },
  research: {
    toggle: {
      placeholder: 'Recherche',
      autoProvider: 'Fournisseur automatique',
      noProviders: 'Aucun fournisseur configuré',
    },
    modes: {
      off: 'Pas de recherche',
      searchOnly: 'Recherche web',
      searchThenFetch: 'Recherche + récupération',
      searchFetchExtract: 'Recherche + extraction',
    },
    providers: {
      title: 'Fournisseurs de recherche',
      description: 'Fournisseurs dynamiques de recherche, récupération et preuves.',
      createButton: 'Nouveau fournisseur',
      createTitle: 'Ajouter un fournisseur de recherche',
      createDescription: 'Enregistrez un fournisseur Tavily / SearXNG / Ollama Web.',
      create: 'Créer',
      creating: 'Création...',
      kind: 'Type',
      name: 'Nom',
      baseUrl: 'URL de base',
      apiKey: 'Clé API (stockée chiffrée)',
      test: 'Tester',
      secretStored: 'Secret stocké',
      healthy: 'Opérationnel',
      unhealthy: 'Défaillant',
      loadFailed: 'Échec du chargement des fournisseurs.',
      emptyTitle: 'Aucun fournisseur de recherche',
      emptyDescription: 'Ajoutez un fournisseur pour enrichir le chat avec des preuves en direct.',
      col: {
        name: 'Nom',
        kind: 'Type',
        baseUrl: 'URL de base',
        status: 'Statut',
        secret: 'Secret',
        actions: 'Actions',
      },
      namePlaceholder: 'ex. Tavily Production',
    },
    runs: {
      title: 'Exécutions de recherche',
      description: 'Historique des exécutions de recherche déclenchées depuis le chat.',
      loadFailed: 'Échec du chargement des exécutions.',
      emptyTitle: 'Aucune exécution de recherche',
      emptyDescription: 'Activez la recherche dans le chat pour produire des preuves.',
    },
    evidence: {
      title: 'Preuves de recherche en direct',
      empty: 'Aucun élément de preuve retourné.',
      noTitle: '(sans titre)',
      confidence: 'Confiance',
      warnings: 'Avertissements',
      requestedModel: 'Modèle demandé',
      toolsUsed: 'Outils',
    },
    results: {
      open: 'Résultats de recherche',
      title: 'Résultats de recherche',
      description:
        'Inspectez le choix du fournisseur, la chaîne de repli, le paquet de preuves et la trace de recherche.',
      provider: 'Fournisseur',
      selectionMode: 'Sélection',
      selectionAuto: 'Auto',
      selectionExplicit: 'Explicite',
      fallbackUsed: 'Repli utilisé',
      query: 'Requête de recherche',
      evidenceCount: 'Éléments de preuve',
      attempts: 'Tentatives de fournisseur',
      trace: 'Trace de recherche',
    },
  },
  workspaceActions: {
    title: "Actions d'espace de travail",
    description: "Examinez et approuvez les actions d'écriture automatisées avant leur exécution.",
    approve: 'Approuver',
    reject: 'Rejeter',
    cancel: 'Annuler',
    rejectTitle: "Rejeter l'action",
    rejectDesc: 'Vous pouvez fournir une raison facultative pour rejeter cette action.',
    rejectReasonPlaceholder: 'Raison (facultative)',
    confirmReject: 'Confirmer le rejet',
    connector: 'Connecteur',
    rejectionReason: 'Raison du rejet',
    pendingApproval: 'Approbation en attente',
    executing: 'En exécution',
    executed: 'Exécutée',
    failed: 'Échouée',
    rejected: 'Rejetée',
    noActions: 'Aucune action trouvée',
    noActionsDesc:
      "Les actions d'écriture automatisées créées par l'IA apparaîtront ici pour examen.",
    loadFailed: 'Échec du chargement des actions.',
    viewPayload: 'Voir la charge utile',
    requestedAt: 'demandée {value}',
    reviewedAt: 'examinée {value}',
    executedAt: 'exécutée {value}',
    approved: 'Approuvé',
    expired: 'Expiré',
    edited: 'Modifié',
  },
  workspaceProviders: {
    catalog: {
      title: "Catalogue de fournisseurs d'espace de travail",
      description: "Parcourez les intégrations d'espace de travail prises en charge.",
      loadFailed: 'Échec du chargement du catalogue des fournisseurs.',
      emptyTitle: 'Aucun fournisseur disponible',
      emptyDescription: "Aucun fournisseur d'espace de travail n'est encore enregistré.",
      available: 'Disponible',
      comingSoon: 'Bientôt disponible',
      objectTypes: "types d'objets",
      docs: 'Documentation',
    },
    appConfigs: {
      title: "Configurations d'applications de fournisseurs",
      description:
        "Enregistrez les applications OAuth et les identifiants des fournisseurs d'espace de travail.",
      createButton: 'Nouvelle configuration',
      createTitle: "Créer une configuration d'application de fournisseur",
      createDescription: "Enregistrez les identifiants OAuth ou un jeton d'accès personnel.",
      create: 'Créer',
      creating: 'Création...',
      editTitle: "Modifier la configuration de l'application fournisseur",
      editDescription:
        'Mettez à jour les valeurs de configuration et les métadonnées de ce fournisseur. Laissez les champs secrets vides pour les conserver inchangés.',
      editSecretHint:
        'Les champs secrets laissés vides conserveront leur valeur précédemment stockée. Remplissez-les uniquement pour pivoter les identifiants.',
      save: 'Enregistrer',
      saving: 'Enregistrement…',
      provider: 'Fournisseur',
      providerPlaceholder: 'Sélectionnez un fournisseur...',
      name: 'Nom',
      namePlaceholder: 'ex. application GitHub de production',
      authMode: "Mode d'authentification",
      descriptionLabel: 'Description',
      descriptionPlaceholder: 'Notes facultatives sur cette configuration',
      test: 'Tester',
      connect: 'Connecter',
      testResult: 'Résultat du test : {status} ({latency} ms)',
      secretStored: 'Secret stocké',
      emptyTitle: 'Aucune configuration de fournisseur',
      emptyDescription:
        "Ajoutez vos premiers identifiants de fournisseur pour activer les connecteurs d'espace de travail.",
      loadFailed: "Échec du chargement des configurations d'applications.",
      fields: {
        secret: '(secret)',
      },
      columns: {
        name: 'Nom',
        provider: 'Fournisseur',
        authMode: 'Authentification',
        status: 'Statut',
        secret: 'Secret',
        lastValidated: 'Dernière validation',
        actions: 'Actions',
      },
      errors: {
        nameRequired: 'Un nom est requis.',
      },
    },
    oauthCallback: {
      exchangingTitle: 'Finalisation de la connexion...',
      exchangingDescription: "Échange du code d'autorisation avec le fournisseur.",
      successTitle: 'Connecté !',
      successDescription: "Redirection vers l'espace de travail...",
      successDescriptionNamed: '{name} connecté. Redirection en cours...',
      errorTitle: 'Échec de la connexion',
      errorUnknown: 'Une erreur inconnue est survenue.',
    },
  },
  agent: {
    title: 'Agent de bureau',
    description: 'Gérez les agents de bureau connectés et les commandes de terminal.',
    loading: "Chargement des sessions d'agent...",
    loadFailed: "Échec du chargement des données de l'agent.",
    noSessions: 'Aucune session active',
    noSessionsDesc: "Démarrez l'agent de bureau Claw sur votre machine pour vous connecter.",
    noCommands: 'Aucune commande',
    noCommandsDesc: 'Les commandes de terminal en attente apparaîtront ici.',
    noRepos: 'Aucun dépôt',
    noReposDesc: "Les dépôts détectés par l'agent apparaîtront ici.",
    terminal: 'Commandes de terminal',
    terminalDesc: "Approuvez ou rejetez les commandes de terminal demandées par l'agent.",
    capabilities: 'File des capacités',
    capabilitiesDesc:
      "Approuvez ou rejetez les appels de capacités sur le système de fichiers, les processus, le navigateur et d'autres classes.",
    capabilityClass: 'Classe',
    capabilityOperation: 'Opération',
    blastRadius: "Rayon d'impact",
    reversibility: 'Réversibilité',
    riskScore: 'Score de risque',
    matchedPolicy: 'Politique correspondante',
    activity: "Activité de l'agent",
    activityDesc: 'Capacités récentes et exécutions de recettes sur tous vos appareils.',
    autoApproved: 'Approuvé automatiquement',
    denied: 'Refusé',
    rolledBack: 'Annulé',
    recipes: 'Recettes',
    recipesDesc: 'Automatisations multi-étapes qui enchaînent des appels de capacités.',
    noRecipes: 'Aucune recette pour le moment',
    noRecipesDesc: 'Créez une recette pour automatiser des flux multi-étapes.',
    recipeRunDetail: "Détail d'exécution",
    recipeRunDetailDesc: "Progression en direct de l'exécution d'une recette.",
    runStatus: "Statut d'exécution",
    cancelRun: "Annuler l'exécution",
    steps: 'Étapes',
    marketplace: 'Marché de Recettes',
    marketplaceDesc: 'Parcourez et installez des recettes signées publiées par la communauté.',
    noListings: 'Aucune annonce pour le moment',
    noListingsDesc: 'Lorsque des éditeurs publient des recettes signées, elles apparaissent ici.',
    install: 'Installer',
    activityMemory: "Mémoire d'activité",
    activityMemoryDesc:
      "Entrées d'activité synchronisées dans le cloud depuis vos appareils (opt-in).",
    noActivity: "Aucune entrée d'activité pour le moment",
    noActivityDesc:
      "L'activité enregistrée sur vos appareils n'apparaît ici qu'après opt-in à la sync cloud.",
    repos: 'Dépôts',
    reposDesc: 'dépôts détectés',
    pendingCommands: 'Commandes en attente',
    pendingApproval: 'Approbation en attente',
    recentCommands: 'Commandes récentes',
    approve: 'Approuver',
    reject: 'Rejeter',
    version: 'Version',
    commands: 'commandes',
    files: 'fichiers',
    dirty: 'Modifié',
    connect: {
      title: 'Connecter un appareil',
      approveDescription: "Examinez les détails de l'appareil et les portées avant d'approuver.",
      scopesLabel: 'Permissions (portées)',
      approveButton: 'Approuver',
      denyButton: 'Annuler',
      successTitle: 'Appareil appairé',
      successBody: 'Vous pouvez fermer cet onglet et retourner à votre terminal.',
      expiredTitle: "Lien d'appairage invalide ou expiré",
      expiredBody: 'Exécutez de nouveau `claw-agent login` pour démarrer un nouvel appairage.',
      deniedTitle: 'Approbation annulée',
      deniedBody: "Aucun identifiant n'a été émis. Vous pouvez fermer cet onglet.",
      accountMismatchTitle: 'Mauvais compte',
      accountMismatchBody:
        'Connectez-vous avec le compte auquel vous souhaitez appairer cet appareil.',
      deviceNamePlaceholder: 'ex. Mon MacBook Pro',
    },
    rejectedByUser: "Rejeté par l'utilisateur",
  },
  discovery: {
    title: 'Découverte de modèles',
    description: 'Découvrez, classifiez et approuvez dynamiquement de nouveaux modèles Ollama.',
    searchPlaceholder: 'Rechercher des candidats...',
    filter: {
      status: 'Statut',
      all: 'Tous',
      pending: 'En attente',
      approved: 'Approuvés',
      rejected: 'Rejetés',
      imported: 'Importés',
      duplicate: 'Doublon',
    },
    actions: {
      refresh: 'Lancer la découverte',
      dryRun: 'Simulation',
      approve: 'Approuver',
      reject: 'Rejeter',
    },
    runs: {
      title: 'Exécutions de découverte récentes',
      empty: 'Aucune exécution de découverte. Cliquez sur « Lancer la découverte » pour commencer.',
      discovered: 'découverts',
      imported: 'importés',
      skipped: 'ignorés',
    },
    candidates: {
      title: 'Candidats',
      empty: {
        title: 'Aucun candidat',
        description: 'Déclenchez une exécution de découverte pour trouver de nouveaux modèles.',
      },
    },
    candidate: {
      size: 'Taille',
      confidence: 'Confiance',
    },
    packs: {
      title: 'Packs matériels',
      empty: 'Aucun pack matériel configuré.',
      install: 'Installer le pack',
      noModelsYet: 'Aucun modèle ne correspond à ce profil.',
    },
  },
  validation: {
    required: 'Ce champ est requis',
    invalidEmail: 'Veuillez saisir une adresse e-mail valide',
    tooShort: 'Doit comporter au moins {min} caractères',
    tooLong: 'Doit comporter au plus {max} caractères',
    invalidUrl: 'Veuillez saisir une URL valide',
    fileTooLarge: 'La taille du fichier dépasse le maximum autorisé',
    invalidFileType: "Ce type de fichier n'est pas pris en charge",
  },
  toast: {
    loginSuccess: 'Connexion réussie',
    loginFailed: 'Échec de la connexion',
    logoutFailed: 'Échec de la déconnexion',
    sessionExpired: 'Session expirée, veuillez vous reconnecter',
  },
  accessibility: {
    closeSidebar: 'Fermer la barre latérale',
    openSidebar: 'Ouvrir la barre latérale',
    toggleSidebar: 'Basculer la barre latérale',
    userMenu: 'Menu utilisateur',
    closeDialog: 'Fermer la boîte de dialogue',
    openMenu: 'Ouvrir le menu',
    search: 'Rechercher',
    openSearch: 'Ouvrir la recherche',
    closeSearch: 'Fermer la recherche',
    navigation: 'Navigation principale',
    notifications: 'Notifications',
    languageSelector: 'Sélectionner la langue',
    themeToggle: 'Basculer le thème',
    resizeInput: 'Redimensionner la zone de saisie',
  },
  actions: {
    test: 'Tester',
    testing: 'Test en cours...',
    sync: 'Synchroniser',
    syncing: 'Synchronisation...',
    archive: 'Archiver',
    unarchive: 'Désarchiver',
    pin: 'Épingler',
    unpin: 'Désépingler',
    duplicate: 'Dupliquer',
    copy: 'Copier',
    copied: 'Copié',
    copyToClipboard: 'Copier dans le presse-papiers',
    view: 'Voir',
    viewAll: 'Voir tout',
    viewDetails: 'Voir les détails',
    download: 'Télécharger',
    upload: 'Téléverser',
    refresh: 'Actualiser',
    reset: 'Réinitialiser',
    apply: 'Appliquer',
    approve: 'Approuver',
    approving: 'Approbation...',
    reject: 'Rejeter',
    rejecting: 'Rejet...',
    reload: 'Recharger',
    reconnect: 'Reconnecter',
    expand: 'Agrandir',
    collapse: 'Réduire',
    enable: 'Activer',
    disable: 'Désactiver',
    remove: 'Retirer',
    add: 'Ajouter',
    select: 'Sélectionner',
    selectAll: 'Tout sélectionner',
    deselectAll: 'Tout désélectionner',
    clear: 'Effacer',
    submit: 'Soumettre',
    more: 'Plus',
    less: 'Moins',
    showMore: 'Afficher plus',
    showLess: 'Afficher moins',
  },
  logs: {
    allLevels: 'Tous les niveaux',
    allActions: 'Toutes les actions',
    allSeverities: 'Toutes les sévérités',
    allMethods: 'Toutes les méthodes',
    methodPlaceholder: 'Méthode',
    componentPlaceholder: 'Composant...',
    actionPlaceholder: 'Action...',
    routePlaceholder: 'Route...',
    routeRegexPlaceholder: 'Route (regex)...',
    userIdPlaceholder: 'ID utilisateur...',
    messageContainsPlaceholder: 'Message contient...',
    servicePlaceholder: 'Service...',
    controllerPlaceholder: 'Contrôleur...',
    entityTypePlaceholder: "Type d'entité...",
    startDate: 'Date de début',
    endDate: 'Date de fin',
    fullTextSearch: 'Recherche plein texte...',
    searchAllFields: 'Rechercher dans tous les champs...',
    avgLatency: 'Latence moyenne',
    errors: 'Erreurs',
    failedToLoadClient: 'Échec du chargement des journaux client',
    failedToLoadClientDesc: 'Impossible de récupérer les journaux client depuis le serveur',
    failedToLoadServer: 'Échec du chargement des journaux serveur',
    failedToLoadServerDesc: 'Impossible de récupérer les journaux serveur depuis le serveur',
    levelDistribution: 'Distribution par niveau',
    loadingClient: 'Chargement des journaux client...',
    loadingServer: 'Chargement des journaux serveur...',
    noActionData: "Aucune donnée d'action",
    noClientLogs: 'Aucun journal client',
    noClientLogsActivityDesc: "Aucune activité de journal client n'a encore été enregistrée",
    noComponentData: 'Aucune donnée de composant',
    noServerLogs: 'Aucun journal serveur',
    noServerLogsActivityDesc: "Aucune activité de journal serveur n'a encore été enregistrée",
    noServiceData: 'Aucune donnée de service',
    percentOfTotal: '% du total',
    topActions: 'Actions principales',
    topComponents: 'Composants principaux',
    topServices: 'Services principaux',
    totalLogs: 'Total des journaux',
  },
  gmail: {
    page: {
      title: 'Gmail',
      description: 'Parcourez et gérez vos messages Gmail synchronisés.',
      empty_title: 'Aucun e-mail synchronisé',
      empty_description:
        "Aucun e-mail n'a encore été synchronisé. Déclenchez une synchronisation sur votre connecteur Gmail.",
      error_title: 'Impossible de charger les e-mails',
      no_connector_title: 'Aucun connecteur Gmail trouvé',
      no_connector_description:
        "Connectez un compte Gmail dans les connecteurs d'espace de travail pour parcourir votre boîte de réception.",
    },
    message: {
      from: 'De',
      to: 'À',
      date: 'Date',
      subject: 'Objet',
      reply: 'Répondre',
      open_in_gmail: 'Ouvrir dans Gmail',
      unread: 'Non lu',
      attachments: 'Pièces jointes ({count})',
      download: 'Télécharger {name}',
      htmlIframeTitle: 'Corps de l’e-mail',
      toggleHtml: 'Basculer HTML',
      showHtml: 'Afficher HTML',
      toggleImages: 'Basculer images',
      loadImages: 'Charger les images',
      imagesBlocked: 'Images bloquées',
    },
    actions: {
      summarize: 'Résumer',
      draft_reply: 'Rédiger une réponse',
      extract_tasks: 'Extraire les tâches',
      send_email: 'Envoyer un e-mail',
      draft_sent: 'Brouillon créé — vérifiez dans Approbations',
      draft_failed: 'Échec de la création du brouillon',
    },
  },
  jira: {
    page: {
      title: 'Jira',
      description: 'Parcourez et gérez les tickets Jira synchronisés.',
      empty_title: 'Aucun ticket synchronisé',
      empty_description:
        "Aucun ticket Jira n'a encore été synchronisé. Déclenchez une synchronisation sur votre connecteur Jira pour charger les tickets.",
      error_title: 'Impossible de charger les tickets',
      no_connector_title: 'Aucun connecteur Jira trouvé',
      no_connector_description:
        'Connectez un compte Jira dans les Connecteurs Workspace pour commencer à parcourir vos tickets.',
    },
    ticket: {
      status: 'Statut',
      priority: 'Priorité',
      assignee: 'Assigné',
      reporter: 'Rapporteur',
      project: 'Projet',
      sprint: 'Sprint',
      story_points: "Points d'histoire",
      due_date: 'Échéance',
      labels: 'Étiquettes',
      issue_type: 'Type',
      open_in_jira: 'Ouvrir dans Jira',
      unassigned: 'Non assigné',
      no_sprint: 'Aucun sprint',
    },
    actions: {
      summarize: 'Résumer',
      write_comment: 'Écrire un commentaire',
      extract_tasks: 'Extraire les tâches',
    },
  },
  source_control: {
    page: {
      title: 'Contrôle de source',
      description: 'Parcourez les pull requests de GitHub, GitLab et Bitbucket.',
      empty_title: 'Aucune pull request synchronisée',
      empty_description:
        "Aucune pull request n'a encore été synchronisée. Déclenchez une synchronisation sur votre connecteur de contrôle de source.",
      error_title: 'Impossible de charger les pull requests',
      no_connector_title: 'Aucun connecteur de contrôle de source trouvé',
      no_connector_description:
        'Connectez GitHub, GitLab ou Bitbucket dans les Connecteurs Workspace.',
    },
    pr: {
      author: 'Auteur',
      source_branch: 'De',
      target_branch: 'Vers',
      reviewers: 'Réviseurs',
      additions: 'Ajouts',
      deletions: 'Suppressions',
      labels: 'Étiquettes',
      draft: 'Brouillon',
      open_pr: 'Ouvrir la PR',
      state_open: 'Ouvert',
      state_closed: 'Fermé',
      state_merged: 'Fusionné',
      review_approved: 'Approuvé',
      review_changes: 'Modifications demandées',
      review_pending: 'Révision en attente',
    },
    actions: {
      review: 'Réviser la PR',
      summarize: 'Résumer',
      extract_tasks: 'Extraire les tâches',
    },
  },
  slack: {
    page: {
      title: 'Slack',
      description: 'Parcourez et gérez les messages Slack synchronisés.',
      empty_title: 'Aucun message synchronisé',
      empty_description:
        "Aucun message Slack n'a encore été synchronisé. Déclenchez une synchronisation sur votre connecteur Slack.",
      error_title: 'Impossible de charger les messages',
      no_connector_title: 'Aucun connecteur Slack trouvé',
      no_connector_description: 'Connectez un workspace Slack dans les Connecteurs Workspace.',
    },
    message: {
      channel: 'Canal',
      sender: 'De',
      date: 'Date',
      thread_reply: 'Réponse en fil',
      open_in_slack: 'Ouvrir dans Slack',
      reactions: 'Réactions',
    },
    actions: {
      summarize: 'Résumer',
      reply: 'Rédiger une réponse',
      extract_tasks: 'Extraire les tâches',
    },
  },
  confluence: {
    page: {
      title: 'Confluence',
      description: 'Parcourez et gérez les pages Confluence synchronisées.',
      empty_title: 'Aucune page synchronisée',
      empty_description:
        "Aucune page Confluence n'a encore été synchronisée. Déclenchez une synchronisation sur votre connecteur Confluence.",
      error_title: 'Impossible de charger les pages',
      no_connector_title: 'Aucun connecteur Confluence trouvé',
      no_connector_description:
        "Connectez un espace de travail Confluence dans les connecteurs d'espace de travail pour parcourir les pages.",
    },
    article: {
      space: 'Espace',
      author: 'Auteur',
      modified_by: 'Modifié par',
      version: 'Version',
      labels: 'Étiquettes',
      parent: 'Parent',
      open_page: 'Ouvrir dans Confluence',
    },
    actions: {
      summarize: 'Résumer',
      extract_tasks: 'Extraire les tâches',
      write_comment: 'Écrire un commentaire',
    },
  },
  docs: {
    page: {
      title: 'Documents',
      description:
        'Parcourez et gérez les documents synchronisés depuis Google Drive, OneDrive et SharePoint.',
      empty_title: 'Aucun document synchronisé',
      empty_description:
        "Aucun document n'a encore été synchronisé. Déclenchez une synchronisation sur votre connecteur Drive ou SharePoint.",
      error_title: 'Impossible de charger les documents',
      no_connector_title: 'Aucun connecteur de documents trouvé',
      no_connector_description:
        "Connectez Google Drive, OneDrive ou SharePoint dans les connecteurs d'espace de travail pour parcourir les documents.",
    },
    file: {
      owner: 'Propriétaire',
      modified_by: 'Modifié par',
      size: 'Taille',
      type: 'Type',
      open_file: 'Ouvrir le fichier',
      shared_with: 'Partagé avec',
      path: 'Chemin',
    },
    actions: {
      summarize: 'Résumer',
      extract_tasks: 'Extraire les tâches',
      draft_email: 'Rédiger un e-mail',
    },
  },
  figma: {
    page: {
      title: 'Figma',
      description: 'Parcourir et gérer les fichiers de design Figma synchronisés.',
      empty_title: 'Aucun design trouvé',
      empty_description: "Aucun fichier de design Figma n'a encore été synchronisé.",
      error_title: 'Échec du chargement des designs',
      no_connector_title: 'Figma non connecté',
      no_connector_description:
        'Connectez votre espace de travail Figma pour parcourir les designs.',
    },
    design: {
      team: 'Équipe',
      project: 'Projet',
      modified_by: 'Modifié par',
      components: 'Composants',
      open_in_figma: 'Ouvrir dans Figma',
      last_updated: 'Dernière mise à jour',
    },
    actions: {
      summarize: 'Résumer le design',
      extract_components: 'Extraire les composants',
      draft_spec: 'Rédiger la spécification',
    },
  },
  workflow: {
    page: {
      title: 'Workflows multi-espaces',
      description:
        'Sélectionnez des objets de plusieurs fournisseurs et exécutez des actions IA sur le contexte combiné.',
      empty_title: 'Aucun objet trouvé',
      empty_description: "Aucun objet d'espace de travail n'a encore été synchronisé.",
      error_title: 'Impossible de charger les objets',
    },
    object: {
      add: 'Ajouter',
      remove: 'Supprimer',
      selected_count: 'objets sélectionnés',
      clear_all: 'Tout effacer',
    },
    actions: {
      summarize_all: 'Tout résumer',
      extract_requirements: 'Extraire les exigences',
      draft_prd: 'Rédiger le PRD',
    },
  },
  gpuBadge: {
    cpuOnly: 'CPU uniquement',
    noGpu: 'Aucun GPU détecté — cliquez pour voir les modèles locaux',
    vendor: {
      nvidia: 'NVIDIA',
      amd: 'AMD ROCm',
      metal: 'Metal',
      intel: 'Intel/Vulkan',
      unknown: 'GPU',
      cpu: 'CPU',
    },
  },
  localFrontier: {
    title: 'Modèles Frontier locaux',
    subtitle:
      'Exécutez localement des LLM frontier à poids ouverts (Kimi K2, GLM-5.1, DeepSeek V3.2/V4).',
    loading: 'Chargement du catalogue…',
    catalogEmpty: 'Aucun modèle ne correspond aux filtres.',
    catalogError: 'Échec du chargement du catalogue. Vérifiez claw-llamacpp-service.',
    contextLength: 'tokens de contexte',
    requiresRamGb: 'Go RAM',
    sourceLink: 'HuggingFace',
    actions: {
      download: 'Télécharger',
      load: 'Charger',
      unload: 'Décharger',
      deleteWeights: 'Supprimer les poids',
      configure: 'Configurer le runtime',
    },
    download: { start: 'Télécharger', cancel: 'Annuler', retry: 'Réessayer' },
    compat: {
      fits: 'Compatible avec votre matériel',
      warns: 'Matériel limité',
      refuses: 'Matériel insuffisant',
    },
    qualityTier: { survival: 'Survie', balanced: 'Équilibré', best: 'Meilleur' },
    preflight: {
      RAM_INSUFFICIENT: 'Mémoire vive insuffisante pour ce modèle.',
      DISK_INSUFFICIENT: 'Espace disque insuffisant (non remplaçable).',
      GPU_INSUFFICIENT: 'Aucun GPU compatible détecté.',
      BINARY_NOT_INSTALLED: "Le binaire llama-server n'est pas encore installé.",
      RUNTIME_INCOMPATIBLE: 'Le runtime installé ne peut pas exécuter ce modèle.',
    },
    override: {
      warning:
        'Votre matériel est en dessous des exigences. Outrepassez uniquement si vous comprenez le risque.',
      confirmTypeSize: 'Saisissez la taille du modèle en Go pour confirmer :',
    },
    delete: {
      confirm: 'Supprimer les poids ?',
      confirmTypePrompt: 'Tapez le nom du modèle (ex. glm-5.1:Q4_K_M) pour confirmer.',
    },
    hardware: {
      title: 'Matériel et runtime',
      subtitle: 'Aperçu en direct de cette machine et du binaire llama.cpp.',
      refresh: 'Actualiser',
      ram: 'RAM',
      disk: 'Disque',
      cpu: 'CPU',
      gpu: 'GPU',
      binary: 'Binaire',
      cores: 'cœurs',
      noGpu: 'Aucun GPU détecté',
      notInstalled: 'Non installé',
      loadedModel: 'Modèle chargé',
      noLoadedModel: 'Aucun chargé',
    },
    filters: {
      category: 'Catégorie',
      qualityTier: 'Niveau de qualité',
      compatibleOnly: 'Compatibles uniquement',
      refreshCatalog: 'Actualiser le catalogue',
      refreshing: 'Actualisation…',
      allCategories: 'Toutes les catégories',
      allTiers: 'Tous les niveaux',
      categoryCoding: 'Code',
      categoryReasoning: 'Raisonnement',
      categoryThinking: 'Pensée',
      categoryGeneral: 'Général',
      categoryFileGen: 'Génération de fichiers',
    },
    downloads: {
      title: 'Téléchargements actifs',
      empty: 'Aucun téléchargement actif ou récent.',
      cancel: 'Annuler',
      retry: 'Réessayer',
      remove: 'Fermer',
      status: 'Statut',
      bytes: 'Octets',
      files: 'Fichiers',
      rate: 'Débit',
      eta: 'ETA',
      unknown: 'Préparation…',
    },
    deleteDialog: {
      title: 'Supprimer les poids',
      description: 'Supprime définitivement les poids téléchargés du disque.',
      promptLabel: 'Tapez pour confirmer',
      placeholder: 'modèle:tag',
      cancel: 'Annuler',
      confirm: 'Supprimer les poids',
      warning: 'Irréversible. Vous devrez télécharger à nouveau pour utiliser ce modèle.',
    },
    overrideDialog: {
      title: 'Outrepasser la vérification matérielle ?',
      description: 'Votre machine ne satisfait pas aux spécifications recommandées.',
      reasonsTitle: 'Raisons :',
      cancel: 'Annuler',
      proceed: 'Télécharger quand même',
    },
    configDialog: {
      title: 'Configuration du runtime',
      description: 'Ajustez les paramètres llama.cpp pour le modèle chargé.',
      ngpuLayers: 'Couches GPU',
      ngpuLayersHint: 'Nombre de couches sur GPU. Vide = automatique.',
      ctxSize: 'Taille du contexte',
      ctxSizeHint: 'Fenêtre de contexte maximale en tokens.',
      threads: 'Threads CPU',
      threadsHint: 'Nombre de threads CPU. Vide = automatique.',
      cpuMoe: 'CPU MoE',
      cpuMoeHint: 'Exécuter les couches mixture-of-experts uniquement sur CPU.',
      customArgs: 'Args personnalisés',
      customArgsHint: 'Flags llama-server supplémentaires (allowlist appliquée).',
      cancel: 'Annuler',
      save: 'Enregistrer',
    },
  },

  emailTemplates: {
    page: {
      title: 'Modèles d’e-mail',
      description:
        "Points de départ réutilisables (objet + corps) pour les e-mails rédigés par l'IA. Les {{placeholders}} sont remplis lors de l'utilisation du modèle.",
      loading: 'Chargement des modèles…',
      error: 'Impossible de charger les modèles. Actualisez la page.',
      empty: "Aucun modèle pour l'instant. Créez-en un pour commencer.",
      create: 'Nouveau modèle',
      edit: 'Modifier',
      delete: 'Supprimer',
      deleting: 'Suppression…',
      defaultBadge: 'Par défaut',
      subjectLabel: 'Objet',
    },
    dialog: {
      createTitle: 'Créer un modèle',
      editTitle: 'Modifier le modèle',
      nameLabel: 'Nom',
      namePlaceholder: 'E-mail de relance',
      subjectLabel: 'Objet',
      subjectPlaceholder: 'Suivi concernant {{topic}}',
      bodyLabel: 'Corps',
      bodyPlaceholder: 'Bonjour {{name}},\n\nJe reviens vers vous au sujet de {{topic}}…',
      defaultLabel: 'Utiliser par défaut',
      save: 'Enregistrer',
      saving: 'Enregistrement…',
      cancel: 'Annuler',
    },
  },

  inbox: {
    page: {
      title: 'Boîte de l’espace de travail',
      description:
        'Cross-provider feed of every recent workspace object — filter by provider, type, attention.',
      loading: 'Chargement de la boîte…',
      loadingMore: 'Chargement…',
      loadMore: 'Charger plus',
      empty: 'Aucun élément ne correspond aux filtres.',
      error: 'Impossible de charger la boîte. Essayez d’actualiser.',
    },
    filter: {
      providers: 'Fournisseur :',
      types: 'Type :',
      needsAttention: 'Nécessite attention',
      hasSuggestion: 'A une suggestion',
      reset: 'Réinitialiser',
    },
    row: {
      needsAttention: 'Nécessite attention',
      hasSuggestion: 'A une suggestion',
      mark: 'Marquer pour attention',
      unmark: 'Effacer attention',
      openExternal: 'Ouvrir',
      viewFile: 'Voir le fichier',
    },
  },
  fileViewer: {
    loading: 'Chargement du fichier…',
    error: 'Impossible de charger ce fichier.',
    unsupported:
      "Aperçu indisponible pour ce type de fichier. Utilisez Télécharger pour l'ouvrir en local.",
    download: 'Télécharger',
    close: 'Fermer',
  },
  search: {
    page: {
      title: 'Recherche sémantique',
      description:
        'Recherche sur tous vos objets — embeddings locaux respectueux de la vie privée.',
      placeholder: 'Type a natural-language question…',
      submit: 'Rechercher',
      searching: 'Recherche…',
      reset: 'Réinitialiser',
      local: 'Embeddings locaux ({model})',
      noResults: 'Aucun résultat. Essayez d’autres mots.',
      error: 'La recherche a échoué. Réessayez.',
    },
  },
  digest: {
    page: {
      title: 'Récap',
      description: 'Votre brief matinal : ce qui a changé partout.',
      loading: 'Chargement du récap…',
      error: 'Impossible de charger le récap.',
      noTodayDigest: 'Pas encore de récap aujourd’hui. Déclenchez ou attendez le cron.',
      today: 'Récap d’aujourd’hui',
      history: 'Récap précédents',
      generatedAt: 'Généré {ts}',
      sectionsCount: '{n} sections',
      triggerDaily: 'Déclencher récap quotidien',
      triggerWeekly: 'Déclencher récap hebdomadaire',
      triggering: 'Génération…',
      preferenceHint: 'Livraison quotidienne : {hour}:00 ({tz})',
    },
    section: {
      highlights: 'Points clés',
      actionItems: 'Actions à mener',
    },
  },
  adminAutomation: {
    dismiss: 'Ignorer',
    retry: 'Réessayer',
    policies: {
      title: 'Politiques d’actions IA',
      description:
        'Règles d’approbation strictes par défaut. Les valeurs par défaut du système peuvent être désactivées mais pas supprimées.',
      loading: 'Chargement des politiques…',
      error: 'Impossible de charger les politiques.',
      empty: 'Aucune politique configurée.',
      systemDefault: 'Par défaut système',
      priority: 'Priorité {p}',
      providerRegex: 'Regex de fournisseur',
      actionKindRegex: 'Regex de type d’action',
      riskCeiling: 'Plafond de risque',
      delete: 'Supprimer',
      cannotDelete: 'Les valeurs par défaut système ne peuvent pas être supprimées',
      toggleActive: 'Basculer actif',
      toggleSucceeded: 'Politique mise à jour.',
      toggleFailed: 'Impossible de mettre à jour la politique.',
      deleteSucceeded: 'Politique supprimée.',
      deleteFailed: 'Impossible de supprimer la politique.',
      mutationError: 'Une erreur s’est produite lors de la mise à jour de la politique.',
      addPolicy: 'Ajouter une politique',
      editPolicy: 'Modifier la politique',
      createTitle: 'Créer une politique',
      editTitle: 'Modifier la politique',
      createDescription:
        'Définissez une nouvelle règle d’approbation pour les actions d’espace de travail rédigées par IA.',
      editDescription: 'Mettre à jour cette règle d’approbation. Le nom ne peut pas être modifié.',
      createSucceeded: 'Politique créée.',
      createFailed: 'Impossible de créer la politique.',
      updateSucceeded: 'Politique mise à jour.',
      updateFailed: 'Impossible de mettre à jour la politique.',
      submit: 'Enregistrer la politique',
      submitting: 'Enregistrement…',
      nameLabel: 'Nom',
      nameHelp: 'Identifiant en kebab-case minuscule (ex. deny-pii).',
      descriptionLabel: 'Description',
      kindFieldLabel: 'Type',
      requireReasonLabel: 'Exiger un motif pour HIGH/CRITICAL',
      isActiveLabel: 'Active',
      riskMaxScoreLabel: 'Score de risque maximal (0–100)',
      priorityLabel: 'Priorité (0–10000)',
      kindLabel: {
        DENY: 'Refuser',
        ALLOW: 'Autoriser',
        AUTO_APPROVE: 'Auto-approuver',
      },
      riskLabel: {
        LOW: 'Faible',
        MEDIUM: 'Moyen',
        HIGH: 'Élevé',
        CRITICAL: 'Critique',
      },
    },
    rules: {
      title: 'Règles de déclenchement',
      description:
        'Règles qui transforment les événements bruts du fournisseur en suggestions de brouillon. Modifier, désactiver ou supprimer.',
      loading: 'Chargement des règles…',
      error: 'Impossible de charger les règles.',
      empty: 'Aucune règle configurée.',
      systemDefault: 'Par défaut système',
      priority: 'Priorité {p}',
      eventType: "Type d'événement",
      actionKind: "Type d'action",
      providerRegex: 'Regex de fournisseur',
      contentRegex: 'Regex de contenu',
      delete: 'Supprimer',
      cannotDelete: 'Les valeurs par défaut système ne peuvent pas être supprimées',
      toggleActive: 'Basculer actif',
      toggleSucceeded: 'Règle mise à jour.',
      toggleFailed: 'Impossible de mettre à jour la règle.',
      deleteSucceeded: 'Règle supprimée.',
      deleteFailed: 'Impossible de supprimer la règle.',
      mutationError: 'Une erreur s’est produite lors de la mise à jour de la règle.',
      addRule: 'Ajouter une règle',
      editRule: 'Modifier la règle',
      createTitle: 'Créer une règle',
      editTitle: 'Modifier la règle',
      createDescription:
        'Définissez à quel moment rédiger une suggestion à partir d’un événement d’espace de travail.',
      editDescription:
        'Mettre à jour cette règle de déclenchement. Le nom ne peut pas être modifié.',
      createSucceeded: 'Règle créée.',
      createFailed: 'Impossible de créer la règle.',
      updateSucceeded: 'Règle mise à jour.',
      updateFailed: 'Impossible de mettre à jour la règle.',
      submit: 'Enregistrer la règle',
      submitting: 'Enregistrement…',
      nameLabel: 'Nom',
      nameHelp: 'Identifiant en kebab-case minuscule (ex. github-pr-opened).',
      descriptionLabel: 'Description',
      eventTypeHelp: 'Modèle d’événement tel que workspace.webhook.received.',
      actionKindHelp: 'Type d’action tel que SUMMARIZE, DRAFT, REWRITE.',
      isActiveLabel: 'Active',
      priorityLabel: 'Priorité (0–10000)',
    },
  },
  adminWebhooks: {
    page: {
      title: 'Livraisons webhook',
      description: 'Inspecter et rejouer les livraisons webhook entrantes de vos fournisseurs.',
      loading: 'Chargement des livraisons…',
      error: 'Échec du chargement des livraisons webhook.',
      empty: 'Aucune livraison ne correspond à vos filtres.',
    },
    filter: {
      providerPlaceholder: 'Filtrer par fournisseur (ex. GITHUB)',
      connectorPlaceholder: 'Filtrer par ID de connecteur',
      signaturePlaceholder: 'Statut de signature',
      signatureAny: 'Toute signature',
      signatureValid: 'Signature valide',
      signatureInvalid: 'Signature invalide',
      clear: 'Effacer les filtres',
    },
    row: {
      deliveryId: 'ID de livraison',
      connector: 'Connecteur',
      bytes: 'Octets du corps',
      processedAt: 'Traité le',
    },
    status: {
      accepted: 'Accepté',
      rejected: 'Rejeté',
      idempotent: 'Idempotent',
    },
    replay: 'Rejouer',
    replaying: 'Relecture…',
    replaySucceeded: 'Livraison du webhook rejouée.',
    replayFailed: 'Impossible de rejouer la livraison du webhook.',
  },
  implHandoff: {
    page: {
      title: 'Remises de code',
      description:
        'Approved IMPL_PROMPT actions delivered to chat threads, agent terminals, or clipboard.',
      loading: 'Chargement des remises…',
      error: 'Impossible de charger les remises.',
      empty: 'Aucune remise. Approuvez un IMPL_PROMPT dans la file.',
      openThread: 'Ouvrir le fil →',
    },
    picker: {
      title: 'Envoyer IMPL_PROMPT à…',
      description: 'Choisissez où livrer le brief de code approuvé.',
      cancel: 'Annuler',
      CHAT: { hint: 'Ouvrir un nouveau fil pré-chargé avec le brief' },
      AGENT: { hint: 'Déposer dans la file de la console de l’agent connecté' },
      CLIPBOARD: { hint: 'Copier dans le presse-papiers pour outil externe' },
    },
  },
  learned: {
    panel: {
      title: 'Ce que nous avons appris',
      subtitle: '{count} preferences',
      description:
        'Patterns derived from your approve / reject / edit decisions. Used to personalise future suggestions.',
      loading: 'Chargement…',
      error: 'Impossible de charger les préférences.',
      empty: 'Nous apprendrons de vos approbations — pas encore de préférences.',
    },
  },
};
