// French (fr).
export default {
  'brand': 'WebBrain',

  'sp.status.disconnected': 'Déconnecté',
  'sp.status.connected': 'Connecté ({model})',
  'sp.status.error': 'Erreur : {msg}',
  'sp.status.failed': 'Échec de la connexion',
  'sp.btn.verbose': 'Basculer le journal détaillé des outils',
  'sp.btn.language': 'Langue',
  'sp.btn.settings': 'Paramètres',
  'sp.btn.clear': 'Nouvelle conversation (effacer l\'historique)',
  'sp.btn.send': 'Envoyer',
  'sp.btn.stop.title': 'Arrêter l\'agent',
  'sp.btn.stop.label': 'Arrêter',

  'sp.inspection': 'WebBrain a commencé à inspecter cette page',

  'sp.greeting.html': 'Bonjour ! Je suis <strong>WebBrain</strong>. Je peux lire cette page, répondre à des questions, cliquer sur des boutons, remplir des formulaires et automatiser des tâches en plusieurs étapes.',
  'sp.greeting.hint': 'Essayez : « Résume cette page » ou « Trouve tous les liens à propos des tarifs »',
  'sp.help_message': 'Comment puis-je vous aider avec cette page ?',
  'sp.cleared_message': 'Conversation effacée. Comment puis-je vous aider ?',

  'sp.mode.ask': 'Demander',
  'sp.mode.ask.title': 'Posez des questions sur la page — aucune modification',
  'sp.mode.act': 'Agir',
  'sp.mode.act.title': 'Laissez WebBrain cliquer, taper et naviguer à votre place',
  'sp.mode.act.warning': 'Mode Agir : WebBrain interagira avec les pages à votre place. Utilisez-le à vos propres risques.',
  'sp.mode.act.confirm': 'Le mode Agir permet à WebBrain de cliquer, taper, défiler et naviguer à votre place.\n\nIl s\'exécute dans votre session de navigateur authentifiée et a donc le même accès que vous sur chaque site auquel vous êtes connecté.\n\nSurveillez ce qu\'il fait et arrêtez-le à tout moment avec le bouton ◼.\n\nContinuer ?',

  'sp.input.ask_placeholder': 'Posez une question sur cette page...',
  'sp.input.act_placeholder': 'Dites-moi quoi faire sur cette page...',

  'sp.activity.thinking': 'Réflexion...',
  'sp.activity.thinking_step': 'Réflexion (étape {step})...',
  'sp.activity.continuing': 'Poursuite...',
  'sp.activity.stopping': 'Arrêt...',

  'sp.copy': 'Copier',
  'sp.copied': 'Copié !',
  'sp.copy.code.title': 'Copier le code',

  'sp.error_prefix': 'Erreur : {msg}',
  'sp.stopped_by_user': '[Arrêté par l\'utilisateur]',
  'sp.stopped_by_user_html': '<em>Arrêté par l\'utilisateur.</em>',

  'sp.continue_bar': 'Limite d\'étapes atteinte ({steps} étapes). Voulez-vous que je continue ?',
  'sp.continue_btn': 'Continuer',

  'sp.step.details': 'détails',
  'sp.step.input_label': 'Entrée',
  'sp.step.result_label': 'Résultat',

  'sp.api.enabled_html': '🔓 <strong>Mutations d\'API activées</strong> pour cette conversation. L\'agent peut désormais utiliser POST/PUT/PATCH/DELETE via fetch_url et execute_js quand il juge l\'API plus fiable que l\'interface pour une étape. L\'interface reste privilégiée par défaut. Ce drapeau s\'efface quand vous réinitialisez la conversation.',
  'sp.api.badge_html': '<span>🔓 Mutations d\'API autorisées</span>',

  'tool.read_page': 'Lecture de la page',
  'tool.get_interactive_elements': 'Analyse des éléments interactifs',
  'tool.click': 'Clic',
  'tool.type_text': 'Saisie',
  'tool.scroll': 'Défilement',
  'tool.navigate': 'Navigation',
  'tool.extract_data': 'Extraction de données',
  'tool.wait_for_element': 'Attente d\'un élément',
  'tool.get_selection': 'Lecture de la sélection',
  'tool.execute_js': 'Exécution d\'un script',
  'tool.new_tab': 'Ouverture d\'un nouvel onglet',
  'tool.screenshot': 'Capture d\'écran',
  'tool.done': 'Finalisation',
  'tool.click.selector': 'Clic sur « {selector} »',
  'tool.click.index': 'Clic sur l\'élément #{index}',
  'tool.type_text.text': 'Saisie de « {text} »',
  'tool.navigate.url': 'Aller à {url}',
  'tool.new_tab.url': 'Ouverture de {url}',
  'tool.scroll.direction': 'Défilement {direction}',
  'tool.extract_data.type': 'Extraction de {type}',
  'tool.wait_for_element.selector': 'Attente de « {selector} »',

  'st.title': 'Paramètres WebBrain',
  'st.subtitle': 'Configurez vos fournisseurs de LLM et vos préférences d\'affichage · v{version}',
  'st.tab.display': 'Affichage',
  'st.tab.providers': 'Fournisseurs',
  'st.tab.vision': 'Vision',
  'st.tab.profile': 'Profil',
  'st.tab.account': 'Compte',

  'st.account.not_signed_in': 'Non connecté',
  'st.account.sign_in': 'Se connecter / S\'inscrire',
  'st.account.sign_out': 'Se déconnecter',
  'st.account.provider_name': 'WebBrain Cloud',

  'st.display.language.label': 'Langue',
  'st.display.language.desc': 'Langue de l\'interface de l\'extension WebBrain.',
  'st.display.verbose.label': 'Mode détaillé',
  'st.display.verbose.desc': 'Affiche tous les détails des appels d\'outils, les arguments et les résultats JSON bruts. Désactivé par défaut pour un chat plus épuré.',
  'st.display.screenshot.label': 'Capture de secours',
  'st.display.screenshot.desc': 'Capture une image de la page quand la lecture du DOM échoue ou renvoie un contenu insuffisant. Nécessite un modèle compatible vision.',
  'st.display.site_adapters.label': 'Adaptateurs de site',
  'st.display.site_adapters.desc': 'Injecte un court guide pré-rédigé pour les sites à fort trafic connus (GitHub, Gmail, Stripe, AWS, etc.) dans le premier message de l\'agent. Aide l\'agent à éviter les impasses classiques. Ajoute un léger coût en tokens sur le premier tour des conversations concernées.',
  'st.display.auto_screenshot.label': 'Capture automatique',
  'st.display.auto_screenshot.desc': 'Capture automatiquement une image de la fenêtre après que l\'agent agit sur la page, pour que les modèles compatibles vision voient ce qui a changé. Consomme plus de tokens. Désactivée silencieusement si le modèle actif ne gère pas les images.',
  'st.display.auto_screenshot.off': 'Désactivée',
  'st.display.auto_screenshot.navigation': 'À la navigation',
  'st.display.auto_screenshot.state_change': 'Au changement d\'état (par défaut)',
  'st.display.auto_screenshot.every_step': 'À chaque étape',
  'st.display.tracing.label': 'Enregistrer les traces (pour comparer des modèles)',
  'st.display.tracing.desc_html': 'Conserve chaque exécution (requêtes LLM, réponses, appels d\'outils, captures) dans IndexedDB local pour pouvoir inspecter et comparer les modèles côte à côte. S\'ouvre dans un onglet Traces distinct. Désactivé par défaut car cela ajoute des écritures disque à chaque étape. <a href="traces.html" target="_blank" style="color:var(--accent);">Ouvrir la page Traces →</a>',
  'st.display.allow_local_network.label': 'Autoriser l\'agent à accéder au réseau local',
  'st.display.allow_local_network.desc': 'Permet à l\'outil fetch_url de l\'agent d\'atteindre les adresses loopback (127.0.0.1, localhost) et privées/RFC1918 (10.x, 192.168.x, 172.16–31.x). Utile pour les serveurs de dev locaux, outils intranet ou API auto-hébergées. Désactivé par défaut — quand désactivé, des pages avec injection de prompt ne peuvent pas pousser l\'agent à sonder votre réseau local. Les adresses de méta-données cloud (169.254.169.254) et les noms d\'hôte *.internal/*.local restent bloqués même quand activé.',
  'st.display.notify_sound.label': 'Son de fin',
  'st.display.notify_sound.desc': 'Joue un court carillon dans le panneau latéral quand l\'agent termine une tâche. Ne joue pas si vous annulez l\'exécution.',
  'st.display.max_steps.label': 'Étapes maximum de l\'agent',
  'st.display.max_steps.desc': 'Nombre maximum d\'étapes d\'outil que l\'agent peut effectuer par message. Des valeurs plus élevées permettent des tâches plus complexes mais peuvent consommer plus de tokens.',
  'st.display.traces_link.label': 'Traces',
  'st.display.traces_link.desc': 'Inspectez les exécutions enregistrées côte à côte. Disponible uniquement quand l\'enregistrement des traces est activé.',
  'st.display.traces_link.open': 'Ouvrir les traces →',

  'st.providers.info.html': '<strong>Premiers pas avec llama.cpp :</strong><br>Exécutez <code>llama-server -m votre-modele.gguf --port 8080</code> pour démarrer un serveur local.<br>Pas besoin de clé d\'API — il fonctionne entièrement sur votre machine.',
  'st.providers.save': 'Enregistrer',
  'st.providers.test': 'Tester la connexion',
  'st.providers.set_active': 'Définir comme actif',
  'st.providers.active': 'ACTIF',
  'st.providers.saved': 'Enregistré !',
  'st.providers.testing': 'Test en cours...',
  'st.providers.connected': 'Connecté ! Modèle : {model}',
  'st.providers.unknown_model': 'inconnu',
  'st.providers.failed': 'Échec : {error}',
  'st.providers.load_models': 'Charger les modèles',
  'st.providers.loading': 'Chargement…',
  'st.providers.models_loaded': '{count} modèles chargés',

  'st.provider.field.server_url': 'URL du serveur',
  'st.provider.field.api_base_url': 'URL de base de l\'API',
  'st.provider.field.api_key': 'Clé d\'API',
  'st.provider.field.model': 'Modèle',
  'st.provider.field.model_optional': 'Modèle (facultatif)',
  'st.provider.field.supports_vision': 'Le modèle gère la vision (multimodal)',
  'st.provider.field.compact_prompt': 'Prompt compact (recommandé pour les petits modèles, activé par défaut)',
  'st.provider.field.model_loaded_hint': 'laisser vide pour utiliser le modèle chargé',

  'st.vision.desc': 'Si défini, les captures d\'écran sont envoyées à ce modèle pour lire la page, pendant que le fournisseur actif gère la planification et les appels d\'outils. Laissez vide pour utiliser également le fournisseur actif pour la vision. Uniquement pour les endpoints compatibles OpenAI.',
  'st.vision.save': 'Enregistrer',
  'st.vision.test': 'Tester la connexion',
  'st.vision.clear': 'Effacer',
  'st.vision.cleared': 'Effacé.',
  'st.vision.saved': 'Enregistré !',
  'st.vision.testing': 'Test en cours...',
  'st.vision.connected': 'Connecté ! Modèle : {model}',
  'st.vision.failed': 'Échec : {error}',
  'st.vision.fill_required': 'Remplissez d\'abord l\'URL de base et le modèle.',

  'st.profile.desc_html': 'Stockez une courte biographie que l\'agent peut utiliser pour remplir des formulaires d\'inscription sans poser la question à chaque fois — votre nom, e-mail professionnel, entreprise, et un mot de passe <em>jetable</em> pour les inscriptions peu sensibles. Lorsqu\'il est activé, le texte ci-dessous est ajouté au prompt système de l\'agent à chaque conversation.',
  'st.profile.enabled.label': 'Activer le remplissage automatique du profil',
  'st.profile.enabled.desc': 'Injecte le texte du profil dans le prompt système de l\'agent. Désactivé = l\'agent ne voit jamais ce texte.',
  'st.profile.text.label': 'Texte du profil',
  'st.profile.text.placeholder': 'Je m\'appelle Jane Doe. Mon e-mail est jane@example.com. Je travaille chez Acme Inc. Mon mot de passe par défaut pour les inscriptions peu sensibles est SomePhrase-42!. Je vis à Berlin.',
  'st.profile.save': 'Enregistrer',
  'st.profile.clear': 'Effacer',
  'st.profile.saved': 'Enregistré.',
  'st.profile.cleared': 'Effacé.',
  'st.profile.security_html': '<strong>Sécurité — à lire :</strong><br><ul style="margin:6px 0 0 18px;padding:0;line-height:1.55;"><li>Le texte que vous saisissez ici est stocké <strong>en clair</strong> dans le stockage local de votre navigateur. Il n\'est <strong>pas</strong> transmis au projet WebBrain — mais il <strong>est</strong> envoyé au fournisseur de LLM que vous avez configuré à chaque tour, dans le cadre du prompt système.</li><li><strong>Ne mettez pas ici les mots de passe de comptes importants</strong> (Google, Apple, iCloud, banque, SSO professionnel, e-mail principal). Ces comptes devraient utiliser la 2FA et vous ne devriez pas avoir à les confier à un agent.</li><li>Un <strong>mot de passe jetable</strong> que vous réutilisez pour des inscriptions peu sensibles (newsletters, essais gratuits, comptes de forum) est l\'usage prévu.</li><li>Si ce profil de navigateur est un jour compromis, un attaquant ayant accès au disque pourra lire ce texte. Gardez-le au minimum.</li></ul>',

  'tr.title': 'Traces WebBrain',
  'tr.runs': '{n} exécutions',
  'tr.run': '{n} exécution',
  'tr.btn.refresh': '↻ Actualiser',
  'tr.btn.refresh.title': 'Recharger la liste des exécutions',
  'tr.btn.compare': '⇔ Comparer',
  'tr.btn.compare.title': 'Entrer en mode comparaison (choisissez 2 exécutions)',
  'tr.btn.compare.picking': '⇔ Comparer (choisissez 2)',
  'tr.btn.export': '⇩ Exporter JSON',
  'tr.btn.export.title': 'Exporter l\'exécution sélectionnée en JSON',
  'tr.btn.delete': '✕ Supprimer',
  'tr.btn.delete.title': 'Supprimer l\'exécution sélectionnée',
  'tr.btn.clear_all': 'Tout effacer',
  'tr.btn.clear_all.title': 'Supprimer toutes les exécutions enregistrées',

  'tr.filter.placeholder': 'Filtrer par tâche / modèle / URL',
  'tr.filter.all_models': 'Tous les modèles',
  'tr.no_match': 'Aucune exécution ne correspond.',
  'tr.no_task': '(pas de tâche)',

  'tr.conversation.label': 'Conversation',
  'tr.conversation.turn_of': 'tour {n} sur {total}',
  'tr.conversation.tooltip': 'Fait partie d\'une conversation à {n} tours ({id}). Ouvrez le run pour naviguer entre les tours.',

  'tr.cost.label': 'Coût :',
  'tr.cost.tooltip': 'Coût total du LLM rapporté par le fournisseur (USD). Surligné en orange à partir de 0,50 $ sans réponse finale — probablement un run gaspillé.',

  'tr.empty.title': 'Aucune exécution sélectionnée.',
  'tr.empty.hint_html': 'Choisissez une exécution à gauche pour voir sa chronologie étape par étape. Cliquez sur <b>Comparer</b> pour choisir deux exécutions et les voir côte à côte.',

  'tr.compare_mode.title': 'Mode comparaison',
  'tr.compare_mode.picked': 'Choisies {n}/2. Cliquez sur une autre exécution pour compléter la comparaison.',
  'tr.compare_mode.hint': 'Cliquez sur deux exécutions dans la liste pour les comparer côte à côte.',

  'tr.status.label': 'statut',
  'tr.steps.label': 'étapes',
  'tr.step': '{n} étape',
  'tr.steps_plural': '{n} étapes',
  'tr.duration.label': 'durée',
  'tr.intokens.label': 'tokens-entrée',
  'tr.outtokens.label': 'tokens-sortie',
  'tr.tokens_short': '{n} tok',
  'tr.unknown_model': 'inconnu',
  'tr.final_label': 'Final :',

  'tr.deleted': 'Supprimée.',
  'tr.all_deleted': 'Toutes les exécutions supprimées.',
  'tr.select_first': 'Sélectionnez d\'abord une exécution.',
  'tr.confirm_delete': 'Supprimer cette exécution ?',
  'tr.confirm_delete_all': 'Supprimer TOUTES les exécutions enregistrées ? Action irréversible.',

  'tr.event.llm_request': '→ Requête LLM',
  'tr.event.llm_response': '← Réponse LLM',
  'tr.event.vision_sub_call': '👁 sous-appel vision',
  'tr.event.error_kind': '⚠ erreur',
  'tr.event.messages_tools': '{m} messages, {t} outils · {model}',
  'tr.event.screenshot_caption': 'capture',
  'tr.event.screenshot_missing': '(blob de capture manquant)',
  'tr.event.description_truncated': '... [tronqué en vue comparaison]',
  'tr.event.vision_failed': 'sous-appel vision échoué : {error}',
  'tr.event.description': 'description',
  'tr.event.args': 'args',
  'tr.event.result': 'résultat',
  'tr.event.step': 'étape {step}',
};
