import type { TranslationMap } from './types';

// French (Français) translations. Keys mirror en.ts; missing/
// English-identical values fall back to English via I18nContext.resolveEn().
const messages: TranslationMap = {
  // Cross-host vault (#4278)
  'crossHostVault.title': "Le coffre se trouve sur l'hôte du cœur.",
  'crossHostVault.message':
    "Ce coffre de mémoire est stocké sur l'hôte openhuman-core ({os}). Il ne peut être ouvert ou affiché que sur cette machine, pas depuis cet appareil.",
  'conversations.backgroundTasks.title': 'Background tasks',
  'nav.feedback': 'Donner mon avis',
  'feedback.board': 'Tableau des suggestions',
  'feedback.empty': 'Aucune suggestion pour le moment. Soyez le premier à partager une idée.',
  'feedback.loadMore': 'Charger plus',
  'feedback.loadError': 'Échec du chargement des suggestions',
  'feedback.expand': 'Afficher plus',
  'feedback.collapse': 'Afficher moins',
  'feedback.comments': 'commentaires',
  'feedback.viewIssue': 'Voir le ticket',
  'feedback.status.open': 'Ouverte',
  'feedback.status.planned': 'Prévue',
  'feedback.status.completed': 'Terminée',
  'feedback.status.closed': 'Fermée',
  'feedback.type.feature': 'Fonctionnalité',
  'feedback.type.bug': 'Bug',
  'feedback.sort.hot': 'Tendances',
  'feedback.sort.top': 'Populaires',
  'feedback.sort.new': 'Récentes',
  'feedback.filter.allTypes': 'Tous les types',
  'feedback.filter.allStatuses': 'Tous les statuts',
  'feedback.vote.up': 'Voter pour',
  'feedback.vote.down': 'Voter contre',
  'feedback.submit.heading': 'Partagez votre avis',
  'feedback.submit.subheading':
    'Proposez une fonctionnalité ou signalez un bug. Les autres peuvent voter.',
  'feedback.submit.titlePlaceholder': 'Titre',
  'feedback.submit.bodyPlaceholder': 'Décrivez votre idée ou le problème rencontré',
  'feedback.submit.action': 'Envoyer',
  'feedback.submit.success': 'Merci ! Votre suggestion est désormais sur le tableau.',
  'feedback.submit.rejected': 'Votre suggestion n’a pas pu être publiée.',
  'feedback.submit.error': 'Une erreur est survenue. Veuillez réessayer.',
  'feedback.admin.status': 'Statut',
  'feedback.admin.updateFailed': 'Échec de la mise à jour du statut',
  'feedback.comments.empty': 'Aucun commentaire pour le moment.',
  'feedback.comments.placeholder': 'Ajouter un commentaire',
  'feedback.comments.post': 'Publier',
  'feedback.comments.loadError': 'Échec du chargement des commentaires',
  'feedback.comments.postError': 'Échec de la publication du commentaire',
  'feedback.comments.you': 'Vous',
  'conversations.backgroundTasks.titleWithCount': 'Background tasks ({count})',
  'conversations.backgroundTasks.running': '{count} running',
  'conversations.backgroundTasks.noneRunning': 'none running',
  'conversations.backgroundTasks.total': '{count} total',
  'conversations.backgroundTasks.empty':
    'No background tasks in this chat. Ask the assistant to do something in the background and it shows up here.',
  'conversations.backgroundTasks.statusRunning': 'Running',
  'conversations.backgroundTasks.statusDone': 'Done',
  'conversations.backgroundTasks.statusFailed': 'Failed',
  'conversations.backgroundTasks.statusNeedsYou': 'Needs you',
  'conversations.backgroundTasks.statusCancelled': 'Annulé',
  'conversations.backgroundTasks.toolCallOne': '{count} tool call',
  'conversations.backgroundTasks.toolCallOther': '{count} tool calls',
  'conversations.backgroundTasks.steps': '{count} steps',
  'conversations.backgroundTasks.viewDetails': 'View details →',
  'conversations.backgroundTasks.close': 'Close',
  'conversations.backgroundTasks.sectionThisChat': 'Dans ce chat',
  'conversations.backgroundTasks.sectionScheduled': 'Tâches planifiées',
  'conversations.backgroundTasks.sectionSubconscious': 'Pensée subconsciente',
  'conversations.backgroundTasks.sectionMemory': 'Synchronisation de la mémoire',
  'conversations.backgroundTasks.cronEmpty': 'Aucune tâche planifiée.',
  'conversations.backgroundTasks.cronUnnamed': 'Tâche sans titre',
  'conversations.backgroundTasks.cronPaused': 'En pause',
  'conversations.backgroundTasks.cronNext': 'Prochaine {time}',
  'conversations.backgroundTasks.cronLast': 'Dernière exécution {time}',
  'conversations.backgroundTasks.cronNever': 'Pas encore exécutée',
  'conversations.backgroundTasks.cronSchedCron': 'Cron {expr}',
  'conversations.backgroundTasks.cronSchedEvery': 'Toutes les {duration}',
  'conversations.backgroundTasks.cronSchedAt': 'Une fois',
  'conversations.backgroundTasks.subOff': 'Désactivé',
  'conversations.backgroundTasks.subWorking': 'En cours…',
  'conversations.backgroundTasks.subIdle': 'Inactif',
  'conversations.backgroundTasks.subLastRan': 'Dernière exécution {time}',
  'conversations.backgroundTasks.subNeverRan': 'Pas encore exécutée',
  'conversations.backgroundTasks.subTicks': '{count} exécutions',
  'conversations.backgroundTasks.subQueued': '{count} en file d’attente',
  'conversations.backgroundTasks.memUpToDate': 'Tous les souvenirs à jour',
  'conversations.backgroundTasks.memIngesting': 'Indexation de {title}',
  'conversations.backgroundTasks.memIngestingUntitled': 'Indexation des souvenirs',
  'conversations.backgroundTasks.memQueued': '{count} en file d’attente',
  'conversations.backgroundTasks.memProviderActive': 'Synchronisation en cours',
  'conversations.backgroundTasks.memProviderRecent': 'Synchronisé récemment',
  'conversations.backgroundTasks.memProviderIdle': 'Inactif',
  'nav.home': 'Accueil',
  'nav.human': 'Humain',
  'nav.chat': 'Chat',
  'nav.assistant': 'Assistant',
  'assistant.faceMode.on': 'Parle avec Tiny',
  'assistant.faceMode.off': 'Parler à Tiny',
  'assistant.faceMode.turnOn': 'Afficher la mascotte',
  'assistant.faceMode.turnOff': 'Masquer la mascotte',
  'nav.connections': 'Connexions',
  'nav.memory': 'Intelligence',
  'nav.alerts': 'Alertes',
  'nav.rewards': 'Récompenses',
  'nav.settings': 'Paramètres',
  'nav.agentProfiles': "Profils d'agent",
  'nav.switchAgentProfile': "Changer de profil d'agent",
  'nav.defaultAgentProfile': 'Agent par défaut',
  'nav.noAgentProfiles': "Aucun profil d'agent trouvé",
  'nav.activity': 'Activité',
  'nav.brain': 'Cerveau',
  'nav.agentWorld': 'Tiny Place',
  'nav.wallet': 'Portefeuille',
  'agentWorld.description':
    'Tiny.Place est un réseau social pour les agents IA. Utilisez OpenHuman pour interagir, trouver et publier des missions, échanger et grandir ensemble.',
  'agentWorld.world': 'Monde',
  'agentWorld.world.booting': 'Démarrage du moteur de rendu...',
  'agentWorld.world.initError': 'Impossible de démarrer le moteur de rendu du monde.',
  'agentWorld.world.retry': 'Réessayer',
  'agentWorld.world.title': 'Tiny Place',
  'agentWorld.world.description':
    'Rejoignez tiny.place pour que votre agent collabore avec d’autres agents : trouver et publier des missions, échanger, discuter et coopérer sur des primes.',
  'agentWorld.world.room': 'Salle',
  'agentWorld.world.rooms.poker.name': 'Poker',
  'agentWorld.world.rooms.poker.description': 'Huit sièges autour d’une table en feutre.',
  'agentWorld.world.rooms.court.name': 'Tribunal',
  'agentWorld.world.rooms.court.description': 'Banc surélevé, jury et galerie.',
  'agentWorld.world.rooms.office.name': 'Bureau',
  'agentWorld.world.rooms.office.description': 'Box, bureaux et tableau blanc.',
  'agentWorld.world.rooms.home.name': 'Maison',
  'agentWorld.world.rooms.home.description': 'Un salon chaleureux avec canapés et tapis.',
  'agentWorld.world.rooms.outside.name': 'Monde',
  'agentWorld.world.rooms.outside.description': 'Une grande place ouverte entourée de bâtiments.',
  'agentWorld.feed': 'Fil',
  'agentWorld.ledger': 'Grand livre',
  'agentWorld.jobs': 'Missions',
  'agentWorld.bounties': 'Primes',
  'agentWorld.explore': 'Explorer',
  'agentWorld.directory': 'Annuaire',
  'agentWorld.identities': 'Identités',
  'agentWorld.profiles': 'Profils',
  'agentWorld.marketplace': 'Marché',
  'agentWorld.messaging': 'Messages',
  'agentWorld.walletNotConfigured': 'Portefeuille non configuré',
  'agentWorld.copyAddress': "Copier l'adresse",
  'agentWorld.addressCopied': 'Copié',
  'agentWorld.walletUnavailable': 'Portefeuille indisponible',
  'agentWorld.walletRetry': 'Réessayer de charger le portefeuille',
  // Agent World — Explore section live data
  'explore.networkOverview': 'Aperçu du réseau',
  'explore.trendingCommunities': 'Communautés tendance',
  'explore.activeJobs': 'Emplois actifs',
  'explore.featuredBounties': 'Primes en vedette',
  'explore.newAgents': 'Nouveaux agents',
  'explore.viewAll': 'Voir tout',
  'explore.noCommunities': 'Pas encore de communautés',
  'explore.noJobs': 'Aucun emploi actif',
  'explore.noBounties': 'Aucune prime ouverte',
  'explore.noAgents': 'Aucun agent enregistré',
  'agentWorld.jobs.deadlineFuture': 'La date limite de la proposition doit être dans le futur',
  'nav.avatarMenu.account': 'Compte',
  'nav.avatarMenu.billing': 'Facturation',
  'nav.avatarMenu.rewards': 'Récompenses',
  'nav.avatarMenu.invites': 'Inviter un ami',
  'nav.avatarMenu.wallet': 'Portefeuille',

  // Brain — full-page memory knowledge-graph surface
  'brain.subtitle': 'Votre graphe de connaissances, vos sources de mémoire et vos commandes.',
  'brain.tabs.memory': 'Mémoire',
  'brain.tabs.subconscious': 'Subconscient',
  'brain.tabs.graph': 'Graphe',
  'brain.tabs.goals': 'Objectifs',
  'brain.goals.title': 'Objectifs à long terme',
  'brain.goals.description':
    'Les objectifs durables de l’agent pour travailler avec vous. Modifiez-les ici ou laissez l’agent les mettre à jour.',
  'brain.goals.reflect': 'Réfléchir',
  'brain.goals.reflecting': 'Réflexion…',
  'brain.goals.reflectDone': 'Objectifs mis à jour.',
  'brain.goals.add': 'Ajouter',
  'brain.goals.addPlaceholder': 'Ajouter un objectif à long terme…',
  'brain.goals.empty':
    'Aucun objectif pour l’instant. Ajoutez-en un ou utilisez le bouton Réfléchir pour les générer à partir du contexte récent.',
  'brain.goals.editGoal': 'Modifier l’objectif',
  'brain.goals.deleteGoal': 'Supprimer l’objectif',
  'brain.goals.actionError': 'Une erreur s’est produite. Veuillez réessayer.',
  'brain.tabs.sources': 'Sources',
  'brain.tabs.sync': 'Synchronisation',
  'brain.tabs.tinyplaceOrchestration': 'TinyPlace',
  'tinyplaceOrchestration.title': 'Relais TinyPlace',
  'tinyplaceOrchestration.subtitle': "Canaux d'agents épinglés et chats de sessions app",
  'tinyplaceOrchestration.refresh': 'Actualiser',
  'tinyplaceOrchestration.pinned': 'Épinglés',
  'tinyplaceOrchestration.sessions': 'Sessions',
  'tinyplaceOrchestration.loading': 'Chargement des chats TinyPlace…',
  'tinyplaceOrchestration.paymentRequired': "L'accès à TinyPlace nécessite un paiement.",
  'tinyplaceOrchestration.failedToLoad': 'Échec du chargement des chats TinyPlace',
  'tinyplaceOrchestration.noSessions': "Aucune session d'app TinyPlace pour le moment.",
  'tinyplaceOrchestration.noMessages': "Aucun message dans ce chat pour l'instant.",
  'tinyplaceOrchestration.active': 'Active',
  'tinyplaceOrchestration.inactive': 'Inactive',
  'tinyplaceOrchestration.encryptedBody': 'Message TinyPlace chiffré',
  'tinyplaceOrchestration.unknownSender': 'Expéditeur inconnu',
  'tinyplaceOrchestration.master.title': 'Agent / humain',
  'tinyplaceOrchestration.master.subtitle': 'Chat maître',
  'tinyplaceOrchestration.master.preview': 'Coordination directe entre vous et OpenHuman.',
  'tinyplaceOrchestration.subconscious.title': 'Subconscient',
  'tinyplaceOrchestration.subconscious.subtitle': 'Chats internes des agents',
  'tinyplaceOrchestration.subconscious.preview':
    'Coordination des agents en arrière-plan et boucles de mémoire.',
  'tinyplaceOrchestration.session.subtitle': "Session d'app TinyPlace",
  'tinyplaceOrchestration.pairing.linkLabel': 'Lier une session',
  'tinyplaceOrchestration.pairing.linkPlaceholder': "Coller l'ID d'agent de session",
  'tinyplaceOrchestration.pairing.linkAction': 'Lier',
  'tinyplaceOrchestration.pairing.requests': 'Demandes de contact',
  'tinyplaceOrchestration.pairing.accept': 'Accepter',
  'tinyplaceOrchestration.pairing.decline': 'Refuser',
  'tinyplaceOrchestration.pairing.block': 'Bloquer',
  'tinyplaceOrchestration.pairing.linked': 'Liée',
  'tinyplaceOrchestration.pairing.pending': 'En attente',
  'tinyplaceOrchestration.pairing.unlinked': 'Non liée',
  'tinyplaceOrchestration.pairing.incoming': 'Entrantes',
  'tinyplaceOrchestration.pairing.outgoing': 'Sortantes',
  'brain.empty':
    'Votre cerveau est vide pour l’instant — connectez une source pour commencer à constituer votre mémoire.',
  'brain.error': 'Impossible de charger votre cerveau. Veuillez réessayer.',
  'common.cancel': 'Annuler',
  'common.save': 'Enregistrer',
  'common.confirm': 'Confirmer',
  'common.delete': 'Supprimer',
  'common.edit': 'Modifier',
  'common.create': 'Créer',
  'common.search': 'Rechercher',
  'common.loading': 'chargement…',
  'sync.runs': 'synchronisations',
  'sync.totalCost': 'total',
  'sync.when': 'Quand',
  'sync.source': 'Source',
  'sync.items': 'Éléments',
  'sync.tokens': 'Jetons',
  'sync.cost': 'Coût',
  'sync.duration': 'Durée',
  'sync.noAuditEntries': "Aucune synchronisation enregistrée pour l'instant.",
  'sync.timeAgo.justNow': "à l'instant",
  'sync.timeAgo.minutes': 'il y a {n} min',
  'sync.timeAgo.hours': 'il y a {n} h',
  'sync.timeAgo.days': 'il y a {n} j',
  'sync.status.success': 'Réussi',
  'sync.status.failed': 'Échec',
  'common.error': 'Erreur',
  'common.success': 'Succès',
  'common.back': 'Retour',
  'common.next': 'Suivant',
  'common.finish': 'Terminer',
  'common.close': 'Fermer',
  'common.enabled': 'Activé',
  'common.disabled': 'Désactivé',
  'common.on': 'Activé',
  'common.off': 'Désactivé',
  'common.yes': 'Oui',
  'common.no': 'Non',
  'common.ok': 'Compris',
  'common.name': 'Nom',
  'common.retry': 'Réessayer',
  'common.copy': 'Copier',
  'common.copied': 'Copié',
  'common.learnMore': 'En savoir plus',
  'common.seeAll': 'Voir',
  'common.dismiss': 'Ignorer',
  'common.clear': 'Effacer',
  'common.reset': 'Réinitialiser',
  'common.refresh': 'Actualiser',
  'common.export': 'Exporter',
  'common.import': 'Importer',
  'common.upload': 'Envoyer',
  'common.download': 'Télécharger',
  'common.add': 'Ajouter',
  'common.remove': 'Supprimer',
  'common.showMore': 'Afficher plus',
  'common.showLess': 'Afficher moins',
  'common.submit': 'Envoyer',
  'common.continue': 'Continuer',
  'common.comingSoon': 'Bientôt disponible',
  'common.breadcrumb': "Fil d'Ariane",
  'common.beta': 'Bêta',
  'common.betaDisclaimer':
    "Cette fonctionnalité est en bêta. Elle peut changer ou présenter des imperfections — vos retours nous aident à l'améliorer.",
  'settings.general': 'Général',
  // Settings layman groups (Phase 4 IA revamp)
  'settings.groups.account': 'Compte',
  'settings.groups.assistant': 'Assistant',
  'settings.groups.privacySecurity': 'Confidentialité et sécurité',
  'settings.groups.notifications': 'Notifications',
  'settings.groups.about': 'À propos',
  'settings.assistant.personality': 'Personnalité',
  'settings.personalityFace.title': 'Personnalité et visage',
  'settings.personalityFace.menuDesc':
    'Réglez le caractère de votre assistant et choisissez son visage',
  'settings.assistant.voice': 'Voix',
  'settings.assistant.voiceDesc': 'Paramètres de synthèse vocale et de reconnaissance vocale',
  'settings.assistant.faceMascot': 'Visage / Mascotte',
  'settings.assistant.backgroundActivity': 'Subconscient',
  'settings.assistant.backgroundActivityDesc':
    "Contrôler l'activité en arrière-plan de votre assistant",
  'settings.assistant.screenAwareness': "Conscience de l'écran",
  'settings.assistant.screenAwarenessDesc': "Permettre à l'assistant de voir votre fenêtre active",
  'settings.assistant.desktopCompanion': 'Compagnon de bureau',
  'settings.assistant.desktopCompanionDesc':
    'Mode compagnon toujours actif avec raccourci dans la barre système',
  'settings.assistant.permissions': 'Autorisations',
  'settings.assistant.permissionsDesc':
    "Choisissez ce que l'assistant peut faire et où il peut travailler",
  'settings.privacySecurity.privacy': 'Confidentialité',
  'settings.privacySecurity.privacyDesc': 'Contrôler quelles données quittent votre ordinateur',
  'settings.privacySecurity.security': 'Sécurité',
  'settings.privacySecurity.securityDesc': 'Sessions et options de connexion',
  'settings.privacySecurity.approvalsHistory': 'Approbations et historique',
  'settings.privacySecurity.approvalsHistoryDesc':
    "Examiner les décisions d'approbation récentes des outils",
  'settings.notifications.menuTitle': 'Notifications',
  'settings.notifications.menuDesc': "Boîte de réception d'alertes et préférences de notifications",
  'settings.devGroups.knowledgeMemory': 'Connaissance et mémoire',
  'settings.devGroups.agentsAutonomy': 'Agents et autonomie',
  'settings.devGroups.modelsInference': 'Modèles et inférence',
  'settings.devGroups.automationIntegrations': 'Automatisation et intégrations',
  'settings.devGroups.toolsCapabilities': 'Outils et capacités',
  'settings.devGroups.council': 'Conseil',
  'settings.analysisViews.title': 'Vues d’analyse',
  'settings.analysisViews.menuDesc':
    'Analyse du graphe mémoire — diagramme, centralité, cohésion, associations, fraîcheur, chronologie, chemins et espaces de noms',
  'settings.buildInfo.title': 'Infos de build/version',
  'settings.buildInfo.menuDesc': 'Build de l’application, version et détails de connexion du cœur',
  'settings.tokenUsage.title': 'Tokens et coût',
  'settings.tokenUsage.menuDesc':
    'Paramètres de compression et combien de tokens et de dollars ils ont économisés',
  'settings.tokenUsage.saving': 'Enregistrement…',
  'settings.tokenUsage.saved': 'Enregistré',
  'settings.tokenUsage.savingsTitle': 'Économies',
  'settings.tokenUsage.attributedTo': 'Coût calculé pour {model}',
  'settings.tokenUsage.tokensSaved': 'Tokens économisés',
  'settings.tokenUsage.costSaved': 'Coût économisé',
  'settings.tokenUsage.cacheOccupancy': 'Originaux mis en cache',
  'settings.tokenUsage.compactions': 'Compactages',
  'settings.tokenUsage.overEvents': 'sur {count} compactages',
  'settings.tokenUsage.byCompressor': 'Par compresseur',
  'settings.tokenUsage.refresh': 'Actualiser',
  'settings.tokenUsage.reset': 'Réinitialiser les statistiques',
  'settings.tokenUsage.compressionTitle': 'Compression',
  'settings.tokenUsage.compressionDesc':
    'Compactage adapté au contenu des grandes sorties d’outils avant leur entrée dans le contexte du modèle.',
  'settings.tokenUsage.routerEnabled': 'Activer la compression',
  'settings.tokenUsage.routerEnabledDesc': 'Interrupteur principal du routeur de contenu.',
  'settings.tokenUsage.search': 'Résultats de recherche',
  'settings.tokenUsage.searchDesc':
    'Classer la sortie grep/recherche par pertinence, en conservant les meilleures correspondances.',
  'settings.tokenUsage.code': 'Code source',
  'settings.tokenUsage.codeDesc': 'Conserver les signatures, replier le corps des fonctions.',
  'settings.tokenUsage.html': 'HTML',
  'settings.tokenUsage.htmlDesc': 'Supprimer le balisage pour obtenir un texte lisible.',
  'settings.tokenUsage.ml': 'Compresseur de texte ML',
  'settings.tokenUsage.mlDesc':
    'Modèle ModernBERT local pour le texte brut (nécessite l’environnement d’exécution Python).',
  'settings.tokenUsage.ccrTitle': 'Cache et récupération (CCR)',
  'settings.tokenUsage.ccrDesc':
    'Les originaux compactés sont mis en cache afin que l’agent puisse récupérer le texte complet à la demande.',
  'settings.tokenUsage.ccrEnabled': 'Conserver les originaux pour récupération',
  'settings.tokenUsage.ccrEnabledDesc':
    'Décharger l’original et ajouter un marqueur de récupération afin que rien ne soit perdu.',
  'settings.tokenUsage.ccrMinTokens': 'Taille minimale à mettre en cache',
  'settings.tokenUsage.ccrMinTokensDesc':
    'Ne mettre en cache et compacter avec perte que les résultats estimés à ce nombre de tokens ou plus.',
  'settings.tokenUsage.tokensUnit': 'tokens',
  'settings.tokenUsage.ccrDisk': 'Conserver le cache sur le disque',
  'settings.tokenUsage.ccrDiskDesc':
    'Conserver les originaux récupérables d’un redémarrage à l’autre.',
  'settings.dataSync.title': 'Synchronisation des données',
  'settings.dataSync.menuDesc': 'Ce que votre assistant synchronise — sources, fraîcheur et état',
  'settings.dataSync.description':
    'Gérez ce qui est synchronisé dans la mémoire de votre assistant : chaque source connectée avec sa dernière synchronisation, la quantité synchronisée et si une synchronisation est en cours.',
  'settings.devGroups.diagnosticsLogs': 'Diagnostics et journaux',
  'settings.featuresAndAI': 'Fonctionnalités & IA',
  'settings.billingAndRewards': 'Facturation & Récompenses',
  'settings.support': 'Assistance',
  'settings.advanced': 'Avancé',
  'settings.dangerZone': 'Zone de danger',
  'settings.account': 'Compte',
  'settings.accountDesc': 'Phrase de récupération, équipe, connexions et confidentialité',
  'settings.notifications': 'Notifications',
  'settings.notificationsDesc': 'Ne pas déranger et contrôles de notifications par compte',
  'settings.notifications.tabs.preferences': 'Préférences',
  'settings.notifications.tabs.routing': 'Routage',
  'settings.features': 'Fonctionnalités',
  'settings.featuresDesc': "Surveillance de l'écran, messagerie et outils",
  'settings.aiModels': 'IA & Modèles',
  'settings.aiModelsDesc':
    'Configuration des modèles IA locaux, téléchargements et fournisseur LLM',
  'settings.ai': 'Configuration IA',
  'settings.aiDesc': 'Fournisseurs cloud, modèles Ollama locaux et routage par charge de travail',
  'settings.billingUsage': 'Facturation & Utilisation',
  'settings.billingUsageDesc': "Plan d'abonnement, crédits et méthodes de paiement",
  'settings.rewards': 'Récompenses',
  'settings.rewardsDesc': 'Parrainages, coupons et crédits gagnés',
  'settings.restartTour': 'Relancer la visite',
  'settings.restartTourDesc': 'Rejouer la présentation du produit depuis le début',
  'settings.about': 'À propos',
  'settings.aboutDesc': "Version de l'application et mises à jour logicielles",
  'settings.developerOptions': 'Avancé',
  'settings.developerOptionsDesc':
    'Configuration IA, canaux de messagerie, outils, diagnostics et panneaux de débogage',
  'settings.developerDiagnostics': 'Développeur et Diagnostics',
  'settings.developerDiagnosticsDesc':
    'Outils avancés de développeur, diagnostics, mémoire, agents et panneaux de débogage',
  'settings.developerMode.title': 'Mode développeur',
  'settings.developerMode.description':
    'Afficher les outils avancés de développeur et de diagnostic',
  'settings.developerMode.enabledByBuild': 'Toujours activé dans les builds de développement',
  'settings.clearAppData': "Effacer les données de l'app",
  'settings.clearAppDataDesc':
    'Se déconnecter et supprimer définitivement toutes les données locales',
  'settings.logOut': 'Se déconnecter',
  'settings.logOutDesc': 'Se déconnecter de ton compte',
  'settings.exitLocalSession': 'Quitter le local session',
  'settings.exitLocalSessionDesc': "Retour à l'écran de connexion",
  'settings.language': 'Langue',
  'settings.navGroups.general': 'Général',
  'settings.navGroups.assistant': 'Assistant',
  'settings.navGroups.data': 'Données',
  'settings.navGroups.connections': 'Connexions',
  'settings.navGroups.system': 'Système',
  'settings.betaBuild': 'Version bêta - v{version}',
  'settings.languageDesc': "Langue d'affichage de l'interface",
  'settings.alerts': 'Alertes',
  'settings.alertsDesc': "Voir les alertes récentes et l'activité dans ta boîte de réception",
  'settings.account.profile': 'Profil',
  'settings.account.profileDesc': 'Nom, e-mail et avatar',
  'settings.account.devices': 'Appareils',
  'settings.account.devicesDesc': 'Associer et gérer les appareils mobiles',
  'settings.account.teamMembers': 'Équipe & membres',
  'settings.account.teamMembersDesc': "Gérer l'accès à l'équipe et les rôles des membres",
  'settings.account.dataMigration': 'Données & migration',
  'settings.account.dataMigrationDesc': 'Importer la mémoire depuis un autre assistant',
  'settings.account.recoveryPhrase': 'Phrase de récupération',
  'settings.account.recoveryPhraseDesc': 'Voir et sauvegarder ta phrase de récupération',
  'settings.account.team': 'Équipe',
  'settings.account.teamDesc': "Gérer les membres et les permissions de l'équipe",
  'settings.account.connections': 'Connexions',
  'settings.account.connectionsDesc': 'Gérer les comptes et services liés',
  'settings.account.privacy': 'Confidentialité',
  'settings.account.privacyDesc': 'Contrôler quelles données quittent ton ordinateur',
  'migration.title': 'Importer depuis un autre assistant',
  'migration.description':
    "Migrez la mémoire et les notes d'un autre assistant local vers cet espace de travail. Commencez par un Aperçu pour voir précisément ce qui changera, puis cliquez sur Appliquer pour copier les données. Votre mémoire actuelle est sauvegardée au préalable.",
  'migration.vendorLabel': 'Source',
  'migration.vendor.openclaw': 'OpenClaw',
  'migration.vendor.hermes': 'Hermes Agent',
  'migration.sourceLabel': "Chemin de l'espace de travail source (facultatif)",
  'migration.sourcePlaceholder':
    'Laisser vide pour détection automatique (p. ex. ~/.openclaw/workspace)',
  'migration.sourcePlaceholderHermes': 'Laisser vide pour la détection automatique (ex. ~/.hermes)',
  'migration.sourceHint':
    "Utilise l'emplacement par défaut du fournisseur si vide. Indiquez un chemin explicite si vous avez déplacé l'espace de travail.",
  'migration.previewAction': 'Aperçu',
  'migration.previewRunning': 'Aperçu en cours…',
  'migration.applyAction': "Appliquer l'import",
  'migration.applyRunning': 'Importation…',
  'migration.applyDisclaimer':
    'Appliquer est débloqué après un Aperçu réussi de la même source. La mémoire existante est sauvegardée avant tout import.',
  'migration.reportTitlePreview': "Aperçu — rien d'importé pour l'instant",
  'migration.reportTitleApplied': 'Importation terminée',
  'migration.report.source': 'Espace de travail source',
  'migration.report.target': 'Espace de travail cible',
  'migration.report.fromSqlite': 'Depuis SQLite (brain.db)',
  'migration.report.fromMarkdown': 'Depuis Markdown',
  'migration.report.imported': 'Importés',
  'migration.report.skippedUnchanged': 'Ignorés (inchangés)',
  'migration.report.renamedConflicts': 'Renommés en cas de conflit',
  'migration.report.warnings': 'Avertissements',
  'migration.report.previewHint':
    "Aucune donnée n'a encore été importée. Cliquez sur Appliquer l'import pour la copier.",
  'migration.report.appliedHint':
    'Les entrées importées sont maintenant dans votre mémoire. Relancez Aperçu pour comparer à nouveau.',
  'migration.confirmImport.singular':
    "Importer {count} entrée dans l'espace de travail actuel ?\n\nSource : {source}\nCible : {target}\n\nLa mémoire existante sera sauvegardée avant l'import.",
  'migration.confirmImport.plural':
    "Importer {count} entrées dans l'espace de travail actuel ?\n\nSource : {source}\nCible : {target}\n\nLa mémoire existante sera sauvegardée avant l'import.",
  'settings.notifications.doNotDisturb': 'Ne pas déranger',
  'settings.notifications.doNotDisturbDesc':
    'Mettre en pause toutes les notifications pendant une durée définie',
  'settings.notifications.channelControls': 'Contrôles par canal',
  'settings.notifications.channelControlsDesc':
    'Configurer les préférences de notifications pour chaque canal',
  'settings.features.screenAwareness': "Surveillance de l'écran",
  'settings.features.screenAwarenessDesc': "Permettre à l'assistant de voir ta fenêtre active",
  'settings.features.messaging': 'Messagerie',
  'settings.features.messagingDesc': "Paramètres d'intégration des canaux et de la messagerie",
  'settings.features.tools': 'Outils',
  'settings.features.toolsDesc': 'Gérer les outils et intégrations connectés',
  'settings.ai.localSetup': 'Configuration IA locale',
  'settings.ai.localSetupDesc': 'Télécharger et configurer les modèles IA locaux',
  'settings.ai.llmProvider': 'Fournisseur LLM',
  'settings.ai.llmProviderDesc': 'Choisir et configurer ton fournisseur IA',
  'clearData.title': "Effacer les données de l'app",
  'clearData.warning':
    'Cela va te déconnecter et supprimer définitivement les données locales, notamment :',
  'clearData.bulletSettings': "Paramètres de l'app et conversations",
  'clearData.bulletCache': "Toutes les données de cache d'intégration locales",
  'clearData.bulletWorkspace': "Données de l'espace de travail",
  'clearData.bulletOther': 'Toutes les autres données locales',
  'clearData.irreversible': 'Cette action est irréversible.',
  'clearData.clearing': 'Effacement des données…',
  'clearData.failed': "Échec de l'effacement des données et de la déconnexion. Réessaie.",
  'clearData.failedLogout': 'Échec de la déconnexion. Réessaie.',
  'clearData.failedPersist': "Échec de l'effacement de l'état persisté. Réessaie.",
  'welcome.logoAlt': 'OpenHuman',
  'welcome.title': 'Bienvenue sur OpenHuman',
  'welcome.subtitle':
    'Ton assistant IA personnel super-intelligent. Privé, simple et extrêmement puissant.',
  'welcome.connectPrompt': "Configurer l'URL RPC (Avancé)",
  'welcome.selectRuntime': 'Sélectionner un runtime',
  'welcome.clearingAppData': "Effacement des données de l'appli…",
  'welcome.clearAppDataAndRestart': "Effacer les données de l'appli et redémarrer",
  'welcome.clearAppDataWarning':
    "Cela efface les secrets et comptes stockés localement sur cet appareil. Votre compte cloud n'est pas affecté — vous pouvez vous reconnecter immédiatement après.",
  'welcome.resetErrorFallback':
    "Impossible d'effacer les données de l'appli. Quittez et rouvrez OpenHuman, puis réessayez.",
  'welcome.signingIn': 'Vous connecter...',
  'welcome.termsIntro': 'En continuant, vous acceptez les',
  'welcome.termsOfUse': 'Terms',
  'welcome.termsJoiner': 'et la',
  'welcome.privacyPolicy': 'Politique de confidentialité',
  'welcome.termsOutro': '.',
  'welcome.urlPlaceholder': 'http://localhost:8089',
  'welcome.invalidUrl': 'Saisis une URL HTTP ou HTTPS valide',
  'welcome.connecting': 'Test en cours',
  'welcome.connect': 'Tester',
  'home.greeting': 'Bonjour',
  'home.greetingAfternoon': 'Bon après-midi',
  'home.greetingEvening': 'Bonsoir',
  'home.askAssistant': "Pose n'importe quelle question à ton assistant…",
  'home.statusOk':
    'Ton assistant est prêt quand tu veux. Écris quelque chose ci-dessous pour commencer.',
  'home.statusBackendOnly':
    'Reconnexion au backend… ton agent sera de nouveau disponible dans quelques instants.',
  'home.statusCoreUnreachable':
    "Le processus local OpenHuman ne répond pas. Il a peut-être planté ou n'a pas démarré correctement.",
  'home.statusInternetOffline':
    "Ton appareil est hors ligne. Vérifie ta connexion ou redémarre l'app.",
  'home.restartCore': 'Redémarrer le core',
  'home.restartingCore': 'Redémarrage du core…',
  'home.themeToggle.toLight': 'Passer en mode clair',
  'home.themeToggle.toDark': 'Passer en mode sombre',
  'home.usageExhaustedTitle': 'Vous avez épuisé votre utilisation',
  'home.usageExhaustedBody':
    'Vous n’avez plus d’utilisation incluse pour le moment. Démarrez un abonnement pour débloquer davantage de capacité continue.',
  'home.usageExhaustedCta': 'Prendre un abonnement',
  'openrouterFree.cta': 'Utiliser les modèles gratuits OpenRouter',
  'openrouterFree.saving': 'Connexion à OpenRouter...',
  'openrouterFree.error':
    'Impossible de passer aux modèles gratuits OpenRouter. Vérifiez votre connexion OpenRouter et réessayez.',
  'home.routinesCard': 'Vos routines',
  'home.routinesActive': '{count} actif(s)',
  'routines.title': 'Vos Routines',
  'routines.subtitle': 'Choses que votre assistant fait automatiquement',
  'routines.loading': 'Chargement des routines…',
  'routines.empty': 'Pas encore de routines',
  'routines.emptyHint':
    'Votre assistant peut exécuter des tâches selon un planning — comme des briefings matinaux ou des résumés quotidiens.',
  'routines.refresh': 'Actualiser',
  'routines.nextRun': 'Prochaine course',
  'routines.lastRunSuccess': 'Dernière exécution réussie',
  'routines.lastRunFailed': 'Dernière exécution échouée',
  'routines.notRunYet': 'Pas encore exécuté',
  'routines.runNow': 'Cours maintenant',
  'routines.running': 'Course…',
  'routines.runNowTimedOut': 'Délai dépassé — veuillez rafraîchir et réessayer.',
  'routines.viewHistory': "Afficher l'historique",
  'routines.loadingHistory': 'Chargement…',
  'routines.noHistory': "Pas encore d'historique d'exécution.",
  'routines.statusSuccess': 'Succès',
  'routines.statusError': 'Erreur',
  'routines.showOutput': 'Afficher la sortie',
  'routines.hideOutput': 'Masquer la sortie',
  'routines.toggleEnabled': 'Activer ou désactiver cette routine',
  'routines.typeAgent': 'Agent',
  'routines.typeCommand': 'Commande',
  'nav.routines': 'Routines',
  'chat.newThread': 'Nouveau fil',
  'chat.newConversation': 'Nouvelle conversation',
  'chat.newWindowWelcome1': 'Bienvenue, {name} 👋',
  'chat.newWindowWelcome2': 'On y va, {name} 🧑‍🍳.',
  'chat.newWindowWelcome3': 'Place à la concentration 🧘🏻',
  'chat.typeMessage': "Comment puis-je t'aider aujourd'hui ?",
  'chat.send': 'Envoyer le message',
  'chat.stopGeneration': 'Arrêter la génération',
  'chat.parallelBranchHint': 'Saisir une branche parallèle — ⌘/Ctrl+Entrée pour envoyer',
  'chat.followupHint':
    'Mettre un suivi en file — envoyé après cette réponse · ⌘/Ctrl+Entrée pour une branche parallèle',
  'chat.queuedFollowups.label': 'Suivis en file',
  'chat.queuedFollowups.clear': 'Effacer',
  'chat.queuedFollowups.clearFailed': 'Impossible de vider la file — réessayez.',
  'chat.parallelBranchLabel': 'Branche parallèle',
  'chat.thinking': 'En train de réfléchir…',
  'chat.noMessages': "Aucun message pour l'instant",
  'chat.startConversation': 'Démarre une conversation',
  'chat.regenerate': 'Régénérer',
  'chat.copyResponse': 'Copier la réponse',
  'chat.citations': 'Citations',
  'chat.toolUsed': 'Outil utilisé',
  'scope.legacy': 'Hérité',
  'scope.user': 'Utilisateur',
  'scope.project': 'Projet',
  'skills.title': 'Connexions',
  'skills.search': 'Rechercher des connexions…',
  'skills.noResults': 'Aucune connexion trouvée',
  'skills.loadingIntegrations': 'Chargement des intégrations…',
  'skills.connect': 'Connecter',
  'skills.disconnect': 'Déconnecter',
  'skills.configure': 'Gérer',
  'skills.connected': 'Connecté',
  'skills.available': 'Disponible',
  'skills.addAccount': 'Ajouter un compte',
  'skills.channels': 'Messagerie',
  'skills.explorer.emptyCta': 'Installer depuis une URL',
  'skills.explorer.emptyDescription':
    'Installez un paquet SKILL.md ou placez des dossiers de style Hermes dans ~/.openhuman/skills.',
  'skills.explorer.emptyTitle': 'Aucune skill trouvée',
  'skills.explorer.installFromUrl': 'Installer depuis une URL',
  'skills.explorer.newSkill': 'Nouvelle skill',
  'skills.explorer.subtitle':
    'Parcourez les paquets SKILL.md, y compris markdown, scripts, références, modèles, exemples et prompts de style Hermes.',
  'skills.explorer.title': 'Explorateur de skills',
  'skills.explorer.searchPlaceholder': 'Rechercher des skills...',
  'skills.explorer.scopeUser': 'User',
  'skills.explorer.scopeProject': 'Project',
  'skills.explorer.scopeLegacy': 'Legacy',
  'skills.explorer.noDescription': 'Aucune description fournie.',
  'skills.explorer.uninstallSuccess': 'Compétence désinstallée avec succès.',
  'skills.explorer.registryTab': 'Registre',
  'skills.explorer.installedTab': 'Installées',
  'skills.explorer.allFormats': 'Tous les formats',
  'skills.explorer.refreshRegistry': 'Actualiser le registre',
  'skills.explorer.registryEmptyTitle': 'Aucune entrée dans le registre',
  'skills.explorer.registryEmptyDescription':
    'Impossible de charger le registre de compétences. Vérifiez votre connexion et réessayez.',
  'skills.explorer.showingOf':
    'Affichage de {shown} sur {total} résultats. Affinez votre recherche pour en voir plus.',
  'skills.explorer.installed': 'Installée',
  'skills.explorer.install': 'Installer',
  'skills.explorer.installing': 'Installation…',
  'skills.integrations': 'Intégrations Composio',
  'skills.integrationsSubtitle':
    'Connexions OAuth cloud — connectez-vous avec votre compte et Composio gère les jetons pour que les agents puissent lire et agir en votre nom. Aucune clé API à gérer.',
  'skills.composio.noApiKeyTitle': 'Aucune clé API Composio configurée',
  'skills.composio.noApiKeyDescription':
    'Le mode local utilise votre propre clé API Composio. Ouvrez Paramètres → Avancé → Composio pour en ajouter une avant de connecter des intégrations ici.',
  'skills.composio.noApiKeyCta': 'Ouvrir dans les paramètres',
  'skills.tabs.composio': 'Composio',
  'skills.tabs.channels': 'Canaux',
  'skills.tabs.explorer': 'Skills',
  'skills.tabs.meetings': 'Réunions Google Meet',
  'skills.tabs.mcp': 'MCP Serveurs',
  'connections.tabs.composio': 'Composio',
  'connections.tabs.channels': 'Canaux',
  'connections.tabs.mcp': 'Serveurs MCP',
  'connections.tabs.skills': 'Compétences',
  'connections.tabs.meetings': 'Réunions',
  'connections.groups.integrations': 'Intégrations',
  'connections.tabs.oauth': 'OAuth',
  'connections.tabs.composioKey': 'Composio',
  'connections.groups.apiKeys': 'Clés API',
  'connections.groups.intelligence': 'Intelligence',
  'memory.title': 'Mémoire',
  'memory.search': 'Rechercher dans la mémoire…',
  'memory.noResults': 'Aucun souvenir trouvé',
  'memory.empty':
    "Aucun souvenir pour l'instant. Les souvenirs sont créés automatiquement au fil de tes interactions.",
  'memory.tab.memory': 'Mémoire',
  'memory.tab.memoryTree': 'Arbre de mémoire',
  'memory.tab.tasks': 'Tâches',
  'memory.tab.tasksDescription':
    'Créez et suivez des tâches — vos propres listes de choses à faire ainsi que les tableaux que vos agents construisent au fil des conversations.',
  'memory.tab.subconscious': 'Subconscient',
  'memory.tab.agentWork': "Travail de l'agent",
  'memory.tab.agentWorkDescription':
    "Un centre de commande pour chaque exécution d'agent en arrière-plan, regroupée selon ce qui nécessite votre intervention, ce qui est en cours et ce qui est terminé.",
  'memory.tab.worktrees': 'Worktrees',
  'memory.tab.worktreesDescription':
    'Worktrees git isolés des workers d’agents parallèles — inspectez les modifications, ouvrez-les ou nettoyez-les.',
  'memory.tab.teams': 'Équipes',
  'memory.tab.teamsDescription':
    "Équipes d'agents coordonnées — qui s'occupe de chaque tâche, ce qui est bloqué et ce que les coéquipiers se disent entre eux.",
  'memory.tab.agents': 'Bibliothèque',
  'memory.tab.agentsDescription':
    'Parcourez et exécutez vos agents disponibles — chacun avec ses propres outils, capacités et domaine de spécialisation.',
  'memory.tab.workflows': 'Workflows',
  'memory.tab.workflowsDescription':
    "Procédures réutilisables et exécutables — un objectif et les étapes pour l'atteindre. Créez-en un, installez depuis une URL ou ouvrez un workflow pour l'exécuter.",
  'memory.tab.dreams': 'Rêves',
  'memory.tab.calls': 'Appels',
  'memory.tab.diagram': 'Diagram',
  'memory.tab.centrality': 'Centrality',
  'memory.tab.namespaces': 'Espaces de noms',
  'memory.tab.timeline': 'Timeline',
  'memory.tab.settings': 'Paramètres',
  'memory.analyzeNow': 'Analyser maintenant',
  'memoryTimeline.title': 'Chronologie de la mémoire',
  'memoryTimeline.intro':
    "Quand l'assistant a appris sur vous — faits regroupés par le mois de leur dernier renforcement. Montre la croissance, les pics d'activité et les périodes calmes.",
  'memoryTimeline.loading': 'Construction de la chronologie…',
  'memoryTimeline.errorPrefix': 'Impossible de charger le graphe :',
  'memoryTimeline.retry': 'Retry',
  'memoryTimeline.namespaceLabel': 'Namespace',
  'memoryTimeline.namespaceAll': 'Tous les espaces de noms',
  'memoryTimeline.empty': 'Pas encore de graphe de connaissances.',
  'memoryTimeline.emptyHint':
    "Lorsque l'assistant enregistrera des faits à votre sujet, la chronologie apparaîtra ici.",
  'memoryTimeline.metricTotal': 'Facts',
  'memoryTimeline.metricMonths': 'Mois actifs',
  'memoryTimeline.metricRecent': '30 derniers jours',
  'memoryTimeline.heading': 'Faits appris par mois',
  'memoryTimeline.busiestCaption': 'Le plus actif : {period} ({count})',
  'memoryTimeline.undatedNote': '{count} fait(s) sans date enregistrée.',
  'memoryTimeline.truncated': 'Affichage des {shown} plus récents sur {total} mois.',
  'namespaceOverview.title': 'Aperçu des espaces de noms',
  'namespaceOverview.intro':
    'Comment vos connaissances sont réparties entre les contextes — le nombre de faits et d’entités distinctes enregistrés dans chaque espace de noms.',
  'namespaceOverview.loading': 'Agrégation des espaces de noms…',
  'namespaceOverview.errorPrefix': 'Impossible de charger le graphique:',
  'namespaceOverview.retry': 'Réessayer',
  'namespaceOverview.empty': 'Pas encore de graphe de connaissances.',
  'namespaceOverview.emptyHint':
    'À mesure que l’assistant enregistre des faits entre les contextes, chaque espace de noms apparaîtra ici.',
  'namespaceOverview.metricNamespaces': 'Espaces de noms',
  'namespaceOverview.metricFacts': 'Faits',
  'namespaceOverview.metricEntities': 'Entités',
  'namespaceOverview.heading': 'Par espace de noms',
  'namespaceOverview.unnamespaced': '(sans espace de noms)',
  'namespaceOverview.factsLabel': '{count} faits',
  'namespaceOverview.entitiesLabel': '{count} entités',
  'namespaceOverview.entitiesShort': '{count} ent.',
  'namespaceOverview.truncated': 'Affichage des {shown} premiers espaces de noms sur {total}.',
  'graphCentrality.title': 'Centralité du graphe de connaissances',
  'graphCentrality.intro':
    "PageRank sur votre graphe de mémoire met en évidence les hubs porteurs de charge — et les entités connectrices qui relient des clusters autrement séparés, ce qu'un simple comptage de fréquence ne peut révéler.",
  'graphCentrality.loading': 'Calcul de la centralité…',
  'graphCentrality.errorPrefix': 'Impossible de charger le graphique:',
  'graphCentrality.retry': 'Réessayer',
  'graphCentrality.empty': 'Pas encore de graphe de connaissances.',
  'graphCentrality.emptyHint':
    "Au fur et à mesure que l'assistant enregistre des faits sur vous, les entités les plus connectées apparaîtront ici.",
  'graphCentrality.namespaceLabel': 'Espace de noms',
  'graphCentrality.namespaceAll': 'Tous les espaces de noms',
  'graphCentrality.metricEntities': 'Entités',
  'graphCentrality.metricConnections': 'Connexions',
  'graphCentrality.metricClusters': 'Groupes',
  'graphCentrality.clustersCaption': 'Clusters {components} · plus grandes poches {largest}',
  'graphCentrality.approximateBadge': 'approximatif',
  'graphCentrality.approximateTitle': "Arrêté à la limite d'itération avant convergence complète",
  'graphCentrality.rankedHeading': 'Principales entités par influence',
  'graphCentrality.colRank': '#',
  'graphCentrality.colEntity': 'Entité',
  'graphCentrality.colInfluence': 'Influence',
  'graphCentrality.colLinks': 'Liens',
  'graphCentrality.bridgeBadge': 'connecteur',
  'graphCentrality.bridgeTitle': 'Connecteur — plus influent que ne le suggère son nombre de liens',
  'graphCentrality.degreeTitle': '{in} en · {out} hors',
  'memory.tab.associations': 'Associations',
  'entityAssociations.title': "Associations d'entités",
  'entityAssociations.intro':
    'Les entités partageant de nombreuses connexions sont associées — même sans lien factuel direct. La similarité de Jaccard révèle ces associations cachées.',
  'entityAssociations.loading': 'Calcul des associations…',
  'entityAssociations.errorPrefix': 'Impossible de charger le graphe :',
  'entityAssociations.retry': 'Retry',
  'entityAssociations.empty': 'Aucune association pour le moment.',
  'entityAssociations.emptyHint':
    'Lorsque les entités partageront des connexions, les associations les plus fortes apparaîtront ici.',
  'entityAssociations.namespaceLabel': 'Namespace',
  'entityAssociations.namespaceAll': 'Tous les espaces de noms',
  'entityAssociations.metricEntities': 'Entities',
  'entityAssociations.metricPairs': 'Associations',
  'entityAssociations.rankedHeading': 'Associations les plus fortes',
  'entityAssociations.linkedBadge': 'linked',
  'entityAssociations.inferredBadge': 'inferred',
  'entityAssociations.linkedTitle': 'Ces entités sont directement connectées.',
  'entityAssociations.inferredTitle':
    'Aucun lien direct — associées uniquement par des connexions partagées.',
  'entityAssociations.sharedLabel': '{shared} partagées',
  'entityAssociations.pairTitle':
    '{jaccard} % similaires · {shared} sur {union} connexions partagées',
  'entityAssociations.truncated': "Affichage de {shown} sur {total} — les plus fortes d'abord.",
  'memory.tab.freshness': 'Freshness',
  'memoryFreshness.title': 'Fraîcheur des connaissances',
  'memoryFreshness.intro':
    "Les faits non reconfirmés récemment par l'assistant se dégradent selon une courbe d'oubli. Cela montre ce qui devient obsolète et mérite une vérification, pour ne pas considérer d'anciens faits comme certains.",
  'memoryFreshness.loading': 'Calcul de la fraîcheur…',
  'memoryFreshness.errorPrefix': 'Impossible de charger le graphe :',
  'memoryFreshness.retry': 'Retry',
  'memoryFreshness.empty': 'Pas encore de graphe de connaissances.',
  'memoryFreshness.emptyHint':
    "Lorsque l'assistant enregistrera des faits à votre sujet, leur fraîcheur sera suivie ici.",
  'memoryFreshness.namespaceLabel': 'Namespace',
  'memoryFreshness.namespaceAll': 'Tous les espaces de noms',
  'memoryFreshness.metricFresh': 'Fresh',
  'memoryFreshness.metricFading': 'Fading',
  'memoryFreshness.metricStale': 'Stale',
  'memoryFreshness.recallCaption': 'Rappel moyen {recall} % sur {total} faits',
  'memoryFreshness.queueHeading': 'File de reconfirmation',
  'memoryFreshness.queueTruncated':
    'Affichage de {shown} sur {total} — traitez ceux-ci en priorité.',
  'memoryFreshness.allFresh': 'Tous les faits sont encore frais — rien à reconfirmer.',
  'memoryFreshness.statusFading': 'fading',
  'memoryFreshness.statusStale': 'stale',
  'memoryFreshness.ageLabel': '{days} j',
  'memoryFreshness.recallTitle': '{recall} % rappel · demi-vie {halfLife} j',
  'memory.tab.path': 'Chemins',
  'connectionPath.title': 'Chemin de connexion',
  'connectionPath.intro':
    'Retracez la plus courte chaîne de relations reliant deux entités — comment le graphe les connecte, même à travers plusieurs sauts.',
  'connectionPath.loading': 'Chargement du graphe…',
  'connectionPath.errorPrefix': 'Impossible de charger le graphe :',
  'connectionPath.retry': 'Réessayer',
  'connectionPath.namespaceLabel': 'Espace de noms',
  'connectionPath.namespaceAll': 'Tous les espaces de noms',
  'connectionPath.sourceLabel': 'De',
  'connectionPath.targetLabel': 'À',
  'connectionPath.sourcePlaceholder': 'Entité de départ',
  'connectionPath.targetPlaceholder': "Entité d'arrivée",
  'connectionPath.prompt': 'Choisissez deux entités pour retracer leur connexion.',
  'connectionPath.empty': "Aucun graphe de connaissances pour l'instant.",
  'connectionPath.emptyHint':
    "Une fois que l'assistant aura enregistré des faits liés, vous pourrez retracer les connexions ici.",
  'connectionPath.resultHeading': 'Chemin le plus court',
  'connectionPath.pathSummary': "{length} saut(s) d'écart",
  'connectionPath.sameMessage': 'Choisissez deux entités différentes.',
  'connectionPath.missingSource': '« {entity} » ne figure pas dans le graphe.',
  'connectionPath.missingTarget': '« {entity} » ne figure pas dans le graphe.',
  'connectionPath.noPath': 'Aucune connexion trouvée entre « {source} » et « {target} ».',
  'memoryTree.status.title': 'Arbre de mémoire',
  'memoryTree.status.autoSyncLabel': 'Auto-synchronisation',
  'memoryTree.status.autoSyncDescription':
    'Pause pour arrêter la nouvelle ingestion. Le wiki existant reste consultable.',
  'memoryTree.status.statusTile': 'Statut',
  'memoryTree.status.lastSyncTile': 'Dernière synchronisation',
  'memoryTree.status.totalChunksTile': 'Morceaux totaux',
  'memoryTree.status.wikiSizeTile': 'Taille du wiki',
  'memoryTree.status.statusRunning': 'Course',
  'memoryTree.status.statusPaused': 'En pause',
  'memoryTree.status.statusSyncing': 'Synchronisation',
  'memoryTree.status.statusError': 'Erreur',
  'memoryTree.status.statusIdle': 'Inactif',
  'memoryTree.status.never': 'Jamais',
  'memoryTree.status.fetchError': "Impossible de récupérer l'état de l'arborescence de mémoire",
  'memoryTree.status.retry': 'Réessayer',
  'memoryTree.status.toggleFailed':
    "Impossible d'activer/désactiver la synchronisation automatique",
  'memoryTree.status.justNow': "à l'instant",
  'memoryTree.status.secondsAgo': '{count}s il y a',
  'memoryTree.status.minuteAgo': 'Il y a 1 minute',
  'memoryTree.status.minutesAgo': '{count} il y a quelques minutes',
  'memoryTree.status.hourAgo': 'Il y a 1 heure',
  'memoryTree.status.hoursAgo': '{count} il y a hr',
  'memoryTree.status.dayAgo': 'Il y a 1 jour',
  'memoryTree.status.daysAgo': '{count} il y a des jours',
  'memoryTree.status.integrationsTitle': 'Santé par intégration',
  'memoryTree.status.integrationsEmpty': 'Aucune intégration connectée',
  'memoryTree.status.integrationActive': 'Active',
  'memoryTree.status.integrationStale': 'Obsolète',
  'memoryTree.status.integrationChunks': 'Morceaux : {count}',
  'alerts.title': 'Alertes',
  'alerts.empty': "Aucune alerte pour l'instant",
  'alerts.markAllRead': 'Tout marquer comme lu',
  'alerts.unread': 'non lu',
  'rewards.title': 'Récompenses',
  'rewards.referrals': 'Parrainages',
  'rewards.coupons': 'Échanger',
  'rewards.localUnavailable':
    'La connexion locale ne permet pas de gagner des récompenses, des coupons ou du crédit de parrainage. Déconnecte-toi puis connecte-toi avec un compte OpenHuman si tu veux que les récompenses comptent.',
  'rewards.localUnavailableCta': 'Ouvrir les paramètres du compte',
  'rewards.credits': 'Crédits',
  'rewards.referralCode': 'Ton code de parrainage',
  'rewards.copyCode': 'Copier le code',
  'rewards.share': 'Partager',
  'onboarding.welcome': 'Salut. Je suis OpenHuman.',
  'onboarding.welcomeDesc':
    'Ton assistant IA super-intelligent qui tourne sur ton ordinateur. Privé, simple et extrêmement puissant.',
  'onboarding.context': 'Collecte de contexte',
  'onboarding.contextDesc': 'Connecte les outils et services que tu utilises tous les jours.',
  'onboarding.localAI': 'IA locale',
  'onboarding.localAIDesc': 'Configure un modèle IA local qui tourne sur ta machine.',
  'onboarding.chatProvider': 'Fournisseur de chat',
  'onboarding.chatProviderDesc': 'Choisis comment tu veux interagir avec ton assistant.',
  'onboarding.referral': 'Parrainage',
  'onboarding.referralDesc': 'Applique un code de parrainage si tu en as un.',
  'onboarding.finish': 'Terminer la configuration',
  'onboarding.finishDesc': 'Tout est prêt ! Commence à utiliser OpenHuman.',
  'onboarding.skip': 'Passer',
  'onboarding.getStarted': 'Démarrer',
  'onboarding.runtimeChoice.title': 'Comment veux-tu utiliser OpenHuman ?',
  'onboarding.runtimeChoice.subtitle':
    'Choisis la configuration qui te convient. Tu pourras la modifier plus tard dans les Paramètres.',
  'onboarding.runtimeChoice.cloud.title': 'Simple',
  'onboarding.runtimeChoice.cloud.tagline': 'Laisse OpenHuman tout gérer pour toi.',
  'onboarding.runtimeChoice.cloud.f1': 'Sécurité intégrée',
  'onboarding.runtimeChoice.cloud.f2': 'Compression de tokens pour aller plus loin',
  'onboarding.runtimeChoice.cloud.f3': 'Un abonnement, tous les modèles inclus',
  'onboarding.runtimeChoice.cloud.f4': 'Aucune clé API à gérer',
  'onboarding.runtimeChoice.cloud.f5': 'Facile à configurer',
  'onboarding.runtimeChoice.custom.title': 'Personnalisé',
  'onboarding.runtimeChoice.custom.tagline':
    'Utilise tes propres clés. Contrôle total sur ce que tu utilises.',
  'onboarding.runtimeChoice.custom.f1': 'Tu auras besoin de clés API pour presque tout',
  'onboarding.runtimeChoice.custom.f2': 'Réutilise les services que tu paies déjà',
  'onboarding.runtimeChoice.custom.f3': 'Peut être gratuit si tu fais tout tourner localement',
  'onboarding.runtimeChoice.custom.f4': "Plus de configuration, plus d'options",
  'onboarding.runtimeChoice.custom.f5': 'Idéal pour les utilisateurs avancés et les développeurs',
  'onboarding.runtimeChoice.cloud.creditHighlight': "Crédits gratuits à l'inscription",
  'onboarding.runtimeChoice.continueCloud': 'Continuer avec Simple',
  'onboarding.runtimeChoice.continueCustom': 'Continuer avec Personnalisé',
  'onboarding.runtimeChoice.recommended': 'Recommandé',
  'onboarding.runtimeChoice.exitError': "Impossible de terminer l'intégration. Veuillez réessayer.",
  'onboarding.apiKeys.title': 'Ajoutons tes clés API',
  'onboarding.apiKeys.subtitle':
    'Tu peux les coller maintenant ou passer et les ajouter plus tard dans Paramètres › IA. Les clés sont stockées sur cet appareil, chiffrées au repos.',
  'onboarding.apiKeys.openaiLabel': 'Clé API OpenAI',
  'onboarding.apiKeys.openaiPlaceholder': 'sk-...',
  'onboarding.apiKeys.openaiOauthHint':
    'Utilisez ChatGPT Plus/Pro (abonnement) ou une clé OpenAI API — les deux ne sont pas requis.',
  'onboarding.apiKeys.openaiOauthOpening': 'Ouverture de la connexion…',
  'onboarding.apiKeys.openaiOauthConnect': 'Se connecter avec ChatGPT',
  'onboarding.apiKeys.openaiOauthConnected': 'Connecté avec ChatGPT',
  'onboarding.apiKeys.openaiOauthCallbackHint':
    "Après connexion, collez l'URL de redirection complète depuis votre navigateur (commence par {url}).",
  'onboarding.apiKeys.oauthDesktopOnly':
    "La connexion à ChatGPT n'est disponible que dans l'application de bureau.",
  'onboarding.apiKeys.oauthStartFailed':
    'Impossible de démarrer la connexion à ChatGPT. Réessayez ou utilisez une clé API.',
  'onboarding.apiKeys.oauthPasteRedirect':
    "Collez l'URL de redirection depuis votre navigateur après vous être connecté.",
  'onboarding.apiKeys.oauthCompleteFailed':
    "La connexion à ChatGPT ne s'est pas terminée. Vérifiez l'URL de redirection et réessayez.",
  'onboarding.apiKeys.finishSignIn': 'Terminer la connexion à ChatGPT',
  'onboarding.apiKeys.orApiKey': 'ou clé API',
  'onboarding.apiKeys.anthropicLabel': 'Clé API Anthropic',
  'onboarding.apiKeys.anthropicPlaceholder': 'sk-ant-...',
  'onboarding.apiKeys.saveError': "Impossible d'enregistrer cette clé. Vérifie-la et réessaie.",
  'onboarding.apiKeys.skipForNow': "Passer pour l'instant",
  'onboarding.apiKeys.continue': 'Enregistrer et continuer',
  'onboarding.apiKeys.saving': 'Enregistrement…',
  'onboarding.custom.stepperInference': 'Inférence',
  'onboarding.custom.stepperVoice': 'Voix',
  'onboarding.custom.stepperOAuth': 'OAuth',
  'onboarding.custom.stepperSearch': 'Recherche',
  'onboarding.custom.stepperEmbeddings': 'Embeddings',
  'onboarding.custom.stepperMemory': 'Mémoire',
  'onboarding.custom.stepCounter': 'Étape {n} sur {total}',
  'onboarding.custom.defaultTitle': 'Par défaut',
  'onboarding.custom.defaultSubtitle': 'Laisse OpenHuman gérer ça pour toi.',
  'onboarding.custom.configureTitle': 'Configurer',
  'onboarding.custom.configureSubtitle': "Je choisis ce que j'utilise.",
  'onboarding.custom.progressAriaLabel': 'Progression de la configuration',
  'onboarding.custom.continue': 'Continuer',
  'onboarding.custom.back': 'Retour',
  'onboarding.custom.finish': 'Terminer la configuration',
  'onboarding.custom.configureLater':
    "Tu peux finaliser cette configuration après l'initialisation. On t'amènera sur la page Paramètres correspondante une fois que tu auras terminé.",
  'onboarding.custom.openSettings': 'Ouvrir dans les Paramètres',
  'onboarding.custom.inference.title': 'Inférence (texte)',
  'onboarding.custom.inference.subtitle':
    'Quel modèle de langage doit répondre à tes questions et faire tourner tes agents ?',
  'onboarding.custom.inference.defaultDesc':
    'OpenHuman dirige chaque charge de travail vers un modèle par défaut adapté. Aucune clé, aucune configuration.',
  'onboarding.custom.inference.configureDesc':
    "Utilise ta propre clé OpenAI ou Anthropic. On l'utilise pour toutes les tâches textuelles.",
  'onboarding.custom.voice.title': 'Voix',
  'onboarding.custom.voice.subtitle': 'Reconnaissance vocale et synthèse pour le mode voix.',
  'onboarding.custom.voice.defaultDesc':
    'OpenHuman inclut un STT/TTS géré qui fonctionne directement. Rien à configurer.',
  'onboarding.custom.voice.configureDesc':
    'Utilise ton propre ElevenLabs / OpenAI Whisper / etc. À configurer dans Paramètres › Voix.',
  'onboarding.custom.oauth.title': 'Connexions (OAuth)',
  'onboarding.custom.oauth.subtitle':
    'Gmail, Slack, Notion et autres services connectés nécessitant OAuth.',
  'onboarding.custom.oauth.defaultDesc':
    'OpenHuman gère un espace de travail Composio. Un clic pour connecter chaque service plus tard.',
  'onboarding.custom.oauth.configureDesc':
    'Utilise ton propre compte Composio / clé API. À configurer dans Paramètres › Connexions.',
  'onboarding.custom.search.title': 'Recherche web',
  'onboarding.custom.search.subtitle':
    'Comment OpenHuman effectue des recherches sur le web en ton nom.',
  'onboarding.custom.search.defaultDesc':
    'OpenHuman utilise un backend de recherche géré. Aucune clé nécessaire.',
  'onboarding.custom.search.configureDesc':
    'Utilise ta propre clé de fournisseur de recherche (Tavily, Brave, etc.). À configurer dans Paramètres › Outils.',
  'onboarding.custom.embeddings.title': 'Embeddings',
  'onboarding.custom.embeddings.subtitle':
    'Comment OpenHuman génère des embeddings vectoriels pour la recherche sémantique en mémoire.',
  'onboarding.custom.embeddings.defaultDesc':
    "OpenHuman utilise un service d'embedding géré. Aucune clé API requise.",
  'onboarding.custom.embeddings.configureDesc':
    "Utilisez votre propre fournisseur d'embeddings (OpenAI, Voyage, Ollama, etc.).",
  'onboarding.custom.memory.title': 'Mémoire',
  'onboarding.custom.memory.subtitle':
    'Comment OpenHuman mémorise ton contexte, tes préférences et tes conversations passées.',
  'onboarding.custom.memory.defaultDesc':
    'OpenHuman gère automatiquement le stockage et la récupération en mémoire. Rien à configurer.',
  'onboarding.custom.memory.configureDesc':
    'Inspecte, exporte ou efface la mémoire toi-même. À configurer dans Paramètres › Mémoire.',
  'accounts.addAccount': 'Ajouter un compte',
  'accounts.addApps': 'Ajouter des apps',
  'accounts.manageAccounts': 'Gérer les comptes',
  'accounts.noAccounts': 'Aucun compte connecté',
  'accounts.connectAccount': 'Connecte un compte pour démarrer',
  'accounts.agent': 'Agent',
  'accounts.respondQueue': 'File de réponses',
  'accounts.disconnect': 'Déconnecter',
  'accounts.disconnectConfirm': 'Es-tu sûr de vouloir déconnecter ce compte ?',
  'accounts.disconnectClearMemory': 'Supprimer aussi la mémoire de cette source',
  'accounts.disconnectClearMemoryHint':
    'Supprime définitivement les fragments de mémoire locaux liés à cette connexion.',
  'accounts.searchAccounts': 'Rechercher des comptes…',
  'channels.title': 'Canaux',
  'channels.configure': 'Configurer le canal',
  'channels.setup': 'Configuration',
  'channels.noChannels': 'Aucun canal configuré',
  'channels.localManagedUnavailable':
    'Les canaux gérés ne sont pas disponibles pour les utilisateurs locaux.',
  'channels.addChannel': 'Ajouter un canal',
  'channels.status.connected': 'Connecté',
  'channels.status.disconnected': 'Déconnecté',
  'channels.status.error': 'Erreur',
  'channels.status.configuring': 'Configuration en cours',
  'channels.defaultMessaging': 'Canal de messagerie par défaut',
  'channels.setAsDefault': 'Définir par défaut',
  'channels.defaultBadge': 'Par défaut',
  'webhooks.title': 'Webhooks',
  'webhooks.create': 'Créer un webhook',
  'webhooks.noWebhooks': 'Aucun webhook configuré',
  'webhooks.url': 'URL',
  'webhooks.secret': 'Secret',
  'webhooks.events': 'Événements',
  'webhooks.archiveDirectory': "Répertoire d'archive",
  'webhooks.todayFile': 'Fichier du jour',
  'invites.title': 'Invitations',
  'invites.create': 'Créer une invitation',
  'invites.noInvites': 'Aucune invitation en attente',
  'invites.code': "Code d'invitation",
  'invites.copyLink': 'Copier le lien',
  'invites.generate': 'Générer une invitation',
  'invites.generating': 'Génération…',
  'invites.refreshing': 'Actualisation des invitations…',
  'invites.loading': 'Chargement des invitations…',
  'invites.copyCodeAria': "Copier le code d'invitation",
  'invites.revokeAria': "Révoquer l'invitation",
  'invites.usedUp': 'Épuisée',
  'invites.uses': 'Utilise : {current}{max}',
  'invites.expiresOn': 'Expire le {date}',
  'invites.empty': 'Aucune invitation pour le moment',
  'invites.emptyHint': 'Générez un code d’invitation à partager',
  'invites.revokeTitle': 'Révoquer le code d’invitation',
  'invites.revokePromptPrefix': "Êtes-vous sûr de vouloir révoquer le code d'invitation",
  'invites.revokeWarning':
    'Ce code d’invitation ne sera plus valide et ne pourra plus être utilisé pour rejoindre l’équipe.',
  'invites.revoking': 'Révocation...',
  'invites.revokeAction': 'Révoquer l’invitation',
  'invites.failedGenerate': 'Échec de la génération de l’invitation',
  'invites.failedRevoke': 'Échec de la révocation de l’invitation',
  'team.refreshingMembers': 'Actualisation des membres...',
  'team.loadingMembers': 'Chargement des membres...',
  'team.memberCount': '{count} membre',
  'team.memberCountPlural': 'Membres {count}',
  'team.you': '(Vous)',
  'team.removeAria': 'Supprimer {name}',
  'team.noMembers': 'Aucun membre trouvé',
  'team.removeTitle': "Supprimer un membre de l'équipe",
  'team.removePromptPrefix': 'Êtes-vous sûr de vouloir supprimer',
  'team.removePromptSuffix': "de l'équipe ?",
  'team.removeWarning': "Il ou elle perdra l'accès à l'équipe et à toutes ses ressources.",
  'team.removing': 'Suppression...',
  'team.removeAction': 'Supprimer un membre',
  'team.changeRoleTitle': 'Modifier le rôle du membre',
  'team.changeRolePrompt': 'Changer le rôle de {name} de {oldRole} à {newRole} ?',
  'team.changeRoleAdminGrant':
    "Cela leur accordera les permissions d'administrateur complètes, y compris la possibilité de gérer les membres de l'équipe.",
  'team.changeRoleAdminRemove':
    "Cela supprimera leurs permissions d'administrateur et ils ne pourront plus gérer l'équipe.",
  'team.changing': 'Modification...',
  'team.changeRoleAction': 'Modifier le rôle',
  'team.failedChangeRole': 'Échec du changement de rôle',
  'team.failedRemoveMember': 'Échec de la suppression du membre',
  'devOptions.title': 'Avancé',
  'devOptions.titleDiagnostics': 'Développeur et Diagnostics',
  'devOptions.diagnostics': 'Diagnostics',
  'devOptions.diagnosticsDesc': 'Santé du système, journaux et métriques de performance',
  'devOptions.toolPolicyDiagnosticsDesc':
    'Inventaire des outils, posture de la politique, listes autorisées MCP et blocages récents',
  'devOptions.toolPolicyDiagnostics.loading': 'Chargement…',
  'devOptions.toolPolicyDiagnostics.unavailable': 'Diagnostics indisponibles',
  'devOptions.toolPolicyDiagnostics.posture.title': 'Position de la politique',
  'devOptions.toolPolicyDiagnostics.posture.autonomy': 'Autonomie:',
  'devOptions.toolPolicyDiagnostics.posture.workspaceOnly': 'Espace de travail uniquement:',
  'devOptions.toolPolicyDiagnostics.posture.maxActionsPerHour': 'Actions max/h :',
  'devOptions.toolPolicyDiagnostics.posture.approvalMediumRisk': 'Approbation (risque moyen):',
  'devOptions.toolPolicyDiagnostics.posture.blockHighRisk': 'Bloquer le haut risque:',
  'devOptions.toolPolicyDiagnostics.inventory.title': 'Inventaire',
  'devOptions.toolPolicyDiagnostics.inventory.totalTools': 'Outils totaux',
  'devOptions.toolPolicyDiagnostics.inventory.enabledTools': 'Outils activés',
  'devOptions.toolPolicyDiagnostics.inventory.mcpStdioTools': 'MCP outils stdio',
  'devOptions.toolPolicyDiagnostics.inventory.jsonRpcTools': 'Outils JSON-RPC',
  'devOptions.toolPolicyDiagnostics.mcpAllowlists.title': 'Listes blanches MCP',
  'devOptions.toolPolicyDiagnostics.mcpAllowlists.summary':
    'Activé : {enabled} · Serveurs : {enabledCount}/{totalCount}',
  'devOptions.toolPolicyDiagnostics.mcpAllowlists.unnamed': '<sans nom>',
  'devOptions.toolPolicyDiagnostics.mcpAllowlists.allowDeny': 'allow={allowCount} deny={denyCount}',
  'devOptions.toolPolicyDiagnostics.mcpWriteAudit.title': 'MCP écrire audit',
  'devOptions.toolPolicyDiagnostics.mcpWriteAudit.summary':
    'Activé: {enabled} · Récent (24h): {recentRows}',
  'devOptions.toolPolicyDiagnostics.recentBlocked.title': 'Appels récents bloqués',
  'devOptions.toolPolicyDiagnostics.recentBlocked.empty': 'Aucun appel bloqué enregistré.',
  'devOptions.toolPolicyDiagnostics.redactedSurfaces.title': 'Surfaces expurgées',
  'devOptions.toolPolicyDiagnostics.redactedSurfaces.summary':
    "Capable d'écrire: {writeCount} · Surfaces de politique: {policyCount}",
  'devOptions.debugPanels': 'Panneaux de débogage',
  'devOptions.debugPanelsDesc':
    "Indicateurs de fonctionnalités, inspection de l'état et outils de débogage",
  'devOptions.webhooks': 'Webhooks',
  'devOptions.webhooksDesc': 'Configurer et tester les intégrations webhook',
  'devOptions.memoryInspection': 'Inspection de la mémoire',
  'devOptions.memoryInspectionDesc': 'Parcourir, interroger et gérer les entrées de mémoire',
  'voice.pushToTalk': 'Appuyer pour parler',
  'voice.recording': 'Enregistrement…',
  'voice.processing': 'Traitement…',
  'voice.languageHint': 'Langue',
  'misc.rehydrating': 'Chargement de tes données…',
  'misc.checkingServices': 'Vérification des services…',
  'misc.serviceUnavailable': 'Service indisponible',
  'misc.somethingWentWrong': "Une erreur s'est produite",
  'misc.tryAgainLater': 'Réessaie plus tard.',
  'misc.restartApp': "Redémarrer l'app",
  'misc.updateAvailable': 'Mise à jour disponible',
  'misc.updateNow': 'Mettre à jour maintenant',
  'misc.updateLater': 'Plus tard',
  'misc.downloading': 'Téléchargement…',
  'misc.installing': 'Installation…',
  'misc.beta':
    "OpenHuman est en bêta anticipée. N'hésite pas à partager tes retours ou signaler des bugs — chaque rapport nous aide à avancer plus vite.",
  'misc.betaFeedback': 'Envoyer un retour',
  'mnemonic.title': 'Phrase de récupération',
  'mnemonic.warning': "Note ces mots dans l'ordre et conserve-les en lieu sûr.",
  'mnemonic.copyWarning':
    'Ne partage jamais ta phrase de récupération. Toute personne disposant de ces mots peut accéder à ton compte.',
  'mnemonic.copied': 'Phrase de récupération copiée dans le presse-papiers',
  'mnemonic.reveal': 'Afficher la phrase',
  'mnemonic.revealPhrase': 'Révéler la phrase de récupération',
  'mnemonic.hidden': 'La phrase de récupération est masquée',
  'privacy.title': 'Confidentialité & Sécurité',
  'privacy.description': 'Rapport de transparence sur les données envoyées aux services externes.',
  'privacy.empty': 'Aucun transfert de données externe détecté.',
  'privacy.whatLeavesComputer': 'Ce qui quitte ton ordinateur',
  'privacy.loading': 'Chargement des détails de confidentialité…',
  'privacy.loadError':
    "Impossible de charger la liste de confidentialité en direct. Les contrôles d'analyse ci-dessous fonctionnent toujours.",
  'privacy.noCapabilities':
    'Aucune fonctionnalité ne divulgue actuellement de mouvement de données.',
  'privacy.sentTo': 'Envoyé à',
  'privacy.leavesDevice': "Quitte l'appareil",
  'privacy.staysLocal': 'Reste local',
  'privacy.anonymizedAnalytics': 'Analyses produit',
  'privacy.shareAnonymizedData': 'Partager les analyses produit et les diagnostics',
  'privacy.shareAnonymizedDataDesc':
    "Aide à améliorer OpenHuman en partageant des rapports de plantage et des événements d'utilisation limités pour la confidentialité, incluant un ID de compte stable et les métadonnées de version de l'app. Les messages, clés de portefeuille, clés API et jetons de session ne sont jamais collectés.",
  'privacy.meetingFollowUps': 'Suivis de réunion',
  'privacy.autoHandoffMeet':
    "Transmettre automatiquement les transcriptions Google Meet à l'orchestrateur",
  'privacy.autoHandoffMeetDesc':
    "Quand un appel Google Meet se termine, l'orchestrateur d'OpenHuman peut lire la transcription et effectuer des actions comme rédiger des messages, planifier des suivis ou publier des résumés sur ton espace Slack connecté. Désactivé par défaut.",
  'privacy.analyticsDisclaimer':
    "Quand elles sont activées, les analyses produit et les diagnostics peuvent inclure des rapports de plantage et des événements d'utilisation limités pour la confidentialité, un ID de compte stable et les métadonnées de version de l'app. Les messages, clés de portefeuille, clés API et jetons de session ne sont jamais collectés. Tu peux modifier ce paramètre à tout moment.",
  'settings.about.version': 'Version',
  'settings.about.updateAvailable': 'disponible',
  'settings.about.softwareUpdates': 'Mises à jour logicielles',
  'settings.about.lastChecked': 'Dernière vérification',
  'settings.about.checking': 'Vérification…',
  'settings.about.checkForUpdates': 'Rechercher des mises à jour',
  'settings.about.releases': 'Versions',
  'settings.about.releasesDesc':
    'Parcourir les notes de version et les builds précédentes sur GitHub.',
  'settings.about.openReleases': 'Ouvrir les versions GitHub',
  'settings.about.connection': 'Connexion',
  'settings.about.connectionMode': 'Mode',
  'settings.about.connectionModeLocal': 'local',
  'settings.about.connectionModeCloud': 'Nuage',
  'settings.about.connectionModeUnset': 'Non sélectionné',
  'settings.about.serverUrl': 'Serveur URL',
  'settings.about.serverUrlUnavailable': 'Indisponible',
  'settings.about.connectionHelperLocal':
    "Généré dans le processus par le shell Tauri au lancement de l'application. Le port est choisi au démarrage, donc ce URL change entre les lancements.",
  'settings.about.connectionHelperCloud':
    'Connecté à un noyau distant. Modifiez cela dans BootCheck ou le sélecteur de mode cloud.',
  'settings.heartbeat.title': 'Battement de coeur et boucles',
  'settings.usage.title': 'Utilisation et limites',
  'settings.usage.menuDesc': 'Coûts, utilisation des tokens, budgets et activité en arrière-plan',
  'settings.costDashboard.title': 'Tableau de bord des coûts',
  'settings.costDashboard.sevenDayCost': 'Coût quotidien sur 7 jours',
  'settings.costDashboard.sevenDayTokens': 'Utilisation du jeton sur 7 jours',
  'settings.costDashboard.totalSpend': 'Total sur 7 jours',
  'settings.costDashboard.monthlyPace': 'Rythme mensuel',
  'settings.costDashboard.budgetLimit': 'Limite de budget',
  'settings.costDashboard.utilization': 'Utilisation',
  'settings.costDashboard.modelBreakdown': 'Répartition par modèle',
  'settings.costDashboard.model': 'Modèle',
  'settings.costDashboard.provider': 'Fournisseur',
  'settings.costDashboard.cost': 'Coût',
  'settings.costDashboard.tokens': 'Jetons',
  'settings.costDashboard.requests': 'Requêtes',
  'settings.costDashboard.percentOfTotal': '% du total',
  'settings.costDashboard.inputTokens': 'Entrée',
  'settings.costDashboard.outputTokens': 'Sortie',
  'settings.costDashboard.budgetNormal': 'Sur la bonne voie',
  'settings.costDashboard.budgetWarning': 'Avertissement',
  'settings.costDashboard.budgetExceeded': 'Dépassé le budget',
  'settings.costDashboard.noBudget': 'Aucune limite définie',
  'settings.costDashboard.noData': 'Aucun coût enregistré pour les 7 derniers jours.',
  'settings.costDashboard.noModels': 'Aucune activité du modèle au cours des 7 derniers jours.',
  'settings.costDashboard.loading': 'Chargement du tableau de bord des coûts…',
  'settings.costDashboard.disabledHint':
    'Le tableau de bord des coûts est désactivé dans la configuration. Définissez [cost.dashboard] enabled = true dans config.toml pour le réactiver.',
  'settings.costDashboard.subtitle':
    "Dépenses en direct et combustion de jetons à travers l'essaim. Les barres se rafraîchissent automatiquement toutes les quelques secondes — aucun rechargement de page nécessaire.",
  'settings.costDashboard.summaryAriaLabel': 'Résumé des métriques de coût',
  'settings.costDashboard.lastSevenDays': 'les 7 derniers jours',
  'settings.costDashboard.utilizationOf': 'de',
  'settings.costDashboard.thisMonth': 'ce mois',
  'settings.costDashboard.monthlyPaceHint':
    "Dépense mensuelle projetée au taux d'utilisation quotidien actuel (moyenne × 30).",
  'settings.costDashboard.budgetLimitHint':
    'Budget mensuel lu à partir de cost.monthly_limit_usd dans config.toml.',
  'settings.costDashboard.dailyTarget': 'Objectif quotidien',
  'settings.costDashboard.today': "Aujourd'hui",
  'settings.costDashboard.todayBadge': "AUJOURD'HUI",
  'settings.costDashboard.unknownProvider': '—',
  'settings.costDashboard.justNow': "À l'instant",
  'settings.costDashboard.secondsAgo': '{value}s il y a',
  'settings.costDashboard.minutesAgo': '{value}m il y a',
  'settings.costDashboard.hoursAgo': '{value}h il y a',
  'settings.costDashboard.daysAgo': '{value}d il y a',
  'settings.costDashboard.updated': 'Mis à jour',
  'settings.costDashboard.refresh': 'Actualiser',
  'settings.costDashboard.utcNote': 'Jours regroupés en UTC',
  'settings.costDashboard.stackedNote': 'Entrée + sortie empilées',
  'settings.costDashboard.modelBreakdownHint': 'Agrégé sur les 7 derniers jours.',
  'settings.costDashboard.categoryDistribution': 'Dépenses par catégorie',
  'settings.costDashboard.categoryDistributionHint':
    'Déduit des enregistrements récents de chat, embeddings, voix, image et reranking.',
  'settings.costDashboard.noCategories': 'Aucune dépense par catégorie enregistrée pour le moment.',
  'settings.costDashboard.categoryMeta': '{requests} requêtes • {tokens} jetons',
  'settings.costDashboard.usageLog': "Journal d'utilisation",
  'settings.costDashboard.usageLogHint':
    'Enregistrements les plus récents des {days} derniers jours, limités à {limit} lignes.',
  'settings.costDashboard.logTotal': '{requests} requêtes • {cost}',
  'settings.costDashboard.noUsageLog':
    "Aucun enregistrement d'utilisation trouvé pour cette période.",
  'settings.costDashboard.when': 'Quand',
  'settings.costDashboard.category': 'Catégorie',
  'settings.costDashboard.session': 'Session',
  'settings.costDashboard.noDataHint':
    "Envoyez un message agent — l'utilisation des jetons lors du prochain appel au fournisseur remplira le graphique en environ 10 secondes.",
  'settings.search.title': 'Moteur de recherche',
  'settings.search.menuDesc':
    'Par défaut, utilisez la recherche gérée par OpenHuman ou connectez votre propre fournisseur avec une clé API.',
  'settings.search.description':
    "Choisissez le moteur de recherche utilisé par l'agent, ou désactivez entièrement les outils de recherche. Géré utilise le backend d'OpenHuman (sans configuration). Parallel, Brave et Querit s'exécutent directement depuis votre machine avec votre clé API.",
  'settings.search.engineAria': 'Moteur de recherche',
  'settings.search.engineDisabledLabel': 'Disabled',
  'settings.search.engineDisabledDesc':
    "Supprimer les outils de recherche du contexte agent et de la liste d'outils disponibles.",
  'settings.search.engineManagedLabel': 'OpenHuman Géré',
  'settings.search.engineManagedDesc':
    'Par défaut. Routé via le backend OpenHuman — aucune clé API requise.',
  'settings.search.localManagedUnavailable':
    'La recherche gérée par OpenHuman n’est pas disponible pour les utilisateurs locaux. Ajoutez votre propre clé API Parallel ou Brave pour activer la recherche web.',
  'settings.search.engineParallelLabel': 'Parallèle',
  'settings.search.engineParallelDesc':
    'Direct Parallel API: rechercher, extraire, discuter, rechercher, enrichir, outils de jeu de données.',
  'settings.search.engineBraveLabel': 'Brave Recherche',
  'settings.search.engineBraveDesc':
    'Recherche Directe Brave API: outils web, actualités, images et vidéos.',
  'settings.search.engineQueritLabel': 'Il/Elle cherche',
  'settings.search.engineQueritDesc':
    'Direct Querit API: recherche sur le web avec filtres de site, de plage temporelle, de pays et de langue.',
  'settings.search.statusConfigured': 'Configuré',
  'settings.search.statusNeedsKey': 'Nécessite la clé API',
  'settings.search.fallbackToManaged':
    "Aucune clé configurée — la recherche reviendra à Managed jusqu'à ce qu'une clé soit enregistrée.",
  'settings.search.getApiKey': 'Obtenir la clé API',
  'settings.search.save': 'Enregistrer',
  'settings.search.clear': 'Effacer',
  'settings.search.show': 'Afficher',
  'settings.search.hide': 'Masquer',
  'settings.search.statusSaving': 'Enregistrement…',
  'settings.search.statusSaved': 'Enregistré.',
  'settings.search.statusError': 'Échec',
  'settings.search.parallelKeyLabel': 'Parallel API clé',
  'settings.search.braveKeyLabel': 'Brave Recherche API clé',
  'settings.search.queritKeyLabel': 'Cherche la clé API',
  'settings.search.placeholderStored': '•••••••• (stocké)',
  'settings.search.placeholderParallel': 'pk_...',
  'settings.search.placeholderBrave': 'BSA...',
  'settings.search.placeholderQuerit': 'Cherche la clé API',
  'settings.search.allowedSitesLabel': 'Sites web autorisés',
  'settings.search.allowedSitesHint':
    "Hôtes que l'assistant peut ouvrir et lire — via la récupération web et l'outil navigateur — un par ligne, p. ex. reuters.com. Un hôte couvre également ses sous-domaines. La recherche web elle-même n'est pas limitée par cette liste.",
  'settings.search.allowedSitesAllOn':
    "L'assistant peut ouvrir n'importe quel site public. Les adresses locales et privées restent bloquées.",
  'settings.search.allowedSitesPlaceholder': 'reuters.com\napnews.com\ngithub.com',
  'settings.search.allowedSitesSave': 'Enregistrer des sites web',
  'settings.search.accessModeAria': "Mode d'accès Web",
  'settings.search.accessAllowAll': 'Autoriser tout',
  'settings.search.accessCustom': 'Personnalisé',
  'settings.search.accessBlockAll': 'Bloquer tout',
  'settings.search.accessBlockAllHint':
    "Tout accès au web est bloqué — l'assistant ne peut ouvrir ni lire aucun site web.",
  // ─── Settings global search bar ────────────────────────────
  'settings.settingsSearch.placeholder': 'Rechercher dans les paramètres…',
  'settings.settingsSearch.ariaLabel': 'Rechercher dans les paramètres',
  'settings.settingsSearch.clear': 'Effacer la recherche',
  'settings.settingsSearch.resultsLabel': 'Résultats de recherche',
  'settings.settingsSearch.noResults': 'Aucun paramètre trouvé pour « {query} »',
  'settings.embeddings.title': 'Encastrements',
  'settings.embeddings.description':
    "Choisissez le fournisseur d'embeddings qui convertit la mémoire en vecteurs pour la recherche sémantique. Changer le fournisseur, le modèle ou les dimensions invalide les vecteurs stockés et nécessite une réinitialisation complète de la mémoire.",
  'settings.embeddings.providerAria': "Fournisseur d'embeddings",
  'settings.embeddings.statusConfigured': 'Configuré',
  'settings.embeddings.statusNeedsKey': 'Clé API requise',
  'settings.embeddings.requiresSignIn': 'Connexion OpenHuman requise',
  'settings.embeddings.managedLoginRequired':
    'Les embeddings gérés nécessitent une connexion OpenHuman. Connectez-vous pour utiliser le backend OpenHuman.',
  'settings.embeddings.managedBannerIntro':
    'Les embeddings gérés passent par le backend OpenHuman et nécessitent une session de compte OpenHuman.',
  'settings.embeddings.managedBannerLocalSession':
    'Quittez la session locale et connectez-vous pour utiliser ce fournisseur, ou passez à un fournisseur local ou avec votre propre clé.',
  'settings.embeddings.managedBannerRemoteSession':
    'Reconnectez-vous pour actualiser votre session OpenHuman, ou passez à un fournisseur local ou avec votre propre clé.',
  'settings.embeddings.signInAgain': 'Se reconnecter',
  'settings.embeddings.apiKeyLabel': 'Clé API {provider}',
  'settings.embeddings.placeholderStored': '•••••••• (stocké)',
  'settings.embeddings.placeholderKey': 'Collez votre clé API…',
  'settings.embeddings.keyStoredEncrypted':
    'Votre clé API est stockée de manière chiffrée sur cet appareil.',
  'settings.embeddings.show': 'Afficher',
  'settings.embeddings.hide': 'Masquer',
  'settings.embeddings.save': 'Enregistrer',
  'settings.embeddings.clear': 'Effacer',
  'settings.embeddings.model': 'Modèle',
  'settings.embeddings.dimensions': 'Dimensions',
  'settings.embeddings.customEndpoint': 'Point de terminaison personnalisé',
  'settings.embeddings.customModelPlaceholder': 'Nom du modèle',
  'settings.embeddings.customDimsPlaceholder': 'Dims La prise en charge du serveur',
  'settings.embeddings.applyCustom': 'Appliquer',
  'settings.embeddings.testConnection': 'Tester la connexion',
  'settings.embeddings.testing': 'Test en cours…',
  'settings.embeddings.testSuccess': 'Connecté — {dims} dimensions',
  'settings.embeddings.connectionTestFailed': 'Test échoué',
  'settings.embeddings.verifyFallback':
    "Impossible de vérifier le point de terminaison d'embeddings. Vérifiez qu'il fonctionne et qu'il propose un modèle d'embedding, puis enregistrez à nouveau.",
  'settings.embeddings.testFailed': 'Échec : {error}',
  'settings.embeddings.saving': 'Enregistrement…',
  'settings.embeddings.saved': 'Enregistré.',
  'settings.embeddings.errorPrefix': 'Échec',
  'settings.embeddings.wipeTitle': 'Réinitialiser les vecteurs mémoire ?',
  'settings.embeddings.wipeBody':
    "Changer le fournisseur d'embeddings, le modèle ou les dimensions effacera tous les vecteurs mémoire stockés. La mémoire doit être reconstruite avant que la récupération ne fonctionne à nouveau. Cette action est irréversible.",
  'settings.embeddings.cancel': 'Annuler',
  'settings.embeddings.confirmWipe': 'Effacer et appliquer',
  'settings.embeddings.setupTitle': 'Configurer {provider}',
  'settings.embeddings.saveAndSwitch': 'Enregistrer et changer',
  'settings.embeddings.optional': 'optionnel',
  'settings.embeddings.vectorSearchDisabled':
    'La recherche vectorielle est désactivée. Le rappel de la mémoire utilisera uniquement la correspondance de mots-clés et la récence — pas de classement sémantique.',
  'settings.embeddings.clearKey': 'Effacer la clé API',
  'pages.settings.ai.embeddings': 'Intégrations',
  'pages.settings.ai.embeddingsDesc':
    "Modèle d'encodage vectoriel pour la récupération de la mémoire",
  'mcp.alphaBadge': 'Alpha',
  'mcp.alphaBannerText':
    "Le support du serveur MCP est en phase alpha précoce. Le registre, le flux d'installation et le câblage des outils peuvent mal fonctionner ou changer de forme entre les versions.",
  'mcp.toolList.noTools': 'Aucun outil disponible.',
  'mcp.setup.secretDialog.title': 'Installation MCP — Entrez le secret',
  'mcp.setup.secretDialog.bodyPrefix': "L'agent de configuration MCP a besoin",
  'mcp.setup.secretDialog.bodySuffix':
    ". Votre valeur est envoyée directement au processus principal et n'entre jamais dans la conversation AI.",
  'mcp.setup.secretDialog.inputLabel': 'Valeur',
  'mcp.setup.secretDialog.inputPlaceholder': 'Coller ici',
  'mcp.setup.secretDialog.show': 'Afficher',
  'mcp.setup.secretDialog.hide': 'Masquer',
  'mcp.setup.secretDialog.submit': 'Soumettre',
  'mcp.setup.secretDialog.cancel': 'Annuler',
  'mcp.setup.secretDialog.submitting': 'Soumission…',
  'mcp.setup.secretDialog.errorPrefix': 'Échec de la soumission :',
  'mcp.setup.secretDialog.privacyNote':
    'Stocké de manière chiffrée dans la table de secrets locale MCP. Jamais enregistré ni envoyé à un modèle.',
  'devices.betaBadge': 'Bêta',
  'devices.betaText':
    'Cette fonctionnalité est actuellement en bêta. Associez des iPhone à cet OpenHuman pour les utiliser comme client distant.',
  'devices.comingSoonDescription':
    'L’appairage des appareils arrive bientôt. Cette page servira à appairer des iPhone et à gérer les appareils connectés.',
  'devices.title': 'Appareils',
  'devices.pairIphone': 'Jumeler l’iPhone',
  'devices.noPaired': 'Aucun appareil jumelé',
  'devices.emptyState':
    'Scannez un code QR sur votre iPhone pour le connecter à cette session OpenHuman.',
  'devices.devicePairedTitle': 'Appareil couplé',
  'devices.devicePairedMessage': 'iPhone connecté avec succès.',
  'devices.deviceRevokedTitle': 'Appareil révoqué',
  'devices.deviceRevokedMessage': '{label} supprimé.',
  'devices.revokeFailedTitle': 'Échec de la révocation',
  'devices.online': 'En ligne',
  'devices.offline': 'Hors ligne',
  'devices.lastSeenNever': 'Jamais',
  'devices.lastSeenNow': "À l'instant",
  'devices.lastSeenMinutes': 'Il y a {count}m',
  'devices.lastSeenHours': 'Il y a {count}h',
  'devices.lastSeenDays': '{count}d il y a',
  'devices.revoke': 'Révoquer',
  'devices.revokeAria': 'Révoquer {label}',
  'devices.confirmRevokeTitle': 'Révoquer l’appareil ?',
  'devices.confirmRevokeBody':
    '{label} ne pourra plus se connecter. Cette action est irréversible.',
  'devices.loadFailed': 'Échec du chargement des appareils : {message}',
  'devices.pairModal.title': 'Jumeler l’iPhone',
  'devices.pairModal.loading': 'Génération du code de jumelage…',
  'devices.pairModal.instructions':
    'Ouvrez l’application OpenHuman sur votre iPhone et scannez ce code.',
  'devices.pairModal.expiresIn': 'Le code expire dans ~{count} minute',
  'devices.pairModal.expiresInPlural': 'Le code expire dans ~{count} minutes',
  'devices.pairModal.showDetails': 'Afficher les détails',
  'devices.pairModal.hideDetails': 'Masquer les détails',
  'devices.pairModal.channelId': 'ID de chaîne',
  'devices.pairModal.pairingUrl': 'Couplage URL',
  'devices.pairModal.expiredTitle': 'Le code QR a expiré',
  'devices.pairModal.expiredBody': 'Générez un nouveau code pour poursuivre le jumelage.',
  'devices.pairModal.generateNewCode': 'Générer un nouveau code',
  'devices.pairModal.successTitle': 'iPhone jumelé',
  'devices.pairModal.autoClose': 'Fermeture automatique…',
  'devices.pairModal.errorPrefix': 'Échec de la création du couplage : {message}',
  'devices.pairModal.errorTitle': 'Un problème est survenu',
  'devices.pairModal.copyUrl': 'Copier',
  'mcp.catalog.searchAria': 'Rechercher des serveurs MCP',
  'mcp.catalog.searchPlaceholder': 'Rechercher des serveurs MCP...',
  'mcp.catalog.loadFailed': 'Échec du chargement du catalogue',
  'mcp.catalog.noResults': 'Aucun serveur trouvé.',
  'mcp.catalog.noResultsFor': 'Aucun serveur trouvé pour "{query}".',
  'mcp.catalog.loadMore': 'Charger plus',
  'mcp.configAssistant.title': 'Assistant de configuration',
  'mcp.configAssistant.empty':
    "Demandez à propos de la configuration, des variables d'environnement requises ou des étapes de configuration.",
  'mcp.configAssistant.autoPromptCta': 'Obtenir une aide à la configuration étape par étape',
  'mcp.configAssistant.suggestedValues': 'Valeurs suggérées :',
  'mcp.configAssistant.valueHidden': '(valeur masquée)',
  'mcp.configAssistant.applySuggested': 'Appliquer les valeurs suggérées',
  'mcp.configAssistant.reinstallHint': 'Réinstallez avec ces valeurs pour les appliquer.',
  'mcp.configAssistant.thinking': 'Je réfléchis...',
  'mcp.configAssistant.inputPlaceholder':
    'Posez une question (Entrée pour envoyer, Maj+Entrée pour un retour à la ligne)',
  'mcp.configAssistant.send': 'Envoyer',
  'mcp.configAssistant.failedResponse': "Échec de l'obtention de la réponse",
  'mcp.toolList.availableSingular': '{count} outil disponible',
  'mcp.toolList.availablePlural': '{count} outils disponibles',
  'mcp.toolList.tryTool': 'Essayer',
  'mcp.toolList.tryToolAria': "Ouvrir le terrain d'exécution pour {name}",
  'mcp.playground.title': 'Exécuter {name}',
  'mcp.playground.close': 'Fermer le terrain de jeu',
  'mcp.playground.inputSchema': "Schéma d'entrée",
  'mcp.playground.argsLabel': 'Arguments (JSON)',
  'mcp.playground.argsHelp':
    "Type JSON correspondant au schéma d'entrée. Une entrée vide est traitée comme {}.",
  'mcp.playground.runShortcut': '⌘/Ctrl + Entrée pour exécuter',
  'mcp.playground.format': 'Format',
  'mcp.playground.invalidJson': 'JSON invalide',
  'mcp.playground.run': "Exécuter l'outil",
  'mcp.playground.running': 'Course…',
  'mcp.playground.result': 'Résultat',
  'mcp.playground.resultError': "L'outil a renvoyé une erreur",
  'mcp.playground.copyResult': 'Copier le résultat',
  'mcp.playground.copied': 'Copié',
  'mcp.playground.history': 'Histoire',
  'mcp.playground.historyEmpty': 'Aucune invocation pour le moment dans cette session.',
  'mcp.playground.historyLoad': 'Charger',
  'mcp.playground.unexpectedError': "Erreur inattendue lors de l'appel de l'outil.",
  'mcp.catalog.deployed': 'Déployé',
  'mcp.catalog.installCount': '{count} installe',
  'app.update.dismissNotification': 'Ignorer la notification de mise à jour',
  'bootCheck.rpcAuthSuffix': 'tous les RPC.',
  'app.localAiDownload.expandAria': 'Développer la progression du téléchargement',
  'app.localAiDownload.collapseAria': 'Réduire la progression du téléchargement',
  'app.localAiDownload.dismissAria': 'Ignorer la notification de téléchargement',
  'mobile.nav.ariaLabel': 'Navigation mobile',
  'progress.stepsAria': 'Étapes de progression',
  'progress.stepAria': 'Étape {current} de {total}',
  'workspace.vaultsTitle': 'Coffres de connaissances',
  'workspace.vaultsDesc':
    'Pointez sur un dossier local ; les fichiers sont fragmentés et mis en miroir dans la mémoire.',
  'calls.title': 'Appels',
  'calls.comingSoonBody': "Les appels assistés par l'IA arriveront bientôt. Restez à l'écoute.",
  'art.rotatingTetrahedronAria': 'Vaisseau spatial à tétraèdre inversé rotatif',
  'mcp.installed.title': 'Installé',
  'mcp.installed.browseCatalog': 'Parcourir le catalogue',
  'mcp.installed.empty': 'Aucun serveur MCP installé pour le moment.',
  'mcp.installed.toolSingular': 'Outil {count}',
  'mcp.installed.toolPlural': 'Outils {count}',
  'mcp.health.title': 'Santé',
  'mcp.health.summaryAria': "Résumé de l'état de santé de la connexion MCP",
  'mcp.health.connectedCount': '{count} connecté',
  'mcp.health.connectingCount': '{count} en connexion',
  'mcp.health.errorCount': 'Erreur {count}',
  'mcp.health.disconnectedCount': '{count} inactif',
  'mcp.health.retryAll': 'Réessayer tout ({count})',
  'mcp.health.retryAllAria': 'Réessayer tous les serveurs {count} MCP en erreur',
  'mcp.health.disconnectAll': 'Déconnecter tout ({count})',
  'mcp.health.disconnectAllAria': 'Déconnectez tous les serveurs {count} connectés MCP',
  'mcp.health.disconnectConfirm.title': 'Déconnecter tous les serveurs MCP?',
  'mcp.health.disconnectConfirm.body':
    "Cela déconnectera {count} serveurs MCP actuellement connectés. Les configurations installées et les secrets sont conservés ; vous pourrez reconnecter n'importe quel serveur ultérieurement.",
  'mcp.health.disconnectConfirm.cancel': 'Annuler',
  'mcp.health.disconnectConfirm.confirm': 'Déconnecter tout',
  'mcp.health.opErrorGeneric': "L'opération en masse a échoué. Voir les journaux.",
  'mcp.health.bulkPartialFailure':
    '{failed} sur {total} serveurs ont échoué. Consultez les journaux.',
  'mcp.installed.search.landmarkAria': 'Rechercher les serveurs MCP installés',
  'mcp.installed.search.inputAria': 'Filtrer les serveurs MCP installés par nom',
  'mcp.installed.search.placeholder': 'Filtrer les serveurs…',
  'mcp.installed.search.clearAria': 'Effacer le filtre',
  'mcp.installed.search.countMatches': '{shown} des serveurs {total}',
  'mcp.installed.search.noMatches': 'Aucun serveur ne correspond à « {query} ».',
  'mcp.inventory.openButton': 'Inventaire',
  'mcp.inventory.openAria': "Ouvrez le panneau d'inventaire partageable MCP",
  'mcp.inventory.title': 'Inventaire MCP partageable',
  'mcp.inventory.subtitle':
    "Exportez vos serveurs MCP installés sous forme de manifeste portable, sans secrets, ou importez-en un depuis un coéquipier. Les valeurs d'environnement secrètes ne sont jamais incluses ni importées.",
  'mcp.inventory.close': "Fermer le panneau d'inventaire",
  'mcp.inventory.tablistAria': "Sections d'inventaire",
  'mcp.inventory.tab.export': 'Exporter',
  'mcp.inventory.tab.import': 'Importer',
  'mcp.inventory.export.empty':
    "Aucun serveur MCP installé pour le moment — rien à exporter. Installez-en un depuis le catalogue d'abord.",
  'mcp.inventory.export.privacyTitle': "Qu'y a-t-il dans ce manifeste",
  'mcp.inventory.export.privacyBody':
    "Noms de serveur, noms qualifiés, noms de clés de variables d'environnement et seule la configuration non secrète. Les valeurs secrètes, les identifiants de votre machine et les horodatages par installation sont intentionnellement supprimés.",
  'mcp.inventory.export.serverCount': 'Serveurs {count} dans ce manifeste',
  'mcp.inventory.export.copy': 'Copier',
  'mcp.inventory.export.copied': 'Copié',
  'mcp.inventory.export.copyAria': 'Copiez le manifeste JSON dans le presse-papiers',
  'mcp.inventory.export.download': 'Télécharger',
  'mcp.inventory.export.downloadAria': 'Téléchargez le manifeste en tant que fichier JSON',
  'mcp.inventory.import.trustTitle': 'Traitez les manifests importés comme du code non fiable',
  'mcp.inventory.import.trustBody':
    "Un serveur MCP est un outil que vous accordez à votre agent. N'importez des manifests que de sources que vous connaissez et en qui vous avez confiance. Chaque installation nécessite votre clic explicite; rien n'est installé automatiquement.",
  'mcp.inventory.import.pasteLabel': 'Collez le manifeste JSON',
  'mcp.inventory.import.pastePlaceholder':
    'Collez un manifeste ici, ou téléchargez un fichier.json ci-dessous.',
  'mcp.inventory.import.preview': 'Aperçu',
  'mcp.inventory.import.clear': 'Clair',
  'mcp.inventory.import.uploadFile': 'ou téléverser un fichier.json',
  'mcp.inventory.import.uploadFileAria': 'Téléchargez un fichier manifest.json',
  'mcp.inventory.import.fileTooLarge':
    'Le fichier est trop volumineux (plus de 1 Mo). Refus de le charger.',
  'mcp.inventory.import.fileReadFailed': 'Impossible de lire le fichier.',
  'mcp.inventory.import.parseErrorPrefix': "Impossible d'analyser le manifeste:",
  'mcp.inventory.import.previewHeading': 'Aperçu',
  'mcp.inventory.import.previewCounts':
    'Serveurs {total} — {newly} nouveaux, {already} déjà installés',
  'mcp.inventory.import.previewEmpty': 'Le manifeste ne contient aucun serveur.',
  'mcp.inventory.import.exportedFrom': 'Exporté de {exporter}',
  'mcp.inventory.import.exportedAt': 'chez {when}',
  'mcp.inventory.import.statusNew': 'Nouveau',
  'mcp.inventory.import.statusAlreadyInstalled': 'Déjà installé',
  'mcp.inventory.import.envKeysLabel': 'Clés Env',
  'mcp.inventory.import.install': 'Installer',
  'mcp.inventory.import.installAria': 'Installez {name} à partir de ce manifeste',
  'mcp.inventory.import.skipped': 'ignoré',
  'mcp.inventory.parseError.empty': 'Le manifeste est vide.',
  'mcp.inventory.parseError.invalidJson': 'JSON invalide.',
  'mcp.inventory.parseError.rootNotObject': 'Le manifeste doit être un objet JSON à la racine.',
  'mcp.inventory.parseError.unsupportedSchema':
    "Schéma de manifeste non pris en charge — ce fichier n'a pas été produit par un exportateur compatible.",
  'mcp.inventory.parseError.missingExportedAt': 'Champ `exported_at` manquant ou invalide.',
  'mcp.inventory.parseError.missingExportedBy': 'Champ `exported_by` manquant ou invalide.',
  'mcp.inventory.parseError.invalidServers': 'Tableau `servers` manquant ou invalide.',
  'mcp.inventory.parseError.serverNotObject': "Une entrée de serveur n'est pas un objet.",
  'mcp.inventory.parseError.serverMissingQualifiedName':
    'Une entrée de serveur manque de son nom_qualifié.',
  'mcp.inventory.parseError.serverMissingDisplayName':
    'Une entrée de serveur manque de son display_name.',
  'mcp.inventory.parseError.serverEnvKeysNotArray':
    "Une entrée de serveur possède un champ env_keys qui n'est pas un tableau de chaînes.",
  'mcp.inventory.parseError.serverContainsEnv':
    "Une entrée de serveur contient une carte de valeurs `env`. Refus d'importer — les manifestes ne doivent contenir que des env_keys (noms), jamais de valeurs secrètes.",
  'mcp.inventory.parseError.duplicateQualifiedName':
    'Nom_qualifié dupliqué trouvé dans le manifeste. Chaque serveur doit apparaître au maximum une fois.',
  'mcp.tab.loading': 'Chargement des serveurs MCP...',
  'mcp.tab.emptyDetail': 'Sélectionnez un serveur ou parcourez le catalogue.',
  'mcp.tab.filter.all': 'Tout',
  'mcp.tab.filter.installed': 'Installés ({count})',
  'mcp.tab.filter.registry': 'Registre',
  'mcp.tab.column.name': 'Nom',
  'mcp.tab.column.description': 'Description',
  'mcp.tab.column.type': 'Type',
  'mcp.tab.column.author': 'Auteur',
  'mcp.tab.column.action': 'Action',
  'mcp.tab.transport.hosted': 'Hébergé',
  'mcp.tab.transport.local': 'Stdio',
  'mcp.tab.transportFilter.label': 'Type',
  'mcp.tab.transportFilter.aria': 'Filtrer les serveurs par transport',
  'mcp.tab.link.website': 'Site web',
  'mcp.tab.link.repo': 'Dépôt',
  'mcp.tab.transport.hostedHint':
    "S'exécute sur un serveur distant — la connexion ou le jeton est configuré lors de l'installation",
  'mcp.tab.transport.localHint':
    "S'exécute sur votre appareil — peut nécessiter un jeton lors de l'installation",
  'mcp.tab.officialBadge': 'Officiel',
  'mcp.tab.officialHint': 'Serveur officiel du fournisseur',
  'mcp.tab.badge.installed': 'Installé',
  'mcp.tab.badge.registry': 'Registre',
  'mcp.tab.action.manage': 'Gérer',
  'mcp.tab.aria.viewDetails': 'Voir les détails de {name}',
  'mcp.tab.aria.installServer': 'Installer {name}',
  'mcp.install.loadingDetail': 'Chargement des détails du serveur...',
  'mcp.install.back': 'Retourner',
  'mcp.install.title': 'Installer {name}',
  'mcp.install.requiredEnv': "Variables d'environnement requises",
  'mcp.install.enterValue': 'Saisissez {key}',
  'mcp.install.show': 'Afficher',
  'mcp.install.hide': 'Masquer',
  'mcp.install.configLabel': 'Config (JSON facultatif)',
  'mcp.install.configPlaceholder': '{"key": "value"}',
  'mcp.install.missingRequired': '"{key}" est requis',
  'mcp.install.invalidJson': "La configuration JSON n'est pas valide JSON",
  'mcp.install.failedDetail': 'Échec du chargement des détails du serveur',
  'mcp.install.failedInstall': "Échec de l'installation",
  'mcp.install.button': 'Installation',
  'mcp.install.installing': 'Installation...',
  'mcp.install.by': 'par',
  'mcp.install.useCount': '{count} installations',
  'mcp.install.connections': 'Connexions disponibles',
  'mcp.install.published': 'publié',
  'mcp.install.configureAndInstall': 'Configurer et installer',
  'mcp.install.configureTitle': 'Configurer {name}',
  'mcp.install.advancedConfig': 'Configuration avancée',
  'mcp.detail.suggestedEnvReady': "Valeurs d'environnement suggérées prêtes",
  'mcp.detail.suggestedEnvBody':
    'Réinstallez ce serveur avec les valeurs suggérées pour les appliquer: {keys}',
  'mcp.detail.connect': 'Connecter',
  'mcp.detail.connecting': 'Connexion...',
  'mcp.detail.authenticate': 'Se connecter',
  'mcp.detail.authRequired':
    "Ce serveur nécessite que vous vous connectiez ou ajoutiez un jeton d'accès avant de pouvoir se connecter. Cliquez sur « Se connecter » pour vous authentifier.",
  'mcp.detail.disconnect': 'Déconnecter',
  'mcp.detail.hideAssistant': "Cacher l'assistant",
  'mcp.detail.helpConfigure': 'Aidez-moi à configurer',
  'mcp.detail.confirmUninstall': 'Confirmer la désinstallation ?',
  'mcp.detail.confirmUninstallAction': 'Oui, désinstaller',
  'mcp.detail.uninstall': 'Désinstaller',
  'mcp.detail.envVars': "Variables d'environnement",
  'mcp.detail.reconfigure': 'Reconfigurer',
  'mcp.detail.reconfigureHint':
    'Saisissez de nouvelles valeurs pour chaque variable, puis reconnectez-vous. Cela remplace les valeurs enregistrées.',
  'mcp.detail.saveReconnect': 'Enregistrer et reconnecter',
  'mcp.detail.reconfigureSaving': 'Enregistrement…',
  'mcp.detail.reconfigureSuccess': 'Environnement mis à jour et reconnecté.',
  'mcp.detail.reconfigureReconnectFailed':
    'Enregistré, mais la reconnexion avec les nouvelles valeurs a échoué.',
  'mcp.detail.enable': 'Activer',
  'mcp.detail.disable': 'Désactiver',
  'mcp.status.disabled': 'Désactivé',
  'mcp.status.unauthorized': 'Connexion requise',
  'mcp.detail.tools': 'Outils',
  'mcp.connectAuth.title': 'Connecter {name}',
  'mcp.connectAuth.hint':
    "Ajoutez l'authentification dont ce serveur a besoin, puis connectez-vous. Les jetons sont stockés chiffrés. Laissez vide pour les serveurs ne nécessitant aucune authentification.",
  'mcp.connectAuth.requiredLabel': 'Obligatoire',
  'mcp.connectAuth.customHeadersLabel': 'En-têtes personnalisés',
  'mcp.connectAuth.customHeadersEmpty':
    "Aucun en-tête personnalisé. Ajoutez-en un si ce serveur a besoin d'un en-tête d'authentification que le registre n'a pas déclaré.",
  'mcp.connectAuth.addHeader': '+ Ajouter un en-tête',
  'mcp.connectAuth.headerName': "Nom de l'en-tête",
  'mcp.connectAuth.headerValue': 'Valeur',
  'mcp.connectAuth.removeHeader': "Supprimer l'en-tête",
  'mcp.connectAuth.howToGetToken': 'Aide et configuration',
  'mcp.connectAuth.tokenProvider': 'Obtenez votre jeton sur :',
  'mcp.connectAuth.findToken': 'Où obtenir le jeton ?',
  'mcp.connectAuth.hideHelp': "Masquer l'aide",
  'mcp.connectAuth.schemeLabel': 'Comment envoyer la valeur',
  'mcp.connectAuth.schemeBearer': 'Bearer',
  'mcp.connectAuth.schemeRaw': 'Aucun',
  'mcp.connectAuth.reconnectFailed': 'Identifiants enregistrés, mais la connexion a échoué.',
  'mcp.connectAuth.oauthHint':
    'Ce serveur utilise OAuth. Connectez-vous via votre navigateur pour autoriser OpenHuman.',
  'mcp.connectAuth.signIn': 'Se connecter avec le navigateur',
  'mcp.connectAuth.oauthWaiting': 'En attente de la connexion…',
  'mcp.connectAuth.oauthOrToken':
    "Vous avez déjà un jeton d'accès ? Collez-le plutôt ci-dessous comme en-tête Authorization.",
  'mcp.connectAuth.oauthTimeout':
    'Délai dépassé en attendant la connexion via le navigateur. Réessayez.',
  'mcp.connectAuth.authError.oauthRequired':
    'Ce serveur utilise OAuth. Utilisez “Se connecter avec le navigateur” — un jeton collé ne sera pas accepté.',
  'mcp.connectAuth.authError.tokenRejected':
    "Le serveur a rejeté ce jeton. Vérifiez qu'il est correct et qu'il n'a pas expiré.",
  'mcp.connectAuth.authError.credentialRequired':
    'Ce serveur nécessite une authentification. Ajoutez un jeton ou connectez-vous.',
  'onboarding.skipForNow': "Passer pour l'instant",
  'onboarding.localAI.continueWithCloud': 'Continuer avec Cloud',
  'onboarding.localAI.useLocalAnyway':
    "Utiliser l'IA locale quand même (non recommandé pour votre appareil)",
  'onboarding.localAI.useLocalInstead':
    "Utiliser l'IA locale à la place (connecter Ollama maintenant)",
  'onboarding.localAI.setupIssue': "La configuration de l'IA locale a rencontré un problème",
  'autonomy.title': "Autonomie de l'agent",
  'autonomy.maxActionsLabel': 'Actions maximales par heure',
  'autonomy.maxActionsHelp':
    "Nombre maximum d'actions d'outil qu'un agent peut exécuter par heure glissante. La nouvelle valeur s'applique à votre prochaine conversation. Les tâches planifiées et les écouteurs de canaux conservent leur limite actuelle jusqu'au redémarrage d'OpenHuman.",
  'autonomy.statusSaving': 'Enregistrement…',
  'autonomy.statusSaved': 'Enregistré.',
  'autonomy.statusFailed': 'Échec',
  'autonomy.unlimitedNote': 'Illimité — limitation de débit désactivée.',
  'autonomy.invalidIntegerMsg':
    'Doit être un entier positif (utilisez le préréglage Illimité pour ne pas définir de limite).',
  'autonomy.presetUnlimited': 'Illimité (par défaut)',
  'triggers.toggleFailed': 'Échec de {action} pour {trigger} : {message}',
  'settings.ai.overview': "Vue d'ensemble du système IA",
  'settings.ai.configStatus': 'État de la configuration',
  'settings.ai.fallbackMode': 'Mode de secours',
  'settings.ai.loadedFromRuntime': 'Chargé depuis le runtime',
  'settings.ai.loadingDuration': 'Durée de chargement',
  'settings.ai.localRuntime': 'Runtime de modèle local',
  'settings.ai.openManager': 'Ouvrir le gestionnaire',
  'settings.ai.retryDownload': 'Relancer le téléchargement',
  'settings.ai.state': 'État',
  'settings.ai.targetModel': 'Modèle cible',
  'settings.ai.download': 'Télécharger',
  'settings.ai.localModelUnavailable': 'État du modèle local indisponible.',
  'settings.ai.soulConfig': 'Configuration de la persona SOUL',
  'settings.ai.refreshing': 'Actualisation…',
  'settings.ai.refreshSoul': 'Actualiser SOUL',
  'settings.ai.loadingSoul': 'Chargement de la configuration SOUL…',
  'settings.ai.identity': 'Identité',
  'settings.ai.personality': 'Personnalité',
  'settings.ai.safetyRules': 'Règles de sécurité',
  'settings.ai.source': 'Source',
  'settings.ai.loaded': 'Chargé',
  'settings.ai.toolsConfig': 'Configuration TOOLS',
  'settings.ai.refreshTools': 'Actualiser TOOLS',
  'settings.ai.toolsAvailable': 'Outils disponibles',
  'settings.ai.tools': 'outils',
  'settings.ai.activeSkills': 'Compétences actives',
  'settings.ai.skills': 'compétences',
  'settings.ai.skillsOverview': "Vue d'ensemble des compétences",
  'settings.ai.refreshingAll': 'Tout actualiser…',
  'settings.ai.refreshAll': 'Actualiser toute la configuration IA',
  'settings.notifications.suppressAll': 'Supprimer toutes les notifications',
  'settings.notifications.suppressAllDesc':
    "Bloquer toutes les notifications OS des apps intégrées, quel que soit l'état de mise au premier plan.",
  'settings.notifications.toggleDnd': 'Activer/désactiver Ne pas déranger',
  'settings.notifications.categories': 'Catégories',
  'settings.notifications.categoryFooter':
    "Désactiver une catégorie empêche les nouvelles notifications de ce type d'apparaître dans le centre de notifications. Les notifications existantes restent jusqu'à ce qu'elles soient effacées.",
  'settings.billing.movedToWeb': 'La facturation est maintenant sur le web',
  'settings.billing.openDashboard': 'Ouvrir le tableau de bord de facturation',
  'settings.billing.movedToWebDesc':
    "Les changements d'abonnement, méthodes de paiement, crédits et factures sont désormais gérés sur TinyHumans en ligne.",
  'settings.billing.backToSettings': 'Retour aux paramètres',
  'settings.billing.openingBrowser': 'Ouverture du navigateur…',
  'settings.billing.browserNotOpen':
    "Si ton navigateur ne s'est pas ouvert, utilise le bouton ci-dessus.",
  'settings.billing.browserOpenFailed':
    "Le navigateur n'a pas pu s'ouvrir automatiquement. Utilise le bouton ci-dessus.",
  'settings.tools.chooseCapabilities':
    "Choisis les fonctionnalités qu'OpenHuman peut utiliser en ton nom.",
  'settings.tools.saveChanges': 'Enregistrer les modifications',
  'settings.tools.preferencesSaved': 'Préférences enregistrées',
  'settings.tools.saveFailed': "Échec de l'enregistrement des préférences. Réessaie.",
  'settings.screenAwareness.mode': 'Mode',
  'settings.screenAwareness.allExceptBlacklist': 'Tout sauf la liste noire',
  'settings.screenAwareness.whitelistOnly': 'Liste blanche uniquement',
  'settings.screenAwareness.screenMonitoring': "Surveillance de l'écran",
  'settings.screenAwareness.saveSettings': 'Enregistrer les paramètres',
  'settings.screenAwareness.session': 'Session',
  'settings.screenAwareness.status': 'État',
  'settings.screenAwareness.active': 'Actif',
  'settings.screenAwareness.stopped': 'Arrêté',
  'settings.screenAwareness.remaining': 'Restant',
  'settings.screenAwareness.startSession': 'Démarrer la session',
  'settings.screenAwareness.stopSession': 'Arrêter la session',
  'settings.screenAwareness.analyzeNow': 'Analyser maintenant',
  'settings.screenAwareness.macosOnly':
    "La capture d'écran et les contrôles d'autorisation de la surveillance de l'écran sont actuellement pris en charge sur macOS uniquement.",
  'connections.comingSoon': 'Bientôt disponible',
  'connections.setUp': 'Configurer',
  'connections.configured': 'Configuré',
  'connections.unavailable': 'Indisponible',
  'connections.checking': 'Vérification…',
  'connections.walletConfigured':
    'Les identités locales EVM, BTC, Solana et Tron sont configurées depuis ta phrase de récupération.',
  'connections.walletReady':
    'Configure les identités locales EVM, BTC, Solana et Tron depuis une seule phrase de récupération.',
  'connections.walletError':
    "Impossible de vérifier l'état du portefeuille. Appuie pour réessayer depuis le panneau de phrase de récupération.",
  'connections.walletChecking': "Vérification de l'état du portefeuille…",
  'connections.walletIdentities': 'Identités de portefeuille',
  'connections.walletDerived':
    'Dérivé localement depuis ta phrase de récupération et stocké comme métadonnées sécurisées uniquement.',
  'connections.privacySecurity': 'Confidentialité & Sécurité',
  'connections.privacySecurityDesc':
    "Toutes les données et informations d'identification sont stockées localement avec une politique de zéro rétention de données. Tes informations sont chiffrées et ne sont jamais partagées avec des tiers.",
  'channels.status.connecting': 'Connexion en cours',
  'channels.status.notConfigured': 'Non configuré',
  'channels.noActiveRoute': 'Aucune route active',
  'channels.activeRoute': 'Route active',
  'channels.loadingDefinitions': 'Chargement des définitions de canaux…',
  'channels.channelConnections': 'Connexions de canaux',
  'channels.configureAuthModes':
    "Configurer les modes d'authentification pour chaque canal de messagerie.",
  'channels.configNotAvailable': 'Configuration pour',
  'channels.channel': 'canal',
  'devOptions.coreModeNotSet': 'Mode core : non défini',
  'devOptions.coreModeNotSetDesc':
    "Le sélecteur de vérification au démarrage n'a pas encore été confirmé. Utilise Changer de mode dans le sélecteur pour choisir Local ou Cloud.",
  'devOptions.local': 'local',
  'devOptions.embeddedCoreSidecar': 'Sidecar core intégré',
  'devOptions.sidecarSpawned':
    "Lancé en processus interne par le shell Tauri au démarrage de l'app.",
  'devOptions.cloud': 'Nuage',
  'devOptions.remoteCoreRpc': 'RPC core distant',
  'devOptions.token': 'Jeton',
  'devOptions.tokenNotSet': 'non défini — le RPC renverra 401',
  'devOptions.triggerSentryTest': 'Déclencher un test Sentry (staging)',
  'devOptions.triggerSentryTestDesc':
    'Envoie une erreur balisée pour vérifier le pipeline Sentry. Issue #1072 — à supprimer après vérification.',
  'devOptions.sendTestEvent': 'Envoyer un événement de test',
  'devOptions.sending': 'Envoi…',
  'devOptions.eventSent': 'Événement envoyé',
  'devOptions.sentryDisabled': '(aucun identifiant - Sentry désactivé dans cette version)',
  'devOptions.failed': 'Échec',
  'devOptions.appLogs': "Journaux de l'app",
  'devOptions.appLogsDesc':
    'Ouvrir le dossier contenant les fichiers journaux quotidiens. Joins le fichier le plus récent quand tu signales un problème.',
  'devOptions.openLogsFolder': 'Ouvrir le dossier des journaux',
  'mnemonic.phraseSaved': 'Phrase de récupération enregistrée',
  'mnemonic.walletReady':
    'Les identités de portefeuille multi-chaîne sont prêtes. Retour aux paramètres…',
  'mnemonic.writeDownWords': 'Note ces',
  'mnemonic.wordsInOrder':
    "mots dans l'ordre et conserve-les en lieu sûr. Cette phrase sécurise ta clé de chiffrement locale et tes identités de portefeuille EVM, BTC, Solana et Tron.",
  'mnemonic.cannotRecover':
    'Cette phrase ne peut jamais être récupérée si elle est perdue et doit rester entièrement locale sur ton appareil.',
  'mnemonic.copyToClipboard': 'Copier dans le presse-papiers',
  'mnemonic.alreadyHavePhrase': "J'ai déjà une phrase de récupération",
  'mnemonic.consentSaved':
    "J'ai sauvegardé cette phrase et j'accepte de l'utiliser pour la configuration du portefeuille local",
  'mnemonic.enterPhraseToRestore':
    "Saisis ta phrase de récupération ci-dessous pour restaurer tes identités de portefeuille locales, ou colle la phrase complète dans n'importe quel champ (12 mots pour les nouvelles sauvegardes ; les phrases de 24 mots des versions antérieures fonctionnent toujours).",
  'mnemonic.words': 'Mots',
  'mnemonic.validPhrase': 'Phrase de récupération valide',
  'mnemonic.generateNewPhrase': 'Générer une nouvelle phrase de récupération à la place',
  'mnemonic.securingData': 'Sécurisation de tes données…',
  'mnemonic.saveRecoveryPhrase': 'Enregistrer la phrase de récupération',
  'mnemonic.userNotLoaded': 'Utilisateur non chargé. Reconnecte-toi ou actualise la page.',
  'mnemonic.invalidPhrase': 'Phrase de récupération invalide. Vérifie tes mots et réessaie.',
  'mnemonic.somethingWentWrong': "Une erreur s'est produite. Réessaie.",
  'mnemonic.walletAlreadyConfigured': 'Ton portefeuille est déjà configuré.',
  'mnemonic.walletSource': 'Source',
  'mnemonic.walletWordCount': 'Nombre de mots',
  'mnemonic.walletLastUpdated': 'Dernière mise à jour',
  'mnemonic.replaceWallet': 'Remplacer le portefeuille',
  'mnemonic.replaceWalletWarning':
    "Cela remplacera définitivement ton portefeuille actuel. Assure-toi d'avoir sauvegardé ta phrase de récupération avant de continuer.",
  'mnemonic.replaceWalletConfirm': 'Je comprends, remplacer mon portefeuille',
  'mnemonic.loadingWalletStatus': 'Vérification du statut du portefeuille...',
  'mnemonic.viewAccounts': 'Voir les comptes du portefeuille',
  'mnemonic.revealRecoveryPhrase': 'Révéler la phrase de récupération',
  'mnemonic.hidePhrase': 'Masquer la phrase',
  'team.failedToCreate': "Échec de la création de l'équipe",
  'team.invalidInviteCode': "Code d'invitation invalide ou expiré",
  'team.failedToSwitch': "Échec du changement d'équipe",
  'team.failedToLeave': "Échec de la sortie de l'équipe",
  'team.role.owner': 'Propriétaire',
  'team.role.admin': 'Administrateur',
  'team.role.billingManager': 'Gestionnaire de facturation',
  'team.role.member': 'Membre',
  'team.active': 'Actif',
  'team.personalTeam': 'Équipe personnelle',
  'team.manageTeam': "Gérer l'équipe",
  'team.switching': 'Changement…',
  'team.switch': 'Changer',
  'team.leaving': 'Départ…',
  'team.leave': 'Quitter',
  'team.yourTeams': 'Tes équipes',
  'team.createNewTeam': 'Créer une nouvelle équipe',
  'team.teamName': "Nom de l'équipe",
  'team.creating': 'Création…',
  'team.joinExistingTeam': 'Rejoindre une équipe existante',
  'team.personalAutoCreatedNote':
    'Votre équipe personnelle est créée automatiquement. Pour collaborer, rejoignez une équipe existante avec un code d’invitation ci-dessous.',
  'team.inviteCode': "Code d'invitation",
  'team.joining': 'Adhésion…',
  'team.join': 'Rejoindre',
  'team.leaveTeam': "Quitter l'équipe",
  'team.confirmLeave': 'Es-tu sûr de vouloir quitter',
  'team.leaveWarning':
    "Tu perdras l'accès à l'équipe et à toutes ses ressources. Tu auras besoin d'une nouvelle invitation pour la rejoindre.",
  'team.management': "Gestion de l'équipe",
  'team.notFound': 'Équipe introuvable',
  'team.accessDenied': 'Accès refusé',
  'team.members': 'Membres',
  'team.membersDesc': "Gérer les membres et les rôles de l'équipe",
  'team.invites': 'Invites',
  'team.invitesDesc': "Générer et gérer les codes d'invitation",
  'team.settings': "Paramètres de l'équipe",
  'team.settingsDesc': "Modifier le nom et les paramètres de l'équipe",
  'team.editSettings': "Modifier les paramètres de l'équipe",
  'team.enterName': "Entrer le nom de l'équipe",
  'team.saving': 'Enregistrement...',
  'team.saveChanges': 'Enregistrer les modifications',
  'team.delete': "Supprimer l'équipe",
  'team.deleteDesc': 'Supprimer définitivement cette équipe',
  'team.deleting': 'Suppression...',
  'team.failedToUpdate': "Échec de la mise à jour de l'équipe",
  'team.failedToDelete': "Échec de la suppression de l'équipe",
  'team.manageTitle': 'Gérer {name}',
  'team.planCreated': '{plan} Plan • Créé {date}',
  'team.confirmDelete': 'Êtes-vous sûr de vouloir supprimer {name} ?',
  'team.deleteWarning':
    "Cette action est irréversible. Toutes les données de l'équipe seront définitivement supprimées.",
  'voice.title': 'Dictée vocale',
  'voice.settings': 'Paramètres vocaux',
  'voice.settingsDesc':
    'Maintiens le raccourci pour dicter et insérer du texte dans le champ actif.',
  'voice.hotkey': 'Raccourci',
  'voice.activationMode': "Mode d'activation",
  'voice.tapToToggle': 'Appuyer pour activer/désactiver',
  'voice.writingStyle': "Style d'écriture",
  'voice.verbatimTranscription': 'Transcription verbatim',
  'voice.naturalCleanup': 'Nettoyage naturel',
  'voice.autoStart': 'Démarrer le serveur vocal automatiquement avec le core',
  'voice.customDictionary': 'Dictionnaire personnalisé',
  'voice.customDictionaryDesc':
    'Ajoute des noms, termes techniques et mots du domaine pour améliorer la précision de la reconnaissance.',
  'voice.addWord': 'Ajouter un mot…',
  'voice.sttDisabled':
    "La dictée vocale est désactivée jusqu'à ce que le modèle STT local soit téléchargé et prêt.",
  'voice.openLocalAiModel': 'Ouvrir le modèle IA local',
  'voice.serverRestarted': 'Serveur vocal redémarré avec les nouveaux paramètres.',
  'voice.settingsSaved': 'Paramètres vocaux enregistrés.',
  'voice.serverStarted': 'Serveur vocal démarré.',
  'voice.serverStopped': 'Serveur vocal arrêté.',
  'voice.saveVoiceSettings': 'Enregistrer les paramètres vocaux',
  'voice.startVoiceServer': 'Démarrer le serveur vocal',
  'voice.stopVoiceServer': 'Arrêter le serveur vocal',
  'voice.debugTitle': 'Débogage vocal',
  'voice.failedToLoadSettings': 'Échec du chargement des paramètres vocaux',
  'voice.failedToSaveSettings': 'Échec de la sauvegarde des paramètres vocaux',
  'voice.failedToStartServer': 'Échec du démarrage du serveur vocal',
  'voice.failedToStopServer': "Échec de l'arrêt du serveur vocal",
  'voice.sttDisabledPrefix':
    "La dictée vocale est désactivée jusqu'au téléchargement du modèle STT local. Utilisez le",
  'voice.sttDisabledSuffix': 'ci-dessus pour installer Whisper.',
  'voice.debug.failedToLoadVoiceDebugData': 'Échec du chargement des données de débogage vocal.',
  'voice.debug.settingsSaved': 'Paramètres de débogage enregistrés.',
  'voice.debug.failedToSaveSettings': 'Échec de la sauvegarde des paramètres vocaux',
  'voice.debug.runtimeStatus': "État du moteur d'exécution",
  'voice.debug.runtimeStatusDesc':
    'Diagnostics en direct pour le serveur vocal et le moteur de reconnaissance vocale.',
  'voice.debug.server': 'Serveur',
  'voice.debug.unavailable': 'Indisponible',
  'voice.debug.ready': 'Prêt',
  'voice.debug.notReady': 'Non prêt',
  'voice.debug.hotkey': 'Raccourci',
  'voice.debug.notAvailable': 'n/a',
  'voice.debug.mode': 'Mode',
  'voice.debug.transcriptions': 'Transcriptions',
  'voice.debug.serverError': 'Erreur du serveur',
  'voice.debug.advancedSettings': 'Paramètres avancés',
  'voice.debug.advancedSettingsDesc':
    "Paramètres de réglage fin pour l'enregistrement et la détection du silence.",
  'voice.debug.minimumRecordingSeconds': "Durée minimale d'enregistrement (secondes)",
  'voice.debug.silenceThreshold': 'Seuil de silence (RMS)',
  'voice.debug.silenceThresholdDesc':
    "Les enregistrements dont l'énergie est inférieure à ce seuil sont traités comme du silence et ignorés. Plus bas = plus sensible.",
  'voice.debug.alwaysOn': 'Écoute permanente',
  'voice.debug.alwaysOnDesc':
    'Garde le microphone ouvert et envoie automatiquement ce que vous dites à l’agent, sans raccourci. Se met en pause lorsque l’écran est verrouillé.',
  'voice.providers.saved': 'Fournisseurs de voix enregistrés.',
  'voice.providers.failedToSave': 'Échec de la sauvegarde des fournisseurs vocaux',
  'voice.providers.ellipsis': '…',
  'voice.providers.installing': 'Installation de',
  'voice.providers.installingBusy': 'Installation…',
  'voice.providers.reinstallLocally': 'Réinstaller localement',
  'voice.providers.repair': 'Réparer',
  'voice.providers.retryLocally': 'Réessayez localement',
  'voice.providers.installLocally': 'Installez localement',
  'voice.providers.whisperReady': 'Whisper est prêt.',
  'voice.providers.whisperInstallStarted': 'Installation de Whisper démarrée',
  'voice.providers.queued': 'queued',
  'voice.providers.failedToInstallWhisper': "Échec de l'installation de Whisper",
  'voice.providers.piperReady': 'Piper est prêt.',
  'voice.providers.piperInstallStarted': 'Installation de Piper démarrée',
  'voice.providers.failedToInstallPiper': "Échec de l'installation de Piper",
  'voice.providers.title': 'Fournisseurs de voix',
  'voice.providers.desc':
    "Choisissez où la transcription et la synthèse s'exécutent. Utilisez les boutons Installer localement pour télécharger les binaires et modèles dans votre espace de travail. Les fournisseurs locaux peuvent être enregistrés avant la fin de l'installation — aucune configuration manuelle de WHISPER_BIN ou PIPER_BIN requise.",
  'voice.providers.sttProvider': 'Fournisseur de synthèse vocale',
  'voice.providers.sttProviderAria': 'Fournisseur STT',
  'voice.providers.cloudWhisperProxy': 'Cloud (proxy Whisper)',
  'voice.providers.localWhisper': 'Whisper local',
  'voice.providers.installRequired': '(installation requise)',
  'voice.providers.whisperInstalledTitle': 'Whisper est installé. Cliquez pour réinstaller.',
  'voice.providers.whisperDownloadTitle':
    'Télécharger whisper.cpp et le modèle GGML dans votre espace de travail.',
  'voice.providers.installed': 'Installé',
  'voice.providers.installFailed': "Échec de l'installation",
  'voice.providers.notInstalled': 'Non installé',
  'voice.providers.whisperModel': 'Modèle Whisper',
  'voice.providers.whisperModelAria': 'Modèle Whisper',
  'voice.providers.whisperModelTiny': 'Petit (39 Mo, le plus rapide)',
  'voice.providers.whisperModelBase': 'Base (74 Mo)',
  'voice.providers.whisperModelSmall': 'Petit (244 Mo)',
  'voice.providers.whisperModelMedium': 'Moyen (769 Mo, recommandé)',
  'voice.providers.whisperModelLargeTurbo': 'Grand v3 Turbo (1,5 Go, meilleure précision)',
  'voice.providers.ttsProvider': 'Fournisseur de synthèse vocale',
  'voice.providers.ttsProviderAria': 'Fournisseur TTS',
  'voice.providers.cloudElevenLabsProxy': 'Cloud (proxy ElevenLabs)',
  'voice.providers.localPiper': 'Piper local',
  'voice.providers.piperInstalledTitle': 'Piper est installé. Cliquez pour réinstaller.',
  'voice.providers.piperDownloadTitle':
    'Télécharger Piper et la voix en_US-lessac-medium intégrée dans votre espace de travail.',
  'voice.providers.piperVoice': 'Voix Piper',
  'voice.providers.piperVoiceAria': 'Voix Piper',
  'voice.providers.customVoiceOption': 'Autre (tapez ci-dessous)…',
  'voice.providers.customVoiceAria': 'Piper voice id (personnalisé)',
  'voice.providers.customVoicePlaceholder': 'en_US-lessac-medium',
  'voice.providers.piperVoicesDesc':
    'Les voix proviennent de huggingface.co/rhasspy/piper-voices. Changer de voix peut nécessiter un clic sur Installer/Réinstaller pour télécharger le nouveau fichier .onnx.',
  'voice.providers.mascotVoice': 'Voix de la mascotte',
  'voice.providers.mascotVoiceDescPrefix':
    'La voix ElevenLabs que la mascotte utilise pour ses réponses vocales est configurée sous',
  'voice.providers.mascotSettings': 'Paramètres de la mascotte',
  'voice.providers.mascotVoiceDescSuffix': '.',
  'voice.providers.hotkeyPlaceholder': 'Fn',
  'voice.providers.piperPreset.lessacMedium': 'US · Lessac (neutre, recommandé)',
  'voice.providers.piperPreset.lessacHigh': 'États-Unis · Lessac (qualité supérieure, plus grand)',
  'voice.providers.piperPreset.ryanMedium': 'États-Unis · Ryan (homme)',
  'voice.providers.piperPreset.amyMedium': 'États-Unis · Amy (femme)',
  'voice.providers.piperPreset.librittsHigh': 'États-Unis · LibriTTS (multi-haut-parleurs)',
  'voice.providers.piperPreset.alanMedium': 'GB · Alan (homme)',
  'voice.providers.piperPreset.jennyDiocoMedium': 'GB · Jenny Dioco (femme)',
  'voice.providers.piperPreset.northernEnglishMaleMedium': 'GB · Anglais du Nord (homme)',
  'voice.providers.chip.cloud': 'OpenHuman (Géré)',
  'voice.providers.chip.cloudAria': 'Le fournisseur géré OpenHuman est toujours activé',
  'voice.providers.chip.whisper': 'Whisper (Local)',
  'voice.providers.chip.enableWhisper': 'Activer la transcription Whisper locale',
  'voice.providers.chip.disableWhisper': 'Désactiver la transcription Whisper locale',
  'voice.providers.chip.piper': 'Piper (Local)',
  'voice.providers.chip.enablePiper': 'Activer la synthèse vocale Piper locale',
  'voice.providers.chip.disablePiper': 'Désactiver la synthèse vocale Piper locale',
  'voice.providers.chip.enableProvider': 'Enable',
  'voice.providers.chip.disableProvider': 'Disable',
  'voice.providers.chip.apiKeyLabel': 'Clé API',
  'voice.providers.chip.apiKeyPlaceholder': 'sk-…',
  'voice.providers.chip.comingSoon': 'bientôt disponible',
  'voice.modal.title': 'Configure',
  'voice.modal.desc':
    "Saisissez votre clé API pour activer ce fournisseur. Vous pouvez tester la connexion avant d'enregistrer.",
  'voice.modal.testKey': 'Tester la clé',
  'voice.modal.testing': 'Test en cours…',
  'voice.modal.saveAndEnable': 'Enregistrer et activer',
  'voice.modal.enable': 'Enable',
  'voice.modal.whisperDesc':
    'Choisissez une taille de modèle et installez le binaire Whisper ainsi que le modèle GGML dans votre espace de travail. Les modèles plus grands sont plus précis mais plus lents.',
  'voice.modal.piperDesc':
    'Choisissez une voix et installez le binaire Piper ainsi que le modèle ONNX dans votre espace de travail. Piper fonctionne entièrement hors ligne avec une faible latence.',
  'voice.routing.title': 'Routage vocal',
  'voice.routing.desc':
    'Choisissez quels fournisseurs activés gèrent la reconnaissance et la synthèse vocale.',
  'voice.routing.save': 'Save',
  'voice.routing.testStt': 'Tester STT',
  'voice.routing.testTts': 'Tester TTS',
  'voice.routing.elevenlabsVoice': 'Voix ElevenLabs',
  'voice.routing.elevenlabsVoiceAria': 'Sélection de la voix ElevenLabs',
  'voice.routing.elevenlabsVoiceIdAria': 'ID de voix ElevenLabs (personnalisé)',
  'voice.routing.elevenlabsVoiceDesc':
    'Choisissez une voix sélectionnée ou collez un ID de voix personnalisé depuis votre tableau de bord ElevenLabs.',
  'voice.externalProviders.title': 'Fournisseurs vocaux externes',
  'voice.externalProviders.desc':
    'Connectez des APIs STT/TTS tierces comme Deepgram, ElevenLabs ou OpenAI directement.',
  'voice.externalProviders.keySet': 'Clé définie',
  'voice.externalProviders.noKey': 'Aucune clé API',
  'voice.externalProviders.test': 'Test',
  'voice.externalProviders.testing': 'Test en cours…',
  'voice.externalProviders.remove': 'Remove',
  'voice.externalProviders.provider': 'Provider',
  'voice.externalProviders.selectProvider': 'Sélectionner un fournisseur…',
  'voice.externalProviders.apiKey': 'Clé API',
  'voice.externalProviders.apiKeyPlaceholder': 'sk-…',
  'voice.externalProviders.add': 'Add',
  'pttSettings.title': 'Appuyer pour parler',
  'pttSettings.description':
    'Maintiens une touche pour parler à OpenHuman pendant que tu utilises une autre application. Relâcher envoie l’enregistrement ; si « Lire les réponses » est activé, OpenHuman lit la réponse à voix haute.',
  'pttSettings.shortcutLabel': 'Raccourci',
  'pttSettings.shortcutPlaceholder': 'Appuie sur une touche (par exemple F13)',
  'pttSettings.shortcutUnsetHint':
    'Appuyer pour parler est désactivé — choisis un raccourci pour l’activer.',
  'pttSettings.speakRepliesLabel': 'Lire les réponses de l’agent à voix haute',
  'pttSettings.showOverlayLabel': 'Afficher la surcouche pendant l’appui',
  'pttSettings.errorConflictsWithDictation':
    'Ce raccourci est déjà utilisé par la dictée. Choisis une autre touche.',
  'pttSettings.errorModifierOnly':
    'Choisis une touche ordinaire (par exemple F13) — les raccourcis composés uniquement de modificateurs ne fonctionnent pas pour appuyer pour parler.',
  'pttSettings.errorEmpty': 'Choisis une touche à associer.',
  'pttSettings.errorAccessibility':
    'macOS exige l’autorisation Accessibilité pour ce raccourci. Ouvre Réglages système → Confidentialité et sécurité → Accessibilité et active OpenHuman.',
  'pttSettings.errorShortcutInUse':
    'Une autre application utilise déjà ce raccourci. Choisis-en un autre.',
  'pttSettings.errorUnsupportedWayland':
    'Les sessions Wayland ne prennent pas encore en charge les raccourcis globaux dans OpenHuman — passe à une session X11 ou utilise la commande de dictée intégrée à l’application.',
  'pttSettings.exclusiveFullscreenHint':
    'En plein écran exclusif des jeux, la surcouche ne s’affichera pas — tu entendras seulement le son. Passe en plein écran sans bordures pour voir la surcouche.',
  'pttOverlay.listening': 'À l’écoute…',
  'pttOverlay.idle': 'En attente',
  'autocomplete.title': 'Autocomplétion',
  'autocomplete.settings': 'Paramètres',
  'autocomplete.acceptWithTab': 'Accepter avec Tab',
  'autocomplete.stylePreset': 'Préréglage de style',
  'autocomplete.style.balanced': 'Équilibré',
  'autocomplete.style.concise': 'Concis',
  'autocomplete.style.formal': 'Formel',
  'autocomplete.style.casual': 'Décontracté',
  'autocomplete.style.custom': 'Personnalisé',
  'autocomplete.disabledApps': "Apps désactivées (un identifiant d'app par ligne)",
  'autocomplete.saveSettings': 'Enregistrer les paramètres',
  'autocomplete.saving': 'Enregistrement…',
  'autocomplete.runtime': 'Runtime',
  'autocomplete.running': 'En cours',
  'autocomplete.start': 'Démarrer',
  'autocomplete.stop': 'Arrêter',
  'autocomplete.settingsSaved': "Paramètres d'autocomplétion enregistrés.",
  'autocomplete.started': 'Autocomplétion démarrée.',
  'autocomplete.didNotStart': "L'autocomplétion n'a pas démarré. Vérifie qu'elle est activée.",
  'autocomplete.stopped': 'Autocomplétion arrêtée.',
  'autocomplete.advancedSettings': 'Paramètres avancés',
  'autocomplete.debugTitle': "Débogage de l'autocomplétion",
  'chat.agentChat': "Chat avec l'agent",
  'chat.overrides': 'Remplacements',
  'chat.model': 'Modèle',
  'chat.temperature': 'Température',
  'chat.conversation': 'Conversation',
  'chat.startAgentConversation': "Démarre une conversation avec l'agent.",
  'chat.you': 'Toi',
  'chat.agent': 'Agent',
  'chat.askAgent': "Pose n'importe quelle question à l'agent…",
  'chat.sendMessage': 'Envoyer le message',
  'composio.triageTitle': "Déclencheurs d'intégration",
  'composio.triageDesc':
    "Quand activé, chaque déclencheur Composio entrant passe par une étape de triage IA qui classe l'événement et peut lancer des actions automatisées — un tour LLM local par déclencheur. Désactive globalement ou par intégration si tu préfères une revue manuelle. Si la variable d'environnement",
  'composio.disableAllTriage': 'Désactiver le triage IA pour tous les déclencheurs',
  'composio.triggersStillRecorded':
    "Les déclencheurs sont toujours enregistrés dans l'historique — aucun tour LLM n'est exécuté.",
  'composio.disableSpecificIntegrations':
    'Désactiver le triage IA pour des intégrations spécifiques',
  'composio.settingsSaved': 'Paramètres enregistrés',
  'composio.saveFailed': "Échec de l'enregistrement. Réessaie.",
  'cron.title': 'Tâches cron',
  'cron.scheduledJobs': 'Tâches planifiées',
  'cron.manageCronJobs': 'Gérer les tâches cron depuis le planificateur core.',
  'cron.refreshCronJobs': 'Actualiser les tâches cron',
  'localModel.modelStatus': 'État du modèle',
  'localModel.downloadModels': 'Télécharger les modèles',
  'localModel.usage': 'Utilisation',
  'localModel.usageDesc':
    'Choisis quels sous-systèmes tournent sur le modèle local. Tout ce qui est désactivé utilise le cloud.',
  'localModel.enableRuntime': 'Activer le runtime IA local',
  'localModel.enableRuntimeDesc':
    "Interrupteur principal. Désactivé par défaut — Ollama reste en veille. Quand activé, le résumeur d'arbre, l'intelligence d'écran et l'autocomplétion utilisent toujours le modèle local.",
  'localModel.advancedSettings': 'Paramètres avancés',
  'localModel.debugTitle': 'Débogage du modèle local',
  'screenAwareness.debugTitle': "Débogage de la surveillance de l'écran",
  'screenAwareness.debug.debugAndDiagnostics': 'Débogage et diagnostics',
  'screenAwareness.debug.collapse': 'Réduire',
  'screenAwareness.debug.expand': 'Développer',
  'screenAwareness.debug.failedToSave': "Échec de la sauvegarde de l'intelligence écran",
  'screenAwareness.debug.policyTitle': "Politique d'intelligence écran",
  'screenAwareness.debug.baselineFps': 'FPS de référence',
  'screenAwareness.debug.useVisionModel': 'Utiliser le modèle de vision',
  'screenAwareness.debug.useVisionModelDesc':
    "Envoyer les captures d'écran à un LLM vision pour un contexte plus riche. Désactivé, seul le texte OCR est utilisé avec un LLM texte — plus rapide et sans modèle vision requis.",
  'screenAwareness.debug.keepScreenshots': "Conserver les captures d'écran",
  'screenAwareness.debug.keepScreenshotsDesc':
    "Enregistrer les captures dans l'espace de travail au lieu de les supprimer après traitement",
  'screenAwareness.debug.allowlist': "Liste d'autorisation (une règle par ligne)",
  'screenAwareness.debug.denylist': 'Liste de refus (une règle par ligne)',
  'screenAwareness.debug.saveSettings': "Enregistrer les paramètres d'intelligence écran",
  'screenAwareness.debug.sessionStats': 'Statistiques de session',
  'screenAwareness.debug.framesEphemeral': 'Trames (éphémères)',
  'screenAwareness.debug.panicStop': 'Arrêt de panique',
  'screenAwareness.debug.defaultPanicHotkey': 'Cmd+Shift+.',
  'screenAwareness.debug.vision': 'Vision',
  'screenAwareness.debug.idle': 'inactif',
  'screenAwareness.debug.visionQueue': "File d'attente vision",
  'screenAwareness.debug.lastVision': 'Dernière vision',
  'screenAwareness.debug.notAvailable': 'n/a',
  'screenAwareness.debug.visionSummaries': 'Résumés de vision',
  'screenAwareness.debug.refreshing': 'Actualisation…',
  'screenAwareness.debug.noSummaries': "Aucun résumé pour l'instant.",
  'screenAwareness.debug.unknownApp': 'Application inconnue',
  'screenAwareness.debug.macosOnly':
    'Screen Intelligence V1 est actuellement pris en charge sur macOS uniquement.',
  'memory.debugTitle': 'Débogage de la mémoire',
  'memory.documents': 'Documents',
  'memory.filterByNamespace': 'Filtrer par espace de noms...',
  'memory.refresh': 'Actualiser',
  'memory.noDocumentsFound': 'Aucun document trouvé.',
  'memory.delete': 'Supprimer',
  'memory.rawResponse': 'Réponse brute',
  'memory.namespaces': 'Espaces de noms',
  'memory.noNamespacesFound': 'Aucun espace de noms trouvé.',
  'memory.queryRecall': 'Requête et rappel',
  'memory.namespace': 'Espace de noms',
  'memory.queryText': 'Texte de requête...',
  'memory.defaultMaxChunks': '10',
  'memory.maxChunks': 'morceaux maximum',
  'memory.query': 'Requête',
  'memory.recall': 'Rappel',
  'memory.queryLabel': 'Requête',
  'memory.recallLabel': 'Rappel',
  'memory.queryResult': 'Résultat de la requête',
  'memory.recallResult': 'Rappel du résultat',
  'memory.clearNamespace': "Vider l'espace de noms",
  'memory.clearNamespaceDescription':
    "Supprimer définitivement tous les documents d'un espace de noms.",
  'memory.selectNamespace': 'Sélectionner un espace de noms…',
  'memory.exampleNamespace': 'par ex. skills:gmail:user@example.com',
  'memory.clear': 'Effacer',
  'memory.deleteConfirm':
    "Supprimer le document « {documentId} » dans l'espace de noms « {namespace} » ?",
  'memory.clearNamespaceConfirm':
    "Cela supprimera définitivement TOUS les documents de l'espace de noms « {namespace} ». Continuer ?",
  'memory.clearNamespaceSuccess': 'Espace de noms « {namespace} » effacé.',
  'memory.clearNamespaceEmpty': 'Rien à effacer dans "{namespace}".',
  'webhooks.debugTitle': 'Débogage des webhooks',
  'webhooks.failedToLoadDebugData': 'Échec du chargement des données de débogage du webhook',
  'webhooks.clearLogsConfirm': 'Effacer tous les journaux de débogage des webhooks capturés ?',
  'webhooks.failedToClearLogs': 'Échec de la suppression des journaux webhook',
  'webhooks.loading': 'Chargement...',
  'webhooks.refresh': 'Actualiser',
  'webhooks.clearing': 'Effacement...',
  'webhooks.clearLogs': 'Effacer les journaux',
  'webhooks.registered': 'enregistré',
  'webhooks.captured': 'capturé',
  'webhooks.live': 'en direct',
  'webhooks.disconnected': 'déconnecté',
  'webhooks.lastEvent': 'Dernier événement',
  'webhooks.at': 'à',
  'webhooks.registeredWebhooks': 'Webhooks enregistrés',
  'webhooks.noActiveRegistrations': 'Aucune inscription active.',
  'webhooks.resolvingBackendUrl': 'Résolution du backend URL…',
  'webhooks.capturedRequests': 'Requêtes capturées',
  'webhooks.noRequestsCaptured': 'Aucune demande de webhook capturée pour le moment.',
  'webhooks.unrouted': 'non acheminé',
  'webhooks.pending': 'en attente',
  'webhooks.requestHeaders': 'En-têtes de requête',
  'webhooks.queryParams': 'Paramètres de requête',
  'webhooks.requestBody': 'Corps de la requête',
  'webhooks.responseHeaders': 'En-têtes de réponse',
  'webhooks.responseBody': 'Corps de réponse',
  'webhooks.rawPayload': 'Charge utile brute',
  'webhooks.empty': '[vide]',
  'providerSetup.error.defaultDetails': 'La configuration du fournisseur a échoué.',
  'providerSetup.error.providerFallback': 'Le fournisseur',
  'providerSetup.error.credentialsRejected':
    '{provider} a rejeté les identifiants. Vérifiez la clé API et réessayez.',
  'providerSetup.error.endpointNotRecognized':
    "{provider} n'a pas reconnu le point de terminaison. Vérifiez l'URL de base et réessayez.",
  'providerSetup.error.providerUnavailable':
    '{provider} est actuellement indisponible. Réessayez ou vérifiez le statut du fournisseur.',
  'providerSetup.error.unreachable':
    "Impossible de joindre {provider}. Vérifiez l'URL du point de terminaison et la connexion réseau, puis réessayez.",
  'providerSetup.error.couldNotReachWithMessage': 'Impossible de joindre {provider} : {message}',
  'providerSetup.error.technicalDetails': 'Détails techniques',
  'notifications.routingTitle': 'Routage des notifications',
  'notifications.routing.pipelineStats': 'Statistiques du pipeline',
  'notifications.routing.total': 'Total',
  'notifications.routing.unread': 'Non lu',
  'notifications.routing.unscored': 'Non noté',
  'notifications.routing.intelligenceTitle': 'Intelligence des notifications',
  'notifications.routing.intelligenceDesc':
    "Chaque notification de vos comptes connectés est évaluée par un modèle d'IA local. Les notifications à haute importance sont automatiquement transmises à votre agent orchestrateur pour qu'aucune information critique ne passe inaperçue.",
  'notifications.routing.howItWorks': 'Comment ça marche',
  'notifications.routing.level.drop': 'Déposer',
  'notifications.routing.level.dropDesc': 'Bruit/spam — stockés mais non visibles',
  'notifications.routing.level.acknowledge': 'Acquitter',
  'notifications.routing.level.acknowledgeDesc':
    'Basse priorité — affichée dans le centre de notifications',
  'notifications.routing.level.react': 'Réagir',
  'notifications.routing.level.reactDesc':
    "Priorité moyenne — déclenche une réponse ciblée de l'agent",
  'notifications.routing.level.escalate': 'Escalader',
  'notifications.routing.level.escalateDesc': "Haute priorité — transmise à l'agent orchestrateur",
  'notifications.routing.perProvider': 'Routage par fournisseur',
  'notifications.routing.threshold': 'Seuil',
  'notifications.routing.routeToOrchestrator': "Transmettre à l'orchestrateur",
  'notifications.routing.loadSettingsError':
    'Échec du chargement des paramètres. Rouvrez ce panneau pour réessayer.',
  'common.reload': 'Recharger',
  'common.skip': 'Passer',
  'common.disable': 'Désactiver',
  'common.enable': 'Activer',
  'chat.safetyTimeout':
    "Aucune réponse de l'agent après 2 minutes. Réessaie ou vérifie ta connexion.",
  'chat.filter.general': 'Général',
  'chat.filter.subconscious': 'Subconscient',
  'chat.filter.meetings': 'Réunions',
  'chat.filter.tasks': 'Tâches',
  'chat.selectThread': 'Sélectionne un fil',
  'chat.threads': 'Fils',
  'chat.noThreads': "Aucun fil pour l'instant",
  'chat.noLabelThreads': 'Aucun fil « {label} »',
  'chat.deleteThread': 'Supprimer le fil',
  'chat.deleteThreadConfirm': 'Es-tu sûr de vouloir supprimer « {title} » ?',
  'chat.untitledThread': 'Fil sans titre',
  'chat.editThreadTitle': 'Modifier le titre du fil',
  'chat.hideSidebar': 'Masquer la barre latérale',
  'chat.showSidebar': 'Afficher la barre latérale',
  'chat.searchThreads': 'Rechercher des conversations',
  'layout.resizeSidebar': 'Redimensionner la barre latérale',
  'layout.showSidebar': 'Afficher la barre latérale',
  'chat.newThreadShortcut': 'Nouveau fil (/new)',
  'chat.new': 'Nouveau',
  'chat.failedToLoadMessages': 'Échec du chargement des messages',
  'chat.thinkingIteration': 'Réflexion… ({n})',
  'chat.thinkingDots': 'Réflexion…',
  'chat.approachingLimit': "Limite d'utilisation proche",
  'chat.approachingLimitMsg': 'Tu as utilisé {pct}% de ton quota disponible.',
  'chat.upgrade': 'Passer à la version supérieure',
  'chat.weeklyLimitHit': 'Tu as atteint ta limite hebdomadaire.',
  'chat.resets': 'Réinitialisation',
  'chat.topUpToContinue': 'Recharge pour continuer.',
  'chat.budgetComplete':
    'Ton budget inclus est épuisé. Ajoute des crédits ou passe à la version supérieure pour continuer.',
  'chat.topUp': 'Recharger',
  'chat.cycle': 'Cycle',
  'chat.cycleSpent': 'Dépensé ce cycle',
  'chat.cycleRemaining': 'Restant',
  'chat.left': 'restant',
  'chat.setup': 'Configurer',
  'chat.switchToText': 'Passer au texte',
  'chat.superContext.label': 'Super contexte',
  'chat.superContext.hint':
    'Super contexte permet à OpenHuman de rassembler et de préparer le contexte à partir de toutes les données auxquelles il a accès afin de fournir une réponse très pertinente. Super contexte est en bêta précoce.',
  'chat.transcribing': 'Transcription…',
  'chat.stopAndSend': 'Arrêter et envoyer',
  'chat.startTalking': 'Commence à parler',
  'chat.playingVoiceReply': 'Lecture de la réponse vocale',
  'chat.voiceHint': 'Utilise le micro pour parler',
  'chat.micUnavailable': 'Microphone indisponible',
  'chat.turn': 'tour',
  'chat.turns': 'tours',
  'chat.openWorkerThread': 'Ouvrir le fil worker',
  'chat.attachment.attach': 'Joindre une image',
  'chat.attachment.remove': 'Supprimer {name}',
  'chat.attachment.tooMany': 'Maximum {max} images par message',
  'chat.attachment.tooManyFiles': 'Maximum {max} fichiers par message',
  'chat.attachment.tooManyVideos': 'Maximum {max} vidéos par message',
  'chat.attachment.videoNotSupported':
    'Ce modèle ne peut pas lire les vidéos. Tu peux utiliser le niveau Raisonnement d’OpenHuman pour joindre ta vidéo.',
  'chat.attachment.dropToAttach': 'Déposez les fichiers pour les joindre',
  'chat.attachment.tooLarge': "L'image dépasse la taille limite de {max}",
  'chat.attachment.unsupportedType':
    'Type de fichier non pris en charge. Utilise une image (PNG, JPEG, WebP, GIF, BMP) ou un fichier PDF, TXT ou Markdown.',
  'chat.attachment.imageNotSupported':
    'Ce modèle ne peut pas lire les images. Tu peux utiliser le niveau Raisonnement d’OpenHuman pour joindre ton image.',
  'chat.attachment.readFailed': 'Impossible de lire le fichier',
  'memory.searchAria': 'Rechercher dans la mémoire',
  'memory.searchPlaceholder': 'Rechercher des entrées de mémoire…',
  'memory.sourceFilter.all': 'Toutes les sources',
  'memory.sourceFilter.email': 'E-mail',
  'memory.sourceFilter.calendar': 'Calendrier',
  'memory.sourceFilter.telegram': 'Telegram',
  'memory.sourceFilter.aiInsight': 'Insight IA',
  'memory.sourceFilter.system': 'Système',
  'memory.sourceFilter.trading': 'Trading',
  'memory.sourceFilter.security': 'Sécurité',
  'memory.ingestionActivity': "Activité d'ingestion",
  'memory.events': 'événements',
  'memory.event': 'événement',
  'memory.overTheLast': 'au cours des derniers',
  'memory.months': 'mois',
  'memory.peak': 'Pic',
  'memory.perDay': '/jour',
  'memory.less': 'Moins',
  'memory.more': 'Plus',
  'memory.on': 'le',
  'memory.loading': 'Chargement de la mémoire',
  'memory.fetching': 'Récupération de tes entrées de mémoire…',
  'memory.analyzing': 'Analyse de la mémoire',
  'memory.analyzingHint': 'Traitement de tes souvenirs pour en extraire des insights…',
  'memory.noMatches': 'Aucun résultat trouvé',
  'memory.noMatchesHint': 'Essaie de modifier tes termes de recherche ou tes filtres.',
  'memory.allCaughtUp': 'Tout est à jour',
  'memory.allCaughtUpHint': 'Aucune nouvelle entrée de mémoire à traiter.',
  'memory.noAnalysis': "Pas encore d'analyse",
  'memory.noAnalysisHint': 'Lance une analyse pour découvrir des tendances dans tes souvenirs.',
  'memory.emptyHint': 'Commence à interagir pour créer tes premiers souvenirs.',
  'mic.unavailable': "Le microphone n'est pas disponible",
  'mic.permissionDenied': 'Permission microphone refusée',
  'mic.failedToStartRecorder': "Échec du démarrage de l'enregistreur",
  'mic.deviceUnavailable':
    "Le microphone sélectionné n'est pas disponible — essayez un autre appareil.",
  'mic.deviceInUse': 'Le microphone est utilisé par une autre application.',
  'mic.error': 'Erreur de microphone',
  'mic.transcribing': 'Transcription…',
  'mic.retryingTranscription': 'Nouvelle tentative… ({attempt} sur {max})',
  'mic.tapToSend': 'Appuie pour envoyer',
  'mic.waitingForAgent': "En attente de l'agent…",
  'mic.tapAndSpeak': 'Appuie et parle',
  'mic.stopRecording': "Arrêter l'enregistrement et envoyer",
  'mic.startRecording': "Démarrer l'enregistrement",
  'mic.deviceSelector': 'Dispositif de microphone',
  'mic.tapToSendCountdown': 'Appuie pour envoyer ({seconds}s)',
  'token.usageLimitReached': "Limite d'utilisation atteinte",
  'token.approachingLimit': 'Limite proche',
  'token.planClickForDetails': 'plan - clique pour les détails',
  'token.sessionTokens': 'Entrée : {in} | Sortie : {out} | Tours : {turns}',
  'token.limit': 'Limite atteinte',
  'token.inLabel': 'ENT',
  'token.outLabel': 'SOR',
  'token.inputTokens': 'Tokens en entrée cette session',
  'token.outputTokens': 'Tokens en sortie cette session',
  'token.turnsCount': "Tours d'inférence cette session",
  'token.turn': 'tour',
  'token.turns': 'tours',
  'token.ctxLabel': 'CTX',
  'token.contextWindow': 'Utilisation de la fenêtre de contexte (dernier tour)',
  'token.cachedLabel': 'En cache',
  'token.costLabel': 'Coût',
  'token.costTitle': 'Coût estimé de cette session (USD)',
  'token.sessionUsageTitle': 'Utilisation de la session',
  'token.subAgentsHeading': 'Utilisation des sous-agents',
  'token.byAgentHeading': 'Par agent',
  'token.orchestrator': 'Orchestrateur',
  'token.noSubAgents': 'Aucune utilisation de sous-agent pour le moment',
  'token.popInput': 'Jetons d’entrée',
  'token.popOutput': 'Jetons de sortie',
  'token.popCacheHit': 'Succès de cache',
  'token.popContext': 'Fenêtre de contexte',
  'token.tipInput':
    'Jetons envoyés au modèle durant cette session — vos invites plus l’historique de la conversation.',
  'token.tipOutput': 'Jetons générés par le modèle durant cette session.',
  'token.tipCacheHit':
    'Jetons d’entrée servis depuis un préfixe d’invite en cache, facturés à un tarif réduit.',
  'token.clickForDetails': 'Cliquez pour les détails d’utilisation de la session',
  'catalog.noCapabilityBinding': 'Aucune liaison de fonctionnalité',
  'catalog.downloadFailed': 'Échec du téléchargement',
  'catalog.active': 'Actif',
  'catalog.installed': 'Installé',
  'catalog.notDownloaded': 'Non téléchargé',
  'catalog.inUse': "En cours d'utilisation",
  'catalog.use': 'Utiliser',
  'catalog.deleteModel': 'Supprimer le modèle',
  'catalog.download': 'Télécharger',
  'navigator.recent': 'Récent',
  'navigator.today': "Aujourd'hui",
  'navigator.thisWeek': 'Cette semaine',
  'navigator.sources': 'Sources',
  'navigator.email': 'E-mail',
  'navigator.slack': 'Slack',
  'navigator.chat': 'Chat',
  'navigator.documents': 'Documents',
  'navigator.people': 'Personnes',
  'navigator.topics': 'Sujets',
  'dreams.description':
    'Les rêves sont des réflexions générées par IA qui synthétisent des tendances de ta mémoire.',
  'dreams.comingSoon': 'Bientôt disponible',
  'assignment.memoryLlm': 'LLM de mémoire',
  'assignment.memoryLlmAria': 'Sélection du LLM de mémoire',
  'assignment.embedder': 'Intégrateur',
  'assignment.loaded': 'Chargé',
  'assignment.notDownloaded': 'Non téléchargé',
  'assignment.usedForExtractSummarise': "Utilisé pour l'extraction et la synthèse",
  'insights.knownFacts': 'Faits connus',
  'insights.preferences': 'Préférences',
  'insights.relationships': 'Relations',
  'insights.skills': 'Compétences',
  'insights.opinions': 'Opinions',
  'insights.other': 'Autre',
  'insights.title': 'Insights',
  'insights.empty':
    "Pas encore d'insights. Les insights sont générés au fur et à mesure que ta mémoire grandit.",
  'insights.description': 'Basé sur {count} relations dans ton graphe de mémoire.',
  'insights.items': 'éléments',
  'insights.more': 'de plus',
  'calls.joiningCall': "Connexion à l'appel",
  'calls.meetWindowOpening': "La fenêtre Meet s'ouvre…",
  'calls.failedToStart': "Échec du démarrage de l'appel Google Meet",
  'calls.couldNotStart': "Impossible de démarrer l'appel",
  'calls.failedToClose': "Échec de la fermeture de l'appel",
  'calls.couldNotClose': "Impossible de fermer l'appel",
  'calls.joinMeet': 'Rejoindre un appel Google Meet',
  'calls.joinMeetDescription': 'Saisis un lien Google Meet pour rejoindre.',
  'calls.meetLink': 'Lien Meet',
  'calls.displayName': "Nom d'affichage",
  'calls.openingMeet': 'Ouverture de Meet…',
  'calls.joinCall': "Rejoindre l'appel",
  'calls.activeCalls': 'Appels actifs',
  'calls.leave': 'Quitter',
  'workspace.wipeConfirm':
    'Es-tu sûr de vouloir effacer toute la mémoire ? Cette action est irréversible.',
  'workspace.resetTreeConfirm': "Es-tu sûr de vouloir reconstruire l'arbre de mémoire ?",
  'workspace.wipeTitle': 'Effacer la mémoire',
  'workspace.resetting': 'Réinitialisation…',
  'workspace.resetMemory': 'Réinitialiser la mémoire',
  'workspace.resetTreeTitle': "Reconstruire l'arbre de mémoire",
  'workspace.rebuilding': 'Reconstruction…',
  'workspace.resetMemoryTree': "Réinitialiser l'arbre de mémoire",
  'workspace.building': 'Construction…',
  'workspace.buildSummaryTrees': 'Construire les arbres de résumé',
  'workspace.viewVault': 'Voir le coffre',
  'workspace.openingVaultTitle': 'Ouverture du coffre-fort dans Obsidian',
  'workspace.openingVaultMessage':
    "Si Obsidian ne s'ouvre pas, installez-le depuis obsidian.md ou utilisez Afficher le dossier. Chemin du coffre :",
  'workspace.openVaultFailedTitle': "Impossible d'ouvrir le coffre dans Obsidian",
  'workspace.openVaultFailedMessage':
    'Utilisez Reveal Folder pour ouvrir directement le répertoire du coffre-fort. Chemin du coffre-fort :',
  'workspace.revealVaultFailed': "Impossible d'afficher le dossier du coffre",
  'workspace.revealFolder': 'Révéler le dossier',
  'workspace.checkingVault': 'Vérification…',
  'workspace.vaultNotRegisteredHelp':
    "Obsidian n'ouvre que les dossiers que vous avez ajoutés comme coffre. Dans Obsidian, choisissez « Ouvrir le dossier comme coffre » et sélectionnez le dossier ci-dessous — vous ne devez le faire qu'une seule fois. Cliquez ensuite sur Afficher le coffre.",
  'workspace.obsidianNotFoundHelp':
    "Obsidian est introuvable sur cet appareil. Installez-le, ou — s'il est installé dans un emplacement non standard — définissez son dossier de configuration sous Avancé.",
  'workspace.openAnyway': 'Ouvrir dans Obsidian quand même',
  'workspace.installObsidian': 'Installer Obsidian',
  'workspace.obsidianAdvanced': 'Obsidian installé ailleurs ?',
  'workspace.obsidianConfigDirLabel': 'Dossier de configuration Obsidian',
  'workspace.obsidianConfigDirHint':
    'Chemin vers le dossier contenant obsidian.json (ex. ~/.config/obsidian). Laisser vide pour la détection automatique.',
  'workspace.obsidianConfigDirPlaceholder': '~/.config/obsidian',
  'workspace.graphLoadFailed': 'Échec du chargement du graphe de mémoire',
  'workspace.loadingGraph': 'Chargement du graphe de mémoire…',
  'workspace.graphViewMode': 'Mode de vue du graphe de mémoire',
  'workspace.trees': 'Arbres',
  'workspace.contacts': 'Contacts',
  'graph.noContactMentions': 'Aucune mention de contact',
  'graph.noMemory': 'Aucune mémoire',
  'graph.source': 'Source',
  'graph.topic': 'Sujet',
  'graph.global': 'Global',
  'graph.document': 'Document',
  'graph.contact': 'Contact',
  'graph.nodes': 'nœuds',
  'graph.parentChild': 'parent-enfant',
  'graph.documentContact': 'document-contact',
  'graph.link': 'lien',
  'graph.links': 'liens',
  'graph.children': 'enfants',
  'graph.clickToOpenObsidian': 'Clique pour ouvrir dans Obsidian',
  'graph.person': 'Personne',
  'graph.resetView': 'Réinitialiser la vue',
  'modal.dontShowAgain': 'Ne plus afficher de suggestions similaires',
  'reflections.loading': 'Chargement des réflexions…',
  'reflections.empty': 'Pas encore de réflexions',
  'reflections.title': 'Réflexions',
  'reflections.proposedAction': 'Action proposée',
  'reflections.act': 'Agir',
  'reflections.dismiss': 'Ignorer',
  'reflections.viewConversation': 'Voir',
  'subconscious.mode.label': 'Mode subconscient',
  'subconscious.mode.off.title': 'Désactivé',
  'subconscious.mode.off.desc': 'Le subconscient est désactivé.',
  'subconscious.mode.simple.title': 'Simple',
  'subconscious.mode.simple.desc':
    'Observation en lecture seule. Accès mémoire et fichiers uniquement.',
  'subconscious.mode.aggressive.title': 'Agressif',
  'subconscious.mode.aggressive.desc':
    'Accès complet aux outils. Peut écrire, créer des agents et déléguer des tâches.',
  'subconscious.mode.aggressiveWarning':
    "Le mode agressif donne au subconscient un accès complet aux outils, y compris l'écriture et la création de sous-agents.",
  'subconscious.interval.label': 'Fréquence',
  'subconscious.interval.minutes': '{n} min',
  'subconscious.interval.hours': '{n}h',
  'subconscious.interval.oneHour': '1 heure',
  'subconscious.interval.oneDay': '24 heures',
  'whatsapp.chatsSynced': 'conversations synchronisées',
  'whatsapp.chatSynced': 'conversation synchronisée',
  'sync.active': 'Actif',
  'sync.recent': 'Récent',
  'sync.idle': 'En veille',
  'sync.memorySources': 'Sources de mémoire',
  'sync.noConnectedSources': 'Aucune source connectée',
  'sync.chunks': 'segments',
  'sync.lastChunk': 'Dernier segment :',
  'sync.pending': 'en attente',
  'sync.processed': 'traité',
  'sync.syncing': 'Synchronisation…',
  'sync.sync': 'Synchroniser',
  'sync.failedToLoad': "Échec du chargement de l'état de synchronisation",
  'sync.noContent':
    "Aucun contenu n'a encore été synchronisé dans la mémoire. Connecte une intégration pour commencer.",
  'memorySyncInterval.title': 'Calendrier de synchronisation',
  'memorySyncInterval.lastSynced': 'Dernière synchronisation',
  'memorySyncInterval.never': 'jamais',
  'memorySyncInterval.everyHours': 'Toutes les {h} h',
  'memorySyncInterval.everyMinutes': 'Toutes les {m} min',
  'memorySyncInterval.manual': 'Manuel uniquement',
  'memorySyncInterval.saveFailed': 'Échec de la mise à jour du calendrier de synchronisation',
  'memorySources.title': 'Sources de mémoire',
  'memorySources.empty':
    'Aucune source de mémoire pour le moment. Ajoutez-en une pour commencer à alimenter la mémoire.',
  'memorySources.customSources': 'Sources personnalisées',
  'memorySources.addSource': 'Ajouter une source',
  'memorySources.noCustomSources':
    'Pas encore de sources personnalisées. Ajoutez un dossier, le dépôt GitHub, le flux RSS ou une page web pour commencer.',
  'memorySources.loadingConnections': 'Chargement des connexions…',
  'memorySources.noConnections':
    "Aucune connexion Composio active trouvée. Connectez d'abord une intégration.",
  'memorySources.pickConnection': 'Choisissez une connexion',
  'memorySources.selectConnection': '— Sélectionnez une connexion —',
  'memorySources.comingSoon': 'Bientôt disponible',
  'memorySources.composioListFailed': 'Échec du chargement des connexions Composio.',
  'memorySources.browse': 'Parcourir…',
  'memorySources.folderPathPlaceholder': '/Users/you/notes',
  'memorySources.globPatternPlaceholder': '**/*.md',
  'memorySources.repoUrlPlaceholder': 'https://github.com/org/repo',
  'memorySources.branchPlaceholder': 'main',
  'memorySources.feedUrlPlaceholder': 'https://example.com/feed.xml',
  'memorySources.pageUrlPlaceholder': 'https://example.com/article',
  'memorySources.cssSelectorPlaceholder': 'article',
  'memorySources.searchQueryPlaceholder': "de:l'utilisateur AI sécurité",
  'memorySources.kind.composio': 'Intégration',
  'memorySources.kind.conversation': 'Conversation',
  'memorySources.kind.folder': 'Dossier local',
  'memorySources.kind.github_repo': 'GitHub Dépôt',
  'memorySources.kind.twitter_query': 'Recherche Twitter',
  'memorySources.kind.rss_feed': 'RSS Flux',
  'memorySources.kind.web_page': 'Page Web',
  'memorySources.sync.successTitle': 'Synchronisation',
  'memorySources.sync.successMessage': 'Le progrès apparaîtra bientôt.',
  'memorySources.sync.failedTitle': 'Échec de la synchronisation:',
  'memorySources.sync.completeTitle': 'Synchronisé',
  'memorySources.sync.itemsSynced': 'éléments synchronisés',
  'memorySources.sync.upToDate': 'À jour',
  'memorySources.sync.failedLabel': 'Échec',
  'time.justNow': "à l'instant",
  'time.secondsAgoSuffix': 's',
  'time.minutesAgoSuffix': 'min',
  'time.hoursAgoSuffix': 'h',
  'time.daysAgoSuffix': 'j',
  'memorySources.pickKind': 'Quel type de source voulez-vous ajouter?',
  'memorySources.backToKinds': 'Retour aux types de source',
  'memorySources.label': 'Étiquette',
  'memorySources.labelPlaceholder': 'Mes notes de recherche',
  'memorySources.add': 'Ajouter',
  'memorySources.adding': 'Ajout en cours…',
  'memorySources.added': 'Source ajoutée',
  'memorySources.removed': 'Source supprimée',
  'memorySources.remove': 'Supprimer',
  'memorySources.enable': 'Activer',
  'memorySources.disable': 'Désactiver',
  'memorySources.toggleFailed': 'Basculement échoué',
  'memorySources.removeFailed': 'Échec de la suppression',
  'memorySources.folderPath': 'Chemin du dossier',
  'memorySources.globPattern': 'Motif glob',
  'memorySources.repoUrl': 'Dépôt URL',
  'memorySources.branch': 'Branche',
  'memorySources.feedUrl': 'Alimentez URL',
  'memorySources.pageUrl': 'URL de la page',
  'memorySources.cssSelector': 'Sélecteur CSS (optionnel)',
  'memorySources.searchQuery': 'Requête de recherche',
  'memorySources.build.title': 'Construire',
  'memorySources.build.building': 'Construction…',
  'memorySources.build.successTitle': 'Arbre construit',
  'memorySources.build.failedTitle': 'Échec de construction',
  'memorySources.build.sealsMessage': 'scellement(s) terminé(s)',
  'memorySources.allIn.button': 'Tout activer',
  'memorySources.allIn.title': 'Tout activer ?',
  'memorySources.allIn.message':
    'Cela activera toutes les sources de mémoire et supprimera toutes les limites de synchronisation. Cela construit le graphe de mémoire le plus riche, mais peut utiliser davantage de crédits.',
  'memorySources.allIn.confirm': 'Oui',
  'memorySources.allIn.cancel': 'Non',
  'memorySources.allIn.success': 'Toutes les sources activées sans limite. Synchronisation lancée.',
  'memorySources.allIn.failed': "Impossible d'appliquer tout activer. Veuillez réessayer.",
  'memorySources.settings.button': 'Paramètres',
  'memorySources.settings.title': 'Paramètres de synchronisation',
  'memorySources.settings.maxPrs': 'Nombre maximal de pull requests',
  'memorySources.settings.maxIssues': "Nombre maximal d'issues",
  'memorySources.settings.maxCommits': 'Nombre maximal de commits',
  'memorySources.settings.maxItems': "Nombre maximal d'éléments",
  'memorySources.settings.sinceDays': 'Période de recherche (jours)',
  'memorySources.settings.syncDepthDays': 'Profondeur de synchronisation (jours)',
  'memorySources.settings.maxTokens': 'Tokens maximum par synchronisation',
  'memorySources.settings.maxCost': 'Coût maximum par synchronisation (USD)',
  'memorySources.settings.unlimited': 'Illimité',
  'memorySources.settings.unlimitedTooltip':
    'Vous avez choisi de synchroniser le maximum pour {toolkit}. Vous pouvez modifier les limites ici.',
  'memorySources.settings.maxed': 'Plein',
  'memorySources.settings.save': 'Enregistrer',
  'memorySources.settings.saving': 'Enregistrement…',
  'memorySources.settings.saved': 'Paramètres enregistrés',
  'memorySources.settings.saveFailed': "Impossible d'enregistrer les paramètres",
  'backend.aiBackend': 'Backend IA',
  'backend.cloud': 'Cloud',
  'backend.recommended': 'Recommandé',
  'backend.cloudDescription':
    "Modèles rapides et puissants hébergés sur nos serveurs. Prêt à l'emploi immédiatement.",
  'backend.privacyNote':
    "Aucune donnée personnelle, message ou clé n'est jamais envoyé à nos serveurs.",
  'backend.local': 'Local',
  'backend.advanced': 'Avancé',
  'backend.localDescription':
    'Fais tourner les modèles sur ta propre machine avec Ollama. Confidentialité totale, configuration requise.',
  'backend.ramRecommended': '16 Go+ de RAM recommandés',
  'subconscious.tasks': 'tâches',
  'subconscious.ticks': 'ticks',
  'subconscious.last': 'Dernier',
  'subconscious.failed': 'échoué',
  'subconscious.tickInterval': 'Intervalle de tick',
  'subconscious.runNow': 'Exécuter maintenant',
  'subconscious.providerUnavailableTitle': 'Subconscient en pause',
  'subconscious.providerSettings': 'Paramètres IA',
  'subconscious.scratchpadInfo':
    "À chaque cycle, le subconscient examine ce qui a changé dans vos sources connectées, puis enregistre des suivis dans votre liste de tâches, met à jour vos objectifs ou vous notifie lorsqu'un élément nécessite votre attention. Consultez Paramètres → Accès agent pour configurer le mode et la fréquence.",
  'subconscious.approvalNeeded': 'Approbation requise',
  'subconscious.requiresApproval': 'Nécessite une approbation',
  'subconscious.fixInConnections': 'Corriger dans Connexions',
  'subconscious.goAhead': "Aller de l'avant",
  'subconscious.activeTasks': 'Tâches actives',
  'subconscious.noActiveTasks': 'Aucune tâche active',
  'subconscious.default': 'Par défaut',
  'subconscious.addTaskPlaceholder': 'Ajouter une nouvelle tâche…',
  'subconscious.activityLog': "Journal d'activité",
  'subconscious.noActivity': "Aucune activité pour l'instant",
  'subconscious.decision.nothingNew': 'Rien de nouveau',
  'subconscious.decision.completed': 'Terminé',
  'subconscious.decision.evaluating': 'Évaluation en cours',
  'subconscious.decision.waitingApproval': "En attente d'approbation",
  'subconscious.decision.failed': 'Échoué',
  'subconscious.decision.cancelled': 'Annulé',
  'subconscious.decision.skipped': 'Ignoré',
  // Subconscious triggers (event-driven orchestrator) debug panel
  'subconsciousTriggers.title': 'Déclencheurs du subconscient',
  'subconsciousTriggers.subtitle': "Orchestrateur d'arrière-plan piloté par événements",
  'subconsciousTriggers.pipeline': 'Pipeline',
  'subconsciousTriggers.mode': 'Mode',
  'subconsciousTriggers.orchestrator': 'Orchestrateur',
  'subconsciousTriggers.running': 'En cours',
  'subconsciousTriggers.stopped': 'Arrêté',
  'subconsciousTriggers.promotionsPerHour': 'Promotions / heure',
  'subconsciousTriggers.queueDepth': 'Profondeur de la file',
  'subconsciousTriggers.orchestratorThread': "Fil de l'orchestrateur",
  'subconsciousTriggers.userThread': "Fil de l'utilisateur",
  'subconsciousTriggers.disabledHint':
    'Activez le mode piloté par événements pour démarrer le pipeline.',
  'subconsciousTriggers.enable': 'Activer',
  'subconsciousTriggers.disable': 'Désactiver',
  'actionable.complete': 'Terminer',
  'actionable.dismiss': 'Ignorer',
  'actionable.snooze': 'Reporter',
  'actionable.new': 'Nouveau',
  'stats.storage': 'Stockage',
  'stats.files': 'fichiers',
  'stats.documents': 'Documents',
  'stats.today': "aujourd'hui",
  'stats.namespaces': 'Espaces de noms',
  'stats.relations': 'Relations',
  'stats.firstMemory': 'Premier souvenir',
  'stats.latest': 'Dernier',
  'stats.sessions': 'Sessions',
  'stats.tokens': 'jetons',
  'bootCheck.invalidUrl': 'Saisis une URL de runtime.',
  'bootCheck.urlMustStartWith': "L'URL doit commencer par http:// ou https://",
  'bootCheck.validUrlRequired':
    'Ça ne ressemble pas à une URL valide (essaie https://core.example.com/rpc)',
  'bootCheck.tokenRequired': "On aura besoin d'un token d'authentification pour se connecter.",
  'bootCheck.httpPublicWarning':
    'Ceci est une URL HTTP en clair sur un hôte public — le trafic ne sera pas chiffré. Utilisez HTTPS sauf si vous faites confiance à ce réseau.',
  'bootCheck.chooseCoreMode': 'Sélectionner un runtime',
  'bootCheck.connectToCore': 'Connecte-toi à ton runtime',
  'bootCheck.desktopDescription':
    "OpenHuman a besoin d'un runtime pour fonctionner. Choisis où il doit être hébergé.",
  'bootCheck.webDescription':
    "Sur le web, OpenHuman se connecte à un runtime que tu contrôles. Renseigne son URL et son token d'authentification ci-dessous, ou télécharge l'app desktop pour en faire tourner un directement sur ta machine.",
  'bootCheck.preferDesktop': 'Tu préfères tout garder sur ton propre appareil ?',
  'bootCheck.downloadDesktop': "Télécharger l'app desktop",
  'bootCheck.localRecommended': 'Exécuter localement (Recommandé)',
  'bootCheck.localDescription':
    'Tourne directement sur ton ordinateur. Le plus rapide, entièrement privé, rien à configurer.',
  'bootCheck.cloudMode': 'Exécuter dans le cloud (Complexe)',
  'bootCheck.cloudDescription':
    "Connecte-toi à un runtime que tu héberges ailleurs. Reste en ligne 24h/24 et 7j/7 — tu n'as pas besoin de garder cet appareil allumé.",
  'bootCheck.coreRpcUrl': 'URL du runtime',
  'bootCheck.rpcUrlPlaceholder': 'https://core.example.com/rpc',
  'bootCheck.authToken': "Token d'authentification",
  'bootCheck.bearerTokenPlaceholder': 'Le token bearer de ton runtime distant',
  'bootCheck.storedLocally': 'Conservé sur cet appareil uniquement. Envoyé en tant que ',
  'bootCheck.testing': 'Test en cours…',
  'bootCheck.testConnection': 'Tester la connexion',
  'bootCheck.connectedOk': 'Connecté. Tu es prêt.',
  'bootCheck.authFailed': "Ce token n'a pas fonctionné. Vérifie-le et réessaie.",
  'bootCheck.unreachablePrefix': "Impossible de l'atteindre :",
  'bootCheck.checkingCore': 'Réveil de ton runtime…',
  'bootCheck.cannotReach': "Impossible d'atteindre le runtime",
  'bootCheck.cannotReachDesc':
    "On n'a pas pu se connecter à ton runtime. Tu veux en essayer un autre ?",
  'bootCheck.switchMode': 'Choisir un autre runtime',
  'bootCheck.quit': 'Quitter',
  'bootCheck.legacyDetected': 'Runtime de fond hérité détecté',
  'bootCheck.legacyDescription':
    "Un daemon OpenHuman installé séparément est déjà en cours d'exécution sur cet appareil. On doit le supprimer avant que le runtime intégré puisse prendre le relais.",
  'bootCheck.removing': 'Suppression…',
  'bootCheck.removeContinue': 'Supprimer et continuer',
  'bootCheck.localNeedsRestart': 'Le runtime local doit être redémarré',
  'bootCheck.localNeedsRestartDesc':
    'Ton runtime local est sur une version différente de cette app. Un redémarrage rapide les remettra en synchronisation.',
  'bootCheck.restarting': 'Redémarrage…',
  'bootCheck.restartCore': 'Redémarrer le runtime',
  'bootCheck.cloudNeedsUpdate': 'Le runtime cloud doit être mis à jour',
  'bootCheck.cloudNeedsUpdateDesc':
    'Ton runtime cloud est sur une version différente de cette app. Lance la mise à jour pour les remettre en synchronisation.',
  'bootCheck.updating': 'Mise à jour…',
  'bootCheck.updateCloudCore': 'Mettre à jour le runtime cloud',
  'bootCheck.versionCheckFailed': 'Échec de la vérification de la version du runtime',
  'bootCheck.versionCheckFailedDesc':
    'Ton runtime est actif mais ne rapporte pas sa version. Il est peut-être obsolète. Redémarre-le ou mets-le à jour pour continuer.',
  'bootCheck.working': 'En cours…',
  'bootCheck.restartUpdateCore': 'Redémarrer / Mettre à jour le runtime',
  'bootCheck.unexpectedError': 'Erreur inattendue lors de la vérification au démarrage',
  'bootCheck.actionFailed': "Une erreur s'est produite. Réessaie.",
  'bootCheck.portConflictTitle': "Impossible de démarrer le moteur de l'application",
  'bootCheck.portConflictBody':
    'Un autre processus utilise le port réseau dont OpenHuman a besoin. Nous allons tenter de corriger cela automatiquement.',
  'bootCheck.portConflictFixButton': 'Corriger automatiquement',
  'bootCheck.portConflictFixing': 'Correction en cours…',
  'bootCheck.portConflictFixFailed':
    "La correction automatique n'a pas fonctionné. Veuillez redémarrer votre ordinateur et réessayer.",
  'bootCheck.portConflictOwner':
    '{name} (PID {pid}) utilise le port réseau dont OpenHuman a besoin.',
  'bootCheck.portConflictGuidance':
    'Fermez ce programme pour libérer le port, ou forcez sa fermeture ci-dessous, puis réessayez.',
  'bootCheck.portConflictForceQuit': 'Forcer la fermeture de {name}',
  'bootCheck.portConflictForceQuitting': 'Fermeture de {name}…',
  'bootCheck.portConflictForceQuitFailed':
    'Impossible de fermer ce programme. Vous devrez peut-être le fermer manuellement, puis réessayer.',
  'notifications.justNow': "à l'instant",
  'notifications.minAgo': 'il y a {n} min',
  'notifications.hrAgo': 'il y a {n} h',
  'notifications.dayAgo': 'il y a {n} j',
  'notifications.category.messages': 'Messages',
  'notifications.category.agents': 'Agents',
  'notifications.category.skills': 'Compétences',
  'notifications.category.system': 'Système',
  'notifications.category.meetings': 'Réunions',
  'notifications.category.reminders': 'Rappels',
  'notifications.category.important': 'Important',
  'notifications.filterAll': 'Tout',
  'notifications.filterEmpty': 'Aucune alerte dans cette catégorie',
  'about.update.status.checking': 'Vérification…',
  'about.update.status.available': 'v{version} disponible',
  'about.update.status.availableNoVersion': 'Mise à jour disponible',
  'about.update.status.downloading': 'Téléchargement…',
  'about.update.status.readyToInstall': 'v{version} prête à installer',
  'about.update.status.readyToInstallNoVersion':
    "Une nouvelle version est téléchargée et prête. Redémarre pour l'appliquer.",
  'about.update.status.installing': 'Installation…',
  'about.update.status.restarting': 'Redémarrage…',
  'about.update.status.upToDate': 'Tu utilises la dernière version.',
  'about.update.status.error': 'Échec de la vérification des mises à jour',
  'about.update.status.default': 'Rechercher des mises à jour',
  'welcome.connectionFailed': 'Connexion échouée : {status} {statusText}',
  'welcome.connectionFailedMsg': 'Connexion échouée : {message}',
  'welcome.continueLocally': 'Continuer localement',
  'welcome.continueLocallyExperimental': 'Continuer en local (Expérimental)',
  'welcome.localSessionStarting': 'Démarrage de la session locale...',
  'welcome.localSessionDesc': 'Utilise un profil local hors ligne et ignore TinyHumans OAuth.',
  'chat.agentChatDesc': "Ouvrir une session de chat direct avec l'agent.",
  'chat.modelPlaceholder': 'gpt-4o',
  'channels.activeRouteValue': '{channel} via {authMode}',
  'privacy.dataKind.messages': 'Messages',
  'privacy.dataKind.agents': 'Agents',
  'privacy.dataKind.skills': 'Compétences',
  'privacy.dataKind.system': 'Système',
  'privacy.dataKind.meetings': 'Réunions',
  'privacy.dataKind.reminders': 'Rappels',
  'privacy.dataKind.important': 'Important',
  'onboarding.enableLocalAI': "Activer l'IA locale",
  'onboarding.skills.status.available': 'Disponible',
  'onboarding.skills.status.connected': 'Connecté',
  'onboarding.skills.status.connecting': 'Connexion en cours',
  'onboarding.skills.status.error': 'Erreur',
  'onboarding.skills.status.unavailable': 'Indisponible',
  'composio.statusUnavailable': 'État indisponible',
  'composio.authExpired': 'Authentification expirée',
  'composio.reconnect': 'Reconnecter',
  'composio.expiredAuthorization': "L'autorisation {name} a expiré",
  'composio.expiredDescription':
    "Reconnectez-vous pour réactiver les outils {name}. OpenHuman gardera cette intégration indisponible jusqu'à ce que vous actualisiez l'accès OAuth.",
  'composio.envVarOverrides': 'est définie, elle remplace ce paramètre.',
  'composio.previewBadge': 'Aperçu',
  'composio.previewTooltip':
    "Intégration de l'agent bientôt disponible : vous pouvez vous connecter, mais l'agent ne peut pas encore utiliser cette boîte à outils.",
  'memory.day.sun': 'Dim',
  'memory.day.mon': 'Lun',
  'memory.day.tue': 'Mar',
  'memory.day.wed': 'Mer',
  'memory.day.thu': 'Jeu',
  'memory.day.fri': 'Ven',
  'memory.day.sat': 'Sam',
  'memory.ingesting': 'Ingestion',
  'memory.ingestionQueued': "En file d'attente",
  'memory.ingestingTitle': 'Ingestion de {title}',
  'mic.noAudioCaptured': 'Aucun audio capturé',
  'mic.noSpeechDetected': 'Aucune parole détectée',
  'mic.lowConfidenceResult': "Impossible de comprendre l'audio clairement — réessaie",
  'mic.failedToStopRecording': "Échec de l'arrêt de l'enregistrement : {message}",
  'mic.transcriptionFailed': 'Échec de la transcription : {message}',
  'reflections.kind.retrospective': 'Rétrospective',
  'reflections.kind.derivedFact': 'Fait dérivé',
  'reflections.kind.moodInsight': 'Insight émotionnel',
  'reflections.kind.relationshipInsight': 'Insight relationnel',
  'graph.tooltip.summary': 'Résumé',
  'graph.tooltip.contact': 'Contact',
  'localModel.usage.never': 'Jamais',
  'localModel.usage.mediumLoad': 'Charge moyenne',
  'localModel.usage.lowLoad': 'Faible charge',
  'localModel.usage.idleMode': 'Mode veille',
  'localModel.rebootstrapComplete': 'Re-bootstrap du modèle terminé.',
  'localModel.modelsVerified': 'Modèles locaux vérifiés.',
  'accounts.addModal.allConnected': 'Tout est connecté',
  'accounts.addModal.title': 'Ajouter un compte',
  'accounts.respondQueue.empty': 'Vide',
  'accounts.respondQueue.hide': 'Masquer la file de réponses',
  'accounts.respondQueue.loadFailed': 'Échec du chargement de la file de réponses',
  'accounts.respondQueue.loading': 'Chargement de la file…',
  'accounts.respondQueue.pending': 'En attente',
  'accounts.respondQueue.show': 'Afficher la file de réponses',
  'accounts.respondQueue.title': 'File de réponses',
  'accounts.webviewHost.almostReady': 'Presque prêt…',
  'accounts.webviewHost.loadTimeout': 'Délai de chargement de la webview dépassé',
  'accounts.webviewHost.loading': 'Chargement de {providerName}…',
  'accounts.webviewHost.loadingAccount': 'Chargement du compte',
  'accounts.webviewHost.restoringSession': 'Restauration de la session…',
  'accounts.webviewHost.retryLoading': 'Réessayer le chargement',
  'accounts.webviewHost.takingLonger': '{providerName} prend plus de temps que prévu.',
  'accounts.webviewHost.timeoutHint': "Indice de délai d'attente",
  'app.connectionBadge.composio': 'Composio',
  'app.connectionBadge.messaging': 'Messagerie',
  'app.connectionIndicator.connected': 'Connecté à OpenHuman AI 🚀',
  'app.connectionIndicator.connecting': 'Connexion en cours',
  'app.connectionIndicator.coreOffline': 'Core hors ligne',
  'app.connectionIndicator.disconnected': 'Déconnecté',
  'app.connectionIndicator.offline': 'Hors ligne',
  'app.connectionIndicator.reconnecting': 'Reconnexion…',
  'app.errorFallback.componentStack': 'Pile de composants',
  'app.errorFallback.contactSupport': 'Contacter le support',
  'app.errorFallback.copyEventId': 'Copier',
  'app.errorFallback.eventIdCopied': 'Copié',
  'app.errorFallback.eventIdLabel': "ID d'erreur",
  'app.errorFallback.revealLogs': 'Afficher les journaux',
  'app.errorFallback.downloadLatest': 'Télécharger la dernière version',
  'app.errorFallback.heading': 'Titre',
  'app.errorFallback.hint': 'Indice',
  'app.errorFallback.reloadApp': "Recharger l'app",
  'app.errorFallback.subheading': 'Sous-titre',
  'app.errorFallback.tryRecover': 'Essayer de récupérer',
  'app.localAiDownload.installing': 'Installation…',
  'app.localAiDownload.preparing': 'Préparation…',
  'app.openhumanLink.accounts.continueWith': 'Continuer avec la connexion {label}',
  'app.openhumanLink.accounts.done': 'Terminé',
  'app.openhumanLink.accounts.intro': 'Intro',
  'app.openhumanLink.accounts.webviewNote': 'Note webview',
  'app.openhumanLink.billing.openDashboard': 'Ouvrir le tableau de bord',
  'app.openhumanLink.billing.stayOnTrial': "Rester en période d'essai",
  'app.openhumanLink.billing.trialCredit': "Crédits d'inscription",
  'app.openhumanLink.billing.trialDesc':
    "Les offres de crédits peuvent varier selon la promotion et l'éligibilité du compte.",
  'app.openhumanLink.defaultBody':
    'Pas encore disponible dans la fenêtre contextuelle. Ouvrez la page des paramètres complète si nécessaire.',
  'app.openhumanLink.discord.intro': 'Intro',
  'app.openhumanLink.discord.openInvite': "Ouvrir l'invitation",
  'app.openhumanLink.discord.perk1': 'Avantage 1',
  'app.openhumanLink.discord.perk2': 'Avantage 2',
  'app.openhumanLink.discord.perk3': 'Avantage 3',
  'app.openhumanLink.discord.perk4': 'Avantage 4',
  'app.openhumanLink.discordReport.intro':
    "Désolé — quelque chose s'est mal passé de notre côté. Nous essayons de journaliser ces erreurs automatiquement, mais partager les détails sur Discord nous aide à les corriger plus vite.",
  'app.openhumanLink.discordReport.openDiscord': 'Ouvrir Discord',
  'app.openhumanLink.done': 'Terminé',
  'app.openhumanLink.notifications.desktopOnly':
    "Les notifications natives ne sont disponibles que dans l'application de bureau (exécutez `pnpm dev:app`).",
  'app.openhumanLink.notifications.permissionOff':
    "L'autorisation des notifications est désactivée. Activez OpenHuman dans Réglages système → Notifications, puis réessayez.",
  'app.openhumanLink.notifications.triggerFailed':
    "OpenHuman n'a pas pu déclencher de notification système. Vérifiez les paramètres de notification du système d'exploitation et réessayez.",
  'app.openhumanLink.notifications.welcomeBody':
    "Vous recevrez des alertes ici lorsqu'une chose nécessitera votre attention.",
  'app.openhumanLink.notifications.welcomeTitle': 'OpenHuman est prêt',
  'app.openhumanLink.status.closed': 'Fermé',
  'app.openhumanLink.status.connected': 'Connecté',
  'app.openhumanLink.status.error': 'Erreur',
  'app.openhumanLink.status.loading': 'Chargement…',
  'app.openhumanLink.status.needsSignIn': 'Connexion requise',
  'app.openhumanLink.status.timedOut': 'Délai dépassé',
  'app.openhumanLink.loadingChannelSetup': 'Chargement de la configuration du canal',
  'app.openhumanLink.maybeLater': 'Peut-être plus tard',
  'app.openhumanLink.notifications.asking': 'Demande à ton OS…',
  'app.openhumanLink.notifications.blocked': 'Bloqué',
  'app.openhumanLink.notifications.blockedStep1': 'Étape 1 bloquée',
  'app.openhumanLink.notifications.blockedStep2': 'Étape 2 bloquée',
  'app.openhumanLink.notifications.blockedStep3': 'Étape 3 bloquée',
  'app.openhumanLink.notifications.intro': 'Intro',
  'app.openhumanLink.notifications.promptHint': "Indice d'invite",
  'app.openhumanLink.notifications.retry': 'Renvoyer une notification de test',
  'app.openhumanLink.notifications.send': 'Envoyer une notification de test',
  'app.openhumanLink.notifications.sendFailed': "Impossible d'envoyer : {error}",
  'app.openhumanLink.notifications.sent':
    "Notification de test envoyée. Si vous ne l'avez pas reçue, allez dans Réglages Système → Notifications → OpenHuman, activez Autoriser les notifications, et définissez le style de bannière sur Persistant.",
  'app.openhumanLink.skipForNow': "Passer pour l'instant",
  'app.openhumanLink.telegramUnavailable': 'Telegram indisponible',
  'app.openhumanLink.title.accounts': 'Connecte tes apps',
  'app.openhumanLink.title.billing': 'Facturation & crédits',
  'app.openhumanLink.title.discord': 'Rejoins la communauté',
  'app.openhumanLink.title.discordReport': 'Signaler cette erreur',
  'app.openhumanLink.title.messaging': 'Connecter un canal de chat',
  'app.openhumanLink.title.notifications': 'Autoriser les notifications',
  'app.persistRehydration.body': 'Corps',
  'app.persistRehydration.heading': 'Titre',
  'app.persistRehydration.resetCta': 'Réinitialisation…',
  'app.persistRehydration.resetting': 'Réinitialisation…',
  'app.routeLoading.initializing': "Initialisation d'OpenHuman...",
  'app.update.currentlyOn': '{version}',
  'app.update.errorFallback': "Une erreur s'est produite lors de la mise à jour.",
  'app.update.header.default': 'Mise à jour',
  'app.update.header.error': 'Mise à jour échouée',
  'app.update.header.installing': 'Installation de la mise à jour',
  'app.update.header.readyToInstall': 'Mise à jour prête à installer',
  'app.update.header.restarting': 'Redémarrage…',
  'app.update.later': 'Plus tard',
  'app.update.newVersionReady': 'Une nouvelle version est prête à installer.',
  'app.update.progress.downloaded': '{amount} téléchargé',
  'app.update.progress.installing': 'Installation de la nouvelle version…',
  'app.update.progress.restarting': "Relancement de l'app…",
  'app.update.progress.working': '{percent} %',
  'app.update.restartNote': 'Note de redémarrage',
  'app.update.restartNow': 'Redémarrer maintenant',
  'app.update.versionReady': 'La version {newVersion} est prête à installer.',
  'channels.discord.accountLinked': 'Compte lié',
  'channels.discord.connect': 'Connecter',
  'channels.discord.linkTokenExpired': 'Token de liaison expiré. Réessaie.',
  'channels.discord.linkTokenInstruction': '{token}',
  'channels.discord.linkTokenLabel': 'Libellé du token de liaison',
  'channels.discord.linkTokenOnce': 'Token de liaison unique',
  'channels.discord.picker.allPermissionsOk':
    'Le bot dispose de toutes les permissions requises dans ce canal.',
  'channels.discord.picker.botNotInServers': 'Bot absent des serveurs',
  'channels.discord.picker.category': 'Catégorie',
  'channels.discord.picker.channel': 'Canal',
  'channels.discord.picker.checkingPermissions': 'Vérification des permissions',
  'channels.discord.picker.loadingChannels': 'Chargement des canaux…',
  'channels.discord.picker.loadingServers': 'Chargement des serveurs…',
  'channels.discord.picker.missingPermissions': 'Permissions manquantes',
  'channels.discord.picker.noChannels': 'Aucun canal texte trouvé',
  'channels.discord.picker.noServers': 'Aucun serveur trouvé',
  'channels.discord.picker.selectChannel': 'Sélectionner un canal',
  'channels.discord.picker.selectServer': 'Sélectionner un serveur',
  'channels.discord.picker.server': 'Serveur',
  'channels.discord.picker.serverChannelSelection': 'Sélection du serveur et du canal',
  'channels.discord.savedRestartRequired': "Canal enregistré. Redémarre l'app pour l'activer.",
  'channels.telegram.connect': 'Connecter',
  'channels.telegram.managedDmConnecting': 'Connexion du DM géré',
  'channels.telegram.managedDmTimeout': 'Délai du DM géré dépassé',
  'channels.telegram.reconnect': 'Reconnecter',
  'channels.telegram.savedRestartRequired': "Canal enregistré. Redémarre l'app pour l'activer.",
  'channels.web.alwaysAvailable': 'Toujours disponible',
  'chat.approval.approve': 'Approuver',
  'chat.approval.alwaysAllow': 'Toujours autoriser',
  'chat.approval.alwaysAllowHint':
    'Arrêtez de demander cet outil — ajoutez-le à votre liste Toujours autoriser',
  'chat.approval.deciding': 'Travail en cours…',
  'chat.approval.deny': 'Refuser',
  'chat.approval.error': "Impossible d'enregistrer votre décision — veuillez réessayer.",
  'chat.approval.fallback': "L'agent veut exécuter une action qui nécessite votre approbation.",
  'chat.approval.title': 'Approbation requise',
  'chat.approval.tool': 'Outil:',
  'channels.authMode.managed_dm': 'Connectez-vous avec OpenHuman',
  'channels.authMode.oauth': 'OAuth Connectez-vous',
  'channels.authMode.bot_token': 'Utiliser votre propre jeton de robot',
  'channels.authMode.api_key': 'Utilisez votre propre clé API',
  'channels.fieldRequired': '{field} est requis',
  'channels.mcp.title': 'Serveurs MCP',
  'channels.mcp.description':
    "Parcourez et gérez les serveurs Model Context Protocol qui étendent l'IA avec de nouveaux outils.",
  'channels.discord.displayName': 'Discord',
  'channels.discord.description': 'Envoyer et recevoir des messages via Discord.',
  'channels.discord.authMode.bot_token.description':
    'Fournissez votre propre jeton de bot Discord.',
  'channels.discord.authMode.oauth.description':
    'Installez le bot OpenHuman sur votre serveur Discord via OAuth.',
  'channels.discord.authMode.managed_dm.description':
    'Liez votre compte personnel Discord au bot OpenHuman.',
  'channels.discord.fields.bot_token.label': 'Jeton de bot',
  'channels.discord.fields.bot_token.placeholder': 'Votre jeton de bot Discord',
  'channels.discord.fields.guild_id.label': 'ID de serveur (guilde)',
  'channels.discord.fields.guild_id.placeholder':
    'Facultatif : restreindre à un serveur spécifique',
  'channels.telegram.displayName': 'Telegram',
  'channels.telegram.description': 'Envoyer et recevoir des messages via Telegram.',
  'channels.telegram.authMode.managed_dm.description':
    'Envoyez un message directement au robot OpenHuman Telegram.',
  'channels.telegram.authMode.bot_token.description':
    'Fournissez votre propre jeton Bot Telegram de @BotFather.',
  'channels.telegram.fields.bot_token.label': 'Jeton de robot',
  'channels.telegram.fields.bot_token.placeholder': '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
  'channels.telegram.fields.allowed_users.label': 'Utilisateurs autorisés',
  'channels.telegram.fields.allowed_users.placeholder':
    "Noms d'utilisateur Telegram séparés par des virgules",
  'channels.telegram.remoteControlTitle': 'Télécommande (Telegram)',
  'channels.telegram.remoteControlBody':
    "À partir d'un chat Telegram autorisé, envoyez /status, /sessions, /new ou /help. Le routage de modèles utilise toujours /model et /models.",
  'channels.web.displayName': 'Web',
  'channels.web.description': "Discutez via l'interface utilisateur Web intégrée.",
  'channels.web.authMode.managed_dm.description':
    'Utilisez le chat Web intégré – aucune configuration requise.',
  'channels.yuanbao.connect': 'Connect',
  'channels.yuanbao.connecting': 'Connexion…',
  'channels.yuanbao.fieldRequired': '{field} est requis',
  'channels.yuanbao.reconnect': 'Reconnect',
  'channels.yuanbao.savedRestartRequired':
    "Canal enregistré. Redémarrez l'application pour l'activer.",
  'channels.yuanbao.unexpectedStatus': 'Statut de connexion inattendu : {status}',
  'chat.unsubscribeApproval.approve': 'Approuver et se désabonner',
  'chat.unsubscribeApproval.approved': '✓ Désabonnement réussi.',
  'chat.unsubscribeApproval.denied': '✕ Demande refusée.',
  'chat.unsubscribeApproval.deny': 'Refuser',
  'chat.unsubscribeApproval.processing': 'Traitement…',
  'chat.unsubscribeApproval.title': 'Demande de désabonnement',
  'commandPalette.ariaLabel': 'Palette de commandes',
  'commandPalette.description': 'Description',
  'commandPalette.label': 'Commandes',
  'commandPalette.noResults': 'Aucun résultat',
  'commandPalette.placeholder': 'Tape une commande ou recherche…',
  'commandPalette.searchAria': 'Rechercher des commandes',
  'commandPalette.shortcutHint': 'Appuyez sur ? pour tous les raccourcis',
  'commandPalette.title': 'Palette de commandes',
  'kbd.ariaLabel': 'Raccourci clavier : {shortcut}',
  'shortcuts.title': 'Raccourcis clavier',
  'shortcuts.subtitle': 'Accélérez votre travail grâce à ces raccourcis clavier.',
  'shortcuts.menuDesc': 'Parcourez tous les raccourcis clavier de l’application.',
  'shortcuts.empty': 'Aucun raccourci clavier n’est disponible pour le moment.',
  'shortcuts.openHint': 'Ouvrez cette liste à tout moment avec',
  'shortcuts.group.navigation': 'Navigation',
  'shortcuts.group.profiles': 'Profils',
  'shortcuts.group.chat': 'Chat',
  'shortcuts.group.view': 'Affichage',
  'shortcuts.group.general': 'Général',
  'shortcuts.group.help': 'Aide',
  'shortcuts.action.home': 'Aller à l’accueil',
  'shortcuts.action.chat': 'Aller au chat',
  'shortcuts.action.knowledge': 'Aller à Connaissances et mémoire',
  'shortcuts.action.connections': 'Aller aux Connexions',
  'shortcuts.action.activity': 'Aller à l’activité',
  'shortcuts.action.settings': 'Ouvrir les paramètres',
  'shortcuts.action.newChat': 'Nouveau chat',
  'shortcuts.action.toggleSidebar': 'Afficher/masquer la barre latérale',
  'shortcuts.action.commandPalette': 'Palette de commandes',
  'iosMascot.connectedTo': 'Connecté à',
  'iosMascot.defaultPairedLabel': 'Bureau',
  'iosMascot.disconnect': 'Déconnecter',
  'iosMascot.error.generic': "Une erreur s'est produite. Veuillez réessayer.",
  'iosMascot.error.sendFailed': "Échec de l'envoi. Vérifiez votre connexion.",
  'iosMascot.pushToTalk': 'Push-to-talk',
  'iosMascot.sendMessage': 'Envoyer un message',
  'iosMascot.thinking': 'En réflexion...',
  'iosMascot.typeMessage': 'Tapez un message...',
  'iosPair.connectedLoading': 'Connecté ! Chargement...',
  'iosPair.connecting': 'Connexion au bureau...',
  'iosPair.desktopLabel': 'Bureau',
  'iosPair.error.camera':
    'Échec du scan par caméra. Vérifiez les autorisations de la caméra et réessayez.',
  'iosPair.error.connectionFailed':
    "Échec de la connexion. Assurez-vous que l'application de bureau est en cours d'exécution et réessayez.",
  'iosPair.error.invalidQr':
    "Code QR invalide. Assurez-vous de scanner un code d'association OpenHuman.",
  'iosPair.error.unreachableDesktop':
    'Impossible de joindre le bureau. Assurez-vous que les deux appareils sont en ligne et réessayez.',
  'iosPair.expired': 'QR code a expiré. Demandez au bureau de régénérer le code.',
  'iosPair.instructions':
    'Ouvrez OpenHuman sur votre bureau, allez dans Réglages > Appareils et appuyez sur « Associer un téléphone » pour afficher le code QR.',
  'iosPair.retryScan': 'Rescanner',
  'iosPair.scanQrCode': 'Numérisation QR code',
  'iosPair.scannerOpening': 'Ouverture du scanner...',
  'iosPair.step.openDesktop': 'Ouvrez OpenHuman sur le bureau',
  'iosPair.step.openSettings': 'Accédez à Paramètres > Appareils',
  'iosPair.step.showQr': 'Appuyez sur « Associer le téléphone » pour afficher QR',
  'iosPair.title': 'Associer avec votre bureau',
  'composio.connect.additionalConfigRequired': 'Configuration supplémentaire requise',
  'composio.connect.atlassianSubdomainHint': 'acme',
  'composio.connect.atlassianSubdomainLabel': 'Libellé du sous-domaine Atlassian',
  'composio.connect.connect': 'Connecter',
  'composio.connect.connectedAccounts': 'Comptes connectés',
  'composio.connect.defaultLabel': 'Par défaut',
  'composio.connect.disconnectAccount': 'Supprimer',
  'composio.connect.addAnotherAccount': 'Ajouter un autre compte',
  'composio.connect.dynamicsOrgNameHint':
    'Par exemple, "myorg" pour myorg.crm.dynamics.com. Saisis uniquement le nom court de l\'organisation, pas l\'URL complète.',
  'composio.connect.dynamicsOrgNameLabel': "Nom de l'organisation Dynamics 365",
  'composio.connect.connectionFailed': 'Échec de la connexion (statut : {status}).',
  'composio.connect.disconnectFailed': 'Déconnexion échouée : {msg}',
  'composio.connect.disconnecting': 'Déconnexion…',
  'composio.connect.idleDescription': 'Connectez votre',
  'composio.connect.idleDescriptionSuffix':
    "compte. Nous ouvrirons une fenêtre du navigateur, vous y approuvez l'accès, et cette application détectera la connexion automatiquement.",
  'composio.connect.isConnected': 'est connecté.',
  'composio.connect.manage': 'Gérer',
  'composio.connect.needsFieldsPrefix': 'Pour connecter',
  'composio.connect.needsFieldsSuffix':
    "nous avons besoin d'un peu plus d'informations. Remplis les champs manquants ci-dessous et réessaie.",
  'composio.connect.needsSubdomain': 'Pour connecter',
  'composio.connect.needsSubdomainSuffix':
    'saisissez votre sous-domaine Atlassian (par ex. acme pour acme.atlassian.net) et réessayez.',
  'composio.connect.oauthComplete': 'OAuth à compléter…',
  'composio.connect.oauthTimeout': 'Délai OAuth dépassé',
  'composio.connect.permissions': 'Autorisations',
  'composio.connect.permissionsDefault': 'Lecture + Écriture activées par défaut',
  'composio.connect.permissionsNote': 'peut exposer',
  'composio.connect.permissionsNoteSuffix':
    "Les autorisations de l'agent OpenHuman sont contrôlées ci-dessous par des bascules lecture, écriture et admin.",
  'composio.connect.reopenBrowser': 'Rouvrir le navigateur',
  'composio.connect.requestingUrl': "Demande de l'URL de connexion…",
  'composio.connect.requiredFieldEmpty': 'Ce champ est obligatoire.',
  'composio.connect.retryConnection': 'Réessayer la connexion',
  'composio.connect.scopeLoadError': 'Impossible de charger les préférences de portée : {msg}',
  'composio.connect.scopeSaveError': "Impossible d'enregistrer la portée {key} : {msg}",
  'composio.connect.scope.read': 'Lire',
  'composio.connect.scope.readHint': "Autoriser l'agent à lire les données de cette connexion.",
  'composio.connect.scope.write': 'Ecriture',
  'composio.connect.scope.writeHint':
    "Autoriser l'agent à créer ou modifier des données via cette connexion.",
  'composio.connect.scope.admin': 'Administrateur',
  'composio.connect.scope.adminHint':
    "Autoriser l'agent à gérer les paramètres, les autorisations ou les actions destructrices.",
  'composio.connect.subdomainInvalid':
    'Saisissez uniquement le sous-domaine court (par ex. "acme"), pas l\'URL complète. Il doit contenir uniquement des lettres, chiffres et tirets.',
  'composio.connect.subdomainRequired': 'Saisis ton sous-domaine Atlassian pour continuer.',
  'composio.connect.wabaIdHint':
    "Trouve-le via GET /me/businesses puis GET /{business_id}/owned_whatsapp_business_accounts en utilisant ton jeton d'accès Meta.",
  'composio.connect.wabaIdLabel': "Libellé de l'identifiant WABA",
  'composio.connect.atlassianSubdomainPlaceholder': 'your-subdomain',
  'composio.connect.dynamicsOrgNamePlaceholder': 'myorg',
  'composio.connect.wabaIdPlaceholder': 'e.g. 123456789012345',
  'composio.connect.wabaIdRequired':
    'Saisis ton identifiant WhatsApp Business Account (WABA ID) pour continuer.',
  'composio.connect.waitingFor': 'En attente de',
  'composio.connect.waitingHint': "Indice d'attente",
  'composio.triggers.heading': 'Déclencheurs',
  'composio.triggers.listenFrom': 'Écouter les événements de',
  'composio.triggers.loadError': 'Impossible de charger les déclencheurs',
  'composio.triggers.sessionExpired':
    'Votre session OpenHuman a expiré. Reconnectez-vous pour charger les déclencheurs.',
  'composio.triggers.needsConfiguration': 'Configuration requise',
  'composio.triggers.noneAvailable': "Aucun déclencheur n'est actuellement disponible pour",
  'conversations.taskKanban.moveLeft': 'Déplacer à gauche',
  'conversations.taskKanban.moveRight': 'Déplacer à droite',
  'conversations.taskKanban.title': 'Tâches',
  'conversations.threadTodo.title': 'Plan',
  'conversations.planReview.title': 'Examiner le plan',
  'conversations.planReview.subtitle':
    'Approuvez pour l’exécuter, rejetez pour l’abandonner ou envoyez un retour pour le réviser.',
  'conversations.planReview.approve': 'Approuver et exécuter',
  'conversations.planReview.reject': 'Rejeter',
  'conversations.planReview.feedbackLabel': 'Demander des modifications',
  'conversations.planReview.feedbackPlaceholder': 'Décrivez ce qu’il faut changer…',
  'conversations.planReview.sendFeedback': 'Envoyer un retour',
  'conversations.threadGoal.label': 'Objectif',
  'conversations.threadGoal.setCta': 'Définir un objectif',
  'conversations.threadGoal.placeholder': 'Que doit accomplir ce fil ?',
  'conversations.threadGoal.save': 'Enregistrer',
  'conversations.threadGoal.cancel': 'Annuler',
  'conversations.threadGoal.edit': 'Modifier l’objectif',
  'conversations.threadGoal.clear': 'Effacer l’objectif',
  'conversations.threadGoal.complete': 'Marquer comme terminé',
  'conversations.threadGoal.pause': 'Suspendre',
  'conversations.threadGoal.resume': 'Reprendre',
  'conversations.threadGoal.tokensSuffix': 'jetons',
  'conversations.threadGoal.status.active': 'Actif',
  'conversations.threadGoal.status.paused': 'En pause',
  'conversations.threadGoal.status.budget_limited': 'Budget atteint',
  'conversations.threadGoal.status.complete': 'Terminé',
  'conversations.taskKanban.approval.default': 'Par défaut',
  'conversations.taskKanban.approval.notRequired': 'Non requis',
  'conversations.taskKanban.approval.notRequiredBadge': 'aucune approbation',
  'conversations.taskKanban.approval.required': 'Requis',
  'conversations.taskKanban.approval.requiredBadge': 'approbation',
  'conversations.taskKanban.approval.requiredBeforeExecution': "Requis avant l'exécution",
  'conversations.taskKanban.briefButton': 'Résumé de la tâche',
  'conversations.taskKanban.briefTitle': 'Résumé de la tâche',
  'conversations.taskKanban.closeBrief': 'Fermer le résumé de la tâche',
  'conversations.taskKanban.field.acceptanceCriteria': "Critères d'acceptation",
  'conversations.taskKanban.field.allowedTools': 'Outils autorisés',
  'conversations.taskKanban.field.approval': 'Approbation',
  'conversations.taskKanban.field.assignedAgent': 'Agent assigné',
  'conversations.taskKanban.field.blocker': 'Blocage',
  'conversations.taskKanban.field.evidence': 'Preuve',
  'conversations.taskKanban.field.notes': 'Notes',
  'conversations.taskKanban.field.objective': 'Objectif',
  'conversations.taskKanban.field.plan': 'Plan',
  'conversations.taskKanban.field.status': 'Statut',
  'conversations.taskKanban.field.title': 'Titre',
  'conversations.taskKanban.saveChanges': 'Enregistrer les modifications',
  'conversations.taskKanban.deleteCard': 'Supprimer',
  'conversations.taskKanban.workTask': 'Travailler la tâche',
  'conversations.taskKanban.viewWork': 'Voir le travail',
  'conversations.taskKanban.startingTask': 'Démarrage…',
  'conversations.taskKanban.updateFailed':
    "Impossible de mettre à jour la tâche; les modifications n'ont pas été enregistrées.",
  'conversations.taskKanban.sourcesButton': 'Sources',
  'conversations.taskKanban.source.openExternal': 'Ouvrir la tâche externe',
  'conversations.taskKanban.source.openExternalShort': 'Ouvrir',
  'conversations.taskKanban.source.unknownProvider': 'Source inconnue',
  'conversations.taskKanban.source.urgencyValue': 'Urgence {percent}%',
  'conversations.taskKanban.sources.desktopOnly':
    'Les contrôles des sources de tâches sont disponibles dans l’application de bureau.',
  'conversations.taskKanban.sources.title': 'Sources de tâches',
  'conversations.taskKanban.sources.statusEnabled': 'Interrogation automatique activée',
  'conversations.taskKanban.sources.manage': 'Gérer les sources',
  'conversations.taskKanban.source.title': 'Source',
  'conversations.taskKanban.source.sourceId': 'ID de source',
  'conversations.taskKanban.source.externalId': 'ID externe',
  'conversations.taskKanban.source.repo': 'Dépôt',
  'conversations.taskKanban.source.urgency': 'Urgence',
  'conversations.toolTimeline.turn': 'tour',
  'conversations.toolTimeline.step': 'Étape',
  'conversations.toolTimeline.workerThread': 'fil worker',
  'conversations.subagent.viewProcessing': 'Voir le traitement complet',
  'conversations.subagent.parent': 'Parent',
  'conversations.subagent.thinking': 'Réflexion',
  'conversations.subagent.thoughts': 'Réflexions',
  'conversations.subagent.response': 'Réponse',
  'conversations.subagent.toolCalls': 'Appels d’outils',
  'conversations.subagent.working': 'En cours…',
  'conversations.subagent.noOutputYet': 'Aucun résultat pour l’instant',
  'conversations.subagent.input': 'Entrée',
  'conversations.subagent.output': 'Sortie',
  'conversations.subagent.noOutput': 'Aucune sortie renvoyée',
  'conversations.subagent.close': 'Fermer',
  'conversations.subagent.cancel': 'Annuler la tâche',
  'conversations.subagent.cancelling': 'Annulation…',
  'conversations.subagent.cancelFailed': "Impossible d'annuler la tâche. Réessayez.",
  'conversations.subagent.statusRunning': 'en cours',
  'conversations.subagent.statusCompleted': 'terminé',
  'conversations.subagent.statusFailed': 'échoué',
  'conversations.subagent.statusAwaitingUser': "en attente de l'utilisateur",
  'conversations.subagent.statusCancelled': 'annulé',
  'conversations.agentTaskInsights.title': "Aperçu des tâches de l'agent",
  'conversations.agentTaskInsights.response': 'Réponse',
  'conversations.agentTaskInsights.processSourceTitle': "Source du processus de l'agent",
  'conversations.agentTaskInsights.stepsHeading': 'Étapes',
  'conversations.agentTaskInsights.sourcesHeading': 'Sources',
  'conversations.agentTaskInsights.noSteps': 'Aucune étape enregistrée',
  'conversations.agentTaskInsights.viewProcessSource':
    "Voir la source complète du processus de l'agent",
  'conversations.agentTaskInsights.processing': 'Traitement en cours',
  'conversations.agentTaskInsights.done': 'Terminé',
  'conversations.agentTaskInsights.failed': 'Échec',
  'conversations.agentTaskInsights.running': 'En cours',
  'conversations.agentTaskInsights.cancelled': 'Annulé',
  'conversations.agentTaskInsights.awaitingUser': 'En attente de saisie',
  'conversations.agentTaskInsights.viewDetails': 'Voir les détails',
  'conversations.agentTaskInsights.subagentsHeading': 'Sous-agents',
  'daemon.serviceBlockingGate.body': 'Corps',
  'daemon.serviceBlockingGate.downloadHint': 'Indice de téléchargement',
  'daemon.serviceBlockingGate.downloadLatest': 'Télécharger la dernière version',
  'daemon.serviceBlockingGate.retryCore': 'Réessayer le Core',
  'daemon.serviceBlockingGate.retryFailed':
    "Nouvelle tentative échouée. Télécharge la dernière version de l'app et réessaie.",
  'daemon.serviceBlockingGate.retrying': 'Nouvelle tentative…',
  'daemon.serviceBlockingGate.title': 'Le core OpenHuman est indisponible',
  'home.banners.discordSubtitle': 'Sous-titre Discord',
  'home.banners.discordTitle': 'Rejoins notre Discord',
  'home.banners.earlyBirdDismiss': 'Ignorer la bannière early bird',
  'home.banners.earlyBirdFirstSub': 'premier abonnement.',
  'home.banners.earlyBirdOn': 'Early bird activé',
  'home.banners.earlyBirdTitle': 'Les 1 000 premiers utilisateurs bénéficient de 60 % de remise.',
  'home.banners.earlyBirdUseCode': 'Utiliser le code early bird',
  'home.banners.getSubscription': 'obtenir un abonnement',
  'home.banners.promoCreditsBody': 'Tu as {amount} de crédits promo. Tu peux',
  'home.banners.promoCreditsUsage': 'Utilisation des crédits promo',
  'intelligence.memoryChunk.detail.chunk': 'Segment',
  'intelligence.memoryChunk.detail.copyChunkId': "Copier l'identifiant du segment",
  'intelligence.memoryChunk.detail.embeddingInfo': 'bge-m3 1024dim',
  'intelligence.memoryChunk.detail.noEmbedding': "Pas d'embedding",
  'intelligence.memoryChunk.letterhead.from': 'de',
  'intelligence.memoryChunk.letterhead.to': 'à',
  'intelligence.memoryChunk.mentioned.chunkOne': '1 fragment',
  'intelligence.memoryChunk.mentioned.chunkOther': '{count} fragments',
  'intelligence.memoryChunk.mentioned.heading': 'm e n t i o n n é',
  'intelligence.memoryChunk.scoreBars.ariaScore': '{name} score {pct} pour cent',
  'intelligence.memoryChunk.scoreBars.atThreshold': 'à {threshold}',
  'intelligence.memoryChunk.scoreBars.dropped': 'abandonné',
  'intelligence.memoryChunk.scoreBars.heading': 'p o u r q u o i   c o n s e r v é',
  'intelligence.memoryChunk.scoreBars.kept': 'conservé',
  'intelligence.diagram.title': "Diagramme d'architecture",
  'intelligence.diagram.description':
    "Dernière sortie d'architecture locale depuis le point de terminaison de diagramme configuré.",
  'intelligence.diagram.refresh': 'Refresh',
  'intelligence.diagram.refreshAria': 'Actualiser le diagramme',
  'intelligence.diagram.emptyTitle': "Aucun diagramme disponible pour l'instant",
  'intelligence.diagram.emptyDescription':
    "Générez un diagramme d'architecture depuis l'orchestrateur et ce panneau se rafraîchira depuis le point de terminaison local configuré.",
  'intelligence.diagram.skillInstallCommand': 'npx skills add yizhiyanhua-ai/fireworks-tech-graph',
  'intelligence.diagram.promptExample':
    "Générer un diagramme d'architecture du swarm actuel dans un style terminal sombre",
  'intelligence.diagram.imageAlt': "Dernier diagramme d'architecture OpenHuman généré",
  'intelligence.diagram.refreshesEvery': 'Actualise toutes les {seconds}s',
  'intelligence.memoryText.entityTypePrefix': "Type d'entité",
  'intelligence.screenDebug.active': 'Actif',
  'intelligence.screenDebug.app': 'Application',
  'intelligence.screenDebug.bounds': 'Limites',
  'intelligence.screenDebug.captureAlt': 'Résultat du test de capture',
  'intelligence.screenDebug.captureFailed': 'Échec',
  'intelligence.screenDebug.captureSuccess': 'Succès',
  'intelligence.screenDebug.captureTest': 'Test de capture',
  'intelligence.screenDebug.capturing': 'Capture en cours',
  'intelligence.screenDebug.frames': 'Images',
  'intelligence.screenDebug.idle': 'En veille',
  'intelligence.screenDebug.lastApp': 'Dernière app',
  'intelligence.screenDebug.mode': 'Mode',
  'intelligence.screenDebug.permAccessibility': 'Permission accessibilité',
  'intelligence.screenDebug.permInput': 'Permission saisie',
  'intelligence.screenDebug.permScreen': 'Accessibilité',
  'intelligence.screenDebug.permissions': 'Autorisations',
  'intelligence.screenDebug.platformNotSupported': 'Plateforme non prise en charge',
  'intelligence.screenDebug.recentVisionSummaries': 'Résumés de vision récents',
  'intelligence.screenDebug.session': 'Session',
  'intelligence.screenDebug.size': 'Taille',
  'intelligence.screenDebug.status': 'État',
  'intelligence.screenDebug.testCapture': 'Test de capture',
  'intelligence.screenDebug.time': 'Temps',
  'intelligence.screenDebug.title': 'Titre',
  'intelligence.screenDebug.unknown': 'Inconnu',
  'intelligence.screenDebug.visionQueue': 'File de vision',
  'intelligence.screenDebug.visionState': 'État de la vision',
  'intelligence.tasks.activeBoardOne': '1 tableau actif dans les conversations',
  'intelligence.tasks.activeBoardOther': '{count} tableaux actifs dans les conversations',
  'intelligence.tasks.empty': "Aucun tableau de tâches agent pour l'instant",
  'intelligence.tasks.emptyHint': 'Indice vide',
  'intelligence.tasks.failedToLoad': 'Échec du chargement',
  'intelligence.tasks.live': 'en direct',
  'intelligence.tasks.loadingBoards': 'Chargement des tableaux de tâches…',
  'intelligence.tasks.threadPrefix': 'Fil {thread}',
  'intelligence.tasks.subtitle':
    "Vos tâches et tableaux de tâches d'agent dans tout l'espace de travail.",
  'intelligence.tasks.newTask': 'Nouvelle tâche',
  'intelligence.tasks.personalBoardTitle': "Tâches de l'agent",
  'intelligence.tasks.personalEmpty': 'Pas encore de tâches personnelles',
  'intelligence.tasks.composer.title': 'Nouvelle tâche',
  'intelligence.tasks.composer.titleLabel': 'Titre',
  'intelligence.tasks.composer.titlePlaceholder': 'Que faut-il faire?',
  'intelligence.tasks.composer.statusLabel': 'Statut',
  'intelligence.tasks.composer.attachLabel': 'Joindre à la conversation',
  'intelligence.tasks.composer.attachNone': 'Personnel (pas de conversation)',
  'intelligence.tasks.composer.objectiveLabel': 'Objectif',
  'intelligence.tasks.composer.objectivePlaceholder': 'Optionnel — le résultat souhaité',
  'intelligence.tasks.composer.notesLabel': 'Notes',
  'intelligence.tasks.composer.notesPlaceholder': 'Notes facultatives',
  'intelligence.tasks.composer.create': 'Créer une tâche',
  'intelligence.tasks.composer.creating': 'Création…',
  'intelligence.tasks.composer.createFailed': 'Impossible de créer la tâche',
  'intelligence.tasks.composer.assignAgentLabel': "Laisser un agent s'en charger automatiquement",
  'intelligence.tasks.composer.assignAgentHint':
    "Le tableau des tâches la prend en charge et l'exécute pour vous. Laissez désactivé pour une simple tâche personnelle.",
  'intelligence.tasks.sourceList.subtitle':
    "Tâches de sources en attente de devenir du travail d'agent.",
  'intelligence.tasks.sourceList.empty': 'Aucune tâche de source en attente.',
  'intelligence.tasks.sourceList.queued': 'En file',
  'intelligence.tasks.sourceList.workOnTask': 'Travailler sur la tâche',
  'intelligence.tasks.sourcePlan.title': 'Affiner la tâche source',
  'intelligence.tasks.sourcePlan.subtitle':
    "Vérifiez le brouillon de recherche avant de créer une tâche d'agent.",
  'intelligence.tasks.sourcePlan.researchAgent': "Brouillon de l'agent de recherche",
  'intelligence.tasks.sourcePlan.approve': 'Approuver le plan',
  'intelligence.tasks.sourcePlan.creating': 'Création de la tâche…',
  'intelligence.tasks.sourcePlan.createFailed': "Impossible de créer la tâche d'agent",
  'intelligence.tasks.workTaskFailed': 'Impossible de démarrer le travail sur la tâche',
  'intelligence.workTask.sourceTaskHeading': 'Tâche source :',
  'intelligence.workTask.repositoryLine': '- Dépôt : {repo}',
  'intelligence.workTask.externalIdLine': '- ID externe : {externalId}',
  'intelligence.workTask.urlLine': '- URL : {url}',
  'intelligence.workTask.closingInstruction':
    "Commencez par reformuler brièvement le plan d'implémentation concret, puis exécutez-le. Gardez la progression visible dans ce fil et mettez à jour le tableau des tâches lorsque l'état du travail change.",
  'intelligence.refine.objectiveDefault':
    "Transformez la tâche source en une tâche d'agent prête à être implémentée : {title}",
  'intelligence.refine.sourceLine': 'Source : {url}',
  'intelligence.agentWork.subtitle':
    "Chaque exécution d'agent en arrière-plan, regroupée par état du cycle de vie.",
  'intelligence.agentWork.loading': "Chargement du travail de l'agent…",
  'intelligence.agentWork.failedToLoad': "Impossible de charger le travail de l'agent",
  'intelligence.agentWork.empty': "Aucune exécution d'agent en arrière-plan pour l'instant.",
  'intelligence.agentWork.bucket.needsInput': 'Intervention requise',
  'intelligence.agentWork.bucket.working': 'En cours',
  'intelligence.agentWork.bucket.completed': 'Terminé',
  'intelligence.agentWork.bucket.failed': 'Échoué',
  'intelligence.agentWork.bucket.stopped': 'Arrêté',
  'intelligence.agentWork.column.agent': 'Agent',
  'intelligence.agentWork.column.status': 'Statut',
  'intelligence.agentWork.column.elapsed': 'Écoulé',
  'intelligence.agentWork.column.cost': 'Coût',
  'intelligence.agentWork.column.tokens': 'Jetons',
  'intelligence.agentWork.status.pending': 'En attente',
  'intelligence.agentWork.status.running': 'En cours',
  'intelligence.agentWork.status.awaitingUser': 'Intervention requise',
  'intelligence.agentWork.status.paused': 'En pause',
  'intelligence.agentWork.status.completed': 'Terminé',
  'intelligence.agentWork.status.failed': 'Échoué',
  'intelligence.agentWork.status.cancelled': 'Annulé',
  'intelligence.agentWork.status.interrupted': 'Interrompu',
  'intelligence.agentWork.kind.subagent': 'Sous-agent',
  'intelligence.agentWork.kind.workerThread': 'Fil worker',
  'intelligence.agentWork.kind.backgroundAgent': 'Agent en arrière-plan',
  'intelligence.agentWork.kind.teamMember': 'Membre de l’équipe',
  'intelligence.agentWork.kind.workflowChild': 'Élément enfant de workflow',
  'intelligence.agentWork.openThread': 'Ouvrir le fil',
  'intelligence.agentWork.openWorker': 'Ouvrir le worker',
  'worktree.label': 'Worktree',
  'worktree.dirty': 'Modifications non validées',
  'worktree.clean': 'Propre',
  'worktree.changedFile': 'fichier modifié',
  'worktree.changedFiles': 'fichiers modifiés',
  'worktree.removing': 'Suppression…',
  'worktree.removeFailed': 'Échec de la suppression du worktree',
  'worktree.diffFailed': 'Échec du chargement du diff',
  'worktree.diffLoading': 'Chargement du diff…',
  'worktree.diffEmpty': 'Aucune modification par rapport à HEAD.',
  'worktree.dirtyConfirm':
    'Ce worktree contient des modifications non validées. Le supprimer abandonne ce travail. La branche du worker est conservée.',
  'worktree.action.open': 'Ouvrir le dossier',
  'worktree.action.diff': 'Diff',
  'worktree.action.hideDiff': 'Masquer le diff',
  'worktree.action.remove': 'Supprimer',
  'worktree.action.removeAnyway': 'Abandonner et supprimer',
  'worktree.action.preserve': 'Conserver',
  'worktree.panel.subtitle': 'Worktrees git isolés créés par des workers d’agents parallèles.',
  'worktree.panel.loading': 'Chargement des worktrees…',
  'worktree.panel.failedToLoad': 'Échec du chargement des worktrees',
  'worktree.panel.empty':
    'Aucun worktree isolé. Les workers parallèles avec isolation par worktree apparaîtront ici.',
  'worktree.panel.overlapsTitle': 'Modifications qui se chevauchent',
  'worktree.panel.overlapHint':
    'Ces fichiers ont été modifiés par plusieurs worktrees — réconciliez-les avant de fusionner.',
  'intelligence.agentWork.action.stop': 'Arrêter',
  'intelligence.agentWork.action.retry': 'Réessayer',
  'intelligence.agentWork.action.continue': 'Continuer',
  'intelligence.agentWork.action.followUp': 'Relancer',
  'intelligence.agentWork.action.send': 'Envoyer',
  'intelligence.agentWork.action.cancel': 'Annuler',
  'intelligence.agentWork.action.continuePlaceholder': 'Répondez pour débloquer cet agent…',
  'intelligence.agentWork.action.followUpPlaceholder': 'Envoyer une instruction de suivi…',
  'intelligence.agentWork.action.failed': 'Échec de l’action',
  'intelligence.teams.subtitle': "Équipes d'agents coordonnées et les tâches qu'elles partagent.",
  'intelligence.teams.loading': 'Chargement des équipes…',
  'intelligence.teams.failedToLoad': 'Échec du chargement des équipes',
  'intelligence.teams.empty': "Pas encore d'équipes d'agents",
  'intelligence.teams.emptyHint':
    "Les équipes apparaissent ici lorsqu'un agent génère des sous-agents coordonnés pour partager un objectif.",
  'intelligence.teams.refresh': 'Actualiser',
  'intelligence.teams.backToList': 'Toutes les équipes',
  'intelligence.teams.status.active': 'Actif',
  'intelligence.teams.status.closed': 'Fermé',
  'intelligence.teams.header.lead': 'responsable',
  'intelligence.teams.header.taskCount': '{count} tâches',
  'intelligence.teams.header.memberCount': '{count} membres',
  'intelligence.teams.member.active': 'Actif',
  'intelligence.teams.member.pending': 'En attente',
  'intelligence.teams.member.idle': 'Inactif',
  'intelligence.teams.member.stopped': 'Arrêté',
  'intelligence.teams.column.todo': 'À faire',
  'intelligence.teams.column.ready': 'Prêt',
  'intelligence.teams.column.inProgress': 'En cours',
  'intelligence.teams.column.blocked': 'Bloqué',
  'intelligence.teams.column.done': 'Terminé',
  'intelligence.teams.emptyColumn': 'Vide',
  'intelligence.teams.unclaimed': 'Non attribué',
  'intelligence.teams.pickedUpBy': 'Pris en charge par {name}',
  'intelligence.teams.depLockTitle': '{count} dépendances non satisfaites',
  'intelligence.teams.gate.pending': 'Contrôle en attente',
  'intelligence.teams.gate.passed': 'Contrôle réussi',
  'intelligence.teams.gate.failed': 'Contrôle échoué',
  'intelligence.teams.gate.label': 'Contrôle : {status}',
  'intelligence.teams.activity.title': "Activité de l'équipe",
  'intelligence.teams.activity.empty': "Aucun message pour l'instant",
  'intelligence.teams.activity.toTeam': 'équipe',
  'intelligence.teams.member.start': 'Démarrer',
  'intelligence.teams.composer.placeholder': 'Message à un coéquipier…',
  'intelligence.teams.composer.send': 'Envoyer',
  'intelligence.teams.composer.recipient': 'Destinataire',
  'intelligence.teams.composer.toTeam': "Toute l'équipe",
  'intelligence.teams.action.blocked': 'En attente de dépendances',
  'intelligence.teams.action.alreadyClaimed': 'Déjà prise par un autre coéquipier',
  'intelligence.teams.action.alreadyActive': 'Le coéquipier est déjà en cours d’exécution',
  'intelligence.teams.action.noClaimableTask': 'Aucune tâche prête pour ce coéquipier',
  'intelligence.teams.action.unknownTask': 'Tâche introuvable',
  'intelligence.refine.sourceIntake': 'Source : réception des sources de tâches',
  'intelligence.refine.repositoryLine': 'Dépôt : {repo}',
  'intelligence.refine.externalTaskLine': 'Tâche externe : {externalId}',
  'intelligence.refine.planStep1':
    'Lisez la tâche source liée et confirmez le comportement exact demandé.',
  'intelligence.refine.planStep2':
    "Inspectez les chemins de code pertinents et identifiez la plus petite frontière d'implémentation.",
  'intelligence.refine.planStep3':
    "Implémentez le changement avec des tests ciblés autour du comportement visible par l'utilisateur.",
  'intelligence.refine.planStep4':
    'Exécutez une validation ciblée et notez les risques résiduels ou le travail de suivi.',
  'intelligence.refine.acceptance1':
    "Les exigences de la tâche source sont représentées dans l'implémentation finale.",
  'intelligence.refine.acceptance2':
    "Des tests unitaires ou d'intégration pertinents couvrent le comportement modifié.",
  'intelligence.refine.acceptance3':
    "Les résultats de la validation et tout risque non résolu sont consignés à l'achèvement.",
  'notifications.card.dismiss': 'Ignorer la notification',
  'notifications.card.importanceTitle': 'Importance : {pct} %',
  'notifications.center.empty': "Aucune notification pour l'instant",
  'notifications.center.emptyHint': 'Indice vide',
  'notifications.center.filterAll': 'Tout filtrer',
  'notifications.center.markAllRead': 'Tout marquer comme lu',
  'notifications.center.title': 'Notifications',
  'notifications.meeting.joinListen': 'Rejoindre (écoute seule)',
  'notifications.meeting.joinActive': 'Rejoindre en participant',
  'notifications.meeting.skip': 'Pas celle-ci',
  'notifications.meeting.alwaysJoin': 'Toujours rejoindre',
  'notifications.meeting.actionError': 'Impossible de terminer cette action. Veuillez réessayer.',
  'oauth.button.connecting': 'Connexion en cours…',
  'oauth.button.loopbackTimeout':
    "La connexion a expiré — le navigateur n'a pas complété la redirection OAuth. Veuillez réessayer.",
  'oauth.login.continueWith': 'Continuer avec',
  'onboarding.contextGathering.buildingDesc': 'Description de la construction',
  'onboarding.contextGathering.buildingProfile': 'Construction de ton profil…',
  'onboarding.contextGathering.continueToChat': 'Accéder au chat',
  'onboarding.contextGathering.coreAlive':
    'Le cœur est accessible — le premier lancement peut prendre une minute.',
  'onboarding.contextGathering.coreAliveProbing': 'Vérification de la connexion au cœur…',
  'onboarding.contextGathering.coreUnreachable':
    'Le cœur ne répond pas. Tu peux continuer et réessayer plus tard.',
  'onboarding.contextGathering.errorDesc':
    "Nous n'avons pas pu créer votre profil complet pour l'instant, mais ce n'est pas grave — vous pouvez continuer et votre profil se construira au fil du temps.",
  'onboarding.contextGathering.stillWorkingDesc':
    'Le premier lancement peut prendre 30 à 60 secondes pendant que nous préparons ton modèle local et tes outils. Tu peux accéder au chat à tout moment — la construction du profil continue en arrière-plan.',
  'onboarding.contextGathering.stillWorkingTitle': 'Construction de ton profil en cours…',
  'onboarding.contextGathering.title': 'Collecte de contexte',
  'openhuman.team_list_teams': 'Liste des équipes',
  'overlay.ariaAttention': "Message d'attention",
  'overlay.ariaCompanion': 'Compagnon actif',
  'overlay.ariaOrb': 'Overlay OpenHuman',
  'overlay.ariaVoiceActive': 'Saisie vocale active',
  'overlay.companion.error': 'Erreur',
  'overlay.companion.listening': 'À l’écoute…',
  'overlay.companion.pointing': 'En train de pointer…',
  'overlay.companion.speaking': 'En train de parler…',
  'overlay.companion.thinking': 'Réflexion…',
  'overlay.orbTitle': 'Glisse pour déplacer · Double-clique pour réinitialiser la position',
  'pages.settings.account.connections': 'Connexions',
  'pages.settings.account.connectionsDesc': 'Description des connexions',
  'pages.settings.account.migration': 'Importer depuis un autre assistant',
  'pages.settings.account.migrationDesc':
    'Migrez la mémoire et les notes depuis OpenClaw (et bientôt Hermes) vers cet espace de travail.',
  'pages.settings.account.privacy': 'Confidentialité',
  'pages.settings.account.privacyDesc': 'Description de la confidentialité',
  'pages.settings.account.recoveryPhrase': 'Phrase de récupération',
  'pages.settings.account.recoveryPhraseDesc': 'Description de la phrase de récupération',
  'pages.settings.account.team': 'Équipe',
  'pages.settings.account.teamDesc': "Description de l'équipe",
  'pages.settings.accountSection.description':
    'Phrase de récupération, équipe, connexions et paramètres de confidentialité.',
  'pages.settings.accountSection.title': 'Compte',
  'pages.settings.ai.llm': 'LLM',
  'pages.settings.ai.llmDesc': 'Description du LLM',
  'pages.settings.ai.voice': 'Voix',
  'pages.settings.ai.voiceDesc': 'Description de la voix',
  'pages.settings.aiSection.description':
    'Fournisseurs de modèles de langage, Ollama local et voix (STT / TTS).',
  'pages.settings.aiSection.title': 'IA',
  'settings.developerMenu.composio.title': 'Composio',
  'settings.developerMenu.composio.desc':
    "Mode de routage, déclencheurs d'intégration et archive de l'historique des déclencheurs.",
  'pages.settings.features.desktopCompanion': 'Compagnon de bureau',
  'pages.settings.features.desktopCompanionDesc':
    "Assistant vocal avec conscience de l'écran — écoute, voit, parle, pointe",
  'pages.settings.features.messagingChannels': 'Canaux de messagerie',
  'pages.settings.features.messagingChannelsDesc': 'Description des canaux de messagerie',
  'pages.settings.features.notifications': 'Notifications',
  'pages.settings.features.notificationsDesc': 'Description des notifications',
  'pages.settings.features.screenAwareness': "Surveillance de l'écran",
  'pages.settings.features.screenAwarenessDesc': "Description de la surveillance de l'écran",
  'pages.settings.features.tools': 'Outils',
  'pages.settings.features.toolsDesc': 'Description des outils',
  'pages.settings.featuresSection.description': "Surveillance de l'écran, messagerie et outils.",
  'pages.settings.featuresSection.title': 'Fonctionnalités',
  'privacy.dataKind.credentials': 'Identifiants',
  'privacy.dataKind.derived': 'Dérivé',
  'privacy.dataKind.diagnostics': 'Diagnostics',
  'privacy.dataKind.metadata': 'Métadonnées',
  'privacy.dataKind.raw': 'Brut',
  'privacy.whatLeaves.link.label': "Qu'est-ce qui quitte mon ordinateur ?",
  'rewards.community.achievementsUnlocked': '{unlocked} sur {total} succès débloqués',
  'rewards.community.connectDiscord': 'Connecter Discord',
  'rewards.community.connectDiscordError':
    'Impossible de démarrer la connexion à Discord. Veuillez réessayer.',
  'rewards.community.connectingDiscord': 'Connexion…',
  'rewards.community.cumulativeTokens': 'Tokens cumulés',
  'rewards.community.currentStreak': 'Série actuelle',
  'rewards.community.disconnectDiscord': 'Déconnecter',
  'rewards.community.disconnectDiscordError':
    'Impossible de déconnecter Discord. Veuillez réessayer.',
  'rewards.community.disconnectingDiscord': 'Déconnexion…',
  'rewards.community.discordAccount': 'Compte Discord',
  'rewards.community.discordConnected': 'Discord connecté',
  'rewards.community.discordConnectedAs': 'Connecté en tant que {username}',
  'rewards.community.discordLinkedNotInGuild': 'Discord lié mais pas dans la guilde',
  'rewards.community.discordMember': 'A rejoint le serveur',
  'rewards.community.discordNotLinked': 'Discord non lié',
  'rewards.community.discordServer': 'Serveur Discord',
  'rewards.community.discordStatusUnavailable': 'État Discord indisponible',
  'rewards.community.discordWaiting': 'En attente de Discord',
  'rewards.community.heroSubtitle': 'Sous-titre principal',
  'rewards.community.heroTitle': 'Titre principal',
  'rewards.community.joinDiscord': 'Rejoindre Discord',
  'rewards.community.loadingRewards': 'Chargement des récompenses…',
  'rewards.community.locked': 'Débloqué',
  'rewards.community.retrying': 'Nouvelle tentative…',
  'rewards.community.roleAssigned': 'Rôle attribué',
  'rewards.community.roleAssignmentCount': '{assigned} sur {unlocked} rôles attribués',
  'rewards.community.roleClaimDesc':
    "Vous avez débloqué des rôles Discord mais n'avez pas encore rejoint le serveur OpenHuman. Rejoignez-le pour qu'ils soient attribués automatiquement.",
  'rewards.community.roleClaimTitle': 'Réclamez vos rôles Discord',
  'rewards.community.roleJoinToClaim': 'Rejoindre le serveur pour réclamer',
  'rewards.community.rolePending': 'Synchronisation du rôle…',
  'rewards.community.rolesAndRewards': 'Rôles & Récompenses',
  'rewards.community.streakDays': '{n}',
  'rewards.community.syncPending': 'Synchronisation des récompenses en attente',
  'rewards.community.syncPendingDesc': 'Description de la synchronisation en attente',
  'rewards.community.syncUnavailable': 'Synchronisation indisponible',
  'rewards.community.tryAgain': 'Nouvelle tentative…',
  'rewards.community.unknown': 'Inconnu',
  'rewards.community.unlocked': 'Débloqué',
  'rewards.community.yourProgress': 'Ta progression',
  'rewards.coupon.colCode': 'Code',
  'rewards.coupon.colRedeemed': 'Échangé',
  'rewards.coupon.colReward': 'Récompense',
  'rewards.coupon.colStatus': 'Statut',
  'rewards.coupon.loadingHistory': "Chargement de l'historique des récompenses…",
  'rewards.coupon.noCodes': "Aucun code de récompense utilisé pour l'instant.",
  'rewards.coupon.pending': 'En attente',
  'rewards.coupon.placeholder': 'Code de coupon',
  'rewards.coupon.promoCredits': 'Crédits promo',
  'rewards.coupon.recentRedemptions': 'Échanges récents',
  'rewards.coupon.redeemAccepted':
    "{code} accepté. {amount} sera débloqué après que l'action requise sera effectuée.",
  'rewards.coupon.redeemButton': 'Utiliser le code',
  'rewards.coupon.redeemSuccess': '{code} utilisé. {amount} a été ajouté à vos crédits.',
  'rewards.coupon.redeemedCodes': 'Codes échangés',
  'rewards.coupon.redeeming': 'Échange en cours…',
  'rewards.coupon.statusApplied': 'Appliqué',
  'rewards.coupon.statusPendingAction': 'Action en attente',
  'rewards.coupon.statusRedeemed': 'Utilisé',
  'rewards.coupon.subtitle': 'Sous-titre',
  'rewards.coupon.title': 'Échanger un code de coupon',
  'rewards.referralSection.activity': 'Activité de parrainage',
  'rewards.referralSection.apply': 'Application…',
  'rewards.referralSection.applying': 'Application…',
  'rewards.referralSection.colReferredUser': 'Utilisateur parrainé',
  'rewards.referralSection.colReward': 'Récompense',
  'rewards.referralSection.colStatus': 'Statut',
  'rewards.referralSection.colUpdated': 'Mis à jour',
  'rewards.referralSection.completed': 'Terminé',
  'rewards.referralSection.copyCode': 'Copier le code',
  'rewards.referralSection.copyFailed': 'Copie échouée',
  'rewards.referralSection.haveCode': 'Tu as un code de parrainage ?',
  'rewards.referralSection.haveCodeDesc': "Description d'un code disponible",
  'rewards.referralSection.linked': 'Lié',
  'rewards.referralSection.linkedCode': '(code {code})',
  'rewards.referralSection.loading': 'Chargement du programme de parrainage…',
  'rewards.referralSection.retry': 'Réessayez',
  'rewards.referralSection.noReferrals': 'Aucun parrainage',
  'rewards.referralSection.pendingReferrals': 'Parrainages en attente',
  'rewards.referralSection.placeholder': 'Code de parrainage',
  'rewards.referralSection.share': 'Partager',
  'rewards.referralSection.statusCompleted': 'Statut terminé',
  'rewards.referralSection.statusExpired': 'Statut expiré',
  'rewards.referralSection.statusJoined': 'Statut rejoint',
  'rewards.referralSection.subtitle': 'Sous-titre',
  'rewards.referralSection.title': 'Invite des amis, gagne des crédits',
  'rewards.referralSection.totalEarned': 'Total gagné',
  'rewards.referralSection.yourCode': 'Ton code',
  'settings.ai.addCloudProvider': 'Ajouter un fournisseur cloud',
  'settings.ai.addProvider': 'Enregistrement…',
  'settings.ai.apiKeyFieldLabel': 'Libellé du champ clé API',
  'settings.ai.apiKeyRequired': 'Colle ta clé API pour continuer.',
  'settings.ai.apiKeyStoredEncrypted': 'Clé API stockée chiffrée',
  'settings.ai.apiKeysEncrypted': 'auth-profiles.json',
  'settings.ai.clearStoredKey': 'Effacer la clé stockée',
  'settings.ai.connectProvider': 'Connecter un fournisseur',
  'settings.ai.customRouting': 'Routage personnalisé',
  'settings.ai.defaultResolvesTo': 'Par défaut résolu en',
  'settings.ai.discard': 'Annuler',
  'settings.ai.editProvider': 'Modifier le fournisseur',
  'settings.ai.llmProviders': 'Fournisseurs LLM',
  'settings.ai.llmProvidersDesc': 'Description des fournisseurs LLM',
  'settings.ai.localOllama': 'Local (Ollama)',
  'settings.ai.modelLabel': 'Modèle',
  'settings.ai.noCustomProviders': 'Aucun fournisseur personnalisé',
  'settings.ai.openAiCompat.authHeaderExample': 'Autorisation : Porteur <votre clé>',
  'settings.ai.openAiCompat.authHeaderLabel': "En-tête d'authentification",
  'settings.ai.openAiCompat.baseUrlLabel': 'URL de base',
  'settings.ai.openAiCompat.baseUrlUnavailable': 'Indisponible',
  'settings.ai.openAiCompat.clearKey': 'Effacer la clé',
  'settings.ai.openAiCompat.description':
    "Les harnais locaux pointent vers ce serveur /v1 pour passer par les fournisseurs configurés ci-dessous. L'authentification utilise une clé stable que vous définissez ici, et non le jeton interne principal de l'application.",
  'settings.ai.openAiCompat.keyConfigured': 'Clé configurée',
  'settings.ai.openAiCompat.keyRequired': 'Clé requise',
  'settings.ai.openAiCompat.rotateKey': 'Rotation key',
  'settings.ai.openAiCompat.setKey': 'Définir la clé',
  'settings.ai.openAiCompat.title': 'Point de terminaison compatible OpenAI',
  'settings.ai.providerLabel': 'Fournisseur',
  'skills.mcpComingSoon.title': 'MCP Serveurs',
  'skills.mcpComingSoon.description':
    'La gestion des serveurs MCP arrive bientôt. Cet onglet sera le point central pour découvrir, connecter et surveiller vos intégrations de serveurs MCP.',
  'settings.ai.routing': 'Routage',
  'settings.ai.claudeCode.button': 'Claude Code',
  'settings.ai.claudeCode.inlineNotConnected':
    'Non connecté — achemine le chat via votre Claude Code CLI locale.',
  'settings.ai.claudeCode.checkingSignIn': 'Vérification de la connexion…',
  'settings.ai.claudeCode.inlineConnected': 'Connecté.',
  'settings.ai.claudeCode.signedInAs': 'Connecté en tant que',
  'settings.ai.claudeCode.subscriptionFallback': 'Abonnement Claude',
  'settings.ai.claudeCode.usingApiKeyEnv': 'Utilise ANTHROPIC_API_KEY',
  'settings.ai.claudeCode.cliNotInstalled': 'CLI non installée',
  'settings.ai.claudeCode.signInUnknown': 'État de connexion inconnu',
  'settings.ai.claudeCode.connectedNotSignedIn': 'Connecté · non authentifié',
  'settings.ai.claudeCode.modalTitle': 'Claude Code CLI',
  'settings.ai.claudeCode.modalDescription':
    'Achemine les tâches de chat, agentiques et de raisonnement via votre Claude Code CLI installée localement. Aucune clé API — elle utilise sa propre connexion.',
  'settings.ai.claudeCode.close': 'Fermer',
  'settings.ai.claudeCode.connection': 'Connexion',
  'settings.ai.claudeCode.enabled': 'Activé',
  'settings.ai.claudeCode.notEnabled': 'Non activé',
  'settings.ai.claudeCode.disconnect': 'Déconnecter',
  'settings.ai.claudeCode.disconnecting': 'Déconnexion…',
  'settings.ai.claudeCode.enable': 'Activer Claude Code',
  'settings.ai.claudeCode.enabling': 'Activation…',
  'settings.ai.claudeCode.authentication': 'Authentification',
  'settings.ai.claudeCode.recheck': 'Revérifier',
  'settings.ai.claudeCode.checking': 'Vérification…',
  'settings.ai.claudeCode.openingTerminal': 'Ouverture du terminal…',
  'settings.ai.claudeCode.signIn': 'Se connecter avec Claude',
  'settings.ai.claudeCode.reconnect': 'Reconnecter',
  'settings.ai.claudeCode.loginHint':
    'Ouvre un terminal exécutant claude login. Une fois terminé, cliquez sur Revérifier.',
  'settings.ai.claudeCode.loginError':
    "Impossible d'ouvrir le terminal de connexion. Veuillez réessayer.",
  'settings.ai.claudeCode.fullAccess': 'Accès complet',
  'settings.ai.claudeCode.fullAccessOn':
    'Claude Code peut exécuter des commandes, utiliser le réseau et lancer des sous-agents.',
  'settings.ai.claudeCode.fullAccessOff':
    'Accepter uniquement les modifications — applique automatiquement les modifications de fichiers, limite les commandes et le réseau.',
  'settings.ai.claudeCode.sandboxNoteMac':
    'Sur macOS, ~/.openhuman reste protégé par le bac à sable dans les deux modes.',
  'settings.ai.claudeCode.sandboxNoteOther':
    "L'accès complet n'est pas confiné sur cette plateforme — ne l'activez que si vous faites confiance à l'espace de travail.",
  'settings.ai.claudeCode.enableToCheck': 'Activez Claude Code pour vérifier la connexion.',
  'settings.ai.claudeCode.usingApiKeyEnvDetail': "Utilise ANTHROPIC_API_KEY de l'environnement.",
  'settings.ai.claudeCode.notFoundInstall':
    'Claude Code CLI introuvable — installez avec : npm install -g @anthropic-ai/claude-code',
  'settings.ai.claudeCode.unknownDetail':
    "Impossible de déterminer l'état de connexion. Votre claude CLI est peut-être antérieure au statut d'authentification — essayez Reconnecter, puis Revérifier.",
  'settings.ai.claudeCode.notSignedIn': 'Non connecté.',
  'settings.ai.routingCustom': 'Routage personnalisé',
  'settings.ai.routingDefault': 'Par défaut',
  'settings.ai.routingDesc': 'Description du routage',
  'settings.ai.saveChanges': 'Enregistrement…',
  'settings.ai.saving': 'Enregistrement…',
  'settings.ai.unsavedChange': 'modification non enregistrée',
  'settings.ai.unsavedChanges': 'modifications non enregistrées',
  'settings.ai.workloadGroupBackground': 'Groupe de charge de fond',
  'settings.ai.workloadGroupChat': 'Groupe de charge chat',
  'settings.ai.disconnectProvider': 'Déconnecter {label}',
  'settings.ai.connectProviderLabel': 'Connecter {label}',
  'settings.ai.editProviderEndpoint': 'Modifier le point de terminaison {label}',
  'settings.ai.defaultLocalEndpoint': 'http://localhost:11434/v1',
  'settings.ai.editEndpoint': 'Modifier le point de terminaison',
  'settings.ai.endpointUrlLabel': 'Point de terminaison URL',
  'settings.ai.localRuntimeHelper':
    "Là où {label} est accessible. Par défaut, c'est localhost; pointez ceci vers un hôte distant (par exemple, http://10.0.0.4:11434/v1) pour utiliser une instance partagée.",
  'settings.ai.endpointUrlRequired': 'Le point de terminaison URL est requis.',
  'settings.ai.endpointProtocolRequired':
    'Le point de terminaison doit commencer par http:// ou https://.',
  'settings.ai.connectProviderDialog': 'Connectez-vous {label}',
  'settings.ai.getProviderApiKey': 'Obtenir une API Key',
  'settings.ai.or': 'Ou',
  'settings.ai.codexOauthMissingAuthUrl':
    "Codex OAuth n'a pas renvoyé d'URL d'autorisation. Essayez de vous reconnecter.",
  'settings.ai.codexOauthMissingCallbackUrl':
    "Collez l'URL de redirection de votre navigateur après vous être connecté.",
  'settings.ai.openRouterOauthDescription':
    "Connectez-vous avec OpenRouter et importez une clé API contrôlée par l'utilisateur en utilisant PKCE.",
  'settings.ai.connecting': 'Connexion...',
  'settings.ai.backgroundLoops': 'Boucles de fond',
  'settings.ai.backgroundLoopsDesc':
    "Voyez ce qui s'exécute sans message de discussion, interrompez le travail du battement de cœur et inspectez les lignes récentes du grand livre de crédit.",
  'settings.ai.heartbeatControls': 'Contrôles de battement de coeur',
  'settings.ai.heartbeatControlsDesc':
    "Désactivé par défaut. L'activation démarre la boucle; la désactivation interrompt la tâche en cours.",
  'settings.ai.heartbeatLoop': 'Boucle de battement de coeur',
  'settings.ai.heartbeatLoopDesc':
    'Planificateur principal pour planificateur + inférence subconsciente optionnelle.',
  'settings.ai.subconsciousInference': 'Inférence subconsciente',
  'settings.ai.subconsciousInferenceDesc':
    'Exécute une évaluation task/reflection basée sur un modèle sur les impulsions du rythme cardiaque.',
  'settings.ai.calendarMeetingChecks': 'Les réunions du calendrier vérifient',
  'settings.ai.calendarMeetingChecksDesc':
    'Appelle la liste des événements du calendrier pour les connexions actives du calendrier Google.',
  'settings.ai.calendarCap': 'Limite du calendrier',
  'settings.ai.connectionsPerTick': '{count} conn/tick',
  'settings.ai.meetingLookahead': 'Anticipation de la réunion',
  'settings.ai.minutesShort': '{count} min',
  'settings.ai.reminderLookahead': 'Anticipation de rappel',
  'settings.ai.cronReminderChecks': 'Vérifications de rappel Cron',
  'settings.ai.cronReminderChecksDesc':
    'Analyse les tâches cron activées pour les éléments à venir de type rappel.',
  'settings.ai.relevantNotificationChecks': 'Vérifications de notifications pertinentes',
  'settings.ai.relevantNotificationChecksDesc':
    'Transforme les notifications locales urgentes en alertes proactives.',
  'settings.ai.externalDelivery': 'Diffusion externe',
  'settings.ai.externalDeliveryDesc':
    'Laissons les alertes de battement de cœur envoyer des messages proactifs vers des canaux externes.',
  'settings.ai.interval': 'Intervalle',
  'settings.ai.running': "En cours d'exécution...",
  'settings.ai.plannerTickNow': 'Planificateur tick maintenant',
  'settings.ai.loadingHeartbeatControls': 'Chargement des contrôles de rythme cardiaque...',
  'settings.ai.heartbeatControlsUnavailable': 'Contrôles de rythme cardiaque indisponibles.',
  'settings.ai.loopMap': 'Carte de boucle',
  'settings.ai.plannerSummary':
    'Planificateur : événements sources {sourceEvents}, {sent} envoyés, {deduped} dédupliqués.',
  'settings.ai.routeLabel': 'itinéraire : {route}',
  'settings.ai.on': 'activée',
  'settings.ai.off': 'désactivée',
  'settings.ai.recentUsageLedger': 'Registre des utilisations récentes',
  'settings.ai.recentUsageLedgerDesc':
    "Les lignes backend exposent action/time aujourd'hui; les tags source nécessitent un support backend.",
  'settings.ai.latestSpend': 'Dernière dépense : {amount} à {time} ({action})',
  'settings.ai.topActions': 'Principales actions',
  'settings.ai.noSpendRows': 'Aucune ligne de dépenses chargée.',
  'settings.ai.topHours': 'Heures principales',
  'settings.ai.noHourlySpend': "Aucune dépense horaire pour l'instant.",
  'settings.ai.openhumanDefault': 'OpenHuman (par défaut)',
  'settings.ai.localModelResolved': 'Ollama · {model}',
  'settings.ai.customRoutingForWorkload': 'Routage personnalisé pour {label}',
  'settings.ai.loadingModels': 'Chargement des modèles...',
  'settings.ai.enterModelIdManually': "ou entrer l'identifiant du modèle manuellement:",
  'settings.ai.modelIdPlaceholderForProvider': '{slug} identifiant du modèle',
  'settings.ai.modelIdPlaceholder': 'model-id',
  'settings.ai.selectModel': 'Sélectionnez un modèle...',
  'settings.ai.temperatureOverride': 'Température override',
  'settings.ai.temperatureOverrideSlider': 'Override de température (curseur)',
  'settings.ai.temperatureOverrideValue': 'Override de température (valeur)',
  'settings.ai.temperatureOverrideDesc':
    'Plus bas = plus déterministe. Laissez décoché pour utiliser la valeur par défaut du fournisseur.',
  'settings.ai.modelVision': 'Prend en charge la vision (entrée d’images)',
  'settings.ai.modelVisionDesc':
    'Activez si ce modèle accepte les images. Permet de joindre des images dans le chat lorsque ce modèle est sélectionné.',
  'settings.ai.testFailed': 'Test échoué',
  'settings.ai.testingModel': 'Modèle de test...',
  'settings.ai.modelResponse': 'Réponse du modèle',
  'settings.ai.providerWithValue': 'Fournisseur : {value}',
  'settings.ai.noneDash': '—',
  'settings.ai.promptHelloWorld': 'Invite : Bonjour tout le monde',
  'settings.ai.startedAt': 'Démarré : {value}',
  'settings.ai.waitingForModelResponse': 'En attente de réponse du modèle sélectionné...',
  'settings.ai.response': 'Réponse',
  'settings.ai.testing': 'Test...',
  'settings.ai.test': 'Test',
  'settings.ai.slugMissingError': 'Saisissez un nom de fournisseur pour générer un slug.',
  'settings.ai.slugInUseError': 'Ce nom de fournisseur est déjà utilisé.',
  'settings.ai.slugReservedError': 'Choisissez un autre nom de fournisseur.',
  'settings.ai.providerNamePlaceholder': 'Mon fournisseur',
  'settings.ai.slugLabel': 'Slug :',
  'settings.ai.openAiUrlLabel': 'URL OpenAI',
  'settings.ai.openAiUrlPlaceholder': 'https://api.openai.com/v1',
  'settings.ai.keepExistingKeyPlaceholder': 'Laisser vide pour conserver la clé existante',
  'settings.ai.reindexingMemory': 'Réindexation de la mémoire',
  'settings.ai.reindexingMemoryMessage':
    "Les embeddings sont en cours de retraitement. L(es) élément(s) de mémoire {pending} sont en cours de réintégration sous le modèle actuel — le rappel sémantique est réduit jusqu'à ce que cela se termine. La recherche par mot-clé continue de fonctionner, et la réintégration se poursuit en arrière-plan si vous fermez ceci.",
  'settings.ai.signInWithOpenRouter': 'Connectez-vous avec OpenRouter',
  'settings.ai.weekBudget': 'Budget hebdomadaire',
  'settings.ai.cycleRemaining': 'Cycle restant',
  'settings.ai.cycleTotalSpend': 'Dépenses totales du cycle',
  'settings.ai.avgSpendRow': 'Ligne de dépenses moyennes',
  'settings.ai.backgroundApiReads': 'Bg API lit',
  'settings.ai.backgroundWakeups': 'Bg réveils',
  'settings.ai.budgetMath': 'Calcul du budget',
  'settings.ai.rowsLeft': 'Lignes restantes',
  'settings.ai.rowsPerFullWeekBudget': 'Lignes par budget de semaine complète',
  'settings.ai.sampleBurnRate': "Taux de combustion d'échantillon",
  'settings.ai.projectedEmpty': 'Vide projeté',
  'settings.ai.apiReadsPerDollarRemaining': 'API lectures par $ restant',
  'settings.ai.loopCallBudget': "Budget d'appel en boucle",
  'settings.ai.heartbeatTicks': 'Ticks de battement de coeur',
  'settings.ai.calendarPlannerCalls': 'Appels du planificateur de calendrier',
  'settings.ai.calendarFanoutCap': 'Capuchon de diffusion du calendrier',
  'settings.ai.subconsciousModelCalls': 'Appels du modèle subconscient',
  'settings.ai.composioSyncScans': 'Composio analyses de synchronisation',
  'settings.ai.totalBackgroundApiReadBudget': 'Budget total de lecture API',
  'settings.ai.memoryWorkerPolls': 'Sondages de mémoire',
  'settings.ai.defaultProviderName': 'OpenHuman',
  'settings.ai.routing.managed': 'Géré',
  'settings.ai.routing.managedAlwaysOn': 'Always on',
  'settings.ai.routing.managedHint':
    'Managed is always available as a fallback. To use your own model, choose a routing mode below.',
  'settings.ai.routing.managedDesc':
    'OpenHuman exécutera toutes les inférences dans le cloud, choisira le meilleur modèle pour la tâche, optimisera les coûts et conservera les paramètres de routage les plus sûrs par défaut.',
  'settings.ai.routing.managedMsg':
    'OpenHuman gérera toutes les inférences pour chaque charge de travail et choisira automatiquement la meilleure route en termes de coût, de qualité et de sécurité.',
  'settings.ai.routing.useYourOwn': 'Utilisez vos propres modèles',
  'settings.ai.routing.useYourOwnDesc':
    "Choisissez un fournisseur + modèle et faites passer toutes les charges de travail par celui-ci. C'est simple, mais cela peut être inefficace car les inférences légères et lourdes partagent toutes le même trajet.",
  'settings.ai.routing.advanced': 'Avancé',
  'settings.ai.routing.advancedDesc':
    "Choisissez différents modèles pour différentes tâches. C'est la meilleure option pour une optimisation stricte des coûts et le plus de contrôle.",
  'settings.ai.routing.customDesc':
    'Le routage granulaire vous offre la meilleure optimisation des coûts et le plus de contrôle. Utilisez les lignes ci-dessous pour décider quelles charges de travail restent gérées, lesquelles utilisent votre valeur par défaut partagée, et lesquelles sont attribuées à un modèle spécifique.',
  'settings.ai.routing.chatAndConversations': 'Chat et conversations',
  'settings.ai.routing.chatDesc':
    "Modèles utilisés lors de l'interaction directe avec l'utilisateur, des réponses, du raisonnement, des boucles d'agents et de l'aide à la programmation.",
  'settings.ai.routing.backgroundTasks': 'Tâches en arrière-plan',
  'settings.ai.routing.bgTasksDesc':
    "Modèles utilisés en dehors du flux principal de conversation pour la synthèse, le suivi, l'apprentissage et l'évaluation subconsciente.",
  'settings.ai.routing.workload.chat.label': 'Chat',
  'settings.ai.routing.workload.chat.description':
    'Direct conversational back-and-forth — “Quick” mode in Conversations',
  'settings.ai.routing.workload.chat.hint':
    'Recommended: a cheap or mid-cost fast chat model with high tokens/sec and low latency. Open-source local models can work well here if they feel responsive.',
  'settings.ai.routing.workload.reasoning.label': 'Reasoning',
  'settings.ai.routing.workload.reasoning.description':
    'Main chat agent, meeting summarizer — “Reasoning” mode in Conversations',
  'settings.ai.routing.workload.reasoning.hint':
    'Recommended: a more expensive frontier or strong reasoning model for deep thinking. This is used for the main chat agent, meeting summaries, and heavier answer synthesis.',
  'settings.ai.routing.workload.agentic.label': 'Agentic',
  'settings.ai.routing.workload.agentic.description':
    'Sub-agent runners, tool loops, GIF decisions',
  'settings.ai.routing.workload.agentic.hint':
    'Recommended: a reliable instruction-following model with strong tool use. Mid-cost frontier models are usually safest; capable open-source models can work if tool calling is stable.',
  'settings.ai.routing.workload.coding.label': 'Coding',
  'settings.ai.routing.workload.coding.description': 'Code generation and refactor passes',
  'settings.ai.routing.workload.coding.hint':
    'Recommended: a coding-tuned model with strong instruction following, edit quality, and long-context performance. This is usually worth spending more on.',
  'settings.ai.routing.workload.vision.label': 'Vision',
  'settings.ai.routing.workload.vision.description':
    'Image understanding for the vision sub-agent — always multimodal',
  'settings.ai.routing.workload.vision.hint':
    'Recommended: a multimodal model that accepts image input. The managed default (vision-v1) is image-capable; any provider you route here is always treated as vision-enabled.',
  'settings.ai.routing.workload.memory.label': 'Memory summarization',
  'settings.ai.routing.workload.memory.description': 'Tree-extracts and consolidations',
  'settings.ai.routing.workload.memory.hint':
    'Recommended: a cheaper summarization model. It should be consistent and compact, but it does not need premium frontier-level reasoning.',
  'settings.ai.routing.workload.heartbeat.label': 'Heartbeat',
  'settings.ai.routing.workload.heartbeat.description': 'Background reasoning between user turns',
  'settings.ai.routing.workload.heartbeat.hint':
    'Recommended: a cheap, efficient background model. This runs often between turns, so low cost matters more than maximum intelligence.',
  'settings.ai.routing.workload.learning.label': 'Learning · Reflections',
  'settings.ai.routing.workload.learning.description': 'Periodic reflection over recent history',
  'settings.ai.routing.workload.learning.hint':
    'Recommended: a stronger reflective model. This can be mid-cost or premium because it benefits from better synthesis over recent history.',
  'settings.ai.routing.workload.subconscious.label': 'Subconscious',
  'settings.ai.routing.workload.subconscious.description': 'Eventfulness scoring + drift checks',
  'settings.ai.routing.workload.subconscious.hint':
    'Recommended: a very cheap monitoring model, ideally one that is lightweight and predictable. This is for eventfulness scoring, drift checks, and quiet background evaluation.',
  'settings.ai.routing.addCustomProvider': 'Ajouter un fournisseur personnalisé',
  'settings.ai.globalModel.title': 'Choisissez un modèle pour tout',
  'settings.ai.globalModel.desc':
    "Cela fait passer toutes les inférences par un seul modèle. C'est plus simple, mais cela peut être inefficace en termes de coût et de qualité, car les tâches légères et lourdes utiliseront toutes le même chemin.",
  'settings.ai.globalModel.noProviders':
    "Ajoutez ou connectez d'abord un fournisseur. Ensuite, vous pouvez acheminer chaque charge de travail via un modèle ici.",
  'settings.ai.globalModel.provider': 'Fournisseur',
  'settings.ai.globalModel.model': 'Modèle',
  'settings.ai.globalModel.loadingModels': 'Chargement des modèles…',
  'settings.ai.globalModel.enterModelId': "Entrez l'identifiant du modèle",
  'settings.ai.globalModel.appliesToAll':
    "S'applique au même fournisseur + modèle pour le chat, le raisonnement, le codage, la mémoire, le rythme cardiaque, l'apprentissage et le subconscient. Les embeddings sont configurés séparément. Les modifications sont enregistrées lorsque vous cliquez sur enregistrer.",
  'settings.ai.globalModel.saving': 'Enregistrement…',
  'settings.ai.globalModel.saved': 'Enregistré',
  'settings.ai.workload.noModel': 'Aucun modèle sélectionné',
  'settings.ai.workload.changeModel': 'Changer de modèle',
  'settings.ai.workload.chooseModel': 'Choisir un modèle',
  'settings.ai.provider.ollama': 'Ollama',
  'settings.autocomplete.appFilter.acceptSuggestion': 'Accepter la suggestion',
  'settings.autocomplete.appFilter.app': 'Application',
  'settings.autocomplete.appFilter.currentSuggestion': 'Suggestion actuelle',
  'settings.autocomplete.appFilter.contextOverride': 'Remplacement du contexte (optionnel)',
  'settings.autocomplete.appFilter.debounce': 'Anti-rebond',
  'settings.autocomplete.appFilter.debugFocus': 'Focus de débogage',
  'settings.autocomplete.appFilter.enabled': 'Activé',
  'settings.autocomplete.appFilter.getSuggestion': 'Obtenir une suggestion',
  'settings.autocomplete.appFilter.lastError': 'Dernière erreur',
  'settings.autocomplete.appFilter.liveLogs': 'Journaux en direct',
  'settings.autocomplete.appFilter.model': 'Modèle',
  'settings.autocomplete.appFilter.noLogs': '):',
  'settings.autocomplete.appFilter.phase': 'Phase',
  'settings.autocomplete.appFilter.platformSupported': 'Plateforme prise en charge',
  'settings.autocomplete.appFilter.refreshStatus': 'Actualisation…',
  'settings.autocomplete.appFilter.refreshing': 'Actualisation…',
  'settings.autocomplete.appFilter.running': "En cours d'exécution",
  'settings.autocomplete.appFilter.runtime': 'Exécution',
  'settings.autocomplete.appFilter.test': 'Tester',
  'settings.autocomplete.completionStyle.acceptedCompletion':
    '{count} complétion acceptée stockée — utilisée pour personnaliser les suggestions futures.',
  'settings.autocomplete.completionStyle.acceptedCompletions':
    '{count} complétions acceptées stockées — utilisées pour personnaliser les suggestions futures.',
  'settings.autocomplete.completionStyle.clearHistory': 'Effacement…',
  'settings.autocomplete.completionStyle.clearing': 'Effacement…',
  'settings.autocomplete.completionStyle.debounce': 'Délai anti-rebond (ms)',
  'settings.autocomplete.completionStyle.enabled': 'Activé',
  'settings.autocomplete.completionStyle.maxChars': 'Nombre max de caractères',
  'settings.autocomplete.completionStyle.noHistory':
    'Pas encore de complétions acceptées. Accepte des suggestions avec Tab pour commencer à personnaliser.',
  'settings.autocomplete.completionStyle.overlayTtl': "Durée de vie de l'overlay (ms)",
  'settings.autocomplete.completionStyle.personalizationHistory': 'Historique de personnalisation',
  'settings.autocomplete.completionStyle.styleExamples': 'Exemples de style (un par ligne)',
  'settings.autocomplete.completionStyle.styleInstructions': 'Instructions de style',
  'settings.autocomplete.debug.acceptedPrefix': 'Acceptée : {value}',
  'settings.autocomplete.debug.acceptFailed': "Échec de l'acceptation de la suggestion",
  'settings.autocomplete.debug.alreadyRunning':
    "La saisie semi-automatique est déjà en cours d'exécution.",
  'settings.autocomplete.debug.clearHistoryFailed': "Échec de l'effacement de l'historique.",
  'settings.autocomplete.debug.didNotStart': "La saisie semi-automatique n'a pas démarré.",
  'settings.autocomplete.debug.disabledInSettings':
    "La saisie semi-automatique est désactivée dans les paramètres. Activez-le et enregistrez d'abord.",
  'settings.autocomplete.debug.fetchSuggestionFailed':
    'Échec de la récupération de la suggestion actuelle',
  'settings.autocomplete.debug.inspectFocusedElementFailed':
    "Échec de l'inspection de l'élément ciblé",
  'settings.autocomplete.debug.loadSettingsFailed':
    'Échec du chargement des paramètres de saisie semi-automatique',
  'settings.autocomplete.debug.noSuggestionApplied': "Aucune suggestion n'a été appliquée.",
  'settings.autocomplete.debug.noSuggestionReturned': 'Aucune suggestion renvoyée.',
  'settings.autocomplete.debug.refreshStatusFailed':
    "Échec de l'actualisation de l'état de la saisie semi-automatique",
  'settings.autocomplete.debug.saveAdvancedSettingsFailed':
    "Échec de l'enregistrement des paramètres avancés",
  'settings.autocomplete.debug.startFailed': 'Échec du démarrage de la saisie semi-automatique',
  'settings.autocomplete.debug.stopFailed': "Échec de l'arrêt de la saisie semi-automatique",
  'settings.autocomplete.debug.suggestionPrefix': 'Suggestion : {value}',
  'settings.autocomplete.shared.none': 'Aucune',
  'settings.autocomplete.shared.notApplicable': 'n/a',
  'settings.autocomplete.shared.unknown': 'Inconnu',
  'settings.billing.autoRecharge.addAmount': 'Ajouter ce montant',
  'settings.billing.autoRecharge.addCard': 'Ajouter une carte',
  'settings.billing.autoRecharge.amountHint': 'Indice de montant',
  'settings.billing.autoRecharge.defaultCard': 'Carte par défaut',
  'settings.billing.autoRecharge.lastRechargeFailed': 'Dernière recharge échouée',
  'settings.billing.autoRecharge.lastRecharged': 'Dernière recharge',
  'settings.billing.autoRecharge.expires': 'Expire {date}',
  'settings.billing.autoRecharge.noCards': 'Aucune carte',
  'settings.billing.autoRecharge.paymentMethods': 'Méthodes de paiement',
  'settings.billing.autoRecharge.rechargeInProgress': 'Recharge en cours',
  'settings.billing.autoRecharge.spentThisWeek': '${spent} de ${limit} utilisé cette semaine',
  'settings.billing.autoRecharge.rechargeWhen': 'Recharger quand le solde passe en dessous de',
  'settings.billing.autoRecharge.saveSettings': 'Enregistrement…',
  'settings.billing.autoRecharge.saving': 'Enregistrement…',
  'settings.billing.autoRecharge.setDefault': ':',
  'settings.billing.autoRecharge.subtitle': 'Sous-titre',
  'settings.billing.autoRecharge.title': 'Activer la recharge automatique',
  'settings.billing.autoRecharge.toggleAriaLabel': 'Activer/désactiver la recharge automatique',
  'settings.billing.autoRecharge.weeklyLimit': 'Limite de dépenses hebdomadaire',
  'settings.billing.history.desc': 'Description',
  'settings.billing.history.empty': 'Vide',
  'settings.billing.history.openPortal': 'Ouvrir le portail',
  'settings.billing.history.posted': 'Publié',
  'settings.billing.history.title': 'Titre',
  'settings.billing.inferenceBudget.cycleEnds': 'Fin du cycle',
  'settings.billing.inferenceBudget.exhausted': 'Épuisé',
  'settings.billing.inferenceBudget.loadError': 'Erreur de chargement',
  'settings.billing.inferenceBudget.noBudgetDesc': 'Description sans budget',
  'settings.billing.inferenceBudget.noRecurringBudget': 'Aucun budget récurrent',
  'settings.billing.inferenceBudget.noRecurringPlanBudget': 'Aucun budget de plan récurrent',
  'settings.billing.inferenceBudget.noRecurringWeeklyDesc':
    "Votre plan actuel n'inclut pas de budget d'inférence hebdomadaire récurrent. L'utilisation est plutôt payée à partir des crédits disponibles.",
  'settings.billing.inferenceBudget.remaining': 'Restant',
  'settings.billing.inferenceBudget.remainingSummary': '{remaining} / {budget} restants',
  'settings.billing.inferenceBudget.spentThisCycle': 'Dépensé {amount} ce cycle',
  'settings.billing.inferenceBudget.cycleEndsOn': 'Le cycle se termine {date}',
  'settings.billing.inferenceBudget.exhaustedDesc':
    "L'utilisation incluse de l'abonnement est épuisée. Rechargez des crédits pour continuer à utiliser AI sans attendre le prochain cycle.",
  'settings.billing.inferenceBudget.discountVsPayg':
    "{pct}% moins cher par appel que le paiement à l'utilisation.",
  'settings.billing.inferenceBudget.cycleSpend': 'Dépenses de cycle',
  'settings.billing.inferenceBudget.totalAmount': '{amount} au total',
  'settings.billing.inferenceBudget.inference': 'Inférence',
  'settings.billing.inferenceBudget.integrations': 'Intégrations',
  'settings.billing.inferenceBudget.calls': '{count} appels',
  'settings.billing.inferenceBudget.dailySpend': 'Dépenses quotidiennes',
  'settings.billing.inferenceBudget.dailySpendPoint': '{date} : {amount}',
  'settings.billing.inferenceBudget.topModels': 'Top modèles',
  'settings.billing.inferenceBudget.noInferenceUsage': "Aucune utilisation d'inférence ce cycle.",
  'settings.billing.inferenceBudget.topIntegrations': 'Principales intégrations',
  'settings.billing.inferenceBudget.noIntegrationUsage':
    "Aucune utilisation de l'intégration ce cycle.",
  'settings.billing.inferenceBudget.tenHourCap': 'Plafond de dix heures',
  'settings.billing.inferenceBudget.title': 'Titre',
  'settings.billing.inferenceBudget.unableToLoad':
    "Impossible de charger les données d'utilisation",
  'settings.billing.inferenceBudget.notAvailable': 'n/a',
  'settings.billing.payAsYouGo.available': 'Disponible',
  'settings.billing.payAsYouGo.chargeCustomAmount': 'Ouverture…',
  'settings.billing.payAsYouGo.chooseTopUpDesc': 'Description du choix de recharge',
  'settings.billing.payAsYouGo.chooseTopUpTitle': 'Titre du choix de recharge',
  'settings.billing.payAsYouGo.creditBalanceDesc': 'Description du solde de crédits',
  'settings.billing.payAsYouGo.creditBalanceTitle': 'Titre du solde de crédits',
  'settings.billing.payAsYouGo.customAmount': 'Montant personnalisé',
  'settings.billing.payAsYouGo.enterAmount': 'Saisir un montant',
  'settings.billing.payAsYouGo.opening': 'Ouverture',
  'settings.billing.payAsYouGo.promotionalCredits': 'Crédits promotionnels',
  'settings.billing.payAsYouGo.topUpBalance': 'Recharger le solde',
  'settings.billing.payAsYouGo.topUpCredits': 'Recharger les crédits',
  'settings.billing.payAsYouGo.unableToLoad': 'Impossible de charger le solde.',
  'settings.billing.subscription.annual': 'Annuel',
  'settings.billing.subscription.billedAnnually': 'Facturé annuellement',
  'settings.billing.subscription.chooseSubtitle': 'Sous-titre du choix',
  'settings.billing.subscription.chooseTitle': 'Titre du choix',
  'settings.billing.subscription.cryptoDesc': 'Description crypto',
  'settings.billing.subscription.cryptoQuestion': 'Question crypto',
  'settings.billing.subscription.current': 'Actuel',
  'settings.billing.subscription.currentPlan': 'Plan actuel',
  'settings.billing.subscription.monthly': 'Mensuel',
  'settings.billing.subscription.paymentConfirmed': 'Paiement confirmé',
  'settings.billing.subscription.perMonth': 'Par mois',
  'settings.billing.subscription.popular': 'Populaire',
  'settings.billing.subscription.save': '{pct}',
  'settings.billing.subscription.upgrade': 'Passer à la version supérieure',
  'settings.billing.subscription.waiting': 'En attente',
  'settings.billing.subscription.waitingPayment': 'En attente de paiement',
  'settings.composio.apiKeyDesc': 'Une clé API Composio est actuellement stockée sur cet appareil.',
  'settings.composio.apiKeyExamplePlaceholder': 'ck_live_xxxxxxxxxxxxxxxx',
  'settings.composio.apiKeyLabel': 'Clé API Composio',
  'settings.composio.apiKeyStored': 'Clé API stockée',
  'settings.composio.apiKeyStoredPlaceholder': '••••••••••••••••',
  'settings.composio.clearedToBackend': 'Basculé en mode Backend',
  'settings.composio.confirmItem1': 'Un compte sur app.composio.dev avec une clé API',
  'settings.composio.confirmItem2':
    'Re-lier chaque intégration via votre compte Composio personnel',
  'settings.composio.confirmItem3':
    "Remarque : les déclencheurs Composio (webhooks en temps réel) ne se déclenchent pas encore en mode Direct — uniquement les appels d'outils synchrones",
  'settings.composio.confirmNeedItems': 'Vous aurez besoin de :',
  'settings.composio.confirmSwitch': 'Je comprends, passer en Direct',
  'settings.composio.confirmTitle': '⚠️ Passage au mode Direct',
  'settings.composio.confirmWarning':
    'Vos intégrations existantes (Gmail, Slack, GitHub, etc. liées via OpenHuman) ne seront pas visibles — elles vivent dans le tenant Composio géré par OpenHuman.',
  'settings.composio.intro':
    "Composio intègre plus de 250 applications externes en tant qu'outils que votre agent peut appeler. Choisissez comment ces appels d'outils sont routés.",
  'settings.composio.title': 'Composio',
  'settings.composio.modeDirect': 'Direct (apporte ta propre clé API)',
  'settings.composio.modeDirectDesc':
    "Les appels vont directement à backend.composio.dev. Souverain / compatible hors ligne. L'exécution des outils fonctionne de manière synchrone ; les webhooks de déclencheurs en temps réel ne sont pas encore routés en mode direct (problème de suivi).",
  'settings.composio.modeManaged': "Géré (OpenHuman s'en occupe pour toi)",
  'settings.composio.modeManagedDesc':
    "OpenHuman relaie les appels d'outils via notre backend (recommandé). L'authentification est négociée ; vous ne collez jamais de clé API Composio. Les webhooks sont entièrement routés.",
  'settings.composio.routingMode': 'Mode de routage',
  'settings.composio.saveErrorNoKey':
    "Échec de l'enregistrement. Le mode Direct nécessite une clé API non vide.",
  'settings.composio.saving': 'Enregistrement…',
  'settings.composio.switching': 'Bascule en cours…',
  'settings.companion.title': 'Compagnon de bureau',
  'settings.companion.session': 'Session',
  'settings.companion.activeLabel': 'Actif',
  'settings.companion.inactiveStatus': 'Inactif',
  'settings.companion.stopping': 'Arrêt…',
  'settings.companion.stopSession': 'Arrêter la session',
  'settings.companion.starting': 'Démarrage…',
  'settings.companion.startSession': 'Démarrer la session',
  'settings.companion.sessionId': 'ID de session',
  'settings.companion.turns': 'Tours',
  'settings.companion.remaining': 'Configuration',
  'settings.companion.configuration': 'restante',
  'settings.companion.hotkey': 'Raccourci clavier',
  'settings.companion.activationMode': "Mode d'activation",
  'settings.companion.sessionTtl': 'Durée de vie de la session',
  'settings.companion.screenCapture': "Capture d'écran",
  'settings.companion.appContext': "Contexte de l'application",
  'settings.cron.jobs.commandRequired': 'La commande est requise pour les tâches shell',
  'settings.cron.jobs.createJob': 'Nouvelle tâche planifiée',
  'settings.cron.jobs.created': 'Tâche créée',
  'settings.cron.jobs.custom': 'Personnalisé',
  'settings.cron.jobs.desc': 'Description',
  'settings.cron.jobs.edit': 'Modifier',
  'settings.cron.jobs.editJob': 'Modifier la tâche planifiée',
  'settings.cron.jobs.empty': 'Aucune tâche cron core trouvée.',
  'settings.cron.jobs.errorCreate': 'Échec de la création de la tâche cron : {message}',
  'settings.cron.jobs.errorLoadList': 'Échec du chargement des tâches cron du cœur : {message}',
  'settings.cron.jobs.errorLoadRuns':
    "Échec du chargement de l'historique des exécutions : {message}",
  'settings.cron.jobs.errorRemove': 'Échec de la suppression de la tâche cron du cœur : {message}',
  'settings.cron.jobs.errorRun': "Échec de l'exécution de la tâche cron du cœur : {message}",
  'settings.cron.jobs.errorToggle': 'Échec de la mise à jour de la tâche cron du cœur : {message}',
  'settings.cron.jobs.errorUpdate': 'Échec de la mise à jour de la tâche cron : {message}',
  'settings.cron.jobs.formAtLabel': 'Exécuter à',
  'settings.cron.jobs.formCancel': 'Annuler',
  'settings.cron.jobs.formCommand': 'Commande shell',
  'settings.cron.jobs.formCommandPlaceholder': 'ex. curl https://example.com/health',
  'settings.cron.jobs.formCreate': 'Créer',
  'settings.cron.jobs.formCronCustom': 'Expression personnalisée',
  'settings.cron.jobs.formCronCustomPlaceholder': 'ex. */30 * * * *',
  'settings.cron.jobs.formCronPreset': 'Préréglage',
  'settings.cron.jobs.formCronPreview': 'Exécutions : {preview}',
  'settings.cron.jobs.formDeleteAfterRun': 'Supprimer après la première exécution',
  'settings.cron.jobs.formDelivery': 'Mode de distribution',
  'settings.cron.jobs.formDeliveryNone': 'Aucun (sortie uniquement)',
  'settings.cron.jobs.formDeliveryProactive': 'Proactif (notification push)',
  'settings.cron.jobs.formError': "Échec de l'enregistrement de la tâche",
  'settings.cron.jobs.formEveryLabel': 'Intervalle (millisecondes)',
  'settings.cron.jobs.formEveryPlaceholder': 'ex. 3600000',
  'settings.cron.jobs.formJobType': 'Type de tâche',
  'settings.cron.jobs.formJobTypeAgent': 'Agent (invite IA)',
  'settings.cron.jobs.formJobTypeShell': 'Commande shell',
  'settings.cron.jobs.formName': 'Nom de la tâche',
  'settings.cron.jobs.formNamePlaceholder': 'ex. daily-report, cleanup-task',
  'settings.cron.jobs.formPrompt': "Invite de l'agent",
  'settings.cron.jobs.formPromptPlaceholder': "Que doit faire l'agent à chaque exécution ?",
  'settings.cron.jobs.formPromptRequired': "L'invite est requise pour les tâches d'agent",
  'settings.cron.jobs.formSave': 'Enregistrer',
  'settings.cron.jobs.formSaving': 'Enregistrement…',
  'settings.cron.jobs.formScheduleAt': 'Unique (exécuter à)',
  'settings.cron.jobs.formScheduleCron': 'Récurrent (cron)',
  'settings.cron.jobs.formScheduleEvery': 'Intervalle (toutes les N ms)',
  'settings.cron.jobs.formScheduleRequired': 'La planification est requise',
  'settings.cron.jobs.formScheduleType': 'Type de planification',
  'settings.cron.jobs.formSessionIsolated': 'Isolée (recommandé)',
  'settings.cron.jobs.formSessionMain': 'Session principale',
  'settings.cron.jobs.formSessionTarget': 'Session cible',
  'settings.cron.jobs.lastStatus': 'Dernier statut',
  'settings.cron.jobs.loading': 'Chargement des tâches cron…',
  'settings.cron.jobs.loadingRuns': 'Chargement des exécutions',
  'settings.cron.jobs.nextRun': 'Prochaine exécution',
  'settings.cron.jobs.pause': 'Mettre en pause',
  'settings.cron.jobs.paused': 'En pause',
  'settings.cron.jobs.recentRuns': 'Exécutions récentes',
  'settings.cron.jobs.removing': 'Suppression',
  'settings.cron.jobs.resume': 'Reprendre',
  'settings.cron.jobs.runningNow': "En cours d'exécution",
  'settings.cron.jobs.saving': 'Enregistrement…',
  'settings.cron.jobs.schedule': 'Planification',
  'settings.cron.jobs.title': 'Tâches cron du core',
  'settings.cron.jobs.updated': 'Tâche mise à jour',
  'settings.cron.jobs.viewRuns': 'Voir les exécutions',
  'settings.cron.schedule.every2hours': 'Toutes les 2 heures',
  'settings.cron.schedule.every30min': 'Toutes les 30 minutes',
  'settings.cron.schedule.every6hours': 'Toutes les 6 heures',
  'settings.cron.schedule.everyHour': 'Toutes les heures',
  'settings.cron.schedule.onceDaily': 'Une fois par jour (9 h)',
  'settings.localModel.deviceCapability.active': 'Actif',
  'settings.localModel.deviceCapability.appliedTier': 'Niveau appliqué',
  'settings.localModel.deviceCapability.applying': 'Application en cours',
  'settings.localModel.deviceCapability.cores': '{count}',
  'settings.localModel.deviceCapability.couldNotLoadPresets':
    'Impossible de charger les préréglages',
  'settings.localModel.deviceCapability.cpu': 'CPU',
  'settings.localModel.deviceCapability.customModelIds': 'Identifiants de modèles personnalisés',
  'settings.localModel.deviceCapability.detected': 'Détecté',
  'settings.localModel.deviceCapability.disabled': 'Désactivé',
  'settings.localModel.deviceCapability.disabledDesc': 'Description désactivé',
  'settings.localModel.deviceCapability.downloadingModels': '(téléchargement des modèles)',
  'settings.localModel.deviceCapability.downloadingSetupDesc':
    "Téléchargement de l'installateur OllamaSetup (~2 Go) et décompression. Cela peut prendre une minute lors de la première installation.",
  'settings.localModel.deviceCapability.failedToApplyPreset':
    "Échec de l'application du préréglage",
  'settings.localModel.deviceCapability.gpu': 'GPU',
  'settings.localModel.deviceCapability.installFailed': "Échec de l'installation d'Ollama",
  'settings.localModel.deviceCapability.installFailedDesc':
    "L'installateur s'est terminé avant qu'Ollama soit utilisable. Clique sur Réessayer pour recommencer, ou installe manuellement depuis ollama.com.",
  'settings.localModel.deviceCapability.installFirst': "Lancez Ollama d'abord.",
  'settings.localModel.deviceCapability.installFirstDesc':
    'Les niveaux locaux dépendent d\'un point de terminaison Ollama géré en externe. Lancez-le vous-même, téléchargez les modèles souhaités, et continuez à utiliser "Désactivé (repli cloud)" jusqu\'à ce que le runtime soit accessible.',
  'settings.localModel.deviceCapability.installOllamaFirst':
    "Lancez Ollama d'abord pour utiliser ce niveau",
  'settings.localModel.deviceCapability.installingOllama': "Installation d'Ollama",
  'settings.localModel.deviceCapability.loadingDeviceInfo':
    "Chargement des informations de l'appareil",
  'settings.localModel.deviceCapability.localAiDisabled':
    'IA locale désactivée — utilisation du fallback cloud.',
  'settings.localModel.deviceCapability.modelTier': 'Niveau de modèle',
  'settings.localModel.deviceCapability.needsOllama': 'Ollama requis',
  'settings.localModel.deviceCapability.notDetected': 'Non détecté',
  'settings.localModel.deviceCapability.disabledLowercase': 'désactivé',
  'settings.localModel.deviceCapability.presetDetails':
    'Chat : {chatModel} · Vision : {visionModel} · RAM cible : {targetRamGb} Go',
  'settings.localModel.deviceCapability.ram': 'RAM',
  'settings.localModel.deviceCapability.recommended': 'Recommandé',
  'settings.localModel.deviceCapability.retryInstall': 'Nouvelle tentative…',
  'settings.localModel.deviceCapability.retrying': 'Nouvelle tentative…',
  'settings.localModel.deviceCapability.starting': 'Démarrage…',
  'settings.localModel.download.audioPathPlaceholder': 'Chemin absolu vers le fichier audio',
  'settings.localModel.download.capabilityChat': 'bavarder',
  'settings.localModel.download.capabilityEmbedding': 'Intégration',
  'settings.localModel.download.capabilityAssets': 'Ressources de fonctionnalité',
  'settings.localModel.download.capabilityStt': 'STT',
  'settings.localModel.download.capabilityTts': 'TTS',
  'settings.localModel.download.capabilityVision': 'Vision',
  'settings.localModel.download.downloading': 'Téléchargement…',
  'settings.localModel.download.embeddingDimensions': 'Dimensions : {dimensions}',
  'settings.localModel.download.embeddingModel': 'Modèle : {modelId}',
  'settings.localModel.download.embeddingPlaceholder': "Une chaîne d'entrée par ligne…",
  'settings.localModel.download.embeddingVectors': 'Vecteurs : {count}',
  'settings.localModel.download.noThinkMode': 'Mode sans réflexion',
  'settings.localModel.download.notAvailable': 'n/a',
  'settings.localModel.download.promptPlaceholder':
    "Tape n'importe quelle invite et exécute-la sur le modèle local…",
  'settings.localModel.download.quantizationPref': 'Préférence de quantification',
  'settings.localModel.download.runEmbeddingTest': 'En cours…',
  'settings.localModel.download.runPromptTest': "Lancer le test d'invite",
  'settings.localModel.download.runSummaryTest': 'Lancer le test de résumé',
  'settings.localModel.download.runTranscriptionTest': 'En cours…',
  'settings.localModel.download.runTtsTest': 'En cours…',
  'settings.localModel.download.runVisionTest': 'En cours…',
  'settings.localModel.download.running': 'En cours…',
  'settings.localModel.download.runningPrompt': "Exécution de l'invite",
  'settings.localModel.download.summaryHelper':
    'Appelle `openhuman.inference_summarize` via le noyau Rust',
  'settings.localModel.download.summarizePlaceholder':
    'Colle du texte à résumer avec le modèle local…',
  'settings.localModel.download.testCustomPrompt': 'Tester une invite personnalisée',
  'settings.localModel.download.testEmbeddings': 'Tester les embeddings',
  'settings.localModel.download.testSummarization': 'Tester la synthèse',
  'settings.localModel.download.testVisionPrompt': 'Tester une invite de vision',
  'settings.localModel.download.testVoiceInput': "Tester l'entrée vocale (STT)",
  'settings.localModel.download.testVoiceOutput': 'Tester la sortie vocale (TTS)',
  'settings.localModel.download.transcript': 'Transcription :',
  'settings.localModel.download.ttsOutput': 'Sortie : {outputPath}',
  'settings.localModel.download.ttsOutputPlaceholder': 'Chemin WAV de sortie optionnel',
  'settings.localModel.download.ttsPlaceholder': 'Saisis du texte à synthétiser…',
  'settings.localModel.download.ttsVoice': 'Voix : {voiceId}',
  'settings.localModel.download.visionImagePlaceholder':
    "Une référence d'image par ligne (URI data, URL ou marqueur de chemin local)",
  'settings.localModel.download.visionPromptPlaceholder':
    'Saisis une invite pour le modèle de vision…',
  'settings.localModel.status.allChecksPassed': 'Toutes les vérifications réussies',
  'settings.localModel.status.artifact': 'Artefact',
  'settings.localModel.status.backend': 'Backend',
  'settings.localModel.status.binary': 'Binaire',
  'settings.localModel.status.bootstrapResume': 'Bootstrap / Reprendre',
  'settings.localModel.status.checking': 'Vérification…',
  'settings.localModel.status.checkingOllama': "Vérification d'Ollama",
  'settings.localModel.status.contextBelowMinimumBadge':
    '{contextLength} ctx - inférieur à {required} min',
  'settings.localModel.status.contextBelowMinimumTitle':
    'Rejeté : la fenêtre contextuelle des jetons {contextLength} est inférieure au minimum de jetons {required} requis par la couche mémoire. Le rappel serait corrompu par une troncature silencieuse.',
  'settings.localModel.status.contextOkBadge': '{contextLength} ctx ✓',
  'settings.localModel.status.contextOkTitle':
    'Les jetons {contextLength} de la fenêtre contextuelle répondent au minimum de la couche mémoire de jetons {required}.',
  'settings.localModel.status.contextUnknownBadge': 'ctx inconnu',
  'settings.localModel.status.contextUnknownTitle':
    "Fenêtre contextuelle inconnue ; n'a pas pu confirmer qu'il répond au minimum de couche mémoire du jeton {required}.",
  'settings.localModel.status.customLocation': 'Emplacement personnalisé',
  'settings.localModel.status.customLocationDesc': "Description de l'emplacement personnalisé",
  'settings.localModel.status.diagnosticsHint':
    'Cliquez sur "Lancer les diagnostics" pour vérifier qu\'Ollama fonctionne et que les modèles sont installés.',
  'settings.localModel.status.downloadingUnknown': 'Téléchargement (taille inconnue)',
  'settings.localModel.status.eta': 'ETA',
  'settings.localModel.status.expectedModels': 'Modèles attendus',
  'settings.localModel.status.expectedChat': 'Discussion : {model}',
  'settings.localModel.status.expectedEmbedding': 'Intégration : {model}',
  'settings.localModel.status.expectedVision': 'Vision : {model}',
  'settings.localModel.status.externalProcess': 'Processus externe',
  'settings.localModel.status.forceRebootstrap': 'Forcer le ré-amorçage',
  'settings.localModel.status.generationTps': 'TPS de génération',
  'settings.localModel.status.hideErrorDetails': "Masquer les détails de l'erreur",
  'settings.localModel.status.installManually': 'Installer manuellement',
  'settings.localModel.status.installManuallyFrom': 'Installer manuellement depuis',
  'settings.localModel.status.installOllama': 'Démarrage…',
  'settings.localModel.status.installedModels': 'Modèles installés',
  'settings.localModel.status.installing': 'Installation…',
  'settings.localModel.status.installingOllama': 'Installation du runtime Ollama…',
  'settings.localModel.status.issues': 'Problèmes',
  'settings.localModel.status.issuesFound': '{count} problème(s) trouvé(s)',
  'settings.localModel.status.lastLatency': 'Dernière latence',
  'settings.localModel.status.model': 'Modèle',
  'settings.localModel.status.notAvailable': 'n/a',
  'settings.localModel.status.notFound': 'Introuvable',
  'settings.localModel.status.notRunning': "Non en cours d'exécution",
  'settings.localModel.status.ollamaBinaryPath': 'Chemin du binaire Ollama',
  'localModel.ollamaServer.helperText': 'Exemple : http://192.168.1.5:11434',
  'localModel.ollamaServer.label': 'URL du serveur Ollama',
  'localModel.ollamaServer.modelCount': 'modèles',
  'localModel.ollamaServer.placeholder': 'http://localhost:11434',
  'localModel.ollamaServer.reachable': 'Accessible',
  'localModel.ollamaServer.resetButton': 'Réinitialiser par défaut',
  'localModel.ollamaServer.saveButton': 'Enregistrer',
  'localModel.ollamaServer.testButton': 'Tester la connexion',
  'localModel.ollamaServer.unreachable': 'Inaccessible',
  'localModel.ollamaServer.validationError': 'Doit être une URL http:// ou https:// valide',
  'settings.localModel.status.ollamaDiagnostics': 'Diagnostics Ollama',
  'settings.localModel.status.ollamaNotInstalled': 'Runtime Ollama indisponible',
  'settings.localModel.status.ollamaNotInstalledDesc':
    "OpenHuman traite désormais Ollama comme un runtime d'inférence externe. Lancez votre propre serveur Ollama, téléchargez les modèles souhaités, et dirigez le routage des charges de travail vers celui-ci.",
  'settings.localModel.status.progress': 'Progression',
  'settings.localModel.status.provider': 'Fournisseur',
  'settings.localModel.status.retryBootstrap': 'Réessayer le bootstrap',
  'settings.localModel.status.runDiagnostics': 'Vérification…',
  'settings.localModel.status.running': 'En cours',
  'settings.localModel.status.runningExternalProcess': 'En cours via processus externe',
  'settings.localModel.status.runtimeStatus': 'État du runtime',
  'settings.localModel.status.server': 'Serveur',
  'settings.localModel.status.setPath': 'Configuration…',
  'settings.localModel.status.setting': 'Configuration…',
  'settings.localModel.status.showErrorDetails': "Masquer les détails de l'erreur",
  'settings.localModel.status.showInstallErrorDetails': "Masquer les détails de l'erreur",
  'settings.localModel.status.suggestedFixes': 'Corrections suggérées',
  'settings.localModel.status.thenSetPath': 'Ensuite définir le chemin',
  'settings.localModel.status.triggering': 'Déclenchement…',
  'settings.localModel.status.unavailable': 'Indisponible',
  'settings.localModel.status.working': 'En cours…',
  'settings.developerMenu.ai.title': 'Configuration IA',
  'settings.developerMenu.ai.desc':
    'Fournisseurs cloud, modèles Ollama locaux et routage par charge de travail',
  'settings.developerMenu.screenAwareness.title': "Conscience de l'écran",
  'settings.developerMenu.screenAwareness.desc':
    "Autorisations de capture d'écran, politique de surveillance et contrôles de session",
  'settings.developerMenu.messagingChannels.title': 'Canaux de messagerie',
  'settings.developerMenu.messagingChannels.desc':
    "Configure les modes d'authentification Telegram/Discord et le routage de canal par défaut",
  'settings.developerMenu.tools.title': 'Outils',
  'settings.developerMenu.tools.desc':
    "Active ou désactive les capacités qu'OpenHuman peut utiliser en ton nom",
  'settings.developerMenu.agentChat.title': 'Chat agent',
  'settings.developerMenu.agentChat.desc':
    'Teste une conversation agent avec des remplacements de modèle et de température',
  'settings.developerMenu.devWorkflow.title': 'Flux de travail de développement',
  'settings.developerMenu.devWorkflow.desc':
    'Agent autonome qui sélectionne vos problèmes GitHub et crée des PR selon un calendrier',
  'settings.developerMenu.devWorkflow.panelDesc':
    'Configurez un agent développeur autonome qui sélectionne les problèmes GitHub qui vous sont attribués et crée automatiquement des demandes de tirage selon un calendrier.',
  'settings.developerMenu.skillsRunner.title': 'Compétences Coureur',
  'settings.developerMenu.skillsRunner.desc':
    "Exécutez n'importe quelle compétence intégrée de manière ponctuelle — remplissez ses entrées et lancez une exécution autonome en arrière-plan",
  'settings.developerMenu.skillsRunner.panelDesc':
    "Choisissez une compétence regroupée, remplissez ses entrées déclarées, et lancez une exécution en arrière-plan de type 'lancer-et-oublier'. Utilisez le flux de travail Dev à la place si vous voulez un travail récurrent planifié par cron.",
  'settings.skillsRunner.skill': 'Compétence',
  'settings.skillsRunner.selectSkill': 'Sélectionnez une compétence…',
  'settings.skillsRunner.loadingSkills': 'Chargement des compétences…',
  'settings.skillsRunner.loadingDescription': 'Chargement des entrées de compétences…',
  'settings.skillsRunner.noInputs': 'Cette compétence ne déclare aucune entrée.',
  'settings.skillsRunner.placeholder.required': 'requis',
  'settings.skillsRunner.runNow': 'Cours maintenant',
  'settings.skillsRunner.starting': 'Démarrage…',
  'settings.skillsRunner.started': 'Commencé — id de course:',
  'settings.skillsRunner.logPath': 'Journal:',
  'settings.skillsRunner.error.listSkills': 'Échec du chargement des compétences:',
  'settings.skillsRunner.error.describe': 'Échec du chargement des entrées:',
  'settings.skillsRunner.error.missingRequired': 'Entrée(s) requise(s) manquante(s):',
  'settings.skillsRunner.error.run': "Échec du démarrage de l'exécution:",
  'settings.skillsRunner.error.preflightGate': 'La porte de prévol a échoué',
  'settings.skillsRunner.error.runtimeUnavailable': 'Runtime indisponible',
  'settings.skillsRunner.error.runtimeUnavailableDefault': 'indisponible',
  'settings.skillsRunner.schedule.heading': 'Planifier (récurrent)',
  'settings.skillsRunner.schedule.help':
    "Enregistrez cette compétence + les entrées comme un travail cron récurrent. L'agent appellera run_workflow à chaque tick.",
  'settings.skillsRunner.schedule.frequency': 'Fréquence',
  'settings.skillsRunner.schedule.every30min': 'Toutes les 30 minutes',
  'settings.skillsRunner.schedule.everyHour': 'Toutes les heures',
  'settings.skillsRunner.schedule.every2hours': 'Toutes les 2 heures',
  'settings.skillsRunner.schedule.every6hours': 'Toutes les 6 heures',
  'settings.skillsRunner.schedule.onceDaily': 'Une fois par jour (9h00)',
  'settings.skillsRunner.schedule.save': 'Enregistrer le planning',
  'settings.skillsRunner.schedule.saving': 'Enregistrement…',
  'settings.skillsRunner.schedule.saved': 'Horaires enregistrés.',
  'settings.skillsRunner.schedule.error': "Échec de l'enregistrement du calendrier:",
  'settings.skillsRunner.schedule.loadingJobs': 'Chargement des emplois du temps existants…',
  'settings.skillsRunner.schedule.noJobs':
    "Aucun emploi du temps n'a encore été enregistré pour cette compétence.",
  'settings.skillsRunner.schedule.existing': 'Tâches planifiées pour cette compétence:',
  'settings.skillsRunner.schedule.inputsLabel': 'Entrées',
  'settings.skillsRunner.schedule.inputsNone': 'Aucune entrée',
  'settings.skillsRunner.schedule.runNow': 'Courir',
  'settings.skillsRunner.schedule.remove': 'Supprimer',
  'settings.skillsRunner.scheduleEnabled': 'Activé',
  'settings.skillsRunner.scheduleDisabled': 'En pause',
  'settings.skillsRunner.scheduleToggleAria': 'Activer/désactiver le programme',
  'settings.skillsRunner.schedule.history': 'Histoire',
  'settings.skillsRunner.schedule.historyLoading': "Chargement de l'historique…",
  'settings.skillsRunner.schedule.historyEmpty': 'Aucune course pour ce planning pour le moment.',
  'settings.skillsRunner.schedule.historyNoOutput': 'Aucune sortie capturée.',
  'settings.skillsRunner.schedule.active': 'actif',
  'settings.skillsRunner.schedule.lastRunLabel': 'dernier:',
  'settings.skillsRunner.recentRuns.headingForSkill': 'Exécutions récentes pour cette compétence',
  'settings.skillsRunner.recentRuns.headingAll': 'Dernières courses de compétences (toutes)',
  'settings.skillsRunner.recentRuns.refresh': 'Actualiser',
  'settings.skillsRunner.recentRuns.loading': 'Chargement des courses récentes…',
  'settings.skillsRunner.recentRuns.empty': 'Aucune course récente.',
  'settings.skillsRunner.viewer.loading': 'Chargement du journal…',
  'settings.skillsRunner.viewer.tailing': 'Suivi en direct',
  'settings.skillsRunner.viewer.fetching': 'récupération',
  'settings.skillsRunner.viewer.error': 'Échec de la lecture du journal:',
  'settings.skillsRunner.repoPicker.loading': 'Chargement des dépôts…',
  'settings.skillsRunner.repoPicker.select': 'Sélectionnez un dépôt…',
  'settings.skillsRunner.repoPicker.empty':
    'Aucun dépôt retourné. Connectez GitHub via Composio pour remplir cette liste.',
  'settings.skillsRunner.repoPicker.notConnected':
    "GitHub n'est pas connecté via Composio. Connectez-le d'abord sous Compétences → Composio.",
  'settings.skillsRunner.repoPicker.privateTag': '(privé)',
  'settings.skillsRunner.branchPicker.needRepo': "Choisis d'abord un dépôt…",
  'settings.skillsRunner.branchPicker.loading': 'Chargement des branches…',
  'settings.skillsRunner.branchPicker.select': 'Sélectionnez une branche…',
  'settings.devWorkflow.githubRepository': 'Dépôt GitHub',
  'settings.devWorkflow.loadingRepositories': 'Chargement des dépôts...',
  'settings.devWorkflow.selectRepository': 'Sélectionnez un dépôt',
  'settings.devWorkflow.privateTag': '(privé)',
  'settings.devWorkflow.detectingForkInfo': 'Détection des informations sur la fourche...',
  'settings.devWorkflow.forkDetected': 'Fourche détectée',
  'settings.devWorkflow.upstream': 'En amont:',
  'settings.devWorkflow.forkPrNote': 'Les PR seront soumises au dépôt en amont.',
  'settings.devWorkflow.notForkNote':
    'Pas un fork. Les PR seront soumises directement contre ce dépôt.',
  'settings.devWorkflow.targetBranch': 'Branche cible',
  'settings.devWorkflow.targetBranchNote': 'Des PR seront créés contre cette branche',
  'settings.devWorkflow.loadingBranches': 'Chargement des branches...',
  'settings.devWorkflow.runFrequency': 'Fréquence de course',
  'settings.devWorkflow.runFrequencyNote':
    "À quelle fréquence l'agent doit vérifier les problèmes et créer des PR.",
  'settings.devWorkflow.updateConfiguration': 'Mettre à jour la configuration',
  'settings.devWorkflow.saveConfiguration': 'Enregistrer la configuration',
  'settings.devWorkflow.remove': 'Supprimer',
  'settings.devWorkflow.saved': 'Enregistré',
  'settings.devWorkflow.activeConfiguration': 'Configuration active',
  'settings.devWorkflow.activeConfigRepository': 'Dépôt:',
  'settings.devWorkflow.activeConfigUpstream': 'En amont:',
  'settings.devWorkflow.activeConfigTargetBranch': 'Branche cible:',
  'settings.devWorkflow.activeConfigSchedule': 'Programme:',
  'settings.devWorkflow.enabled': 'Activé',
  'settings.devWorkflow.paused': 'En pause',
  'settings.devWorkflow.nextRun': 'Prochaine course',
  'settings.devWorkflow.lastRun': 'Dernière exécution',
  'settings.devWorkflow.runNow': 'Cours maintenant',
  'settings.devWorkflow.running': 'Course…',
  'settings.devWorkflow.recentRuns': 'Courses récentes',
  'settings.devWorkflow.cronSaveError': "Échec de l'enregistrement de la configuration",
  'settings.devWorkflow.lastOutput': 'Dernière sortie',
  'settings.devWorkflow.noOutput': 'Aucune sortie capturée',
  'settings.devWorkflow.runningStatus':
    "L'agent fonctionne — il choisit un problème et travaille sur une solution...",
  'settings.devWorkflow.errorNotConnected':
    "GitHub n'est pas connecté. Veuillez connecter GitHub via Paramètres > Avancé > Composio en premier.",
  'settings.devWorkflow.errorToolNotEnabled':
    "L'outil GITHUB_LIST_REPOSITORIES_FOR_THE_AUTHENTICATED_USER n'est pas activé sur ce backend. Veuillez demander à votre administrateur de l'activer dans l'intégration Composio (backend#842).",
  'settings.devWorkflow.errorNotAuthenticated': "Non authentifié. Veuillez vous connecter d'abord.",
  'settings.devWorkflow.errorNoRepositories': 'Aucun dépôt trouvé pour ce compte GitHub.',
  'settings.devWorkflow.schedule.every30min': 'Toutes les 30 minutes',
  'settings.devWorkflow.schedule.everyHour': 'Toutes les heures',
  'settings.devWorkflow.schedule.every2hours': 'Toutes les 2 heures',
  'settings.devWorkflow.schedule.every6hours': 'Toutes les 6 heures',
  'settings.devWorkflow.schedule.onceDaily': 'Une fois par jour (9 h)',
  'settings.developerMenu.tasks.title': 'Tâches',
  'settings.developerMenu.tasks.desc':
    'Parcourez et gérez les tableaux de tâches — vos propres to-dos ainsi que les tableaux créés par les agents au fil des conversations.',
  'settings.developerMenu.cronJobs.title': 'Tâches cron',
  'settings.developerMenu.cronJobs.desc':
    "Afficher et configurer les tâches planifiées des compétences d'exécution",
  'settings.developerMenu.localModelDebug.title': 'Débogage du modèle local',
  'settings.developerMenu.localModelDebug.desc':
    "Configuration Ollama, téléchargements d'assets, tests de modèle et diagnostics",
  'settings.developerMenu.webhooks.title': 'Webhooks',
  'settings.developerMenu.webhooks.desc':
    "Inspecter les enregistrements de webhooks d'exécution et les journaux de requêtes capturés",
  'settings.developerMenu.eventLog.title': 'Journal des événements',
  'settings.developerMenu.eventLog.desc':
    'Flux en direct codé par couleur de tous les événements des agents, outils et systèmes',
  'settings.developerMenu.eventLog.allTypes': 'Tous les types',
  'settings.developerMenu.eventLog.filterAgent': 'Filtrer...',
  'settings.developerMenu.eventLog.download': 'Télécharger',
  'settings.developerMenu.eventLog.events': 'événements',
  'settings.developerMenu.eventLog.live': 'Vivre',
  'settings.developerMenu.eventLog.disconnected': 'Déconnecté',
  'settings.developerMenu.eventLog.waiting': 'En attente des événements...',
  'settings.developerMenu.eventLog.notConnected': 'Non connecté au noyau',
  'settings.developerMenu.eventLog.jumpToLatest': 'Aller au plus récent',
  'settings.developerMenu.eventLog.badge.tool': 'TOOL',
  'settings.developerMenu.eventLog.badge.agent': 'AGENT',
  'settings.developerMenu.eventLog.badge.info': 'INFO',
  'settings.developerMenu.eventLog.badge.mem': 'MEM',
  'settings.developerMenu.eventLog.badge.chan': 'CHAN',
  'settings.developerMenu.eventLog.badge.cron': 'CRON',
  'settings.developerMenu.eventLog.badge.hook': 'HOOK',
  'settings.developerMenu.eventLog.badge.warn': 'WARN',
  'settings.developerMenu.eventLog.badge.skill': 'SKILL',
  'settings.developerMenu.eventLog.badge.comp': 'COMP',
  'settings.developerMenu.eventLog.badge.mcp': 'MCP',
  'settings.developerMenu.intelligence.title': 'Intelligence',
  'settings.developerMenu.intelligence.desc':
    'Espace mémoire, moteur subconscient, rêves et paramètres',
  'settings.developerMenu.notificationRouting.title': 'Routage des notifications',
  'settings.developerMenu.notificationRouting.desc':
    "Score d'importance par IA et escalade de l'orchestrateur pour les alertes d'intégration",
  'settings.developerMenu.composeioTriggers.title': 'Déclencheurs ComposeIO',
  'settings.developerMenu.composeioTriggers.desc':
    "Afficher l'historique et les archives des déclencheurs ComposeIO",
  'settings.developerMenu.composioRouting.title': 'Routage Composio (mode direct)',
  'settings.developerMenu.composioRouting.desc':
    'Utilise ta propre clé API Composio et route les appels directement vers backend.composio.dev',
  'settings.developerMenu.integrationTriggers.title': "Déclencheurs d'intégration",
  'settings.developerMenu.integrationTriggers.desc':
    "Configurer les paramètres de triage IA pour les déclencheurs d'intégration Composio",
  'settings.developerMenu.mcpServer.title': 'MCP Serveur',
  'settings.developerMenu.mcpServer.desc':
    'Configurer les clients MCP externes pour se connecter à OpenHuman',
  'settings.developerMenu.autonomy.title': 'Autonomie de l’agent',
  'settings.developerMenu.autonomy.desc':
    'Limites de fréquence des actions des outils et seuils de sécurité',
  'settings.developerMenu.autocomplete.title': 'Autocomplétion',
  'settings.developerMenu.autocomplete.desc':
    'Paramètres d’autocomplétion IA en ligne et panneau de débogage',
  'settings.developerMenu.voiceDebug.title': 'Voix (débogage)',
  'settings.developerMenu.voiceDebug.desc':
    'État d’exécution de la dictée vocale et paramètres de débogage',
  'settings.mcpServer.title': 'Serveur MCP',
  'settings.mcpServer.toolsSectionTitle': 'Outils disponibles',
  'settings.mcpServer.toolsSectionDesc':
    "Outils exposés via le serveur stdio MCP lors de l'exécution d'openhuman-core mcp",
  'settings.mcpServer.configSectionTitle': 'Configuration du client',
  'settings.mcpServer.configSectionDesc':
    "Sélectionnez votre client MCP pour générer l'extrait de configuration correct",
  'settings.mcpServer.copySnippet': 'Copier dans le presse-papiers',
  'settings.mcpServer.copied': 'Copié !',
  'settings.mcpServer.openConfigFile': 'Ouvrir le fichier de configuration',
  'settings.mcpServer.binaryPathNotFound':
    'Binaire OpenHuman introuvable. Si vous exécutez à partir des sources, compilez avec : cargo build --bin openhuman-core',
  'settings.mcpServer.openConfigError': "Échec de l'ouverture du fichier de configuration",
  'settings.mcpServer.clientClaudeDesktop': 'Bureau Claude',
  'settings.mcpServer.clientCursor': 'Curseur',
  'settings.mcpServer.clientCodex': 'Codex',
  'settings.mcpServer.clientZed': 'Zed',
  'settings.mcpServer.configFilePath': 'Fichier de configuration',
  'settings.mcpServer.clientSelectorAriaLabel': 'MCP sélecteur de client',
  'settings.appearance.menuDesc': 'Choisis clair, sombre ou le thème du système',
  'settings.agentAccess.title': "Accès OS de l'agent",
  'settings.agentAccess.menuDesc':
    "Contrôlez où l'agent peut read/write et s'il peut utiliser le shell.",
  'settings.agentAccess.loadError': "Échec du chargement des paramètres d'accès",
  'settings.agentAccess.saveError': "Échec de l'enregistrement des paramètres d'accès",
  'settings.agentAccess.saved': "Enregistré — s'applique à votre prochain message.",
  'settings.agentAccess.desktopOnly':
    "Les paramètres d'accès ne sont disponibles que dans l'application de bureau.",
  'settings.agentAccess.loading': 'Chargement…',
  'settings.agentAccess.accessMode': "Mode d'accès",
  'settings.agentAccess.tier.readonly.title': 'Lecture seule',
  'settings.agentAccess.tier.readonly.desc':
    "Lit des fichiers et exécute des commandes en lecture seule pour explorer — mais n'écrit jamais, ne modifie jamais, ni n’exécute quoi que ce soit qui change l’état.",
  'settings.agentAccess.tier.supervised.title': 'Demandez avant de modifier',
  'settings.agentAccess.tier.supervised.desc':
    'Crée de nouveaux fichiers librement, mais demande votre approbation avant de modifier un fichier existant, d’exécuter une commande, d’accéder au réseau ou d’installer quoi que ce soit.',
  'settings.agentAccess.tier.full.title': 'Accès complet',
  'settings.agentAccess.tier.full.desc':
    "Exécute des commandes avec l'accès complet de votre compte utilisateur — il peut read/write partout où cela est autorisé, sauf dans les magasins de certificats et du système. Les commandes destructrices, l'accès au réseau et les installations demandent toujours une approbation.",
  'settings.agentAccess.defaultTag': '(par défaut)',
  'settings.agentAccess.fullWarning':
    "⚠ L'accès complet exécute des commandes avec l'accès complet de votre compte et n'est pas isolé. Ne l'activez que lorsque vous faites confiance à l'agent avec cette machine. Les répertoires de systèmes et d'identifiants restent bloqués, et les actions destructrices, réseau et d'installation demandent toujours une approbation.",
  'settings.agentAccess.confine.label': "Confiner à l'espace de travail",
  'settings.agentAccess.confine.desc':
    "Restreignez l'agent au répertoire de l'espace de travail (plus tous les dossiers accordés), quel que soit le mode d'accès sélectionné. Lorsqu'il est désactivé, il peut accéder à n'importe quel endroit auquel votre utilisateur peut accéder — sauf aux répertoires de crédentiel et système toujours bloqués.",
  'settings.agentAccess.requireTaskPlanApproval.label': "Exiger l'approbation du plan de tâche",
  'settings.agentAccess.requireTaskPlanApproval.desc':
    "Pause avant qu'un agent assigné n'exécute un briefing de tâche rédigé par un agent.",
  'settings.agentAccess.tinyplaceAutopilot.title': 'Agent tiny.place autonome',
  'settings.agentAccess.tinyplaceAutopilot.desc':
    'Laissez OpenHuman agir sur tiny.place tout seul : de façon planifiée, il cherche du travail intéressant — les primes ouvertes d’abord —, fait ce qui correspond à ses compétences et agit depuis votre identité. Il fonctionne sans surveillance et peut dépenser ; gardez-le sur devnet pendant vos tests. Désactivé par défaut.',
  'settings.agentAccess.tinyplaceAutopilot.label': 'Exécuter automatiquement',
  'settings.agentAccess.timeout.label': "Délai d'expiration de l'action",
  'settings.agentAccess.timeout.desc':
    "Durée pendant laquelle un seul outil ou une seule action peut s'exécuter avant d'être annulé. Augmentez cette valeur si un grand modèle local est interrompu avant d'avoir terminé sa réponse.",
  'settings.agentAccess.timeout.unit': 'secondes',
  'settings.agentAccess.timeout.invalid':
    'Saisissez un nombre entier de secondes dans la plage autorisée',
  'settings.agentAccess.timeout.envOverride':
    "La variable d'environnement OPENHUMAN_TOOL_TIMEOUT_SECS remplace ce paramètre ; les modifications effectuées ici n'auront donc aucun effet tant qu'elle n'est pas supprimée.",
  'settings.agentAccess.grantedFolders': 'Dossiers accordés',
  'settings.agentAccess.alwaysAllow': 'Outils toujours autorisés',
  'settings.agentAccess.alwaysAllowDesc':
    "Les outils que vous avez marqués « Toujours autoriser » dans le chat s'exécutent sans demander. Supprimez-en un pour être invité à nouveau.",
  'settings.agentAccess.alwaysAllowNone': 'Pas encore d’outils toujours autorisés.',
  'settings.agentAccess.grantedDesc':
    "Dossiers que l'agent peut lire et écrire, en plus de l'espace de travail. Les magasins d'informations d'identification (~/.ssh, ~/.gnupg, ~/.aws, trousseaux) et les répertoires système (/etc, /System, C:\\Windows,…) sont toujours bloqués, même à l'intérieur d'un dossier autorisé.",
  'settings.agentAccess.noneGranted': 'Aucun dossier accordé.',
  'settings.agentAccess.readWrite': 'lire + écrire',
  'settings.agentAccess.readOnly': 'lecture seule',
  'settings.agentAccess.remove': 'Supprimer',
  'settings.agentAccess.pathPlaceholder': 'Chemin absolu du dossier',
  'settings.agentAccess.accessLevelLabel': "Niveau d'accès",
  'settings.agentAccess.add': 'Ajouter',
  'settings.agentAccess.saving': 'Enregistrement…',
  'settings.agentAccess.changesApply': "Les modifications s'appliquent à votre prochain message.",
  'settings.agentAccess.directories': 'Répertoires',
  'settings.agentAccess.actionSandbox': "Bac à sable d'actions",
  'settings.agentAccess.readWriteAccess': 'lecture + écriture',
  'settings.agentAccess.actionSandboxDesc':
    'Répertoire de travail par défaut pour les outils shell, fichiers et git.',
  'settings.agentAccess.actionDir.edit': 'Modifier',
  'settings.agentAccess.actionDir.save': 'Enregistrer',
  'settings.agentAccess.actionDir.cancel': 'Annuler',
  'settings.agentAccess.actionDir.placeholder': 'Chemin absolu, par ex. /Users/you/Projects',
  'settings.agentAccess.actionDir.envLocked':
    'Défini par OPENHUMAN_ACTION_DIR. Modifiez la variable d’environnement pour le remplacer.',
  'settings.agentAccess.actionDir.saved': 'Répertoire d’action mis à jour.',
  'settings.agentAccess.internalState': 'État interne',
  'settings.agentAccess.agentBlocked': "bloqué pour l'agent",
  'settings.agentAccess.internalStateDesc':
    "Bases de données mémoire, sessions, jetons et autres données essentielles. Non accessible aux outils de l'agent.",
  'settings.agentAccess.actionDirInputLabel': "Chemin du bac à sable d'actions",
  'settings.agentAccess.actionDirSave': 'Enregistrer',
  'settings.agentAccess.actionDirSaving': 'Enregistrement…',
  'settings.agentAccess.actionDirSaved': "Bac à sable d'actions mis à jour.",
  'settings.agentAccess.actionDirEmptyError': 'Le chemin ne peut pas être vide.',
  'settings.agentAccess.actionDirSaveError':
    "Impossible de mettre à jour le bac à sable d'actions.",
  'settings.agentAccess.actionDirEnvOverrideError':
    "OPENHUMAN_ACTION_DIR est défini — désactivez la variable d'environnement pour modifier cela depuis les Paramètres.",
  'settings.agentAccess.actionDirEnvOverrideNote':
    "Remplacé par OPENHUMAN_ACTION_DIR — désactivez la variable d'environnement pour gérer cela depuis les Paramètres.",
  'settings.agentAccess.approvalHistory': 'Historique des approbations',
  'settings.agentAccess.approvalHistoryDesc':
    "Consultez les décisions Approuver / Refuser passées demandées par l'agent.",
  'settings.agentAccess.viewApprovalHistory': "Voir l'historique des approbations",

  // ── Panneau des autorisations ─────────────────────────────────────
  'settings.permissions.title': 'Autorisations',
  'settings.permissions.menuDesc':
    'Choisissez ce que votre assistant peut faire et où il peut travailler.',
  'settings.permissions.accessMode': "Que peut faire l'assistant ?",
  'settings.permissions.accessModeDesc':
    "Choisissez la liberté accordée à l'assistant lorsqu'il effectue des actions sur votre ordinateur.",
  'settings.permissions.preset.readonly.title': 'Regarder sans toucher',
  'settings.permissions.preset.readonly.desc':
    "L'assistant peut lire des fichiers et explorer, mais ne peut jamais écrire, modifier ou exécuter quoi que ce soit qui change l'état.",
  'settings.permissions.preset.supervised.title': "M'interroger d'abord",
  'settings.permissions.preset.supervised.desc':
    "Peut créer de nouveaux fichiers librement, mais demande toujours votre approbation avant de modifier, d'exécuter des commandes ou d'accéder au réseau.",
  'settings.permissions.preset.full.title': 'Contrôle total',
  'settings.permissions.preset.full.desc':
    "Fonctionne avec votre accès de compte complet. Les commandes destructives, l'accès réseau et les installations demandent toujours une approbation.",
  'settings.permissions.folders': 'Où peut-il travailler ?',
  'settings.permissions.foldersDesc':
    "Le dossier par défaut que l'assistant lit et écrit. Vous pouvez ajouter d'autres dossiers dans les paramètres avancés.",

  'settings.meetings.title': 'Réunions',
  'settings.meetings.menuDesc': 'Connexion automatique, résumés et transcriptions des réunions',
  'settings.meetings.desktopOnly':
    'Les paramètres de réunion sont disponibles uniquement sur ordinateur.',
  'settings.meetings.loading': 'Chargement…',
  'settings.meetings.loadError': 'Échec du chargement des paramètres de réunion.',
  'settings.meetings.saveError': 'Échec de la sauvegarde des paramètres de réunion.',
  'settings.meetings.saved': 'Enregistré',
  'settings.meetings.saving': 'Enregistrement…',
  'settings.meetings.autoJoin.title': 'Politique de connexion automatique',
  'settings.meetings.autoJoin.desc': 'Quand un événement du calendrier a un lien Google Meet',
  'settings.meetings.autoJoin.askEachTime': 'Demander à chaque fois',
  'settings.meetings.autoJoin.always': 'Toujours rejoindre',
  'settings.meetings.autoJoin.never': 'Ne jamais rejoindre',
  'settings.meetings.autoSummarize.title': 'Résumé après appel',
  'settings.meetings.autoSummarize.desc': 'Générer un résumé après la fin de la réunion',
  'settings.meetings.autoSummarize.ask': 'Demander après appel',
  'settings.meetings.autoSummarize.always': 'Toujours résumer',
  'settings.meetings.autoSummarize.never': 'Ne jamais résumer',
  'settings.meetings.listenOnly': 'Mode écoute seule',
  'settings.meetings.listenOnlyDesc': 'Rejoindre avec le micro coupé',
  'settings.meetings.ingestTranscripts': 'Intégrer les transcriptions du backend',
  'settings.meetings.ingestTranscriptsDesc': 'Stocker les transcriptions de réunion en mémoire',
  'settings.sandbox.title': 'Exécution en sandbox',
  'settings.sandbox.menuDesc':
    "Configurer les backends sandbox pour l'isolation des outils de l'agent.",
  'settings.sandbox.loading': 'Chargement…',
  'settings.sandbox.desktopOnly':
    "Les paramètres sandbox sont disponibles uniquement dans l'application de bureau.",
  'settings.sandbox.loadError': 'Échec du chargement des paramètres sandbox.',
  'settings.sandbox.saveError': 'Échec de la sauvegarde des paramètres sandbox.',
  'settings.sandbox.saved': "Enregistré — applicable aux nouvelles sessions de l'agent.",
  'settings.sandbox.saving': 'Enregistrement…',
  'settings.sandbox.status': 'Statut',
  'settings.sandbox.dockerStatus': 'Docker',
  'settings.sandbox.available': 'Disponible',
  'settings.sandbox.unavailable': 'Indisponible',
  'settings.sandbox.detectedBackend': 'Backend OS',
  'settings.sandbox.enableLabel': "Activer l'exécution en sandbox",
  'settings.sandbox.enableDesc':
    "Exécuter les outils de l'agent dans un environnement sandbox isolé.",
  'settings.sandbox.backendLabel': 'Backend',
  'settings.sandbox.backendDesc':
    "Choisissez le backend d'isolation à utiliser pour l'exécution en sandbox.",
  'settings.sandbox.backend.auto': 'Automatique (détecter le meilleur disponible)',
  'settings.sandbox.backend.docker': 'Docker',
  'settings.sandbox.backend.landlock': 'Landlock (Linux)',
  'settings.sandbox.backend.firejail': 'Firejail (Linux)',
  'settings.sandbox.backend.bubblewrap': 'Bubblewrap (Linux)',
  'settings.sandbox.backend.none': 'Aucun (pas de sandbox)',
  'settings.sandbox.dockerSettings': 'Paramètres Docker',
  'settings.sandbox.dockerImage': 'Image',
  'settings.sandbox.dockerImagePlaceholder': 'alpine:3.20',
  'settings.sandbox.memoryLimit': 'Limite mémoire',
  'settings.sandbox.memoryUnit': 'MB',
  'settings.sandbox.cpuLimit': 'Limite CPU',
  'settings.sandbox.cpuUnit': 'cœurs',
  'settings.sandbox.envPassthrough': "Transfert des variables d'environnement",
  'settings.sandbox.envPassthroughDesc': "Variables d'environnement transmises dans le sandbox.",
  'settings.sandbox.noEnvVars': "Aucune variable d'environnement configurée.",
  'settings.approvalHistory.title': 'Historique des approbations',
  'settings.approvalHistory.subtitle':
    "Décisions récentes d'approbation d'outils, les plus récentes en premier.",
  'settings.approvalHistory.refresh': 'Refresh',
  'settings.approvalHistory.loading': "Chargement de l'historique des approbations…",
  'settings.approvalHistory.retry': 'Retry',
  'settings.approvalHistory.emptyState': "Aucune décision d'approbation enregistrée.",
  'settings.approvalHistory.errorGeneric':
    "Impossible de charger l'historique des approbations. Réessayez.",
  'settings.approvalHistory.decidedAt': 'Décidé le {date}',
  'settings.approvalHistory.decision.approveOnce': 'Approuvé une fois',
  'settings.approvalHistory.decision.approveAlways': 'Toujours autorisé',
  'settings.approvalHistory.decision.deny': 'Denied',
  'settings.theme.variantLight': 'Clair',
  'settings.theme.variantDark': 'Sombre',
  'settings.theme.variantAuto': 'Automatique',
  'settings.theme.variantAria': 'Variante de thème',
  'settings.theme.backdropHeading': 'Arrière-plan',
  'settings.theme.backdrop.mesh': 'Maillage',
  'settings.theme.backdrop.solid': 'Uni',
  'settings.theme.backdrop.image': 'Image',
  'settings.theme.backdropImageUrl': "URL de l'image d'arrière-plan",
  'settings.theme.backdropDots': "Afficher les points d'arrière-plan",
  'settings.theme.backdropHint':
    'Le maillage affiche le dégradé animé ; Uni utilise un fond plat ; Image affiche le vôtre.',
  'settings.theme.autoForkHint':
    'Modifier un préréglage enregistre automatiquement vos changements comme un nouveau thème personnalisé.',
  'settings.theme.title': 'Studio de thèmes',
  'settings.theme.menuDesc':
    'Personnalisez entièrement les couleurs et les polices, ou choisissez un thème prédéfini.',
  'settings.theme.presetsHeading': 'Thèmes',
  'settings.theme.builtInBadge': 'Prédéfini',
  'settings.theme.customBadge': 'Personnalisé',
  'settings.theme.customizeHint':
    'Les thèmes prédéfinis sont en lecture seule. Dupliquez ce thème pour modifier ses couleurs et ses polices.',
  'settings.theme.duplicate': 'Dupliquer et personnaliser',
  'settings.theme.copyName': '{name} (personnalisé)',
  'settings.theme.importedName': 'Thème importé',
  'settings.theme.contrastWarn':
    "Contraste faible entre le texte et l'arrière-plan — ce thème peut être difficile à lire.",
  'settings.theme.group.surfaces': 'Surfaces',
  'settings.theme.group.text': 'Texte',
  'settings.theme.group.borders': 'Bordures',
  'settings.theme.group.accents': "Couleurs d'accentuation",
  'settings.theme.showShades': "Afficher toutes les nuances d'accentuation",
  'settings.theme.hideShades': "Masquer toutes les nuances d'accentuation",
  'settings.theme.fontsHeading': 'Polices',
  'settings.theme.fontRole.title': 'Titre',
  'settings.theme.fontRole.heading': 'En-tête',
  'settings.theme.fontRole.body': 'Corps de texte',
  'settings.theme.fontRole.mono': 'Largeur fixe',
  'settings.theme.fontRole.serif': 'Serif',
  'settings.theme.fontCurrent': 'Actuelle',
  'settings.theme.actions': 'Gérer le thème',
  'settings.theme.reset': 'Réinitialiser les remplacements',
  'settings.theme.delete': 'Supprimer le thème',
  'settings.theme.export': 'Copier le JSON',
  'settings.theme.copied': 'Copié !',
  'settings.theme.import': 'Importer un thème',
  'settings.theme.importHint':
    "Collez le JSON de thème exporté pour l'ajouter comme thème personnalisé.",
  'settings.theme.importApply': 'Importer',
  'settings.theme.importError': "Impossible d'analyser ce JSON de thème.",
  'settings.appearance.title': 'Apparence',
  'settings.appearance.themeHeading': 'Thème',
  'settings.appearance.themeAria': 'Thème',
  'settings.appearance.modeLight': 'Clair',
  'settings.appearance.modeLightDesc': 'Surfaces claires, texte sombre.',
  'settings.appearance.modeDark': 'Sombre',
  'settings.appearance.modeDarkDesc':
    'Surfaces sombres, plus agréables pour les yeux après le crépuscule.',
  'settings.appearance.modeSystem': 'Système de correspondance',
  'settings.appearance.modeSystemDesc':
    "Suivez les paramètres d'apparence de votre système d'exploitation.",
  'settings.appearance.helperText':
    "Le mode sombre fait basculer l'ensemble de l'application (chat, paramètres, panneaux) vers une palette sombre. \"Match system\" suit l'apparence de votre système d'exploitation et se met à jour en direct.",
  'settings.appearance.fontSizeHeading': 'Taille de police',
  'settings.appearance.fontSizeAria': 'Taille de police',
  'settings.appearance.fontSizeSmall': 'Petite',
  'settings.appearance.fontSizeSmallDesc': 'Texte compact — plus de contenu à l’écran.',
  'settings.appearance.fontSizeMedium': 'Moyenne',
  'settings.appearance.fontSizeMediumDesc': 'La taille par défaut, équilibrée.',
  'settings.appearance.fontSizeLarge': 'Grande',
  'settings.appearance.fontSizeLargeDesc': 'Texte plus grand pour une lecture plus facile.',
  'settings.appearance.fontSizeXLarge': 'Très grande',
  'settings.appearance.fontSizeXLargeDesc': 'Le texte le plus grand, pour une lisibilité maximale.',
  'settings.appearance.fontSizeHelperText':
    'Ajuste la taille du texte dans toute l’application — chat, paramètres et panneaux — indépendamment du réglage de police de votre système.',
  'settings.appearance.tabBarHeading': "Barre d'onglets inférieure",
  'settings.appearance.tabBarAlwaysShowLabels': 'Toujours afficher les étiquettes',
  'settings.appearance.tabBarAlwaysShowLabelsDesc':
    "Lorsqu'elle est désactivée, les étiquettes n'apparaissent qu'au survol ou pour l'onglet actif.",
  'settings.appearance.chatHeading': 'Chat',
  'settings.appearance.assistantTextMode': "Réponses de l'assistant en texte",
  'settings.appearance.hideAgentInsights': 'Masquer le raisonnement de l’agent',
  'settings.appearance.hideAgentInsightsDesc':
    'Réduit la chronologie en direct des étapes de l’agent dans le chat. Un lien clignotant « Traitement en cours » permet toujours d’ouvrir le déroulé complet.',
  'settings.appearance.assistantTextModeDesc':
    "Affiche les réponses de l'assistant en texte sans cadre tout en gardant vos messages en bulles.",
  'settings.mascot.active': 'Actif',
  'settings.mascot.characterDesc': 'Description du personnage',
  'settings.mascot.characterDraft': 'Brouillon',
  'settings.mascot.characterHeading': 'Titre du personnage',
  'settings.mascot.customGifError':
    'Entrez un HTTPS .gif URL, un bouclage HTTP .gif URL, un fichier:// .gif URL ou un chemin local .gif.',
  'settings.mascot.customGifHeading': 'Avatar GIF personnalisé',
  'settings.mascot.customGifLabel': 'Avatar GIF personnalisé URL',
  'settings.mascot.customGifPlaceholder': 'https://example.com/avatar.gif',
  'settings.mascot.characterPreview': 'Aperçu',
  'settings.mascot.characterStates': 'états',
  'settings.mascot.characterVisemes': 'visèmes',
  'settings.mascot.colorAria': 'OpenHuman couleur',
  'settings.mascot.colorDesc': 'Description de la couleur',
  'settings.mascot.colorHeading': 'Titre de la couleur',
  'settings.mascot.colorBlack': 'Noir',
  'settings.mascot.colorBurgundy': 'Bordeaux',
  'settings.mascot.colorCustom': 'Personnalisé',
  'settings.mascot.colorNavy': 'Marine',
  'settings.mascot.primaryColor': 'Couleur primaire',
  'settings.mascot.secondaryColor': 'Couleur secondaire',
  'settings.mascot.colorYellow': 'Jaune',
  'settings.mascot.libraryUnavailable': 'OpenHuman bibliothèque indisponible',
  'settings.mascot.title': 'OpenHuman',
  'settings.mascot.loadingLibrary': 'Chargement de la bibliothèque OpenHuman…',
  'settings.mascot.loadDetailError': 'Impossible de charger la mascotte.',
  'settings.mascot.loadLibraryError': 'Impossible de charger la bibliothèque de mascottes.',
  'settings.mascot.localDefault': 'OpenHuman local (par défaut)',
  'settings.mascot.menuTitle': 'Mascotte',
  'settings.mascot.menuDesc': "Choisis la couleur de la mascotte utilisée dans toute l'application",
  'settings.mascot.noCharacters': "Aucun personnage OpenHuman n'est encore disponible",
  'settings.mascot.noColorVariants': 'Aucune variante de couleur',
  'settings.mascot.voice.current': 'actuel',
  'settings.mascot.voice.customDesc':
    "Trouvez les identifiants vocaux sur api.elevenlabs.io/v1/voices ou dans votre tableau de bord ElevenLabs. Seul l'identifiant est stocké — votre clé API reste sur le backend.",
  'settings.mascot.voice.customHeading': 'Identifiant vocal personnalisé',
  'settings.mascot.voice.customOption': "Autre (coller l'identifiant vocal)…",
  'settings.mascot.voice.customPlaceholder': 'par ex. 21m00Tcm4TlvDq8ikWAM',
  'settings.mascot.voice.desc':
    "Choisissez la voix ElevenLabs utilisée par la mascotte pour les réponses parlées. Filtrez par genre, choisissez dans la liste sélectionnée, collez un identifiant personnalisé, ou laissez l'application choisir une voix qui correspond à la langue de l'interface.",
  'settings.mascot.voice.genderFemale': 'Féminin',
  'settings.mascot.voice.genderHeading': 'Genre de la voix',
  'settings.mascot.voice.genderMale': 'Masculin',
  'settings.mascot.voice.heading': 'Voix',
  'settings.mascot.voice.preset': 'Préréglage vocal',
  'settings.mascot.voice.presetHeading': 'Préréglage vocal',
  'settings.mascot.voice.preview': 'Aperçu de la voix',
  'settings.mascot.voice.previewError': "Échec de l'aperçu de la voix",
  'settings.mascot.voice.previewText': 'Salut, je suis votre assistant. Ceci est un aperçu vocal.',
  'settings.mascot.voice.previewing': 'Aperçu en cours…',
  'settings.mascot.voice.reset': 'Réinitialiser à la valeur par défaut',
  'settings.mascot.voice.useLocaleDefault': "Faire correspondre à la langue de l'application",
  'settings.mascot.voice.useLocaleDefaultDesc':
    "Choisir automatiquement une voix pour la langue de l'interface actuelle.",
  'settings.persona.title': 'Persona',
  'settings.persona.menuTitle': 'Persona',
  'settings.persona.menuDesc':
    'Nom, personnalité, avatar et voix — votre assistant comme une seule identité',
  'settings.persona.identityHeading': 'Identité',
  'settings.persona.identityDesc':
    "Un nom d'affichage et une courte description pour votre assistant. Affiché dans l'application; ne change pas la façon dont l'assistant raisonne.",
  'settings.persona.displayNameLabel': 'Nom affiché',
  'settings.persona.displayNamePlaceholder': 'par exemple Nova',
  'settings.persona.descriptionLabel': 'Description',
  'settings.persona.descriptionPlaceholder':
    'par exemple. Un assistant calme et concis pour mon équipe.',
  'settings.persona.soul.heading': 'Personnalité (ÂME.md)',
  'settings.persona.soul.desc':
    "La personnalité que l'assistant suit dans chaque conversation. Les modifications sont enregistrées dans votre espace de travail et prennent effet lors de la réponse suivante.",
  'settings.persona.soul.editorLabel': 'Contenu de SOUL.md',
  'settings.persona.soul.reset': 'Réinitialiser par défaut',
  'settings.persona.soul.usingDefault': 'Utiliser le défaut inclus',
  'settings.persona.soul.loadError': 'Impossible de charger SOUL.md',
  'settings.persona.soul.saveError': "Impossible d'enregistrer SOUL.md",
  'settings.persona.soul.resetError': 'Impossible de réinitialiser SOUL.md',
  'settings.persona.appearanceHeading': 'Avatar et Voix',
  'settings.persona.appearanceDesc':
    "La couleur de la mascotte, l'avatar personnalisé GIF et la voix de réponse sont configurés dans les paramètres de la mascotte.",
  'settings.persona.openMascotSettings': 'Ouvrir les paramètres de Mascot',
  'settings.memoryWindow.balanced.badge': 'Recommandé',
  'settings.memoryWindow.balanced.hint':
    'Valeur par défaut raisonnable — bonne continuité sans consommer de jetons supplémentaires à chaque exécution.',
  'settings.memoryWindow.balanced.label': 'Équilibré',
  'settings.memoryWindow.description':
    "Quelle quantité de contexte mémorisé OpenHuman injecte dans chaque nouvelle exécution d'agent. Des fenêtres plus larges semblent plus conscientes des conversations passées mais consomment plus de jetons — et coûtent plus cher — à chaque exécution.",
  'settings.memoryWindow.extended.badge': 'Plus de contexte',
  'settings.memoryWindow.extended.hint':
    'Plus de mémoire à long terme injectée à chaque exécution. Coût en jetons plus élevé par tour.',
  'settings.memoryWindow.extended.label': 'Étendu',
  'settings.memoryWindow.maximum.badge': 'Coût maximum',
  'settings.memoryWindow.maximum.hint':
    'La plus grande fenêtre sûre. Meilleure continuité, facture de jetons nettement plus élevée à chaque exécution.',
  'settings.memoryWindow.maximum.label': 'Maximum',
  'settings.memoryWindow.minimal.badge': 'Le moins cher',
  'settings.memoryWindow.minimal.hint':
    'Plus petite fenêtre de mémoire. Le moins cher, le plus rapide, le moins de continuité entre les exécutions.',
  'settings.memoryWindow.minimal.label': 'minimal',
  'settings.memoryWindow.title': 'Fenêtre de mémoire à long terme',
  'settings.agentbox.title': 'AgentBox',
  'settings.agentbox.desc':
    "État de l'adaptateur de la place de marché GMI Cloud et configuration du fournisseur",
  'settings.agentbox.intro':
    "État en lecture seule de l'adaptateur de la place de marché AgentBox. Le mode et le fournisseur GMI MaaS sont définis par des variables d'environnement au démarrage du noyau.",
  'settings.agentbox.modeLabel': 'Mode place de marché',
  'settings.agentbox.providerHeading': 'Fournisseur GMI MaaS',
  'settings.agentbox.slug': 'Identifiant du fournisseur',
  'settings.agentbox.baseUrl': 'URL de base',
  'settings.agentbox.model': 'Modèle',
  'settings.agentbox.notConfigured':
    "Non configuré. Définissez les variables d'environnement GMI_MAAS_BASE_URL, GMI_MAAS_API_KEY et GMI_MODELS.",
  'settings.agentbox.unavailable': "État d'AgentBox indisponible",
  'settings.modelHealth.title': 'Santé Modèle',
  'settings.modelHealth.desc':
    "Qualité par modèle, taux d'hallucination et comparaison des coûts entre les modèles actifs",
  'settings.modelHealth.allStatuses': 'Tous les statuts',
  'settings.modelHealth.models': 'modèles',
  'settings.modelHealth.loading': 'Chargement des données du modèle...',
  'settings.modelHealth.empty': 'Aucun modèle enregistré',
  'settings.modelHealth.col.model': 'Modèle',
  'settings.modelHealth.col.quality': 'Qualité',
  'settings.modelHealth.col.halluc': "Taux d'halluc.",
  'settings.modelHealth.col.cost': 'Coût / 1M sorti',
  'settings.modelHealth.col.agents': 'Agents',
  'settings.modelHealth.col.status': 'Statut',
  'settings.modelHealth.badge.keep': 'Garder',
  'settings.modelHealth.badge.replace': 'Remplacer',
  'settings.modelHealth.badge.staging': 'Test de mise en scène',
  'settings.modelHealth.badge.vision': 'Vision seulement',
  'settings.modelHealth.swap': 'Échanger?',
  'settings.modelHealth.modal.title': 'Remplacer le modèle?',
  'settings.modelHealth.modal.hallucRate': "Taux d'hallucination",
  'settings.modelHealth.modal.cancel': 'Annuler',
  'settings.modelHealth.modal.apply': 'Appliquer le remplacement',
  'settings.modelHealth.tag.cheaper': 'CHEAPER',
  'settings.modelHealth.tag.better': 'BETTER',
  'settings.desktopAgent.title': 'Agent de bureau',
  'settings.desktopAgent.description':
    'Vérifiez et accordez les autorisations dont l’agent de bureau a besoin.',
  'settings.desktopAgent.microphone': 'Microphone',
  'settings.desktopAgent.grant': 'Accorder',
  'settings.desktopAgent.notRequiredOnOs': 'Non requis sur ce système d’exploitation',
  'settings.desktopAgent.allGranted':
    'Tout est prêt : l’agent de bureau dispose de toutes les autorisations nécessaires.',
  'settings.desktopAgent.recheck': 'Revérifier',
  'settings.desktopAgent.restartAndRecheck': 'Redémarrer le cœur et revérifier',
  'settings.desktopAgent.seamless.title': 'Actions de l’agent',
  'settings.desktopAgent.seamless.label': 'Laisser l’agent agir sans demander',
  'settings.desktopAgent.seamless.description':
    'Accordez l’accès complet et approuvez automatiquement les actions de bureau (ouvrir des applications, contrôler leurs interfaces) afin que l’agent les exécute sans demande de confirmation.',
  'settings.desktopAgent.seamless.note':
    'Seules les actions de bureau évitent la demande — exécuter des commandes shell, modifier des fichiers, les requêtes réseau et l’installation de logiciels demandent toujours. Désactiver ceci arrête l’approbation automatique des actions de bureau mais laisse le niveau d’accès inchangé.',
  'settings.desktopAgent.beta':
    'Bêta — l’agent de bureau est expérimental et peut ne pas toujours fonctionner comme prévu.',
  'settings.desktopAgent.wakeWordHint':
    'Dites « Hey Tiny » avant votre commande pour réveiller l’agent.',
  'settings.screenIntel.permissions.accessibility': 'Accessibilité',
  'settings.screenIntel.permissions.grantHint': "Indice d'autorisation",
  'settings.screenIntel.permissions.inputMonitoring': 'Surveillance des entrées',
  'settings.screenIntel.permissions.macosAppliesPrivacy': 'macOS applique la confidentialité',
  'settings.screenIntel.permissions.openInputMonitoring': 'Demande en cours…',
  'settings.screenIntel.permissions.refreshStatus': 'Actualisation…',
  'settings.screenIntel.permissions.refreshing': 'Actualisation…',
  'settings.screenIntel.permissions.requestAccessibility': 'Demande en cours…',
  'settings.screenIntel.permissions.requestScreenRecording': 'Demande en cours…',
  'settings.screenIntel.permissions.requesting': 'Demande en cours…',
  'settings.screenIntel.permissions.restartRefresh': 'Redémarrage du core…',
  'settings.screenIntel.permissions.restartingCore': 'Redémarrage du core…',
  'settings.screenIntel.permissions.screenRecording': "Enregistrement d'écran",
  'settings.screenIntel.permissions.title': 'Autorisations',
  'skills.card.moreActions': "Plus d'actions",
  'skills.channelIcon.discord': 'Discord',
  'skills.channelIcon.imessage': 'iMessage',
  'skills.channelIcon.telegram': 'Telegram',
  'skills.channelIcon.web': 'Web',
  'skills.channelIcon.yuanbao': 'Yuanbao',
  'skills.composio.poweredBy': 'Propulsé par Composio',
  'skills.composio.staleStatusTitle': 'Les connexions affichent un état obsolète',
  'skills.create.allowedTools': 'Outils autorisés',
  'skills.create.allowedToolsHelp': 'Rendu dans le frontmatter SKILL.md comme',
  'skills.create.allowedToolsPlaceholder': 'node_exec, récupérer',
  'skills.create.author': 'Auteur',
  'skills.create.authorPlaceholder': 'Ton nom',
  'skills.create.commaSeparated': '(séparés par des virgules)',
  'skills.create.createBtn': 'Créer la compétence',
  'skills.create.createError': 'Impossible de créer la compétence',
  'skills.create.creating': 'Création…',
  'skills.create.description': 'Description',
  'skills.create.descriptionPlaceholder': 'Que fait cette compétence ?',
  'skills.create.optional': '(facultatif)',
  'skills.create.inputs.heading': 'Inputs',
  'skills.create.inputs.help':
    "Déclarez les paramètres dont la compétence a besoin. Le lanceur de compétences affichera un formulaire pour ceux-ci à l'exécution.",
  'skills.create.inputs.add': 'Ajouter une entrée',
  'skills.create.inputs.row.name': "Nom de l'entrée",
  'skills.create.inputs.row.namePlaceholder': 'ex. repo',
  'skills.create.inputs.row.nameError':
    'Lettres, chiffres, tirets bas et tirets uniquement ; doit commencer par une lettre.',
  'skills.create.inputs.row.description': "Description de l'entrée",
  'skills.create.inputs.row.descriptionPlaceholder': 'Que contient ce champ ?',
  'skills.create.inputs.row.type': 'Type',
  'skills.create.inputs.row.required': 'Required',
  'skills.create.inputs.row.remove': "Supprimer l'entrée",
  'skills.create.inputs.type.string': 'Text',
  'skills.create.inputs.type.integer': 'Number',
  'skills.create.inputs.type.boolean': 'Oui / Non',
  'skills.create.license': 'Licence',
  'skills.create.licensePlaceholder': 'MIT',
  'skills.create.name': 'Nom',
  'skills.create.namePlaceholder': 'ex. Journal de trading',
  'skills.create.scope': 'Portée',
  'skills.create.scopeProjectHint': '/.openhuman/skills/',
  'skills.create.scopeUserHint':
    'Écrit dans ~/.openhuman/skills/<slug>/SKILL.md — disponible dans tous les espaces de travail.',
  'skills.create.slugLabel': 'Libellé du slug',
  'skills.create.subtitle': 'SKILL.md',
  'skills.create.tags': 'Étiquettes',
  'skills.create.tagsPlaceholder': 'trading, recherche',
  'skills.create.title': 'Nouvelle compétence',
  'skills.detail.allowedTools': 'Outils autorisés',
  'skills.detail.author': 'Auteur',
  'skills.detail.license': 'Licence',
  'skills.detail.bundledResources': 'Ressources groupées',
  'skills.detail.description': 'Description',
  'skills.detail.closeAriaLabel': 'Fermer les détails de la compétence',
  'skills.detail.location': 'Emplacement',
  'skills.detail.noBundledResources': 'Aucune ressource groupée.',
  'skills.detail.platforms': 'Plateformes',
  'skills.detail.relatedSkills': 'Skills associées',
  'skills.detail.source': 'URL source',
  'skills.detail.sourceFormat': 'Format',
  'skills.detail.stars': 'Étoiles',
  'skills.detail.tags': 'Étiquettes',
  'skills.detail.warnings': 'Avertissements',
  'skills.detail.version': 'Version',
  'skills.install.errors.alreadyInstalledHint':
    "Une compétence avec ce slug existe déjà dans l'espace de travail. Supprimez-le d'abord ou modifiez le frontmatter `metadata.id` / `name`.",
  'skills.install.errors.alreadyInstalledTitle': 'Compétence déjà installée',
  'skills.install.errors.fetchFailedHint':
    "La demande n'a pas abouti. Vérifiez les points URL sur un fichier public accessible et que l'hôte a renvoyé une réponse 2xx.",
  'skills.install.errors.fetchFailedTitle': 'Échec de la récupération',
  'skills.install.errors.fetchTimedOutHint':
    "L'hôte distant n'a pas répondu à temps. Réessayez ou augmentez le délai d'attente (1 à 600 s).",
  'skills.install.errors.fetchTimedOutTitle': 'Le délai de récupération a expiré.',
  'skills.install.errors.fetchTooLargeHint':
    'Le fichier SKILL.md doit être inférieur à 1 Mo. Divisez les ressources groupées en fichiers « références/ » ou « scripts/ » au lieu de les intégrer.',
  'skills.install.errors.fetchTooLargeTitle': 'SKILL.md trop volumineux',
  'skills.install.errors.genericHint':
    'Le backend a renvoyé une erreur. Le message brut est présenté ci-dessous.',
  'skills.install.errors.genericTitle': "Impossible d'installer la compétence",
  'skills.install.errors.invalidSkillHint':
    'Le frontmatter doit être un YAML valide avec des champs `name` et `description` non vides, terminés par `---`.',
  'skills.install.errors.invalidSkillTitle': "SKILL.md n'a pas analysé",
  'skills.install.errors.invalidUrlHint':
    'Seuls les HTTPS URL publics sont autorisés. Les hôtes privés, de bouclage et de métadonnées sont bloqués.',
  'skills.install.errors.invalidUrlTitle': 'URL rejeté',
  'skills.install.errors.unsupportedUrlHint':
    "Seuls les liens directs `.md` fonctionnent. Pour GitHub, créez un lien vers un fichier (github.com/owner/repo/blob/.../SKILL.md) - les racines de l'arborescence et du dépôt ne sont pas installées.",
  'skills.install.errors.unsupportedUrlTitle': 'Formulaire URL non pris en charge.',
  'skills.install.errors.writeFailedHint':
    "Le répertoire des compétences de l'espace de travail n'était pas accessible en écriture. Vérifiez les autorisations du système de fichiers pour `<workspace>/.openhuman/skills/`.",
  'skills.install.errors.writeFailedTitle': "Impossible d'écrire SKILL.md",
  'skills.install.fetchLog': 'Récupérer le journal',
  'skills.install.fetchingPrefix': 'Récupération',
  'skills.install.fetchingSuffix':
    "cela peut prendre jusqu'au délai d'attente que vous avez configuré.",
  'skills.install.installBtn': 'Installation…',
  'skills.install.installComplete': 'Installation terminée',
  'skills.install.installing': 'Installation…',
  'skills.install.parseWarnings': "Avertissements d'analyse",
  'skills.install.rawError': 'Erreur brute',
  'skills.install.subtitleMiddle': "sur HTTPS et l'installe sous",
  'skills.install.subtitlePrefix': 'Récupère un seul',
  'skills.install.subtitleSuffix':
    'HTTPS uniquement ; les hôtes privés et de bouclage sont bloqués.',
  'skills.install.successDiscovered': 'Vous avez découvert {count} nouvelle(s) compétence(s).',
  'skills.install.successNoNewIds':
    "Compétence installée, mais aucun nouvel identifiant de compétence n'est apparu - le catalogue contient peut-être déjà une compétence avec le même slug.",
  'skills.install.timeoutHint': '(secondes, optionnel)',
  'skills.install.timeoutHelp':
    'La valeur par défaut est 60 secondes. Les valeurs en dehors de 1-600 sont limitées côté serveur.',
  'skills.install.timeoutInvalid': 'Doit être un entier compris entre 1 et 600.',
  'skills.install.timeoutLabel': "Libellé du délai d'attente",
  'skills.install.timeoutPlaceholder': '60',
  'skills.install.title': 'Installer une compétence depuis une URL',
  'skills.install.urlHelpMiddle': 'déposer.',
  'skills.install.urlHelpPrefix': 'Lien direct vers une réécriture automatique de',
  'skills.install.urlHelpSuffix': 'URLs vers',
  'skills.install.urlInvalidPrefix': 'URL doit être un lien',
  'skills.install.urlInvalidSuffix': 'bien formé. Le support de',
  'skills.install.urlLabel': 'URL de la compétence',
  'skills.install.urlPlaceholder': 'https://raw.githubusercontent.com/owner/repo/main/SKILL.md',
  'skills.meetingBots.bannerDesc': 'Description de la bannière',
  'skills.meetingBots.bannerTitle': 'Titre de la bannière',
  'skills.meetingBots.busyTitle': 'OpenHuman est occupé',
  'skills.meetingBots.comingSoon': 'Bientôt disponible',
  'skills.meetingBots.couldNotLeaveTitle': 'Impossible de quitter la réunion',
  'skills.meetingBots.couldNotStartTitle': 'Impossible de démarrer OpenHuman',
  'skills.meetingBots.displayName': "Nom d'affichage",
  'skills.meetingBots.failedToStart': "Échec du démarrage d'OpenHuman.",
  'skills.meetingBots.joiningMessage':
    'Il devrait apparaître comme participant dans quelques secondes.',
  'skills.meetingBots.joiningTitle': 'OpenHuman rejoint la réunion',
  'skills.meetingBots.meetingLink': 'Lien de réunion',
  'skills.meetingBots.modalAriaLabel': 'Envoyer OpenHuman à une réunion',
  'skills.meetingBots.modalDesc': 'Description de la modal',
  'skills.meetingBots.modalTitle': 'Envoyer OpenHuman à une réunion',
  'skills.meetingBots.newBadge': 'Nouveau badge',
  'skills.meetingBots.platformComingSoon': '{label} sera bientôt disponible.',
  'skills.meetingBots.platformHints.gmeet': 'meet.google.com/abc-defg-hij',
  'skills.meetingBots.platformHints.teams': 'teams.microsoft.com/...',
  'skills.meetingBots.platformHints.webex': 'webex.com/meet/...',
  'skills.meetingBots.platformHints.zoom': 'zoom.us/j/...',
  'skills.meetingBots.platforms.gmeet': 'Google Meet',
  'skills.meetingBots.platforms.teams': 'Microsoft Teams',
  'skills.meetingBots.platforms.webex': 'Webex',
  'skills.meetingBots.platforms.zoom': 'Zoom',
  'skills.meetingBots.sendTo': 'Envoyer à',
  'skills.meetingBots.serverOverloaded':
    'OpenHuman est actuellement très sollicité. Veuillez réessayer dans quelques minutes.',
  'skills.meetingBots.soonSuffix': 'bientôt',
  'skills.meetingBots.starting': 'Démarrage…',
  'skills.meetingBots.recentCallsAriaLabel': 'Appels de réunion récents',
  'skills.meetingBots.recentCallsHeading': 'Appels récents',
  'skills.meetingBots.recentCallsEmpty':
    'Pas encore d\u2019appels précédents — votre historique de réunions apparaîtra ici.',
  'skills.meetingBots.recentCallsLoading': 'Chargement\u2026',
  'skills.meetingBots.recentCallAddedBy': 'Ajouté par {name}',
  'skills.meetingBots.recentCallParticipants': 'Avec {names}',
  'skills.meetingBots.recentCallTurnSingular': '{count} tour',
  'skills.meetingBots.recentCallTurnPlural': '{count} tours',
  'skills.meetingBots.recentCallDuration': '{seconds}s en appel',
  'skills.meetingBots.callDetailLoading': 'Chargement de la transcription…',
  'skills.meetingBots.callDetailError': 'Impossible de charger la transcription.',
  'skills.meetingBots.callDetailRetry': 'Réessayer',
  'skills.meetingBots.callDetailEmpty':
    'Aucune transcription ni aucun résumé n’a été enregistré pour cet appel.',
  'skills.meetingBots.callSummaryHeading': 'Résumé',
  'skills.meetingBots.callKeyPointsHeading': 'Points clés',
  'skills.meetingBots.callActionItemsHeading': 'Actions à mener',
  'skills.meetingBots.callTranscriptHeading': 'Transcription',
  'skills.meetingBots.liveBadge': 'En direct',
  'skills.meetingBots.liveTitle': 'En réunion',
  'skills.meetingBots.liveStatusJoining': 'Connexion\u2026',
  'skills.meetingBots.liveStatusActive': 'En direct dans la réunion',
  'skills.meetingBots.liveStatusListening': 'Écoute (muet)',
  'skills.meetingBots.liveStatusEnded': 'Réunion terminée',
  'skills.meetingBots.liveStatusError': 'Échec de connexion',
  'skills.meetingBots.liveTranscriptHeading': 'Transcription en direct',
  'skills.meetingBots.liveTranscriptEmpty': 'En attente de parole…',
  'skills.meetingBots.leaveButton': 'Quitter',
  'skills.meetingBots.leavingButton': 'Sortie en cours…',
  'skills.meetingBots.respondToParticipant': 'Votre nom dans cette réunion',
  'skills.meetingBots.respondToParticipantHint': 'ex. Alice (votre nom affiché dans l\u2019appel)',
  'skills.meetingBots.respondToParticipantDesc':
    'Saisissez votre nom d\u2019affichage exact dans la réunion. Le bot ne répond que lorsque vous prononcez son nom (phrase de réveil).',
  'skills.meetingBots.wakePhrase': 'Phrase de réveil',
  'skills.meetingBots.wakePhraseHint': 'Hey OpenHuman',
  'skills.meetingBots.wakePhraseDesc': 'Le participant doit dire ceci avant que le bot réponde.',
  'skills.meetingBots.activeMode': 'Répondre quand je m’adresse à lui',
  'skills.meetingBots.activeModeDesc':
    'Activé, le bot répond à voix haute après que vous prononcez sa phrase d’activation. Désactivé, il se contente d’écouter et de transcrire.',
  'skills.meetingBots.history.allPlatforms': 'Toutes les plateformes',
  'skills.meetingBots.history.copyTranscript': 'Copier',
  'skills.meetingBots.history.downloadTranscript': 'Télécharger',
  'skills.meetingBots.history.earlier': 'Plus tôt',
  'skills.meetingBots.history.participantCount': '{count} participant',
  'skills.meetingBots.history.participantCountPlural': '{count} participants',
  'skills.meetingBots.history.runWithOpenHuman': 'Exécuter avec OpenHuman',
  'skills.meetingBots.history.searchPlaceholder': 'Rechercher des appels…',
  'skills.meetingBots.history.selectPrompt':
    'Sélectionnez un appel pour voir son résumé et sa transcription.',
  'skills.meetingBots.history.today': "Aujourd'hui",
  'skills.meetingBots.history.yesterday': 'Hier',
  'skills.meetingBots.upcoming.heading': 'À venir',
  'skills.meetingBots.upcoming.when': 'Quand',
  'skills.meetingBots.upcoming.meeting': 'Réunion',
  'skills.meetingBots.upcoming.platform': 'Plateforme',
  'skills.meetingBots.upcoming.people': 'Personnes',
  'skills.meetingBots.upcoming.joinPolicy': 'Politique de participation',
  'skills.meetingBots.upcoming.joinNow': 'Rejoindre maintenant',
  'skills.meetingBots.upcoming.joinNowAriaLabel': 'Rejoindre {title}',
  'skills.meetingBots.upcoming.join': 'Rejoindre',
  'skills.meetingBots.upcoming.auto': 'Auto',
  'skills.meetingBots.upcoming.ask': 'Demander',
  'skills.meetingBots.upcoming.skip': 'Ignorer',
  'skills.meetingBots.upcoming.today': "Aujourd'hui",
  'skills.meetingBots.upcoming.tomorrow': 'Demain',
  'skills.meetingBots.upcoming.empty':
    'Aucune réunion à venir — connectez Google Calendar pour les voir ici.',
  'skills.meetingBots.upcoming.error': 'Impossible de charger les réunions à venir.',
  'skills.meetingBots.upcoming.retry': 'Réessayer',
  'skills.meetingBots.upcoming.refresh': 'Actualiser',
  'skills.meetingBots.upcoming.filterAll': 'Toutes les plateformes',
  'skills.meetingBots.upcoming.participants': '{count} participants',
  'skills.meetingBots.upcoming.imminent': 'Commence bientôt',
  'skills.meetingBots.upcoming.autoJoinsAt': 'Rejoint automatiquement ~à {time}',
  'skills.meetingBots.upcoming.asksAtStart': 'Demande au début',
  'skills.meetingBots.upcoming.watchCalendarHint':
    "Activez 'Surveiller mon agenda' dans les Paramètres (icône engrenage) pour que Auto/Demander prenne effet — sinon ces politiques sont enregistrées mais ne se déclencheront pas.",
  'skills.meetingBots.relative.now': 'maintenant',
  'skills.meetingBots.relative.inMinutes': 'dans {count}m',
  'skills.meetingBots.relative.inHours': 'dans {count}h',
  'skills.meetingBots.relative.minutesAgo': 'il y a {count}m',
  'skills.meetingBots.relative.hoursAgo': 'il y a {count}h',
  'skills.meetingBots.relative.daysAgo': 'il y a {count}j',
  'skills.meetingBots.relative.yesterday': 'hier',
  'skills.meetingBots.defaults.drawerTitle': 'Paramètres de réunion',
  'skills.meetingBots.defaults.closeDrawer': 'Fermer',
  'skills.meetingBots.defaults.openDefaults': 'Paramètres de réunion',
  'skills.meetingBots.defaults.watchCalendar': 'Surveiller mon agenda',
  'skills.meetingBots.defaults.watchCalendarDesc':
    "Laissez OpenHuman surveiller votre agenda connecté pour qu'il puisse rejoindre automatiquement ou vous inviter à des réunions selon les politiques ci-dessous. Cela est indépendant des notifications de rappel de réunion.",
  'skills.meetingBots.defaults.globalPolicy': "Politique d'adhésion automatique globale",
  'skills.meetingBots.defaults.perPlatformTitle': 'Paramètres par plateforme',
  'skills.meetingBots.defaults.perPlatformDesc':
    'Remplacer la politique globale pour des plateformes spécifiques.',
  'skills.meetingBots.defaults.useDefault': 'Utiliser par défaut',
  'skills.resource.preview.closeAriaLabel': "Fermer l'aperçu",
  'skills.resource.preview.failed': "Échec de l'aperçu",
  'skills.resource.preview.loading': "Chargement de l'aperçu…",
  'skills.resource.tree.assets': 'Ressources',
  'skills.resource.tree.examples': 'Exemples',
  'skills.resource.tree.other': 'Autres',
  'skills.resource.tree.prompts': 'Prompts',
  'skills.resource.tree.references': 'Références',
  'skills.resource.tree.scripts': 'Scripts',
  'skills.resource.tree.templates': 'Modèles',
  'skills.resource.tree.empty': 'Aucune ressource groupée.',
  'skills.search.placeholder': 'Espace réservé',
  'skills.setup.autocomplete.acceptKey': "Touche d'acceptation",
  'skills.setup.autocomplete.activeDesc': 'Description active',
  'skills.setup.autocomplete.activeTitle': "L'autocomplétion est active",
  'skills.setup.autocomplete.customizeSettings': 'Personnaliser les paramètres',
  'skills.setup.autocomplete.debounce': 'Anti-rebond',
  'skills.setup.autocomplete.description': 'Description',
  'skills.setup.autocomplete.enableBtn': 'Activation…',
  'skills.setup.autocomplete.enableError': "Échec de l'activation de l'autocomplétion",
  'skills.setup.autocomplete.enabling': 'Activation…',
  'skills.setup.autocomplete.notSupported': 'Non pris en charge',
  'skills.setup.autocomplete.stepEnable': 'Activer les complétions en ligne',
  'skills.setup.autocomplete.stepSuccess': "Prêt à l'emploi",
  'skills.setup.autocomplete.stylePreset': 'Préréglage de style',
  'skills.setup.autocomplete.stylePresetValue': 'Équilibré (configurable plus tard)',
  'skills.setup.autocomplete.title': 'Autocomplétion de texte',
  'skills.setup.screenIntel.activeDesc': 'Description active',
  'skills.setup.screenIntel.activeTitle': "L'intelligence d'écran est activée",
  'skills.setup.screenIntel.advancedSettings': 'Paramètres avancés',
  'skills.setup.screenIntel.allGranted': 'Toutes les permissions accordées',
  'skills.setup.screenIntel.captureMode': 'Mode de capture',
  'skills.setup.screenIntel.captureModeValue': 'Toutes les fenêtres (configurable plus tard)',
  'skills.setup.screenIntel.deniedHint':
    'Après avoir accordé les permissions dans les Paramètres système, clique ci-dessous pour redémarrer et prendre en compte les modifications.',
  'skills.setup.screenIntel.enableBtn': 'Activation…',
  'skills.setup.screenIntel.enableDesc':
    's sur ton écran et injecte du contexte utile dans ton agent',
  'skills.setup.screenIntel.enableError': "Échec de l'activation de l'intelligence d'écran",
  'skills.setup.screenIntel.enabling': 'Activation…',
  'skills.setup.screenIntel.grant': 'Ouverture…',
  'skills.setup.screenIntel.granted': 'Accordé',
  'skills.setup.screenIntel.macosOnly': 'macOS uniquement',
  'skills.setup.screenIntel.opening': 'Ouverture…',
  'skills.setup.screenIntel.panicHotkey': 'Raccourci de panique',
  'skills.setup.screenIntel.permAccessibility': 'Accessibilité',
  'skills.setup.screenIntel.permInputMonitoring': 'Surveillance des entrées',
  'skills.setup.screenIntel.permScreenRecording': "Enregistrement d'écran",
  'skills.setup.screenIntel.permissionsDesc': 'Description des permissions',
  'skills.setup.screenIntel.permissionPathLabel': 'macOS applique la confidentialité à :',
  'skills.setup.screenIntel.refreshStatus': 'Actualiser le statut',
  'skills.setup.screenIntel.restartRefresh': 'Redémarrage…',
  'skills.setup.screenIntel.restarting': 'Redémarrage…',
  'skills.setup.screenIntel.stepEnable': 'Activer la compétence',
  'skills.setup.screenIntel.stepPermissions': 'Accorder les permissions',
  'skills.setup.screenIntel.stepSuccess': "Prêt à l'emploi",
  'skills.setup.screenIntel.title': "Intelligence d'écran",
  'skills.setup.screenIntel.visionModel': 'Modèle de vision',
  'skills.setup.voice.activation': 'Activation',
  'skills.setup.voice.activeDescPrefix': 'Fn',
  'skills.setup.voice.activeDescSuffix': 'Fn',
  'skills.setup.voice.activeTitle': "L'intelligence vocale est active",
  'skills.setup.voice.customizeSettings': 'Personnaliser les paramètres',
  'skills.setup.voice.downloadSttBtn': 'Télécharger le modèle STT',
  'skills.setup.voice.enableDesc': "Description d'activation",
  'skills.setup.voice.hotkey': 'Raccourci',
  'skills.setup.voice.startBtn': 'Démarrage…',
  'skills.setup.voice.startError': 'Échec du démarrage du serveur vocal',
  'skills.setup.voice.starting': 'Démarrage…',
  'skills.setup.voice.stepEnable': 'Démarrer le serveur vocal',
  'skills.setup.voice.stepSetup': 'Téléchargement du modèle requis',
  'skills.setup.voice.stepSuccess': "Prêt à l'emploi",
  'skills.setup.voice.sttNotReady': 'Modèle speech-to-text non prêt',
  'skills.setup.voice.sttNotReadyDesc':
    "L'intelligence vocale nécessite un modèle Whisper local pour la transcription. Télécharge-le depuis les paramètres du modèle local.",
  'skills.setup.voice.sttReady': 'Modèle speech-to-text prêt',
  'skills.setup.voice.sttReturnHint': 'Indice de retour STT',
  'skills.setup.voice.title': 'Intelligence vocale',
  'skills.uninstall.couldNotUninstall': 'Impossible de désinstaller',
  'skills.uninstall.description':
    "Cela supprime définitivement le répertoire de la compétence et toutes ses ressources fournies. L'agent cessera de la voir au prochain tour.",
  'skills.uninstall.title': 'Désinstaller',
  'skills.uninstall.uninstallBtn': 'Désinstaller',
  'skills.uninstall.uninstalling': 'Désinstallation…',
  'upsell.global.limitMessage': 'Mets à niveau ton plan ou recharge des crédits pour continuer',
  'upsell.global.limitTitle': 'Toi',
  'upsell.global.nearLimitMessage':
    "Tu as utilisé {pct}% de ta limite d'utilisation. Mets à niveau pour des limites plus élevées.",
  'upsell.global.nearLimitTitle': "Limite d'utilisation proche",
  'upsell.usageLimit.bodyBudget':
    'Vous avez atteint votre limite hebdomadaire.{reset} Améliorez votre forfait ou rechargez des crédits pour éviter les limites.',
  'upsell.usageLimit.bodyRate':
    "Vous avez atteint votre limite de taux d'inférence sur 10 heures.{reset} Améliorez pour des limites plus élevées.",
  'upsell.usageLimit.heading': "Limite d'utilisation atteinte",
  'upsell.usageLimit.notNow': 'Pas maintenant',
  'upsell.usageLimit.perWindow': '{amount}',
  'upsell.usageLimit.planIncludes': '{plan}',
  'upsell.usageLimit.resetsIn': 'Réinitialisation {time}.',
  'upsell.usageLimit.upgradePlan': 'Mettre à niveau le plan',
  'upsell.usageLimit.weeklyInference': '{amount}',
  'walkthrough.steps.startChat.title': 'Commencez dans le chat',
  'walkthrough.steps.startChat.content':
    'Le chat est votre point de départ. Les nouvelles fenêtres s’ouvrent avec le même accueil et les actions rapides vues pendant la configuration.',
  'walkthrough.steps.sayHello.title': 'Dites bonjour',
  'walkthrough.steps.sayHello.content':
    'Appuyez ici pour lancer une conversation avec votre assistant IA à tout moment.',
  'walkthrough.steps.meetAi.title': 'Rencontrez votre IA',
  'walkthrough.steps.meetAi.content':
    'C’est ici que les conversations ont lieu. Posez des questions, demandez des résumés ou explorez des idées. Tout reste consultable.',
  'walkthrough.steps.connectWorld.title': 'Connectez votre monde',
  'walkthrough.steps.connectWorld.content':
    'Gmail, Slack, WhatsApp et plus encore : chaque connexion donne de nouveaux pouvoirs à votre assistant.',
  'walkthrough.steps.messagingApps.title': 'Discutez là où vous êtes déjà',
  'walkthrough.steps.messagingApps.content':
    'WhatsApp, Telegram, Slack, Discord : connectez vos messageries pour que votre assistant puisse vous joindre partout.',
  'walkthrough.steps.settings.title': 'Personnalisez-le',
  'walkthrough.steps.settings.content':
    'Préférences, confidentialité et notifications sont ici. Vous pouvez relancer cette visite depuis cette page à tout moment.',
  'walkthrough.steps.chatTab.title': 'Retour au chat',
  'walkthrough.steps.chatTab.content':
    'Utilisez l’onglet Chat dès que vous voulez revenir à vos conversations.',
  'walkthrough.steps.humanTab.title': 'Votre profil humain',
  'walkthrough.steps.humanTab.content':
    'Human réunit votre contexte personnel, votre identité et le profil visible par l’assistant.',
  'walkthrough.steps.brainTab.title': 'Ouvrez votre Brain',
  'walkthrough.steps.brainTab.content':
    'Brain est le graphe de mémoire : l’endroit où vérifier ce qu’OpenHuman sait et comment les idées se relient.',
  'walkthrough.steps.agentWorldTab.title': 'Explorez Agent World',
  'walkthrough.steps.agentWorldTab.content':
    'Agent World regroupe les agents réutilisables et les automatisations partagées.',
  'walkthrough.steps.connectionsTab.title': 'Gérer les connexions',
  'walkthrough.steps.connectionsTab.content':
    'Connections reste disponible dans la navigation principale pour ajouter ou ajuster des services.',
  'walkthrough.steps.feedbackTab.title': 'Envoyer un retour',
  'walkthrough.steps.feedbackTab.content':
    'Feedback vous donne un lieu direct pour signaler les problèmes ou demander des améliorations.',
  'walkthrough.steps.allSet.title': 'Tout est prêt !',
  'walkthrough.steps.allSet.content':
    'Votre assistant vous a laissé une note de bienvenue : cet espace sert à discuter, poser des questions ou explorer des idées. Amusez-vous bien !',
  'walkthrough.tooltip.letsGo': "C'est parti !",
  'walkthrough.tooltip.next': 'Suivant →',
  'walkthrough.tooltip.skip': 'Passer la visite',
  'walkthrough.tooltip.stepCounter': '{n} sur {total}',
  'webhooks.activity.empty': 'Vide',
  'webhooks.activity.title': 'Activité récente',
  'webhooks.composioHistory.empty': 'Vide',
  'webhooks.composioHistory.metadataId': 'ID de métadonnées',
  'webhooks.composioHistory.metadataUuid': 'UUID de métadonnées',
  'webhooks.composioHistory.payload': 'Charge utile',
  'webhooks.composioHistory.title': 'Historique des déclencheurs ComposeIO',
  'webhooks.tunnels.active': 'Actif',
  'webhooks.tunnels.createFailed': 'Échec de la création du tunnel',
  'webhooks.tunnels.creating': 'Création…',
  'webhooks.tunnels.deleteFailed': 'Échec de la suppression du tunnel',
  'webhooks.tunnels.descriptionPlaceholder': 'Description (optionnel)',
  'webhooks.tunnels.echo': 'Écho',
  'webhooks.tunnels.empty': 'Vide',
  'webhooks.tunnels.enableEcho': "Activer l'écho",
  'webhooks.tunnels.inactive': 'Inactif',
  'webhooks.tunnels.namePlaceholder': 'Nom du tunnel (ex. telegram-bot)',
  'webhooks.tunnels.newTunnel': 'Nouveau tunnel',
  'webhooks.tunnels.removeEcho': "Supprimer l'écho",
  'webhooks.tunnels.title': 'Tunnels webhook',
  'webhooks.tunnels.toggleFailed': "Échec de la bascule de l'écho",
  'composio.directModeRequiresKey':
    "Échec de l'enregistrement. Le mode Direct nécessite une clé API non vide.",
  'composio.integrationSlugsHelp': "Identifiants d'intégration séparés par des virgules, ex.",
  'composio.integrationSlugsExample': 'gmail, slack',
  'composio.integrationSlugsCaseInsensitive': 'Insensible à la casse.',
  'composio.integrationSlugsPlaceholder': 'gmail, slack, ...',
  'composio.notYetRouted': 'pas encore routé',
  'composio.triggers.loading': 'Chargement…',
  'conversations.taskKanban.todo': 'À faire',
  'chat.addReaction': 'Ajouter une réaction',
  'chat.agentProfile.create': "Créer un profil d'agent",
  'chat.agentProfile.createFailed': "Impossible de créer le profil d'agent.",
  'chat.agentProfile.customDescription': "Profil d'agent personnalisé",
  'chat.agentProfile.defaultAgentLabel': 'Orchestrator',
  'chat.agentProfile.exists': "Le profil d'agent « {name} » existe déjà.",
  'chat.agentProfile.label': "Profil d'agent",
  'chat.agentProfile.quick': 'Rapide',
  'chat.agentProfile.reasoning': 'Raisonnement',
  'chat.agentProfile.namePlaceholder': 'Nom du profil',
  'chat.agentProfile.promptStylePlaceholder': 'Style de prompt',
  'chat.agentProfile.allowedToolsPlaceholder': 'Outils autorisés',
  'chat.backToThread': 'retour à {title}',
  'chat.parentThread': 'fil parent',
  'chat.removeReaction': 'Supprimer {emoji}',
  'settings.composio.loading': 'Chargement…',
  'settings.mascot.noCharactersAvailable': "Aucun personnage OpenHuman n'est encore disponible",
  'skills.uninstall.confirmTitle': 'Désinstaller {name} ?',
  'conversations.taskKanban.blocked': 'Bloqué',
  'conversations.taskKanban.done': 'Terminé',
  'conversations.taskKanban.pending': 'En attente',
  'conversations.taskKanban.working': 'Travailler',
  'conversations.taskKanban.awaitingApproval': "En attente d'approbation",
  'conversations.taskKanban.ready': 'Prêt',
  'conversations.taskKanban.rejected': 'rejeté',
  'conversations.taskKanban.inProgress': 'En cours',
  'conversations.taskKanban.awaitingApprovalColumn': "En attente d'approbation",
  'conversations.taskKanban.blockedColumn': 'Bloqué',
  'conversations.taskKanban.evidenceBadge': 'Preuves ({count})',
  'conversations.taskKanban.needsInput': 'Ces tâches nécessitent votre intervention',
  'conversations.taskKanban.emptyColumn': 'Aucune tâche',
  'conversations.taskKanban.dragHint': 'Glisser pour déplacer entre les colonnes',
  'conversations.taskKanban.movingCard': 'Déplacement…',
  'conversations.taskKanban.statusBadge.ready': 'Prêt à démarrer',
  'conversations.taskKanban.statusBadge.rejected': 'Rejeté',
  'intelligence.memoryChunk.detail.copiedHint': 'copié',
  'settings.composio.notYetRouted': 'pas encore routé',
  'settings.localModel.download.manageExternal': 'Gérez ce modèle dans votre runtime externe.',
  'settings.localModel.status.manageOllamaExternal':
    "Gérez le processus Ollama et les téléchargements de modèles en dehors d'OpenHuman, puis relancez les diagnostics.",
  'settings.localModel.status.ollamaDocs': 'Documentation Ollama',
  'settings.localModel.status.thenRetry':
    'pour les instructions de configuration, puis réessayez une fois votre runtime accessible.',
  'devOptions.menuAi': "Configuration de l'IA",
  'devOptions.menuAiDesc':
    'Fournisseurs de cloud, modèles Ollama locaux et routage par charge de travail',
  'devOptions.menuScreenAware': "Connaissance de l'écran",
  'devOptions.menuScreenAwareDesc':
    "Autorisations de capture d'écran, stratégie de surveillance et contrôles de session",
  'devOptions.menuMessaging': 'Canaux de messagerie',
  'devOptions.menuMessagingDesc':
    "Configurer les modes d'authentification Telegram/Discord et le routage des canaux par défaut",
  'devOptions.menuTools': 'Outils',
  'devOptions.menuToolsDesc':
    'Activer ou désactiver les fonctionnalités que OpenHuman peut utiliser en votre nom',
  'devOptions.menuAgentChat': "Chat d'agent",
  'devOptions.menuAgentChatDesc':
    "Conversation de l'agent de test avec remplacements de modèle et de température",
  'devOptions.menuCronJobs': 'Tâches Cron',
  'devOptions.menuCronJobsDesc':
    "Afficher et configurer les tâches planifiées pour les compétences d'exécution",
  'devOptions.menuLocalModelDebug': 'Débogage du modèle local',
  'devOptions.menuLocalModelDebugDesc':
    "Ollama configuration, téléchargements d'actifs, tests de modèles et diagnostics",
  'devOptions.menuWebhooksDebug': 'Webhooks',
  'devOptions.menuWebhooksDebugDesc':
    "Inspecter les enregistrements de webhooks d'exécution et les journaux de requêtes capturés",
  'devOptions.menuIntelligence': 'Intelligence',
  'devOptions.menuIntelligenceDesc':
    'Espace de travail mémoire, moteur subconscient, rêves et paramètres',
  'devOptions.menuNotificationRouting': 'Routage des notifications',
  'devOptions.menuNotificationRoutingDesc':
    "Score d'importance de l'IA et escalade de l'orchestrateur pour les alertes d'intégration",
  'devOptions.menuComposeIOTriggers': 'Déclencheurs ComposeIO',
  'devOptions.menuComposeIOTriggersDesc':
    "Afficher l'historique et les archives des déclencheurs ComposeIO",
  'devOptions.menuComposioRouting': 'Routage Composio (mode direct)',
  'devOptions.menuComposioRoutingDesc':
    'Apportez votre propre clé Composio API et acheminez les appels directement vers backend.composio.dev',
  'devOptions.menuComposioTriggers': "Déclencheurs d'intégration",
  'devOptions.menuComposioTriggersDesc':
    "Configurez les paramètres de triage IA pour les déclencheurs d'intégration Composio",
  'memory.sourceFilterAria': 'Filtrer par source',
  'calls.comingSoonDescription': "Les appels assistés par IA arrivent bientôt. Restez à l'écoute.",
  'whatsapp.title': 'WhatsApp',
  'subconscious.priority.critical': 'critique',
  'subconscious.priority.important': 'important',
  'subconscious.priority.normal': 'normal',
  'subconscious.durationSeconds': '{seconds}s',
  'subconscious.durationMilliseconds': '{milliseconds}ms',
  'settings.appearance': 'Apparence',
  'settings.appearanceDesc': 'Choisissez clair, sombre ou assorti à votre thème système',
  'settings.mascot': 'Mascotte',
  'settings.mascotDesc': "Choisissez la couleur de la mascotte utilisée dans l'application",
  'pages.settings.account.walletBalances': 'Soldes du portefeuille',
  'pages.settings.account.walletBalancesDesc':
    'Afficher les soldes multi-chaînes de votre portefeuille local',
  'walletBalances.title': 'Soldes du portefeuille',
  'walletBalances.refresh': 'Refresh',
  'walletBalances.loading': 'Chargement des soldes…',
  'walletBalances.retry': 'Retry',
  'walletBalances.emptyState':
    "Aucun compte de portefeuille pour l'instant — configurez un portefeuille dans Phrase de récupération.",
  'walletBalances.copyAddress': "Copier l'adresse",
  'walletBalances.providerMissing': 'fournisseur indisponible',
  'walletBalances.rawBalance': 'Brut : {raw}',
  'walletBalances.errorGeneric':
    'Impossible de charger les soldes du portefeuille. Configurez votre portefeuille dans Phrase de récupération et réessayez.',
  'walletBalances.setupHint':
    'Votre phrase de récupération n’est pas encore configurée. Configurez-la pour activer votre portefeuille et voir les soldes en direct.',
  'walletBalances.setupCta': 'Configurer la phrase de récupération',
  'walletBalances.notSetUp': 'Non configuré',
  'walletBalances.send': 'Envoyer',
  'walletBalances.receive': 'Recevoir',
  'walletReceive.scanHint':
    'Scannez ce code ou copiez l’adresse ci-dessous pour recevoir des fonds.',
  'walletReceive.addressLabel': 'Adresse {network}',
  'walletReceive.onlyChainWarning':
    'N’envoyez que des actifs {network} à cette adresse. Envoyer des actifs d’un autre réseau peut entraîner une perte définitive.',
  'walletSend.available': 'Disponible',
  'walletSend.recipient': 'Adresse du destinataire',
  'walletSend.recipientPlaceholder': 'Collez l’adresse de destination',
  'walletSend.recipientRequired': 'Saisissez une adresse de destinataire',
  'walletSend.amount': 'Montant',
  'walletSend.invalidAmount': 'Saisissez un montant valide',
  'walletSend.review': 'Vérifier',
  'walletSend.preparing': 'Préparation…',
  'walletSend.confirmHint':
    'Vérifiez les détails ci-dessous. La signature a lieu localement ; rien n’est diffusé tant que vous ne confirmez pas.',
  'walletSend.estimatedFee': 'Frais de réseau estimés',
  'walletSend.confirmSend': 'Confirmer et envoyer',
  'walletSend.sending': 'Envoi…',
  'walletSend.sent': 'Transaction envoyée',
  'walletSend.txHash': 'Hash de la transaction',
  'walletSend.viewExplorer': 'Voir dans l’explorateur',
  'walletSend.done': 'Terminé',
  'walletSend.genericError': 'Impossible de finaliser le transfert. Veuillez réessayer.',
  'settings.taskSources.title': 'Sources de tâches',
  'settings.integrations.title': 'Intégrations',
  'settings.integrations.menuDesc':
    'Sources de tâches, routage Composio et déclencheurs de webhooks',
  'settings.taskSources.subtitle':
    "Tirez les tâches de vos outils sur le tableau des tâches de l'agent",
  'settings.taskSources.description':
    "Collecter les éléments de travail de GitHub, Notion, Linear et ClickUp, les enrichir et les acheminer vers le tableau des tâches de l'agent.",
  'settings.taskSources.connectHint':
    "Les sources de tâches utilisent vos comptes connectés. Connectez-les d'abord sous Intégrations.",
  'settings.taskSources.disabledBanner':
    "Les sources de tâches sont désactivées dans les paramètres. Activez-les pour qu'elles soient interrogées automatiquement.",
  'settings.taskSources.loadError': 'Échec du chargement des sources de la tâche',
  'settings.taskSources.addTitle': 'Ajouter une source de tâche',
  'settings.taskSources.provider': 'Fournisseur',
  'settings.taskSources.name': 'Nom (facultatif)',
  'settings.taskSources.namePlaceholder': 'par exemple, mes problèmes ouverts',
  'settings.taskSources.github.repo': 'Dépôt (propriétaire/nom, facultatif)',
  'settings.taskSources.github.labels': 'Étiquettes (séparées par des virgules)',
  'settings.taskSources.notion.database': 'ID de la base de données (tableau)',
  'settings.taskSources.notion.browseDatabases': 'Parcourir les bases de données',
  'settings.taskSources.notion.loadingDatabases': 'Chargement des bases de données…',
  'settings.taskSources.notion.selectDatabase': 'Sélectionner une base de données…',
  'settings.taskSources.notion.noDatabases': 'Aucune base de données trouvée pour cette connexion.',
  'settings.taskSources.linear.team': "ID de l'équipe (facultatif)",
  'settings.taskSources.clickup.team': 'ID de l’espace de travail (équipe) (optionnel)',
  'settings.taskSources.assignedToMe': 'Uniquement les éléments qui me sont attribués',
  'settings.taskSources.add': 'Ajouter une source',
  'settings.taskSources.adding': 'Ajout en cours…',
  'settings.taskSources.preview': 'Aperçu',
  'settings.taskSources.previewResult': 'La ou les tâches {count} correspondent à ce filtre',
  'settings.taskSources.fetchNow': 'Ramasse maintenant',
  'settings.taskSources.fetching': 'Récupération…',
  'settings.taskSources.fetchResult':
    '{routed} tâche(s) acheminée(s) sur {fetched}; {pruned} tâche(s) obsolète(s) supprimée(s)',
  'settings.taskSources.syncAll': 'Tout synchroniser',
  'settings.taskSources.syncing': 'Synchronisation…',
  'settings.taskSources.configured': 'Sources configurées',
  'settings.taskSources.empty': 'Aucune source de tâche configurée pour le moment.',
  'settings.taskSources.proactive': 'proactif',
  'settings.taskSources.lastFetch': 'Dernière récupération',
  'settings.taskSources.never': 'Jamais',
  'settings.taskSources.statusEnabled': 'Activé',
  'settings.taskSources.statusDisabled': 'désactivé',
  'settings.taskSources.enable': 'Activer',
  'settings.taskSources.disable': 'Désactiver',
  'settings.taskSources.remove': 'Supprimer',
  'settings.taskSources.removeConfirm':
    "Supprimer cette source de tâche? Tout l'historique des tâches ingérées sera supprimé et ne pourra pas être annulé.",
  'settings.taskSources.refresh': 'Actualiser',
  'settings.taskSources.providers.github': 'GitHub',
  'settings.taskSources.providers.notion': 'Notion',
  'settings.taskSources.providers.linear': 'Linéaire',
  'settings.taskSources.providers.clickup': 'ClickUp',
  'skills.dashboard.enable': 'Activer le workflow planifié',
  'skills.dashboard.disable': 'Désactiver le workflow planifié',
  'skills.dashboard.lastRun': 'Dernière exécution',
  'skills.dashboard.nextRun': 'Prochaine exécution',
  'skills.dashboard.cardOpenRunner': 'Ouvrir dans le lanceur',
  'skills.new.title': 'Créer un workflow',
  'settings.agents.title': 'Agents',
  'settings.agents.subtitle':
    'Gérez les agents disponibles pour la délégation — les agents par défaut intégrés et vos propres agents personnalisés.',
  'settings.agents.menuDesc': 'Gérer les agents intégrés et personnalisés',
  'settings.agents.newAgent': 'Nouvel agent',
  'settings.agents.loadError': 'Impossible de charger les agents',
  'settings.agents.empty': "Pas encore d'agents",
  'settings.agents.sourceDefault': 'Intégré',
  'settings.agents.sourceCustom': 'Personnalisé',
  'settings.agents.enable': "Activer l'agent",
  'settings.agents.disable': "Désactiver l'agent",
  'settings.agents.edit': 'Modifier',
  'settings.agents.delete': 'Supprimer',
  'settings.agents.reset': 'Réinitialiser par défaut',
  'settings.agents.modelLabel': 'Modèle',
  'settings.agents.toolsLabel': 'Outils',
  'settings.agents.toolsAll': 'Tous les outils',
  'settings.agents.toolsCount': 'Outils {count}',
  'settings.agents.actionFailed': "Impossible de mettre à jour l'agent",
  'settings.agents.orchestratorLocked': "L'orchestrateur est toujours activé.",
  'settings.agents.editor.createTitle': 'Nouvel agent',
  'settings.agents.editor.editTitle': "Modifier l'agent",
  'settings.agents.editor.id': 'ID',
  'settings.agents.editor.idHint': 'Lettres minuscules, chiffres, _ et - seulement.',
  'settings.agents.editor.name': 'Nom',
  'settings.agents.editor.description': 'Description',
  'settings.agents.editor.model': 'Modèle (optionnel)',
  'settings.agents.editor.modelPlaceholder':
    'par exemple hériter, indice: rapide, ou un identifiant de modèle',
  'settings.agents.editor.systemPrompt': 'Invite système (optionnel)',
  'settings.agents.editor.tools': 'Outils autorisés',
  'settings.agents.editor.toolsHint': "Un nom d'outil par ligne. Utilisez * pour tous les outils.",
  'settings.agents.editor.defaultsNote':
    'Modifier un agent intégré enregistre une substitution que vous pouvez réinitialiser plus tard.',
  'settings.agents.editor.save': 'Enregistrer',
  'settings.agents.editor.create': 'Créer un agent',
  'settings.agents.editor.saving': 'Enregistrement…',
  'nav.workflows': 'Workflows',
  'workflows.title': 'Workflows',
  'workflows.subtitle':
    "Procédures réutilisables et exécutables — un objectif et les étapes pour l'atteindre. Créez-en un, installez depuis une URL ou ouvrez un workflow pour l'exécuter.",
  'workflows.createNew': 'Nouveau workflow',
  'workflows.listHeading': 'Workflows',
  'workflows.delete': 'Supprimer le workflow',
  'workflows.deleteError': 'Échec de la suppression du workflow',
  'workflows.warnings': '{count} avertissement(s)',
  'workflows.empty.title': 'Aucun workflow pour le moment',
  'workflows.empty.body':
    'Créez un workflow pour définir des règles et des scripts pour les phases du cycle de vie des tâches.',
  'workflows.create.title': 'Nouveau workflow',
  'workflows.create.subtitle': "Définissez un ensemble de règles lié au cycle de vie de l'agent.",
  'workflows.create.name': 'Name',
  'workflows.create.namePlaceholder': 'ex. Workflow de projet Python',
  'workflows.create.description': 'Description',
  'workflows.create.descriptionPlaceholder': 'Que fait ce workflow ?',
  'workflows.create.whenToUse': 'Quand utiliser',
  'workflows.create.whenToUsePlaceholder': "Quand l'agent doit-il utiliser ce workflow ?",
  'workflows.create.optional': '(facultatif)',
  'workflows.create.createBtn': 'Créer un workflow',
  'workflows.create.creating': 'Creating…',
  'workflows.create.createError': 'Impossible de créer le workflow',
  'workflows.create.successTitle': 'Workflow créé',
  'workflows.create.successMessage': 'a été créé avec succès.',
  'workflows.deleteConfirm.title': 'Supprimer le workflow',
  'workflows.deleteConfirm.body': 'Supprimer « {name} » ? Cette action est irréversible.',
  'workflows.detail.tags': 'Tags',
  'workflows.detail.location': 'Location',
  'workflows.detail.warnings': 'Warnings',
  'workflows.detail.phases': 'Phases',
  'workflows.detail.noPhases': 'Aucune phase définie.',
  'workflows.detail.loadError': 'Échec du chargement complet du workflow',
  'workflows.phase.rules': 'Rules',
  'workflows.phase.rules.empty': 'Aucune règle.',
  'workflows.phase.scripts': 'Scripts',
  'workflows.phase.scripts.empty': 'Aucun script.',
  'workflows.phase.toolScope': 'Portée des outils',
  'workflows.phase.toolScope.allow': 'Allow',
  'workflows.phase.toolScope.deny': 'Deny',
  'workflows.phase.toolScope.inherited': 'Hérité des paramètres par défaut du workflow.',
  'workflows.phase.toolScope.empty': "Aucune restriction d'outils.",
  'workflows.phase.context': 'Context',
  'workflows.phase.context.empty': 'Aucun fournisseur de contexte.',
  'settings.agentsSection.title': 'Agents',
  'settings.agentsSection.description':
    'Gérez vos agents, leur autonomie et ce à quoi ils peuvent accéder sur cet ordinateur.',
  'settings.agentsSection.menuDesc': 'Registre, autonomie et accès au système',
  'settings.cryptoSection.title': 'Crypto',
  'settings.cryptoSection.description':
    'Gérez votre phrase de récupération et consultez les soldes de vos comptes de portefeuille.',
  'settings.cryptoSection.menuDesc': 'Phrase de récupération et soldes du portefeuille',
  'settings.notificationsHub.title': 'Notifications',
  'settings.notificationsHub.description':
    'Consultez votre boîte de réception des alertes et gérez les préférences de notification et le routage.',
  'settings.notificationsHub.menuDesc':
    'Boîte de réception des alertes et préférences de notification',
  'settings.notificationsHub.settingsItem': 'Paramètres de notification',
  'settings.notificationsHub.settingsItemDesc': 'Préférences et routage',
  'settings.agents.editor.notFound': 'Agent introuvable.',
  'settings.agents.editor.modelInherit': 'Hériter (défaut de la plateforme)',
  'settings.agents.editor.modelHints': 'Conseils de routage',
  'settings.agents.editor.modelTiers': 'Niveaux de modèle',
  'settings.agents.editor.modelCustom': 'Identifiant de modèle personnalisé…',
  'settings.agents.editor.modelCustomPlaceholder': 'ex. anthropic/claude-sonnet-4',
  'settings.agents.editor.selectTools': 'Ajouter des outils',
  'settings.agents.editor.toolsAllSelected': 'Tous les outils',
  'settings.agents.editor.toolsNoneSelected': 'Aucun outil sélectionné',
  'settings.agents.editor.removeToolAria': 'Retirer {tool}',
  'settings.agents.editor.toolsModalTitle': 'Outils autorisés',
  'settings.agents.editor.toolsSelectedCount': '{count} sélectionné(s)',
  'settings.agents.editor.toolsSearchPlaceholder': 'Rechercher des outils…',
  'settings.agents.editor.toolsAllowAll': 'Autoriser tous les outils (*)',
  'settings.agents.editor.toolsAllowAllHint':
    'Cet agent peut utiliser tous les outils disponibles.',
  'settings.agents.editor.toolsLoading': 'Chargement des outils…',
  'settings.agents.editor.toolsLoadError': 'Impossible de charger les outils',
  'settings.agents.editor.toolsEmpty': 'Aucun outil ne correspond à votre recherche.',
  'settings.agents.editor.toolsDone': 'Done',
  'settings.agents.editor.builtInReadonly':
    'Les agents intégrés ne peuvent pas être modifiés. Vous pouvez les activer, les désactiver ou les réinitialiser depuis la liste des agents.',
  // Chat — agent-generated artifacts (#2779)
  'chat.artifact.aria': 'Artefact : {title}',
  'chat.artifact.generating': 'Génération de {kind}…',
  'chat.artifact.ready': 'Prêt',
  'chat.artifact.failed': 'Échec de la génération',
  'chat.artifact.download': 'Télécharger',
  'chat.artifact.downloading': 'Téléchargement…',
  'chat.artifact.downloaded': 'Enregistré dans {path}',
  'chat.artifact.download_failed': 'Échec du téléchargement : {reason}',
  'chat.artifact.retry': 'Réessayer',
  'chat.artifact.reveal': 'Afficher dans le dossier',
  'chat.artifact.show_more': 'Voir plus',
  'chat.artifact.show_less': 'Voir moins',

  // Chat — files panel (#3024)
  'chat.files.chip.aria.one': '{count} fichier dans cette discussion',
  'chat.files.chip.aria.other': '{count} fichiers dans cette discussion',
  'chat.files.panel.aria': 'Fichiers dans cette discussion',
  'chat.files.panel.title': 'Fichiers ({count})',
  'chat.files.panel.empty': 'Aucun fichier pour l’instant. Demandez à l’agent d’en générer un.',
  'chat.files.panel.close': 'Fermer le panneau de fichiers',
  'chat.files.delete.aria': 'Supprimer {title}',
  'chat.files.delete.confirm': 'Supprimer ce fichier ?',
  'chat.files.delete.cancel': 'Annuler',
  'chat.files.delete.action': 'Supprimer',
  'chat.files.delete.failed': 'Impossible de supprimer le fichier. Réessayez.',
  'chat.files.error.not_desktop':
    'Les téléchargements sont uniquement disponibles dans l’application bureau.',
  'chat.files.error.missing_artifact_id': 'Identifiant d’artefact manquant.',
  'chat.files.error.missing_artifact_path':
    'Le chemin de l’artefact est absent de la réponse du cœur.',
  'chat.files.error.resolve_failed': 'Impossible de résoudre l’artefact. Réessayez.',
  'chat.files.error.download_failed': 'Échec du téléchargement. Réessayez.',
  'chat.files.error.delete_failed': 'Impossible de supprimer le fichier. Réessayez.',
  'autocomplete.debounceMs': 'Anti-rebond (ms)',
  'autocomplete.maxChars': 'Caractères de contexte maximum',
  'autocomplete.overlayTtlMs': "Délai d'affichage (ms)",
  'memory.tab.council': 'Council',
  'activity.tabs.automations': 'Automatisations',
  'activity.tabs.automationsDescription':
    "Procédures réutilisables et exécutables — un objectif et les étapes pour l'atteindre.",
  'activity.tabs.backgroundActivity': 'Subconscient',
  'activity.tabs.alerts': 'Alertes',

  'intelligence.agents.title': "Bibliothèque d'agents",
  'intelligence.agents.subtitle':
    'Inspectez les spécialistes exécutables et envoyez une tâche à un agent nommé.',
  'intelligence.agents.refresh': 'Actualiser',
  'intelligence.agents.loading': 'Chargement des agents…',
  'intelligence.agents.failedToLoad': 'Impossible de charger les agents',
  'intelligence.agents.empty': 'Aucun agent exécutable disponible.',
  'intelligence.agents.readOnly': 'Lecture seule',
  'intelligence.agents.writeCapable': 'Peut écrire',
  'intelligence.agents.allTools': 'Tous les outils',
  'intelligence.agents.toolCountOne': '{count} outil',
  'intelligence.agents.toolCountOther': '{count} outils',
  'intelligence.agents.subagentCountOne': '{count} sous-agent',
  'intelligence.agents.subagentCountOther': '{count} sous-agents',
  'intelligence.agents.startChat': 'Démarrer le chat',
  'intelligence.agents.startChatPrompt':
    'Démarre une conversation avec cet agent. Présente ta spécialité, demande le contexte nécessaire, puis attends ma tâche.',
  'intelligence.agents.copyId': "Copier l'ID",
  'intelligence.agents.copied': 'Copié',
  'intelligence.agents.taskPlaceholder': 'Tâche pour cet agent',
  'intelligence.agents.runTask': 'Exécuter la tâche',
  'intelligence.agents.running': 'Exécution…',
  'intelligence.agents.runFailed': "Impossible de démarrer l'agent sélectionné",
  'intelligence.agents.model.inherit': 'Hériter',
  'intelligence.agents.tier.chat': 'Chat',
  'intelligence.agents.tier.reasoning': 'Raisonnement',
  'intelligence.agents.tier.worker': 'Travailleur',
  'modelCouncil.title': 'Conseil de modèles',
  'modelCouncil.intro':
    "Posez une question, obtenez des réponses indépendantes de plusieurs modèles en parallèle, puis le modèle président synthétise les points d'accord, de désaccord et les apports uniques de chacun.",
  'modelCouncil.listTitle': 'Councils',
  'modelCouncil.listIntro':
    'Choisissez un conseil sauvegardé, modifiez ses agents et son juge, ou créez-en un nouveau pour un type de décision spécifique.',
  'modelCouncil.addCouncil': 'Nouveau conseil',
  'modelCouncil.openCouncil': 'Ouvrir le conseil',
  'modelCouncil.editCouncil': 'Modifier le conseil',
  'modelCouncil.editCurrentCouncil': 'Modifier le conseil actuel',
  'modelCouncil.editCouncilAria': 'Modifier {name}',
  'modelCouncil.deleteCouncilAria': 'Supprimer {name}',
  'modelCouncil.backToCouncils': 'Retour aux conseils',
  'modelCouncil.saveCouncil': 'Enregistrer le conseil',
  'modelCouncil.savingCouncil': 'Saving…',
  'modelCouncil.cancelEdit': 'Cancel',
  'modelCouncil.loadingCouncils': 'Chargement des conseils…',
  'modelCouncil.noCouncils': 'Aucun conseil pour le moment. Ajoutez-en un pour commencer.',
  'modelCouncil.noCouncilDescription': 'Aucune description',
  'modelCouncil.registryErrorPrefix': 'Le registre du conseil a échoué :',
  'modelCouncil.councilNameLabel': 'Nom du conseil',
  'modelCouncil.councilDescriptionLabel': 'Description',
  'modelCouncil.councilDescriptionPlaceholder': 'Quand utiliser ce conseil',
  'modelCouncil.selectModel': 'Select',
  'modelCouncil.modelPickerHelp':
    'Sélectionnez un indice de routage ou épinglez un modèle fournisseur exact.',
  'modelCouncil.closeModelPicker': 'Close',
  'modelCouncil.hint.chat': 'Conversation',
  'modelCouncil.hint.code': 'Code',
  'modelCouncil.hint.default': 'Par défaut',
  'modelCouncil.hint.reasoning': 'Raisonnement',
  'modelCouncil.hint.summarize': 'Résumé',
  'modelCouncil.modelPickerHints': 'Hints',
  'modelCouncil.modelPickerProviderModel': 'Fournisseur + modèle',
  'modelCouncil.modelProviderLabel': 'Fournisseur du modèle',
  'modelCouncil.modelIdLabel': 'ID du modèle',
  'modelCouncil.useProviderModel': 'Utiliser le modèle du fournisseur',
  'modelCouncil.questionLabel': 'Question',
  'modelCouncil.questionPlaceholder': 'Posez une question au conseil…',
  'modelCouncil.membersLabel': 'Modèles membres',
  'modelCouncil.maxMembersNote': "jusqu'à {max}",
  'modelCouncil.memberPlaceholder': 'ex. gpt-5.2',
  'modelCouncil.memberAria': 'Modèle membre {n}',
  'modelCouncil.removeMemberAria': 'Supprimer le modèle membre {n}',
  'modelCouncil.addMember': '+ Ajouter un modèle',
  'modelCouncil.settingsTitle': 'Paramètres du conseil',
  'modelCouncil.settingsSummary': '{count} jurés · juge : {judge}',
  'modelCouncil.juryCountLabel': 'Nombre de jurés',
  'modelCouncil.debateRoundsLabel': 'Tours de débat',
  'modelCouncil.debateRoundsHelp':
    'Chaque juré débat sur plusieurs tours avant que le juge ne rédige la synthèse finale.',
  'modelCouncil.judgeAgentLabel': 'Agent juge',
  'modelCouncil.defaultJudge': 'Juge par défaut',
  'modelCouncil.savedProfile': 'Profil enregistré',
  'modelCouncil.customAgent': 'Agent personnalisé',
  'modelCouncil.judgeProfileLabel': 'Profil du juge',
  'modelCouncil.chooseProfile': 'Choisir un profil',
  'modelCouncil.judgeNameLabel': 'Nom du juge',
  'modelCouncil.judgeNamePlaceholder': 'Juge principal',
  'modelCouncil.rosterHeading': 'Composition du conseil',
  'modelCouncil.rosterHelp':
    'Chaque juré peut hériter de l’agent par défaut, utiliser un profil enregistré ou devenir un profil personnalisé pour cette exécution.',
  'modelCouncil.loadingProfiles': 'Chargement des profils…',
  'modelCouncil.jurorLabel': 'Juré {n}',
  'modelCouncil.profileModeLabel': 'Source du profil',
  'modelCouncil.mode.default': 'Défaut',
  'modelCouncil.mode.profile': 'Profil',
  'modelCouncil.mode.custom': 'Personnalisé',
  'modelCouncil.memberProfileAria': 'Profil du juré {n}',
  'modelCouncil.memberNameAria': 'Nom du juré {n}',
  'modelCouncil.memberNamePlaceholder': 'Nom de l’agent',
  'modelCouncil.profileModelPlaceholder': 'Remplacer le modèle du profil',
  'modelCouncil.memberBriefAria': 'Brief du juré {n}',
  'modelCouncil.memberBriefPlaceholder': 'Perspective de ce juré',
  'modelCouncil.jurorFallback': 'Juré',
  'modelCouncil.sharedReasoningLabel': 'Fichier de raisonnement partagé',
  'modelCouncil.sharedReasoningHelp':
    'Le conseil travaille sur ce brouillon partagé avant que le juge rédige la synthèse.',
  'modelCouncil.liveScratchpadHelp':
    'Les mises à jour des jurés sont ajoutées ici après chaque tour et alimentent le tour suivant.',
  'modelCouncil.liveScratchpadBadge': 'Live',
  'modelCouncil.scratchpadRoundHeading': 'Mises à jour du tour {round}',
  'modelCouncil.scratchpadNoResponse': 'Aucune réponse',
  'modelCouncil.chairLabel': 'Modèle président',
  'modelCouncil.chairPlaceholder': 'ex. claude-opus-4-8',
  'modelCouncil.chairHelp': 'Le président lit chaque réponse des membres et rédige la synthèse.',
  'modelCouncil.run': 'Convoquer le conseil',
  'modelCouncil.running': 'Convening…',
  'modelCouncil.runningHint': 'Interrogation des membres en parallèle, puis synthèse…',
  'modelCouncil.deliberationHeading': 'Délibération du conseil',
  'modelCouncil.deliberationHelp':
    "Les mascottes montrent chaque agent en réflexion pendant que le fichier de raisonnement partagé est en cours d'utilisation.",
  'modelCouncil.debateRoundInstruction':
    'Répondez aux autres jurés. Préservez les désaccords, révisez votre avis si justifié et gardez votre conclusion actuelle explicite.',
  'modelCouncil.debateFinalInstruction':
    "C'est votre dernier tour de juré. Convergez là où les preuves le justifient, signalez les désaccords restants et donnez au juge une conclusion claire.",
  'modelCouncil.roundLabel': 'Tour {round}',
  'modelCouncil.currentRoundThinking': 'Poursuite du tour suivant…',
  'modelCouncil.thinkingBadge': 'Thinking',
  'modelCouncil.thinkingWithBrief': 'Travail depuis cette perspective : {brief}',
  'modelCouncil.thought.evidence':
    'Vérification des preuves, des hypothèses et du contenu déjà capturé dans le fichier de raisonnement partagé.',
  'modelCouncil.thought.plan': 'Esquisse du chemin pratique et des points de blocage possibles.',
  'modelCouncil.thought.risk':
    'Recherche de modes de défaillance, de contexte manquant et de conclusions fragiles.',
  'modelCouncil.thought.tradeoffs':
    'Comparaison des compromis avant de remettre au juge une position concise.',
  'modelCouncil.thought.synthesis':
    "Préparation d'un point de vue distinct pour que le juge puisse comparer les vrais désaccords.",
  'modelCouncil.judgeWaitingBadge': 'Judge',
  'modelCouncil.judgeWaitingThought':
    'En attente des réponses des jurés, puis lecture du fichier de raisonnement partagé pour la synthèse.',
  'modelCouncil.judgeSynthesizingBadge': 'Synthesizing',
  'modelCouncil.judgeSynthesizingThought':
    'Lecture des réflexions en direct des jurés et rédaction de la synthèse finale du conseil.',
  'modelCouncil.errorPrefix': 'Le conseil a échoué :',
  'modelCouncil.resultsHeading': 'Résultats du conseil',
  'modelCouncil.memberAnswered': 'Answered',
  'modelCouncil.memberFailed': 'Failed',
  'modelCouncil.synthesisHeading': 'Synthesis',
  'modelCouncil.synthesisBy': 'par {model}',
  'modelCouncil.usageHeading': 'Utilisation du débat',
  'modelCouncil.usageEstimated':
    "Estimations de tokens issus des prompts et réponses du débat. La tarification réelle nécessite les données d'utilisation du fournisseur via le RPC du conseil.",
  'modelCouncil.usageEstimatedBadge': 'Tokens estimés',
  'modelCouncil.usageInputTokens': 'Input',
  'modelCouncil.usageOutputTokens': 'Output',
  'modelCouncil.usageTotalTokens': 'Total',
  'graphCohesion.brokerBadge': 'courtier',
  'graphCohesion.brokerTitle':
    'Trou structurel : les voisins de cette entité ne sont pas connectés entre eux — elle est le seul lien entre eux.',
  'graphCohesion.colCohesion': 'Cohésion',
  'graphCohesion.colEntity': 'Entité',
  'graphCohesion.colLinks': 'Liens',
  'graphCohesion.colRank': '#',
  'graphCohesion.empty': 'Pas encore de graphe de connaissances.',
  'graphCohesion.emptyHint':
    "À mesure que l'assistant enregistre des faits connectés à votre sujet, leur structure de regroupement apparaîtra ici.",
  'graphCohesion.errorPrefix': 'Impossible de charger le graphe :',
  'graphCohesion.intro':
    "À quel point le voisinage de chaque entité est étroitement tissé. Les courtiers — entités dont les voisins ne sont pas liés entre eux — sont les points uniques qui maintiennent ensemble des groupes autrement séparés, ce qu'un tri par fréquence ou PageRank ne peut révéler.",
  'graphCohesion.loading': 'Calcul de la cohésion…',
  'graphCohesion.metricConnections': 'Connexions',
  'graphCohesion.metricEntities': 'Entités',
  'graphCohesion.metricTriangles': 'Triangles',
  'graphCohesion.namespaceAll': 'Tous les espaces de noms',
  'graphCohesion.namespaceLabel': 'Espace de noms',
  'graphCohesion.noBrokers': "Aucune entité avec deux connexions ou plus pour l'instant.",
  'graphCohesion.rankedHeading': 'Courtiers — voisinages les plus lâches',
  'graphCohesion.retry': 'Réessayer',
  'graphCohesion.summaryCaption': 'Regroupement moyen {avg} · transitivité {transitivity}',
  'graphCohesion.title': 'Cohésion du graphe',
  'memory.tab.cohesion': 'Cohesion',

  'harnessInit.title': 'Configuration en cours',

  'announcement.gotIt': 'Compris',
  'harnessInit.subtitle':
    'OpenHuman prépare les composants dont il a besoin lors du premier lancement.',
  'harnessInit.stepPython': "Environnement d'exécution Python",
  'harnessInit.stepSpacy': 'Modèle de langage',
  'harnessInit.stepNode': "Environnement d'exécution Node.js",
  'harnessInit.statePending': 'En attente',
  'harnessInit.stateRunning': 'Installation…',
  'harnessInit.stateDone': 'Prêt',
  'harnessInit.stateSkipped': 'Ignoré',
  'harnessInit.stateFailed': 'Échec',
  'harnessInit.failedMessage':
    'Certaines étapes de configuration ne se sont pas terminées. Vous pouvez réessayer ou continuer — OpenHuman utilisera une solution de secours intégrée.',
  'harnessInit.retry': 'Réessayer',
  'harnessInit.continueAnyway': 'Continuer quand même',
  'harnessInit.runInBackground': 'Exécuter en arrière-plan',
  'harnessInit.backgroundHint':
    'Vous pouvez continuer à utiliser OpenHuman pendant que cela se termine.',

  'keyring.consent.title': 'Stockage sécurisé indisponible',
  'keyring.consent.description':
    "Le trousseau de votre système d'exploitation n'est pas accessible. OpenHuman a besoin de votre autorisation pour stocker les secrets en utilisant un stockage local chiffré.",
  'keyring.consent.reasonPrefix': 'Raison :',
  'keyring.consent.showDetails': "Qu'est-ce que cela signifie ?",
  'keyring.consent.hideDetails': 'Masquer les détails',
  'keyring.consent.tradeoffTitle': 'Compromis de sécurité',
  'keyring.consent.tradeoffBody':
    "Avec le stockage local chiffré, vos secrets sont chiffrés sur disque à l'aide d'une clé maître stockée à côté des données. C'est moins sécurisé que le trousseau du système, qui utilise une protection matérielle. Les sauvegardes ou la synchronisation de fichiers peuvent inclure les données chiffrées.",
  'keyring.consent.consentButton': 'Utiliser le stockage local chiffré',
  'keyring.consent.retryButton': 'Réessayer OS Keychain',
  'keyring.consent.declineButton': 'Refuser',
  'keyring.consent.retrying': 'Nouvelle tentative…',
  'keyring.consent.error': "Impossible d'enregistrer la préférence. Veuillez réessayer.",
  'keyring.consent.retryFailed': 'Le trousseau est toujours indisponible.',
  'keyring.settings.title': 'Sécurité',
  'keyring.settings.storageMode': 'Mode de stockage des secrets',
  'keyring.settings.mode.osKeychain': 'Trousseau du système',
  'keyring.settings.mode.encryptedFile': 'Local chiffré',
  'keyring.settings.mode.consentPending': 'Non configuré',
  'keyring.settings.mode.declined': 'Refusé',
  'keyring.settings.availability': 'Disponibilité du trousseau',
  'keyring.settings.available': 'Le trousseau du système est disponible',
  'keyring.settings.unavailable': 'Le trousseau du système est indisponible',
  'keyring.settings.backend': 'Moteur',
  'keyring.settings.retryButton': 'Réessayer la détection du trousseau',
  'keyring.settings.retryFailed': 'Échec de la tentative. Le trousseau est toujours indisponible.',
  'keyring.settings.consentTitle': 'Consentement de stockage',
  'keyring.settings.consentDescription':
    "Choisissez comment les secrets sont stockés lorsque le trousseau du système n'est pas disponible.",
  'keyring.settings.grantConsent': 'Autoriser le stockage local chiffré',
  'keyring.settings.revokeConsent': 'Refuser le stockage local',
  'pages.settings.account.security': 'Sécurité',
  'pages.settings.account.securityDesc': 'Mode de stockage des secrets et état du trousseau',
  // #002 memory-pipeline-hardening: degraded badges + typed remediation.
  'memoryTree.status.statusDegraded': 'Dégradé',
  'memoryTree.status.degradedRecall': 'Rappel sémantique désactivé',
  'memoryTree.status.degradedStructure': 'Structure du wiki incomplète',
  'memoryTree.status.extractionCoverage':
    "Couverture d'extraction : {pct}% des fragments ont une structure",
  'memory.health.remediation.budget_exhausted':
    "Les embeddings de mémoire ont atteint le budget géré. Configurez des embeddings Ollama locaux (Paramètres → IA → Encastrements) ou ajoutez votre propre clé d'API d'embeddings pour continuer à construire la mémoire.",
  'memory.health.remediation.auth_missing':
    "Aucune information d'identification d'embeddings trouvée. Connectez-vous à OpenHuman ou configurez des embeddings Ollama locaux dans Paramètres → IA → Encastrements.",
  'memory.health.remediation.auth_invalid':
    "Vos informations d'identification d'embeddings ont été rejetées. Authentifiez-vous à nouveau ou passez aux embeddings Ollama locaux dans Paramètres → IA → Encastrements.",
  'memory.health.remediation.embeddings_unconfigured':
    "Aucun fournisseur d'embeddings n'est configuré, le rappel sémantique est donc désactivé. Configurez des embeddings Ollama locaux (recommandé) ou ajoutez une clé d'embeddings dans Paramètres → IA → Encastrements.",
  'memory.health.remediation.embedding_dim_mismatch':
    "Le modèle d'embeddings renvoie une taille de vecteur incorrecte (la mémoire attend 1024 dimensions). Choisissez un modèle à 1024 dimensions ou demandez 1024 dimensions à votre fournisseur.",
  'memory.health.remediation.local_model_unavailable':
    "Un modèle local requis n'est pas disponible. Installez/lancez Ollama et téléchargez le modèle, ou basculez cette charge de travail vers un fournisseur cloud dans Paramètres → IA.",
  'memory.health.remediation.extraction_timeout':
    "Le modèle d'extraction de mémoire dépasse le délai imparti, le wiki a donc peu de structure. Choisissez un modèle d'extraction de mémoire plus rapide dans Paramètres → IA.",
  'memory.health.remediation.summarizer_unavailable':
    "Aucun fournisseur de résumé n'est disponible pour Créer des arbres de résumé. Activez l'IA locale (Ollama) ou activez la synthèse cloud dans Paramètres → IA → Mémoire.",
  'memory.health.remediation.empty_input_refused':
    "Un élément de mémoire a été ignoré car son texte était vide. Aucune action requise — les nouveaux éléments continuent de s'intégrer normalement.",
  'memory.health.remediation.storage_unavailable':
    "OpenHuman ne peut pas écrire dans son stockage de mémoire — le disque ou la carte SD semble défaillant, plein ou en lecture seule. Vérifiez le lecteur et libérez de l'espace ; le traitement de la mémoire reprendra automatiquement une fois le stockage de nouveau accessible en écriture.",
  'memory.health.remediation.transient':
    'Une erreur temporaire a interrompu le traitement de la mémoire. Une nouvelle tentative aura lieu automatiquement.',
  'memory.health.remediation.unknown':
    'Le traitement de la mémoire a rencontré un problème. Vérifiez Paramètres → IA pour la configuration.',
  // Chat — agent-generated artifacts (#2779)

  // Chat composer toolbar
  'composer.attachFile': 'Joindre un fichier',
  'composer.modelSelector': 'Modèle',
  'composer.voiceMode': 'Mode vocal',
  'composer.qualityHigh': 'Élevé',
  // Agent activity level
  'activityLevel.title': "Niveau d'activité de l'agent",
  'activityLevel.description':
    'Contrôlez le niveau de proactivité de votre agent. Les niveaux élevés consomment plus de tokens.',
  'activityLevel.off': 'Désactivé',
  'activityLevel.offDesc':
    'Aucun traitement en arrière-plan. Synchronise uniquement sur pression du bouton.',
  'activityLevel.minimal': 'Minimal',
  'activityLevel.minimalDesc': 'Synchronise les sources une fois par jour. Aucun message proactif.',
  'activityLevel.moderate': 'Modéré',
  'activityLevel.moderateDesc':
    'Synchronise toutes les heures. Résumé quotidien. Suggère des actions.',
  'activityLevel.active': 'Actif',
  'activityLevel.activeDesc':
    'Synchronise toutes les 10 min. Surveille les canaux, trie et rédige des réponses.',
  'activityLevel.alwaysOn': 'Toujours actif',
  'activityLevel.alwaysOnDesc':
    'Synchronisation en temps réel. Pleine autonomie dans les limites définies.',
  'activityLevel.currentMonth': 'Ce mois-ci : ${amount}',
  'activityLevel.saved': "Niveau d'activité mis à jour.",
  'activityLevel.default': 'par défaut',
  'activityLevel.costFree': '0 $',
  'activityLevel.costRange': '~${min}–${max}/mois',

  // Sync budget dialog
  'syncBudget.title': 'Budget de synchronisation',
  'syncBudget.maxTokens': 'Tokens max par synchronisation',
  'syncBudget.maxTokensHelp': 'Arrêter la synchronisation une fois ce nombre de tokens consommé.',
  'syncBudget.maxCost': 'Coût max par synchronisation (USD)',
  'syncBudget.maxCostHelp': 'Plafond absolu en dollars par exécution de synchronisation.',
  'syncBudget.syncDepth': 'Profondeur de synchronisation',
  'syncBudget.syncDepthHelp': 'Récupérer uniquement les éléments de cette fenêtre temporelle.',
  'syncBudget.days7': '7 derniers jours',
  'syncBudget.days30': '30 derniers jours',
  'syncBudget.days90': '90 derniers jours',
  'syncBudget.allTime': 'Tout le temps',
  'syncBudget.unlimited': 'Illimité',
  'syncBudget.saved': 'Budget enregistré.',

  // Sync confirm dialog
  'syncConfirm.title': 'Confirmer la synchronisation',
  'syncConfirm.message':
    'Cette synchronisation traitera ~{items} éléments (~{tokens} tokens, est. ${cost}).',
  'syncConfirm.budgetNote': 'Plafond budgétaire : ${max}',
  'syncConfirm.proceed': 'Procéder',
  'syncConfirm.cancel': 'Annuler',
  'syncConfirm.estimating': 'Estimation du coût...',

  // Monthly cost badge
  'monthlyCost.badge': '${amount} ce mois-ci',
  'monthlyCost.noData': 'Aucune synchronisation ce mois-ci',

  // Onboarding: Custom > Activity
  'onboarding.custom.stepperActivity': 'Activité',
  'onboarding.custom.stepperVault': 'Coffre',
  'onboarding.custom.activity.title': "Activité de l'agent",
  'onboarding.custom.activity.subtitle':
    'À quel point votre agent surveille et agit en arrière-plan.',
  'onboarding.custom.activity.defaultDesc':
    'Activité modérée — synchronisation horaire, résumé quotidien.',
  'onboarding.custom.activity.configureDesc':
    "Choisissez votre propre niveau d'activité. Configurer dans Paramètres › Niveau d'activité de l'agent.",

  // Onboarding: Custom > Vault
  'onboarding.custom.vault.title': 'Configuration de la mémoire et du coffre',
  'onboarding.custom.vault.subtitle':
    'Confirmez où les notes de mémoire sont écrites, comment les données sources sont lues et si votre pipeline de coffre est en bon état.',
  'onboarding.custom.vault.defaultDesc':
    "Utiliser les paramètres de mémoire gérés par OpenHuman. Le chemin du coffre et l'état de synchronisation peuvent encore être consultés ultérieurement.",
  'onboarding.custom.vault.configureDesc':
    'Vérifiez la propriété du coffre, exécutez des contrôles de santé et affinez les contrôles de mémoire maintenant.',
  'onboarding.custom.vault.localDisabledReason':
    "La configuration gérée nécessite une connexion à OpenHuman et n'est pas disponible en mode local.",
  'onboarding.custom.vault.exitError': "Impossible de terminer l'intégration. Veuillez réessayer.",

  // Vault Health
  'vaultHealth.title': 'Liste de contrôle de santé du coffre',
  'vaultHealth.setupTitle': 'Santé de la configuration du coffre',
  'vaultHealth.workspaceVault': "Coffre de l'espace de travail :",
  'vaultHealth.refresh': 'Actualiser',
  'vaultHealth.refreshing': 'Actualisation…',
  'vaultHealth.revealFolder': 'Afficher le dossier',
  'vaultHealth.openInObsidian': 'Ouvrir dans Obsidian',
  'vaultHealth.installObsidian': 'Installer Obsidian',
  'vaultHealth.openObsidianError': "Impossible d'ouvrir Obsidian",
  'vaultHealth.revealError': "Impossible d'afficher le dossier du coffre",
  'vaultHealth.downloadError': "Impossible d'ouvrir la page de téléchargement d'Obsidian",
  'vaultHealth.loadError': 'Impossible de charger la santé du coffre :',
  'vaultHealth.lastSync': 'Dernière synchronisation :',
  'vaultHealth.passed': 'Réussi',
  'vaultHealth.needsAttention': 'Attention requise',
  'vaultHealth.existsLabel': "Le chemin du coffre de l'espace de travail existe",
  'vaultHealth.existsRecovery':
    'Le dossier du coffre est manquant. Lancez une synchronisation ou créez ce dossier, puis actualisez cette liste de contrôle.',
  'vaultHealth.writableLabel': 'Le coffre est accessible en écriture par OpenHuman',
  'vaultHealth.writableRecovery':
    "OpenHuman ne peut pas encore écrire dans ce coffre. Accordez les autorisations d'écriture et actualisez.",
  'vaultHealth.obsidianLabel': 'Le coffre est enregistré dans Obsidian',
  'vaultHealth.obsidianRecovery':
    'Dans Obsidian, choisissez « Ouvrir le dossier comme coffre » pour ce chemin, puis actualisez cette liste de contrôle.',
  'vaultHealth.pipelineLabel': 'Le pipeline de mémoire est en bon état',
  'vaultHealth.pipelineRecovery':
    "Le pipeline de mémoire est en pause ou en erreur. Réactivez la synchronisation automatique dans le statut de l'arbre de mémoire et réessayez.",
  'vaultHealth.timeNever': 'Jamais',
  'vaultHealth.timeJustNow': "à l'instant",
  'vaultHealth.timeMinAgo': 'il y a {n} min',
  'vaultHealth.timeHrAgo': 'il y a {n} h',
  'vaultHealth.timeDayAgo': 'il y a {n} jour',
  'vaultHealth.timeDaysAgo': 'il y a {n} jours',

  // Memory Data
  'memoryData.howItWorks': 'Fonctionnement du stockage de la mémoire',
  'memoryData.workspaceVault': "Coffre de l'espace de travail · écriture",
  'memoryData.workspaceVaultDesc':
    'OpenHuman écrit les notes de mémoire générées dans memory_tree/content.',
  'memoryData.connectedSources': 'Sources connectées · lecture',
  'memoryData.connectedSourcesDesc':
    "Les dossiers, boîtes mail, conversations et dépôts sont importés pour l'indexation de la mémoire — leurs fichiers originaux ne sont jamais réécrits.",
  'memoryData.internalFiles': "Fichiers internes de l'arbre de mémoire",
  'memoryData.internalFilesDesc':
    "Les index, l'état de la file d'attente et les résumés sont gérés par OpenHuman pour maintenir la mémoire et la synchronisation en bon état.",
  'memoryData.windowError': 'Fenêtre de mémoire',
  'memoryData.windowUpdated': 'Fenêtre de mémoire mise à jour',
  'memoryData.windowUpdatedMsg': 'Définie sur {window}.',
  'skills.create.whenToUse': "Quand l'utiliser",
  'skills.create.whenToUsePlaceholder':
    "p. ex. lorsque l'utilisateur demande de trier sa boîte de réception",
  'skills.create.whenToUseHelp':
    "Le déclencheur sur lequel un agent se base pour décider d'exécuter ce workflow. Laissez vide pour réutiliser la description.",
  'skills.create.inputs.row.descriptionError': 'Une description est requise pour chaque entrée.',
  'skills.detail.run': 'Exécuter',
  'skills.detail.runAriaLabel': 'Exécuter ce workflow',
  'skills.run.title': 'Workflow',
  'workflows.installFromUrl': 'Installer depuis une URL',
  // Security banner (approval-gate host-aware boot state)
  'security.approvalGateDisabled.title': "Porte d'approbation désactivée",
  'security.approvalGateDisabled.body':
    "OPENHUMAN_APPROVAL_GATE=0 est défini dans votre environnement. Les outils à effet externe s'exécuteront sans demander de confirmation.",
  'security.approvalGateOverrideIgnored.title': 'Contournement bloqué',
  'security.approvalGateOverrideIgnored.body':
    "Un contournement OPENHUMAN_APPROVAL_GATE=0 a été détecté mais ignoré : l'application de bureau garde toujours la porte d'approbation activée.",

  // Run queue
  'runQueue.mode.interrupt': 'Interrompre',
  'runQueue.mode.steer': 'Orienter',
  'runQueue.mode.followup': 'Suivi',
  'runQueue.mode.collect': 'Ajouter du contexte',
  'runQueue.queued': "Message en file d'attente",
  'runQueue.steerHint': 'Orienter le tour en cours',
  'runQueue.followupHint': "Mettre en file d'attente comme suivi",
  'runQueue.collectHint': 'Ajouter comme contexte supplémentaire',
  'runQueue.status': '{total} en attente',
  'runQueue.cleared': "File d'attente vidée",
  'notch.ready': 'Prêt',
  'notch.processing': 'Traitement…',
  'notch.listening': "J'écoute…",
  'notch.thinking': 'Je réfléchis…',
  'notch.speaking': 'Je parle…',
  'notch.transcribing': 'Transcription…',
  'notch.executing': "J'exécute…",
  'memory.tab.orchestration': 'Orchestration',
  'memory.tab.orchestrationDescription':
    'Exécutez des workflows multi-agents — répartissez une question entre des agents parallèles, recoupez leurs résultats et regardez chaque phase aboutir à une réponse synthétisée unique.',
  'orchestration.subtitle':
    'Démarrez un workflow multi-agents, suivez la progression de ses phases et lisez le résultat synthétisé.',
  'orchestration.loading': 'Chargement des workflows…',
  'orchestration.failedToLoad': 'Échec du chargement des workflows',
  'orchestration.definitions': 'Workflows disponibles',
  'orchestration.noDefinitions': 'Aucune définition de workflow disponible.',
  'orchestration.approvalRequired': 'Approbation requise',
  'orchestration.start': 'Démarrer',
  'orchestration.confirmStart': "Démarrer l'exécution",
  'orchestration.starting': 'Démarrage…',
  'orchestration.questionLabel': 'Question de recherche (facultatif)',
  'orchestration.questionPlaceholder': 'Que doivent rechercher les agents ?',
  'orchestration.runProgress': "Progression de l'exécution",
  'orchestration.recentRuns': 'Exécutions récentes',
  'orchestration.noRuns': 'Aucune exécution de workflow pour le moment.',
  'orchestration.close': 'Fermer',
  'orchestration.tier.readOnly': 'Lecture seule',
  'orchestration.tier.standard': 'Standard',
  'orchestration.tier.editCapable': "Capable d'édition",
  'orchestration.approval.title': 'Approuver cette exécution de workflow',
  'orchestration.approval.body':
    "Il s'agit d'une exécution coûteuse ou très concurrente qui nécessite votre approbation explicite avant de démarrer :",
  'orchestration.approval.reason.tier':
    'Ses agents peuvent effectuer des actions au-delà de la recherche en lecture seule.',
  'orchestration.approval.reason.concurrency': 'Il exécute de nombreux agents en même temps.',
  'orchestration.approval.reason.children':
    "Il peut générer un très grand nombre d'agents au total.",
  'orchestration.approval.tier': 'Niveau de sécurité',
  'orchestration.approval.concurrency': 'Concurrence',
  'orchestration.approval.maxChildren': "Nombre max d'agents",
  'orchestration.approval.approve': 'Approuver et démarrer',
  'orchestration.approval.starting': 'Démarrage…',
  'orchestration.approval.cancel': 'Annuler',
  'orchestration.runStatus.pending': 'En attente',
  'orchestration.runStatus.running': 'En cours',
  'orchestration.runStatus.completed': 'Terminée',
  'orchestration.runStatus.failed': 'Échouée',
  'orchestration.runStatus.cancelled': 'Annulée',
  'orchestration.runStatus.interrupted': 'Interrompue',
  'orchestration.phaseStatus.pending': 'En attente',
  'orchestration.phaseStatus.running': 'En cours',
  'orchestration.phaseStatus.completed': 'Terminée',
  'orchestration.phaseStatus.failed': 'Échouée',
  'orchestration.detail.stop': 'Arrêter',
  'orchestration.detail.resume': 'Reprendre',
  'orchestration.detail.agents': 'agents',
  'orchestration.detail.childRefs': 'Agents enfants',
  'orchestration.detail.synthesis': 'Synthèse finale',
  // ── Agent Profiles ───────────────────────────────────────────────────────
  'settings.profiles.title': "Profils d'agent",
  'settings.profiles.subtitle':
    'Des agents avec du caractère — chacun avec sa propre âme, mémoire, connecteurs et compétences.',
  'settings.profiles.menuDesc': "Créez et gérez les profils d'agent",
  'settings.profiles.new': 'Nouveau profil',
  'settings.profiles.empty': "Aucun profil d'agent pour le moment",
  'settings.profiles.loadError': 'Impossible de charger les profils',
  'settings.profiles.active': 'Actif',
  'settings.profiles.setActive': 'Définir comme actif',
  'settings.profiles.sourceBuiltIn': 'Intégré',
  'settings.profiles.sourceCustom': 'Personnalisé',
  'settings.profiles.deleteConfirm': 'Supprimer ce profil ? Cette action est irréversible.',
  'settings.profiles.editor.createTitle': 'Nouveau profil',
  'settings.profiles.editor.editTitle': 'Modifier le profil',
  'settings.profiles.editor.name': 'Nom',
  'settings.profiles.editor.id': 'Identifiant',
  'settings.profiles.editor.idHint': 'Lettres minuscules, chiffres et tirets uniquement.',
  'settings.profiles.editor.description': 'Description',
  'settings.profiles.editor.soul': 'Âme (SOUL.md)',
  'settings.profiles.editor.soulHint':
    "Identité personnalisée de ce profil. Vide, on revient au SOUL.md de l'espace de travail.",
  'settings.profiles.editor.baseAgent': 'Agent de base',
  'settings.profiles.editor.baseAgentHint':
    "Définition d'agent sous laquelle ce profil s'exécute (par ex. orchestrator).",
  'settings.profiles.editor.model': 'Modèle',
  'settings.profiles.editor.modelHint':
    'Remplacement de modèle facultatif. Vide, hérite de la valeur par défaut.',
  'settings.profiles.editor.temperature': 'Température',
  'settings.profiles.editor.systemPromptSuffix': 'Suffixe du message système',
  'settings.profiles.editor.agentConversations': "Rappeler les conversations de l'agent",
  'settings.profiles.editor.agentConversationsHint':
    'Inclure la mémoire des discussions précédentes et croisées dans le contexte de ce profil.',
  'settings.profiles.editor.memorySources': 'Sources de mémoire',
  'settings.profiles.editor.memorySourcesHint': 'Sources de mémoire que ce profil rappelle.',
  'settings.profiles.editor.connectors': 'Connecteurs',
  'settings.profiles.editor.connectorsHint':
    'Boîtes à outils Composio que ce profil peut utiliser.',
  'settings.profiles.editor.skills': 'Compétences',
  'settings.profiles.editor.skillsHint': 'Flux de travail que ce profil peut lister et exécuter.',
  'settings.profiles.editor.mcpServers': 'Serveurs MCP',
  'settings.profiles.editor.mcpServersHint': 'Serveurs MCP que ce profil peut atteindre.',
  'settings.profiles.editor.all': 'Tous',
  'settings.profiles.editor.selected': 'Sélectionnés',
  'settings.profiles.editor.addPlaceholder': 'Saisissez un identifiant, puis Entrée',
  'settings.profiles.editor.removeAria': 'Retirer {item}',
  'settings.profiles.editor.notFound': 'Profil introuvable',
  'settings.profiles.editor.saving': 'Enregistrement…',
  'settings.profiles.editor.idRequired': "L'identifiant du profil ne peut pas être vide",
  'agentworld.jobs.applyModal.title': "Postuler à l'offre",
  'agentworld.jobs.applyModal.successHeading': 'Proposition soumise avec succès !',
  'agentworld.jobs.applyModal.successBody': 'Le recruteur examinera votre candidature.',
  'agentworld.jobs.applyModal.coverLetterLabel': 'Lettre de motivation',
  'agentworld.jobs.applyModal.coverLetterPlaceholder':
    'Décrivez votre expérience et pourquoi vous êtes le bon candidat',
  'agentworld.jobs.applyModal.bidAmountLabel': 'Montant proposé',
  'agentworld.jobs.applyModal.bidAmountPlaceholder': 'ex. 450 USDC',
  'agentworld.jobs.applyModal.deliveryLabel': 'Délai estimé',
  'agentworld.jobs.applyModal.deliveryPlaceholder': 'ex. 2 semaines',
  'agentworld.jobs.applyModal.cancel': 'Annuler',
  'agentworld.jobs.applyModal.submit': 'Soumettre la candidature',
  'agentworld.jobs.applyModal.submitting': 'Envoi en cours…',
  'agentworld.messaging.missingSignalBundle':
    "Cet utilisateur n'a pas encore activé la messagerie chiffrée. Demandez-lui d'ouvrir Agent World et d'activer les messages privés sécurisés avant d'envoyer un message.",

  // User-actionable runtime errors (#3931)
  'userErrors.title': 'Action requise',
  'userErrors.dismiss': 'Ignorer',
  'userErrors.action.openBilling': 'Ouvrir la facturation',
  'userErrors.action.openProviderSettings': 'Paramètres du fournisseur',
  'userErrors.budgetExceeded.title': 'Budget géré atteint',
  'userErrors.budgetExceeded.body':
    'Votre budget IA géré est épuisé. Ajoutez du budget ou changez de forfait.',
  'userErrors.insufficientCredits.title': 'Crédits du fournisseur requis',
  'userErrors.insufficientCredits.body':
    "Votre fournisseur IA n'a plus de crédits. Rechargez-le ou mettez à jour sa clé API.",
  'userErrors.apiKeyMissing.title': 'Clé API requise',
  'userErrors.apiKeyMissing.body':
    "Aucune clé API n'est définie pour votre fournisseur d'IA. Ajoutez-en une dans les paramètres du fournisseur pour continuer.",
  'userErrors.scope.chat': 'Chat',
  'userErrors.scope.cron': 'Tâche planifiée',
  // Agent World — Identity trading (confirm-before-spend + balance gate)
  'agentWorld.trading.amountLabel': 'Montant',
  'agentWorld.trading.networkLabel': 'Réseau',
  'agentWorld.trading.balanceLabel': 'Votre solde',
  'agentWorld.trading.walletLabel': 'Portefeuille',
  'agentWorld.trading.balanceUnknown': 'Inconnu',
  'agentWorld.trading.cancel': 'Annuler',
  'agentWorld.trading.addFunds': 'Ajouter des fonds',
  'agentWorld.trading.confirmPay': 'Confirmer et payer',
  'agentWorld.trading.confirmCommit': 'Confirmer',
  'agentWorld.trading.continue': 'Continuer',
  'agentWorld.trading.submitting': 'Envoi…',
  'agentWorld.trading.placeBid': 'Enchérir',
  'agentWorld.trading.submitOffer': 'Envoyer l’offre',
  'agentWorld.trading.bidTitlePrefix': 'Enchérir sur',
  'agentWorld.trading.offerTitlePrefix': 'Offre pour',
  'agentWorld.trading.bidReviewTitlePrefix': 'Confirmer l’enchère sur',
  'agentWorld.trading.offerReviewTitlePrefix': 'Confirmer l’offre pour',
  'agentWorld.trading.spendInsufficient':
    'Solde insuffisant pour effectuer ce paiement. Approvisionnez votre portefeuille pour continuer.',
  'agentWorld.trading.spendBroadcastNote':
    'Votre portefeuille signera et diffusera ce paiement sur',
  'agentWorld.trading.commitInsufficientWarning':
    'Votre solde pourrait ne pas couvrir cela si l’engagement est accepté. Vous pouvez quand même l’envoyer : les fonds ne bougent qu’à l’acceptation.',
  'agentWorld.trading.commitSettleNote':
    'Il s’agit d’un engagement signé : les fonds ne bougent qu’en cas d’acceptation.',
  'agentWorld.trading.commitReviewSubtitle': 'Vérifiez votre engagement avant de l’envoyer.',
  'agentWorld.trading.balanceUnverified':
    'Nous n’avons pas pu vérifier le solde de votre portefeuille. Vous pouvez quand même continuer : le paiement est vérifié lors de l’envoi.',
  'agentWorld.trading.amountTooManyDecimals': 'Ce montant comporte trop de décimales.',
  'agentWorld.trading.amountMustBePositive': 'Saisissez un montant supérieur à zéro.',
  'agentWorld.trading.amountInvalid': 'Saisissez un montant valide.',

  // Code block chrome
  'codeBlock.copy': 'Copier',
  'codeBlock.copied': 'Copié !',
};

export default messages;
