{
  "Language": {
    "followSystem": "Suivre le système",
    "english": "Anglais",
    "simplifiedChinese": "Chinois simplifié",
    "traditionalChinese": "Chinois traditionnel",
    "japanese": "Japonais",
    "korean": "Coréen",
    "spanish": "Espagnol",
    "german": "Allemand",
    "french": "Français",
    "portuguese": "Portugais",
    "arabic": "Arabe"
  },
  "GitCredentialDialog": {
    "title": "Authentification requise",
    "description": "Le serveur distant nécessite des identifiants. Entrez votre nom d'utilisateur et votre mot de passe (ou jeton d'accès personnel).",
    "username": "Nom d'utilisateur",
    "usernamePlaceholder": "Nom d'utilisateur ou e-mail",
    "password": "Mot de passe / Jeton",
    "passwordPlaceholder": "Mot de passe ou jeton d'accès personnel",
    "passwordHint": "Entrez le nom d'utilisateur et le mot de passe du serveur.",
    "cancel": "Annuler",
    "authenticate": "Authentifier",
    "authenticating": "Authentification...",
    "invalidCredentials": "Identifiants invalides. Veuillez réessayer.",
    "saveCredentials": "Enregistrer les identifiants pour les opérations futures",
    "githubTitle": "Authentification GitHub",
    "githubDescription": "Entrez un jeton d'accès personnel pour vous connecter à GitHub. Le jeton sera validé et enregistré automatiquement.",
    "githubToken": "Jeton d'accès personnel",
    "githubTokenPlaceholder": "ghp_xxxxxxxxxxxx",
    "githubTokenHint": "Générez un jeton dans GitHub → Settings → Developer settings → Personal access tokens.",
    "githubAuthenticate": "Valider et connecter",
    "generateToken": "Générer un jeton"
  },
  "SettingsShell": {
    "title": "Paramètres",
    "preferences": "Préférences",
    "nav": {
      "general": "Général",
      "appearance": "Apparence",
      "agents": "Agents IA",
      "mcp": "MCP",
      "skills": "Skills",
      "shortcuts": "Raccourcis",
      "version_control": "Contrôle de version",
      "system": "Système",
      "chat_channels": "Canaux de chat",
      "web_service": "Service Web",
      "model_providers": "Fournisseurs de Modèles",
      "experts": "Experts",
      "quick_messages": "Messages rapides"
    }
  },
  "AppearanceSettings": {
    "sectionTitle": "Apparence du thème",
    "sectionDescription": "Choisissez clair, sombre ou suivre le système. Les paramètres sont enregistrés automatiquement.",
    "themeMode": "Mode du thème",
    "placeholder": "Sélectionner le mode du thème",
    "system": "Suivre le système",
    "light": "Clair",
    "dark": "Sombre",
    "currentTheme": "Thème effectif actuel : {theme}",
    "resolvedTheme": {
      "light": "Clair",
      "dark": "Sombre",
      "unknown": "--"
    },
    "themeColor": {
      "sectionTitle": "Couleur du thème",
      "sectionDescription": "Choisissez une palette pour les accents, les boutons et les surlignages.",
      "current": "Couleur actuelle : {color}",
      "options": {
        "neutral": "Neutral",
        "zinc": "Zinc",
        "slate": "Slate",
        "stone": "Stone",
        "gray": "Gray",
        "red": "Red",
        "rose": "Rose",
        "orange": "Orange",
        "green": "Green",
        "blue": "Blue",
        "yellow": "Yellow",
        "violet": "Violet"
      }
    },
    "zoomLevel": {
      "sectionTitle": "Zoom de la fenêtre",
      "sectionDescription": "Met à l'échelle toute l'interface. S'applique immédiatement et est enregistré par appareil.",
      "placeholder": "Sélectionnez le niveau de zoom",
      "default": "Par défaut",
      "current": "Zoom actuel : {zoom}%"
    },
    "fonts": {
      "sectionTitle": "Polices",
      "sectionDescription": "Choisissez les polices pour l’interface, l’éditeur de code et le terminal. Les polices intégrées sont chargées à la demande ; sélectionnez « Personnalisée… » pour utiliser n’importe quelle police installée sur votre système.",
      "interface": "Interface",
      "editor": "Éditeur",
      "terminal": "Terminal",
      "groupSans": "Sans empattement",
      "groupMono": "Monospace",
      "custom": "Personnalisée…",
      "customPlaceholder": "Nom de la police, par ex. Fira Code",
      "fontSize": "Taille de police",
      "ligatures": "Activer les ligatures",
      "ligaturesUnavailable": "Cette police n’a pas de ligatures",
      "terminalLigaturesHint": "Les ligatures du terminal ne s’appliquent qu’aux polices de programmation intégrées.",
      "preview": "Aperçu"
    }
  },
  "SystemSettings": {
    "loading": "Chargement...",
    "sectionTitle": "Gestion du système",
    "sectionDescription": "Gérez le proxy réseau, les mises à jour de l’app et les préférences de langue.",
    "proxyTitle": "Proxy réseau",
    "proxyDescription": "Lorsqu’il est activé, les requêtes réseau suivantes utilisent ce proxy en priorité (y compris le chat ACP, l’installation d’agents et les opérations Git distantes).",
    "loadFailed": "Échec du chargement : {message}",
    "enableProxy": "Activer le proxy système",
    "proxyAddress": "Adresse du proxy",
    "proxyHint": "Prend en charge http(s)/socks5, exemple : {example}. Actif uniquement lorsque le proxy système est activé.",
    "save": "Enregistrer",
    "saving": "Enregistrement...",
    "proxyRequired": "L’URL du proxy est requise lorsque le proxy est activé",
    "saveSuccess": "Les paramètres du proxy système ont été enregistrés",
    "saveFailed": "Échec de l’enregistrement : {message}",
    "languageTitle": "Langue",
    "languageDescription": "Définissez la langue de l’app. En mode système, les langues non prises en charge reviennent à l’anglais.",
    "appLanguage": "Langue de l’app",
    "languageSaveSuccess": "Les paramètres de langue ont été enregistrés",
    "languageSaveFailed": "Échec de l’enregistrement des paramètres de langue : {message}",
    "updateTitle": "Mise à jour de l’app",
    "versionTitle": "Mise à jour logicielle",
    "updateDescription": "Vérifiez les nouvelles versions depuis la source de publication configurée et installez-les directement si disponibles.",
    "currentVersion": "Version actuelle",
    "upgradableVersion": "Dernière version",
    "none": "Aucune",
    "lastChecked": "Dernière vérification : {time}",
    "updateError": "Erreur de mise à jour : {message}",
    "checking": "Vérification...",
    "checkUpdate": "Rechercher les mises à jour",
    "updating": "Installation...",
    "downloading": "Téléchargement...",
    "upgradeTo": "Mettre à jour vers v{version}",
    "viewRelease": "Voir la version v{version}",
    "foundUpdate": "Nouvelle version v{version} trouvée",
    "alreadyLatest": "Vous utilisez déjà la dernière version",
    "checkUpdateFailed": "Échec de la recherche de mises à jour : {message}",
    "installSuccess": "Mise à jour installée. Redémarrage de l’app.",
    "installFailed": "Échec de la mise à jour : {message}",
    "upgradeSuccess": "Mise à niveau terminée. Rechargement...",
    "restartTimeout": "Le serveur n'est pas revenu à temps. Consultez les journaux du conteneur ou du service.",
    "restartingIn": "Redémarrage dans {seconds} s...",
    "waitingForServer": "En attente du retour du serveur...",
    "restartToUpdate": "Redémarrer pour mettre à jour",
    "updateReadyHint": "Mise à jour téléchargée — redémarrez pour l'appliquer.",
    "restarting": "Redémarrage...",
    "dockerUpgradeHint": "Cela met à jour le conteneur en cours d'exécution. La mise à jour est perdue si le conteneur est recréé — pour la conserver, récupérez ou créez une image à la nouvelle version puis recréez le conteneur.",
    "upgradeRolledBack": "Échec de la mise à niveau ; le serveur est revenu à la version précédente.",
    "serverUnreachable": "Impossible de joindre le serveur pour démarrer la mise à niveau. Vérifiez qu'il fonctionne et réessayez.",
    "rollbackButton": "Revenir en arrière",
    "rollingBack": "Restauration...",
    "rollbackDescription": "Restaure la version installée avant la dernière mise à niveau.",
    "rollbackConfirmTitle": "Revenir à la version précédente ?",
    "rollbackConfirmDescription": "Le serveur redémarrera sur la version installée avant la dernière mise à niveau. Une version plus récente reste disponible à la réinstallation.",
    "rollbackConfirm": "Revenir en arrière",
    "rollbackCancel": "Annuler",
    "rollbackSuccess": "Retour à la version précédente. Rechargement...",
    "rollbackFailed": "Échec du retour en arrière. Consultez les journaux du serveur.",
    "updateErrors": {
      "sourceUnavailable": "Impossible d’atteindre la source de mise à jour. Vérifiez votre réseau ou proxy et réessayez.",
      "network": "La connexion réseau a échoué. Vérifiez votre réseau ou proxy et réessayez.",
      "downloadFailed": "Impossible de télécharger le paquet de mise à jour. Veuillez réessayer plus tard.",
      "installFailed": "Impossible d’installer la mise à jour. Fermez l’app puis réessayez.",
      "unknown": "La mise à jour a échoué. Veuillez réessayer plus tard."
    }
  },
  "VersionControlSettings": {
    "loading": "Chargement...",
    "sectionTitle": "Contrôle de version",
    "sectionDescription": "Configurez l'exécutable Git et gérez les comptes GitHub.",
    "gitTitle": "Configuration Git",
    "gitDescription": "Configurez l'exécutable Git utilisé par l'application.",
    "gitDetected": "Git détecté",
    "gitNotFound": "Git introuvable sur le système",
    "gitVersion": "Version",
    "gitPath": "Chemin",
    "customGitPath": "Chemin Git personnalisé",
    "customGitPathPlaceholder": "/usr/bin/git",
    "customGitPathHint": "Laissez vide pour utiliser le chemin détecté automatiquement.",
    "test": "Tester",
    "testing": "Test en cours...",
    "testSuccess": "L'exécutable Git est valide.",
    "testFailed": "Test Git échoué : {message}",
    "save": "Enregistrer",
    "saving": "Enregistrement...",
    "saveSuccess": "Paramètres Git enregistrés.",
    "saveFailed": "Échec de l'enregistrement : {message}",
    "githubTitle": "Comptes GitHub",
    "githubDescription": "Gérez les comptes GitHub pour l'authentification. Les jetons sont stockés localement.",
    "noAccounts": "Aucun compte GitHub configuré.",
    "addAccount": "Ajouter un compte",
    "serverUrl": "URL du serveur",
    "serverUrlPlaceholder": "https://github.com",
    "token": "Jeton d'accès personnel",
    "tokenPlaceholder": "ghp_xxxxxxxxxxxx",
    "generateToken": "Générer un jeton",
    "tokenHint": "Générez un jeton dans GitHub → Settings → Developer settings → Personal access tokens.",
    "validateAndAdd": "Valider et ajouter",
    "validating": "Validation...",
    "addSuccess": "Compte {username} ajouté avec succès.",
    "addFailed": "Échec de l'ajout du compte : {message}",
    "testConnection": "Tester",
    "connectionSuccess": "Connexion réussie.",
    "connectionFailed": "Échec de la connexion : {message}",
    "setDefault": "Définir par défaut",
    "defaultLabel": "Par défaut",
    "defaultSet": "Compte par défaut mis à jour.",
    "removeAccount": "Supprimer",
    "removeConfirmTitle": "Supprimer le compte",
    "removeConfirmMessage": "Êtes-vous sûr de vouloir supprimer le compte « {username} » ?",
    "removeConfirm": "Supprimer",
    "removeCancel": "Annuler",
    "removeSuccess": "Compte supprimé.",
    "scopes": "Portées",
    "loadFailed": "Échec du chargement des paramètres : {message}",
    "gitAccount": {
      "sectionTitle": "Comptes serveur Git",
      "sectionDescription": "Gérez les identifiants pour les serveurs Git non GitHub (GitLab, Bitbucket, auto-hébergé, etc.).",
      "noAccounts": "Aucun compte de serveur Git configuré.",
      "addAccount": "Ajouter un compte",
      "addTitle": "Ajouter un compte Git",
      "addDescription": "Entrez l'adresse du serveur, le nom d'utilisateur et le mot de passe ou jeton d'accès.",
      "serverUrl": "URL du serveur",
      "serverUrlPlaceholder": "https://gitlab.example.com",
      "username": "Nom d'utilisateur",
      "usernamePlaceholder": "Nom d'utilisateur ou e-mail",
      "password": "Mot de passe / Jeton",
      "passwordPlaceholder": "Mot de passe ou jeton d'accès",
      "passwordHint": "Entrez le mot de passe ou le jeton d'accès du serveur.",
      "add": "Ajouter",
      "serverRequired": "L'URL du serveur est requise.",
      "usernameRequired": "Le nom d'utilisateur est requis.",
      "passwordRequired": "Le mot de passe est requis."
    }
  },
  "ShortcutSettings": {
    "sectionTitle": "Raccourcis",
    "resetDefault": "Rétablir les valeurs par défaut",
    "recordInstruction": "Cliquez sur le bouton à droite, puis appuyez sur une combinaison de touches. Utilisez Ctrl/Cmd, Alt et Shift. Appuyez sur Échap pour annuler l’enregistrement.",
    "recording": "Appuyez sur un raccourci...",
    "toasts": {
      "conflict": "Le raccourci est déjà utilisé par \"{title}\"",
      "updated": "Raccourci mis à jour",
      "invalid": "Raccourci invalide, veuillez réessayer",
      "reset": "Les raccourcis par défaut ont été restaurés"
    },
    "actions": {
      "toggle_search": {
        "title": "Ouvrir la recherche",
        "description": "Afficher ou masquer le panneau de recherche de conversations"
      },
      "toggle_sidebar": {
        "title": "Basculer la barre latérale gauche",
        "description": "Afficher ou masquer la barre latérale de liste des conversations"
      },
      "toggle_terminal": {
        "title": "Basculer le terminal",
        "description": "Afficher ou masquer le panneau terminal inférieur"
      },
      "new_terminal_tab": {
        "title": "Nouveau terminal",
        "description": "Créer un nouvel onglet terminal lorsque le terminal a le focus"
      },
      "close_current_terminal_tab": {
        "title": "Fermer le terminal actuel",
        "description": "Fermer l’onglet terminal actuel lorsque le terminal a le focus"
      },
      "toggle_aux_panel": {
        "title": "Basculer le panneau droit",
        "description": "Afficher ou masquer le panneau d’informations auxiliaires"
      },
      "new_conversation": {
        "title": "Nouvelle conversation",
        "description": "Créer un nouvel onglet de conversation dans le dossier actuel"
      },
      "open_folder": {
        "title": "Ouvrir un dossier",
        "description": "Ouvrir le sélecteur de dossier et ouvrir dans une nouvelle fenêtre"
      },
      "open_settings": {
        "title": "Ouvrir les paramètres",
        "description": "Ouvrir la fenêtre des paramètres"
      },
      "close_current_tab": {
        "title": "Fermer l’onglet actuel",
        "description": "Fermer la conversation actuelle ou l’onglet de fichier"
      },
      "close_all_file_tabs": {
        "title": "Fermer tous les onglets de fichiers",
        "description": "Fermer tous les onglets de fichiers ouverts lorsque le panneau de fichiers est actif"
      },
      "next_tab": {
        "title": "Onglet suivant",
        "description": "Passer à l'onglet de conversation ou de fichier suivant"
      },
      "prev_tab": {
        "title": "Onglet précédent",
        "description": "Passer à l'onglet de conversation ou de fichier précédent"
      },
      "send_message": {
        "title": "Envoyer le message",
        "description": "Envoyer le message actuel dans la zone de saisie"
      },
      "newline_in_message": {
        "title": "Retour à la ligne",
        "description": "Insérer un retour à la ligne dans la zone de saisie"
      }
    }
  },
  "SkillsSettings": {
    "title": "Skills",
    "description": "Sélectionnez une Skill à gauche. À droite, un aperçu Markdown s’affiche par défaut ; passez en édition pour modifier et enregistrer.",
    "loadingAgents": "Chargement des agents qui prennent en charge les Skills...",
    "emptyNoManageableAgents": "Aucun agent disponible pour la gestion des Skills.",
    "managedTarget": "Cible gérée",
    "selectAgentPlaceholder": "Sélectionnez un agent",
    "searchPlaceholder": "Rechercher par nom / ID / chemin...",
    "skillsList": "Liste des Skills",
    "loadingSkills": "Chargement des Skills...",
    "agentNotSupported": "L’agent actuel ne prend pas en charge la gestion des Skills.",
    "emptySkills": "Aucune Skill pour le moment. Cliquez sur « Nouvelle Skill » pour en créer une.",
    "newSkillTitle": "Nouvelle Skill",
    "skillInfo": "Infos de la Skill",
    "skillIdPlaceholder": "skill-id (lettres/chiffres/-/_/.)",
    "skillsDirectoryWithPath": "Répertoire des Skills : {path}",
    "skillsDirectoryNeedId": "Répertoire des Skills : saisissez l’ID de Skill pour générer le chemin complet",
    "markdownContent": "Contenu Markdown",
    "editingStatus": "Édition",
    "previewStatus": "Aperçu",
    "contentPlaceholder": "Saisissez le contenu Markdown de la Skill...",
    "metadataTitle": "Métadonnées des Skills",
    "onlyYamlMetadata": "Cette Skill contient uniquement des métadonnées YAML.",
    "emptyContentHint": "Aucun contenu pour le moment. Cliquez sur « Éditer » pour commencer.",
    "loadingSkill": "Chargement de la Skill...",
    "emptyNoAgents": "Aucun agent disponible.",
    "noSelectionHint": "Sélectionnez un Skill à gauche ou cliquez sur « Nouveau Skill » pour en créer un.",
    "systemBadge": "Système",
    "systemHint": "Skill intégré du CLI · lecture seule",
    "scope": {
      "global": "Global",
      "folder": "Dossier",
      "selectFolderPlaceholder": "Sélectionner un dossier",
      "noFolders": "Aucun dossier trouvé",
      "pickFolderHint": "Sélectionnez un dossier pour afficher ses Skills."
    },
    "actions": {
      "preview": "Aperçu",
      "edit": "Éditer",
      "openInWindow": "Ouvrir dans une nouvelle fenêtre",
      "delete": "Supprimer",
      "deleting": "Suppression...",
      "refresh": "Actualiser",
      "newSkill": "Nouvelle Skill",
      "reset": "Réinitialiser",
      "save": "Enregistrer",
      "saving": "Enregistrement...",
      "cancel": "Annuler"
    },
    "deleteDialog": {
      "title": "Supprimer la Skill",
      "confirm": "Supprimer la Skill actuelle ? Cette action est irréversible.",
      "confirmWithNamePrefix": "Supprimer la Skill",
      "confirmWithNameSuffix": "? Cette action est irréversible."
    },
    "toasts": {
      "loadFailed": "Échec du chargement de la Skill",
      "openFolderFailed": "Échec de l’ouverture du dossier",
      "noSkillDirectory": "Aucun répertoire de Skills disponible pour l’agent actuel",
      "nameRequired": "Le nom de la Skill ne peut pas être vide",
      "updated": "Skill mise à jour",
      "created": "Skill créée",
      "saveFailed": "Échec de l’enregistrement de la Skill",
      "deleted": "Skill supprimée",
      "deleteFailed": "Échec de la suppression de la Skill"
    },
    "templates": {
      "gemini": "---\nname: example-skill\ndescription: Describe when this skill should be used.\n---\n\n# Skill Name\n\nInstructions for the agent when this skill is active.\n\n## Workflow\n\n1. Add actionable step one.\n2. Add actionable step two.\n",
      "openCode": "---\nname: example-skill\ndescription: Describe when this skill should be used.\n---\n\n# Purpose\n\nDescribe what this skill helps with.\n\n# Steps\n\n1. Add actionable step one.\n2. Add actionable step two.\n",
      "openClaw": "---\nname: example-skill\ndescription: Describe when this skill should be used.\nuser-invocable: true\ndisable-model-invocation: false\n---\n\n# Purpose\n\nDescribe what this skill helps with.\n\n# Instructions\n\n1. Add actionable instruction one.\n2. Add actionable instruction two.\n",
      "default": "---\nname: example-skill\ndescription: Describe when this skill should be used.\n---\n\n# Skill: example-skill\n\n## When to use\n\n- Describe trigger conditions.\n\n## Instructions\n\n1. Add actionable instruction one.\n2. Add actionable instruction two.\n"
    }
  },
  "McpSettings": {
    "loading": "Chargement...",
    "summary": {
      "missingCommand": "(commande manquante)",
      "missingUrl": "(URL manquante)"
    },
    "protocol": {
      "stdio": "Stdio"
    },
    "errors": {
      "selectInstallProtocol": "Veuillez sélectionner un protocole d’installation",
      "fieldRequired": "{field} est requis",
      "fieldNeedsBoolean": "{field} doit être true ou false",
      "fieldNeedsNumber": "{field} doit être un nombre",
      "fieldNeedsInteger": "{field} doit être un entier",
      "fieldInvalidJson": "{field} contient un JSON invalide : {message}",
      "fieldOutOfRange": "La valeur de {field} est hors de la plage autorisée",
      "jsonEmpty": "{name} ne peut pas être vide",
      "jsonInvalid": "{name} n’est pas un JSON valide : {message}",
      "jsonMustBeObject": "{name} doit être un objet JSON",
      "specMustBeObject": "La configuration MCP doit être un objet JSON.",
      "missingType": "Le champ type est manquant dans la configuration MCP. Indiquez stdio, http (alias : streamable-http, streamableHttp) ou sse.",
      "unsupportedType": "Type MCP non pris en charge {type}. Pris en charge : stdio, http (alias : streamable-http, streamableHttp), sse.",
      "codexEntryUnsupportedType": "L’entrée MCP Codex {id} a un type non pris en charge {type}. Pris en charge : stdio, http (alias : streamable-http, streamableHttp), sse.",
      "unsupportedTransportType": "Type de transport non pris en charge {type}. Pris en charge : http (alias : streamable-http, streamableHttp), sse.",
      "stdioCommandRequired": "Un MCP stdio nécessite un champ command non vide.",
      "remoteUrlRequired": "Un MCP distant nécessite un champ url non vide.",
      "appsRequired": "Sélectionnez au moins une application cible."
    },
    "jsonNames": {
      "localConfig": "Configuration MCP",
      "installConfig": "Configuration d’installation"
    },
    "toasts": {
      "uninstalled": "MCP désinstallé",
      "uninstallFailed": "Échec de la désinstallation : {message}",
      "selectAtLeastOneApp": "Veuillez sélectionner au moins une application cible",
      "saveSuccess": "Enregistré",
      "saveFailed": "Échec de l’enregistrement : {message}",
      "installed": "{name} installé",
      "installFailed": "Échec de l’installation : {message}",
      "serverIdRequired": "L'ID du serveur est requis",
      "serverIdExists": "Le Server ID \"{id}\" existe déjà. Modifiez l'entrée existante ou choisissez un autre nom.",
      "created": "MCP créé"
    },
    "installDialog": {
      "title": "Confirmer l’installation MCP",
      "descriptionWithName": "Installer {name} dans la configuration locale.",
      "description": "Sélectionnez les applications cibles pour l’installation.",
      "protocol": "Protocole",
      "selectProtocol": "Sélectionner un protocole",
      "parameters": "Paramètres de configuration",
      "booleanPlaceholder": "Veuillez sélectionner true/false",
      "selectOneValue": "Sélectionner une valeur",
      "targetApps": "Applications cibles"
    },
    "actions": {
      "cancel": "Annuler",
      "confirmInstall": "Confirmer l’installation",
      "installing": "Installation",
      "uninstall": "Désinstaller",
      "uninstalling": "Désinstallation",
      "viewDetails": "Voir les détails",
      "save": "Enregistrer",
      "saving": "Enregistrement",
      "install": "Installer",
      "refresh": "Actualiser",
      "newMcp": "Nouveau MCP",
      "create": "Créer",
      "creating": "Création..."
    },
    "tabs": {
      "local": "MCP local",
      "market": "Marketplace MCP"
    },
    "local": {
      "filterPlaceholder": "Filtrer les MCP locaux...",
      "loadFailed": "Échec du chargement : {message}",
      "empty": "Aucun MCP local détecté.",
      "description": "La configuration MCP locale peut être modifiée et enregistrée directement.",
      "enabledApps": "Applications activées",
      "configJson": "Configuration MCP (JSON)",
      "draftTitle": "Nouveau MCP",
      "draftDescription": "Renseignez un Server ID et une configuration pour créer un serveur MCP local.",
      "serverIdLabel": "Server ID",
      "serverIdPlaceholder": "Server ID (ex. my-mcp)",
      "typeHint": "Types pris en charge : stdio, http (alias : streamable-http, streamableHttp), sse. env n'est utilisé que par stdio ; pour les MCP distants, utilisez headers pour transporter les jetons d'authentification.",
      "envOnRemoteWarning": "env détecté sur un MCP distant. Seul stdio utilise env ; les MCP distants transportent les jetons d'authentification via headers, donc env sera ignoré à l'enregistrement."
    },
    "market": {
      "selectMarketplace": "Sélectionner un marketplace",
      "searchPlaceholder": "Rechercher MCP...",
      "searchFailed": "Échec de la recherche : {message}",
      "loadingList": "Chargement de la liste MCP...",
      "empty": "Aucun résultat MCP.",
      "loadingDetail": "Chargement des détails du marketplace...",
      "detailLoadFailed": "Échec du chargement des détails : {message}",
      "owner": "Propriétaire : {owner}",
      "namespace": "Espace de noms : {namespace}",
      "defaultInstallProtocol": "Protocole d’installation par défaut",
      "currentOptionParameterCount": "Nombre de paramètres de l’option actuelle : {count}",
      "installConfigDescription": "Configuration d’installation (JSON, modifiable avant installation ; les modifications remplaceront le formulaire protocole/paramètres)",
      "selectLeftToView": "Sélectionnez un MCP du marketplace à gauche pour voir les détails."
    },
    "badges": {
      "verified": "Vérifié",
      "remote": "Distant",
      "hasHomepage": "A une page d’accueil",
      "uses": "{count} utilisations",
      "deployed": "Déployé",
      "notDeployed": "Non déployé"
    },
    "selectLeftMcp": "Sélectionnez un MCP à gauche."
  },
  "AcpAgentSettings": {
    "title": "Gestion du SDK des agents",
    "description": "Gérez en un seul endroit la connexion SDK des agents, l'état activé, les variables d'environnement, la gestion de configuration et les informations de préflight de version.",
    "loadingAgents": "Chargement de la liste des agents...",
    "agentList": "Liste des agents",
    "emptyNoAgent": "Aucun agent disponible.",
    "configManagement": "Gestion de configuration",
    "envVars": "Variables d'environnement",
    "nativeJsonConfig": "Configuration JSON native",
    "modelHintDefault": "Laissez vide pour utiliser le modèle système par défaut.",
    "generalConfigDescriptionClaude": "Prend en charge la configuration rapide de l'API URL, API Key et des modèles Claude, et synchronise avec la configuration JSON native.",
    "generalConfigDescriptionDefault": "Prend en charge les entrées de configuration importantes (API URL, API Key, Model) et la gestion de la configuration JSON native.",
    "multiAgent": {
      "title": "Collaboration multi-agent",
      "description": "Permet aux agents actifs de déléguer des sous-tâches à d’autres agents.",
      "enable": "Activer la délégation",
      "enableHint": "Lorsque cette option est désactivée, l’outil delegate_to_agent est masqué du catalogue d’outils MCP de l’agent.",
      "depthLimit": "Profondeur maximale de délégation",
      "depthHint": "Plage autorisée : {min}–{max}. Limite la profondeur de récursion d’une chaîne de délégation (racine → enfant → petit-enfant …).",
      "completedCacheLabel": "Cache des résultats terminés (MB)",
      "completedCacheHint": "Cache en mémoire des résultats terminés des sous-agents, conservé uniquement tant que la session de délégation est en cours et libéré automatiquement à la fin de cette session. Au-delà de ce budget, les résultats les plus anciens sont supprimés de la mémoire en premier (toujours consultables dans la session du sous-agent) ; 0 = illimité (libéré quand même à la fin de la session).",
      "save": "Enregistrer",
      "saving": "Enregistrement…",
      "saved": "Paramètres de délégation enregistrés",
      "saveFailed": "Échec de l’enregistrement des paramètres de délégation",
      "loadFailed": "Échec du chargement des paramètres de délégation : {detail}",
      "tabGeneral": "Général",
      "tabAgentDefaults": "Valeurs par défaut du sous-agent",
      "agentDefaultsDescription": "Remplacements par agent appliqués lorsque la Collaboration multi-agent démarre un sous-agent pour un appel de délégation. Les options affichées proviennent d’une sonde en direct : votre sélection correspond exactement à ce que l’agent acceptera.",
      "probing": "Chargement des options disponibles depuis l’agent…",
      "probeFailed": "Échec du chargement des options : {detail}",
      "retry": "Réessayer",
      "noConfigAvailable": "Cet agent n’a aucune option configurable.",
      "modeLabel": "Mode",
      "agentDefaultHint": "Valeur par défaut de l’agent : {value}",
      "defaultOptionLabel": "Par défaut ({value})"
    },
    "actions": {
      "dragSort": "Glisser pour réordonner",
      "dragSortAgent": "Glisser pour réordonner {name}",
      "refreshCheck": "Actualiser la vérification",
      "refreshCheckAgent": "Actualiser la vérification de {name}",
      "clickEnable": "Cliquer pour activer {name}",
      "clickDisable": "Cliquer pour désactiver {name}",
      "install": "Installer",
      "upgrade": "Mettre à niveau",
      "uninstall": "Désinstaller",
      "uninstalling": "Désinstallation...",
      "saveEnvVars": "Enregistrer les variables d’environnement",
      "saving": "Enregistrement...",
      "saveCodexConfig": "Enregistrer la config Codex",
      "saveGeminiConfig": "Enregistrer la config Gemini",
      "saveOpenCodeConfig": "Enregistrer la config OpenCode",
      "saveOpenClawConfig": "Enregistrer la config OpenClaw",
      "saveConfigManagement": "Enregistrer la gestion de config",
      "saveCurrentProvider": "Enregistrer le provider actuel",
      "showApiKey": "Afficher la clé API",
      "hideApiKey": "Masquer la clé API",
      "showKey": "Afficher la clé",
      "hideKey": "Masquer la clé",
      "showToken": "Afficher le token",
      "hideToken": "Masquer le token",
      "cancel": "Annuler",
      "delete": "Supprimer",
      "deleting": "Suppression...",
      "confirmDelete": "Confirmer la suppression",
      "confirmUninstall": "Confirmer la désinstallation",
      "saveClineConfig": "Enregistrer la configuration Cline",
      "saveHermesConfig": "Enregistrer la configuration Hermes",
      "customInstall": "Installation personnalisée"
    },
    "status": {
      "enabled": "Activé",
      "disabled": "Désactivé",
      "unchecked": "Non vérifié",
      "agentEnabledAria": "{name} activé",
      "agentEnabledSwitch": "Interrupteur d’activation {name}"
    },
    "preflight": {
      "count": "Éléments de pré-vérification : {count}",
      "notRun": "Les vérifications n’ont pas encore été exécutées."
    },
    "codex": {
      "configDescription": "Prend en charge la configuration rapide de l’URL API, de la clé API, du nom du modèle et du reasoning effort, avec synchronisation vers `auth.json` / `config.toml`.",
      "authMode": "Mode d’authentification",
      "chatgptSubscription": "Abonnement officiel",
      "chatgptSubscriptionHint": "Connectez-vous avec l’abonnement officiel ChatGPT, pas besoin d’API Key",
      "apiKeyHint": "Connectez-vous avec une API Key à OpenAI ou aux services API compatibles",
      "selectProvider": "Sélectionner un provider",
      "modelName": "Nom du modèle",
      "selectReasoningEffort": "Sélectionner Reasoning Effort",
      "enableWebsocket": "Activer WebSocket",
      "enableWebsocketAria": "Activer WebSocket pour Codex Provider",
      "enableSkills": "Activer Skills",
      "enableSkillsAria": "Activer Skills pour Codex",
      "enableFast": "Activer Fast",
      "enableFastAria": "Activer le niveau de service Fast pour Codex",
      "authJsonNative": "auth.json (natif)",
      "configTomlNative": "config.toml (natif)",
      "loginButton": "Se connecter avec ChatGPT",
      "loginRequesting": "Demande du code de connexion...",
      "loginStep1": "Ouvrez l'URL suivante dans votre navigateur :",
      "loginStep2": "Entrez le code ci-dessous :",
      "loginPolling": "En attente d'autorisation...",
      "loginCancel": "Annuler",
      "loginSuccess": "Connexion réussie, configuration enregistrée !",
      "loginFailed": "Échec de la connexion : {message}",
      "loginRetry": "Réessayer",
      "loginCodeCopied": "Code copié",
      "loggedIn": "Compte connecté",
      "loginRelogin": "Reconnecter / Changer de compte",
      "loginTimeout": "Connexion expirée, veuillez réessayer",
      "loginSaveFailed": "Connexion réussie mais échec de la sauvegarde de la configuration"
    },
    "gemini": {
      "authConfig": "Configuration d’authentification Gemini",
      "authConfigDescription": "Alignée sur la documentation d’authentification Gemini CLI, avec prise en charge d’un endpoint personnalisé, connexion Google, Gemini API Key et Vertex AI (ADC / compte de service / API Key).",
      "authMode": "Mode d’authentification",
      "selectAuthMode": "Sélectionner un mode d’authentification",
      "viewAuthDoc": "Voir la documentation d’authentification",
      "mode": {
        "custom": "Endpoint personnalisé",
        "loginGoogle": "Connexion Google (OAuth)",
        "vertexServiceAccount": "Vertex AI (Compte de service)"
      },
      "hint": {
        "custom": "Renseignez API URL, API Key et Model, mappés sur GOOGLE_GEMINI_BASE_URL / GEMINI_API_KEY / GEMINI_MODEL.",
        "loginGoogle": "Exécutez d’abord gemini dans le terminal et terminez la connexion Google ; la clé API n’est pas requise.",
        "geminiApiKey": "Renseignez GEMINI_API_KEY lors de l’utilisation de l’API Gemini.",
        "vertexAdc": "Utilisez gcloud ADC ; GOOGLE_CLOUD_PROJECT et GOOGLE_CLOUD_LOCATION sont recommandés.",
        "vertexServiceAccount": "Définissez le chemin JSON du compte de service dans GOOGLE_APPLICATION_CREDENTIALS.",
        "vertexApiKey": "Renseignez GOOGLE_API_KEY lors de l’utilisation d’une clé API Vertex AI."
      }
    },
    "openCode": {
      "configManagement": "Gestion de configuration OpenCode",
      "configDescription": "Alignée sur le schéma `provider` d’OpenCode, prend en charge la gestion multi-provider et la synchronisation bidirectionnelle avec les fichiers JSON natifs.",
      "providerManagement": "Gestion des providers",
      "providerCount": "{count} fournisseurs",
      "addProvider": "Ajouter un provider",
      "emptyProvider": "Aucun provider pour le moment. Saisissez un ID puis cliquez sur « Ajouter un provider ».",
      "providerEnabledState": "État activé de {providerId}",
      "selectProviderNpm": "Sélectionner provider.npm",
      "modelManagement": "Gestion des modèles",
      "modelCount": "{count} modèles",
      "modelDescription": "Aligné sur `provider.models` d’OpenCode. La gestion rapide prend actuellement en charge `name` / `id` ; les autres champs avancés sont conservés et peuvent être modifiés dans le JSON natif ci-dessous.",
      "addModel": "Ajouter un modèle",
      "emptyModel": "Aucun modèle pour le moment. Saisissez model id puis cliquez sur « Ajouter un modèle ».",
      "modelId": "ID du modèle",
      "modelName": "Nom du modèle",
      "deleteModel": "Supprimer le modèle {modelId}",
      "nativeJsonConfig": "Configuration JSON native OpenCode",
      "mainModel": "Modèle principal",
      "smallModel": "Petit modèle",
      "noMatchingModels": "Aucun modèle correspondant"
    },
    "openClaw": {
      "gatewayConfig": "Configuration Gateway",
      "gatewayDescription": "Configure la connexion OpenClaw Gateway. Prend en charge une gateway locale ou distante.",
      "gatewayUrlHint": "Laisser vide pour utiliser gateway.remote.url depuis la configuration locale openclaw.",
      "gatewayTokenPlaceholder": "Token d’authentification Gateway",
      "gatewayTokenHint": "Utilisez token-file plutôt qu’un token en clair si possible ; configurez-le via le CLI openclaw.",
      "sessionKeyHint": "Optionnel. Spécifie la session key de la gateway ; laisser vide pour auto-attribuer une session isolée."
    },
    "hermes": {
      "configManagement": "Configuration de Hermes",
      "configDescription": "Hermes gère ses propres identifiants dans ~/.hermes/.env et ses paramètres dans ~/.hermes/config.yaml. Choisissez un fournisseur, puis définissez la clé d'API et le modèle — codeg écrit les deux fichiers pour vous.",
      "providerLabel": "Fournisseur",
      "providerHint": "Le fournisseur détermine quelle variable de clé d'API et quel model.provider Hermes utilise. Les fournisseurs OAuth se configurent via la configuration du terminal ci-dessous.",
      "groupApiKey": "Fournisseurs avec clé API",
      "groupOauth": "Fournisseurs OAuth",
      "groupAws": "AWS",
      "apiKeyHint": "Enregistrée dans ~/.hermes/.env. Elle n'est jamais injectée dans le processus — Hermes la lit depuis sa propre configuration.",
      "modelName": "Modèle",
      "oauthHint": "Ce fournisseur utilise OAuth. Exécutez la configuration ci-dessous pour vous authentifier dans votre terminal.",
      "awsHint": "Bedrock utilise vos identifiants AWS (environnement ou configuration partagée). Définissez l'ID du modèle ci-dessus et configurez l'accès AWS dans votre environnement.",
      "unsupportedProvider": "Ce fournisseur n'est pas modifiable via les champs structurés. Utilisez l'éditeur config.yaml ci-dessous ou la configuration par terminal.",
      "setupTitle": "Configuration autogérée",
      "setupHint": "La configuration interactive de Hermes nécessite un terminal. Lancez-la ci-dessous ou copiez la commande pour l'exécuter vous-même.",
      "runSetup": "Exécuter la configuration de Hermes",
      "configureModel": "Configurer le modèle",
      "openConfigFolder": "Ouvrir ~/.hermes",
      "copyCommand": "Copier la commande",
      "commandCopied": "Commande copiée dans le presse-papiers",
      "advancedTitle": "Avancé : modifier config.yaml",
      "rawConfigHint": "Modifiez directement ~/.hermes/config.yaml. Enregistrer ici écrase le fichier tel quel.",
      "saveRawConfig": "Enregistrer config.yaml"
    },
    "authModeOfficialSubscription": "Abonnement officiel",
    "authModeCustomEndpoint": "Endpoint personnalisé",
    "authModeCustomEndpointHint": "Configurer manuellement l'URL API et la clé API pour un endpoint personnalisé.",
    "authModeModelProvider": "Fournisseur de modèle",
    "modelProvider": "Fournisseur de modèle",
    "modelProviderHint": "Utiliser l'URL API, la clé API et le modèle d'un fournisseur de modèle configuré.",
    "selectModelProvider": "Sélectionner un fournisseur de modèle",
    "noModelProviderAvailable": "Aucun fournisseur de modèle configuré pour cet agent. Allez dans les paramètres des fournisseurs de modèle pour en ajouter un.",
    "claude": {
      "authMode": "Mode d'authentification",
      "officialSubscription": "Abonnement officiel",
      "officialSubscriptionHint": "Utiliser l'abonnement officiel Anthropic, pas de clé API requise.",
      "mainModel": "Modèle principal",
      "reasoningModel": "Modèle de raisonnement (thinking)",
      "haikuDefaultModel": "Modèle Haiku par défaut",
      "sonnetDefaultModel": "Modèle Sonnet par défaut",
      "opusDefaultModel": "Modèle Opus par défaut",
      "effortLevel": "Niveau de raisonnement",
      "effortLevelDefault": "Niveau par défaut",
      "effortLevel_low": "Bas",
      "effortLevel_medium": "Moyen",
      "effortLevel_high": "Élevé",
      "effortLevel_xhigh": "Très Élevé"
    },
    "dialogs": {
      "confirmDeleteProvider": "Supprimer le provider {providerId} ?",
      "confirmDeleteProviderDescription": "La configuration OpenCode et auth JSON seront mises à jour ensemble. Cette action est irréversible.",
      "confirmUninstall": "Désinstaller {name} ?",
      "confirmUninstallDescription": "Cela supprime la version installée localement. Vous pouvez réinstaller plus tard.",
      "customInstallTitle": "Installation personnalisée de {name}",
      "customInstallDescription": "Saisissez la version à installer. Cela réinstalle et remplace la version actuellement installée.",
      "customInstallVersionLabel": "Numéro de version",
      "customInstallInvalid": "Saisissez un numéro de version valide, par ex. 1.2.3.",
      "customInstallSubmit": "Installer"
    },
    "errors": {
      "nativeJsonMustBeObject": "La configuration JSON native doit être un objet",
      "nativeJsonInvalid": "Erreur de format de configuration JSON native : {message}",
      "openCodeAuthMustBeObject": "OpenCode auth.json doit être un objet JSON",
      "openCodeAuthInvalid": "Erreur de format OpenCode auth.json : {message}",
      "authMustBeObject": "auth.json doit être un objet JSON",
      "authInvalid": "Erreur de format auth.json : {message}",
      "providerIdPattern": "L’ID du provider n’accepte que lettres, chiffres, underscore, point et tiret",
      "providerExists": "Le provider {providerId} existe déjà",
      "modelIdPattern": "L’ID du modèle n’accepte que lettres, chiffres, underscore, point, deux-points et tiret",
      "modelExists": "Le modèle {modelId} existe déjà"
    },
    "warnings": {
      "nativeJsonRecoveredStructured": "La configuration JSON native est invalide ; réinitialisée en configuration structurée",
      "nativeJsonRecoveredOpenCode": "La configuration JSON native est invalide ; réinitialisée en configuration structurée OpenCode",
      "openCodeAuthRecovered": "OpenCode auth.json est invalide ; réinitialisé en configuration par défaut",
      "authRecoveredStructured": "auth.json est invalide ; réinitialisé en configuration structurée"
    },
    "toasts": {
      "agentActionCompleted": "{name} {action} terminé",
      "agentActionFailed": "{name} {action} échoué",
      "localVersion": "Version locale : {version}",
      "installCompletedVersionLater": "Installation terminée, la version sera mise à jour à la prochaine vérification",
      "uninstallCompleted": "Désinstallation de {name} terminée",
      "uninstallFailed": "Échec de la désinstallation de {name}",
      "localVersionRemoved": "Version locale supprimée",
      "saveAgentOrderFailed": "Échec de l’enregistrement de l’ordre des agents",
      "saveAgentSwitchFailed": "Échec de l’enregistrement du switch agent",
      "saveEnvFailed": "Échec de l’enregistrement des variables d’environnement",
      "codexSaved": "Configuration Codex enregistrée",
      "saveCodexNativeFailed": "Échec de l’enregistrement de la configuration native Codex",
      "geminiSaved": "Configuration Gemini enregistrée",
      "saveGeminiFailed": "Échec de l’enregistrement de la configuration Gemini",
      "providerDeleted": "Provider {providerId} supprimé",
      "providerDeleteFailed": "Échec de suppression du provider {providerId}",
      "providerSaved": "Provider {providerId} enregistré",
      "saveProviderFailed": "Échec d’enregistrement du provider {providerId}",
      "openCodeConfigSynced": "La configuration OpenCode et auth JSON ont été synchronisés.",
      "openCodeSaved": "Configuration OpenCode enregistrée",
      "saveOpenCodeFailed": "Échec de l’enregistrement de la configuration OpenCode",
      "openClawSaved": "Configuration OpenClaw enregistrée",
      "saveOpenClawFailed": "Échec de l’enregistrement de la configuration OpenClaw",
      "configSaved": "Configuration enregistrée",
      "configSavedHint": "Les sessions existantes doivent être rouvertes pour prendre effet",
      "saveConfigManagementFailed": "Échec de l’enregistrement de la gestion de configuration",
      "clineSaved": "Configuration Cline enregistrée",
      "saveClineFailed": "Échec de l'enregistrement de la configuration Cline",
      "hermesSaved": "Configuration Hermes enregistrée",
      "saveHermesFailed": "Échec de l'enregistrement de la configuration Hermes",
      "modelProviderRequired": "Veuillez sélectionner un fournisseur de modèle avant d'enregistrer.",
      "affectedRunningSessions": "{count, plural, one {# session active doit se reconnecter pour appliquer la modification} other {# sessions actives doivent se reconnecter pour appliquer la modification}}"
    },
    "version": {
      "statusLabel": "Statut de version",
      "notInstalled": "Non installé",
      "remoteLocal": "Distant : {remoteVersion} · Local : {localVersion}",
      "platformUnsupported": "{versionText}. La plateforme actuelle ne prend pas en charge cet agent.",
      "uvxNotReady": "{versionText}. Le runtime uv n'est pas installé — installez-le depuis la vérification uv ci-dessous pour utiliser cet agent.",
      "clickInstall": "{versionText}. Cliquez sur Installer à droite.",
      "localUnrecognized": "{versionText}. La version locale n’est pas comparable ; essayez une mise à niveau pour écraser l’installation.",
      "upgradeAvailable": "{versionText}. Mise à niveau disponible.",
      "remoteUnavailable": "{versionText}. La version distante est actuellement indisponible.",
      "latest": "{versionText}. Déjà à jour."
    },
    "cline": {
      "configDescription": "Configurez le fournisseur API et les identifiants Cline. Les paramètres sont enregistrés dans ~/.cline/data/."
    },
    "opencodePlugins": {
      "title": "Plugins OpenCode",
      "declared": "Plugins déclarés",
      "noPlugins": "Aucun plugin déclaré dans opencode.json",
      "status": {
        "installed": "Installé",
        "missing": "Non installé"
      },
      "installAll": "Installer tous les manquants",
      "pinVersions": "Fixer les versions @latest",
      "install": "Installer",
      "uninstall": "Désinstaller",
      "refresh": "Actualiser",
      "success": "Tous les plugins ont été installés avec succès",
      "failed": "L'opération du plugin a échoué"
    }
  },
  "SettingsPages": {
    "agentsLoading": "Chargement des paramètres des agents..."
  },
  "GeneralSettings": {
    "loading": "Chargement...",
    "sectionTitle": "Général",
    "sectionDescription": "Préférences centralisées pour le terminal par défaut, l'accélération du rendu et la délégation multi-agents.",
    "terminalTitle": "Terminal par défaut",
    "terminalDescription": "Choisis le shell utilisé lors de l’ouverture de nouveaux onglets de terminal depuis la barre du terminal ou l’arborescence des fichiers.",
    "defaultTerminalShell": "Shell par défaut",
    "terminalSystemDefault": "Par défaut système",
    "terminalPowerShell7": "PowerShell 7 (pwsh)",
    "terminalWindowsPowerShell": "Windows PowerShell",
    "terminalCmd": "Invite de commandes (cmd)",
    "terminalSaveFailed": "Échec de l’enregistrement des paramètres du terminal : {message}",
    "terminalShellCustom": "Chemin personnalisé",
    "terminalShellCustomPath": "Chemin du shell",
    "terminalShellCustomPlaceholder": "/usr/local/bin/fish",
    "terminalShellCustomSave": "Enregistrer",
    "terminalShellCustomHint": "Indiquez un chemin absolu ou un nom résolvable via PATH.",
    "terminalShellNotInstalled": "non installé",
    "terminalShellNotFoundWarning": "Ce chemin n’existe pas sur cet hôte.",
    "terminalCurrentShell": "Actuellement utilisé : {path}",
    "renderingTitle": "Rendu",
    "renderingDescription": "Désactivez l’accélération matérielle si l’application affiche un écran noir ou des défauts de rendu (fréquent sur certaines GPU AMD ou GPU Intel intégrées). N’a d’effet que sur la version Windows de bureau.",
    "disableHardwareAcceleration": "Désactiver l’accélération matérielle",
    "renderingSaveFailed": "Échec de l’enregistrement des paramètres de rendu : {message}",
    "restartRequired": "Enregistré. Redémarrez l’application pour appliquer la modification.",
    "restartNow": "Redémarrer maintenant",
    "restartFailed": "Échec du redémarrage : {message}",
    "loadFailed": "Échec du chargement : {message}"
  },
  "LoginPage": {
    "documentTitle": "Connexion - codeg",
    "brand": "Codeg",
    "subtitle": "Saisissez votre jeton d'accès pour vous connecter à l'application de bureau",
    "tokenPlaceholder": "Jeton d'accès",
    "connect": "Se connecter",
    "connecting": "Connexion...",
    "helpText": "Vous trouverez votre jeton dans l'application de bureau sous Paramètres → Service Web",
    "invalidToken": "Jeton invalide. Veuillez vérifier et réessayer.",
    "connectionFailed": "Échec de la connexion (HTTP {status})",
    "networkError": "Impossible de se connecter au serveur"
  },
  "CommitPage": {
    "title": "Valider",
    "invalidFolderId": "ID de dossier invalide",
    "loadingRepo": "Chargement du dépôt..."
  },
  "MergePage": {
    "title": "Résoudre les conflits",
    "invalidFolderId": "ID de dossier invalide",
    "loadingRepo": "Chargement du dépôt...",
    "localVersion": "Local (Le nôtre)",
    "result": "Résultat",
    "remoteVersion": "Distant (Le leur)",
    "acceptLocal": "Accepter le local",
    "acceptRemote": "Accepter le distant",
    "markResolved": "Marquer comme résolu",
    "abortMerge": "Abandonner",
    "completeMerge": "Terminer la fusion",
    "unresolvedConflicts": "Il reste des marqueurs de conflit non résolus dans ce fichier",
    "fileResolved": "Fichier résolu avec succès",
    "allResolved": "Tous les conflits sont résolus",
    "conflictFiles": "Fichiers en conflit",
    "loadingFile": "Chargement du fichier...",
    "preparingMerge": "Préparation de la fusion...",
    "selectFile": "Sélectionner un fichier à résoudre",
    "noConflicts": "Aucun fichier en conflit",
    "skipFile": "Passer",
    "abortSuccess": "Opération abandonnée",
    "applyAllNonConflicting": "Appliquer tous les changements non conflictuels",
    "applyLeftNonConflicting": "Appliquer local",
    "applyRightNonConflicting": "Appliquer distant"
  },
  "Folder": {
    "workspaceStatus": {
      "degradedTitle": "Mises à jour en temps réel indisponibles",
      "degradedHint": "L’observateur n’a pas pu démarrer (par ex. permission refusée). Actualisez manuellement pour voir les modifications.",
      "retry": "Réessayer",
      "retrying": "Nouvelle tentative..."
    },
    "common": {
      "all": "Tout",
      "cancel": "Annuler",
      "close": "Fermer",
      "closeOthers": "Fermer les autres",
      "closeAll": "Tout fermer",
      "confirm": "Confirmer",
      "save": "Enregistrer",
      "delete": "Supprimer",
      "rename": "Renommer",
      "loading": "Chargement...",
      "refresh": "Actualiser",
      "refreshing": "Actualisation...",
      "create": "Créer",
      "createAndSwitch": "Créer et basculer",
      "openFile": "Ouvrir le fichier",
      "viewDiff": "Voir le Diff",
      "push": "Pousser..."
    },
    "statusLabels": {
      "in_progress": "En cours",
      "pending_review": "Revue",
      "completed": "Terminé",
      "cancelled": "Annulé"
    },
    "sidebar": {
      "title": "Discussions",
      "locateActiveConversation": "Localiser la conversation active",
      "expandAllGroups": "Développer tous les groupes",
      "collapseAllGroups": "Réduire tous les groupes",
      "newConversation": "Nouvelle conversation",
      "newConversationShort": "Nouvelle",
      "newChat": "Nouvelle conversation",
      "search": "Rechercher",
      "noConversationsFound": "Aucune conversation trouvée.",
      "importLocalSessions": "Importer les sessions locales",
      "importing": "Import en cours...",
      "error": "Erreur : {message}",
      "completeAllSessions": "Terminer toutes les sessions",
      "completeAllReviewTitle": "Terminer toutes les sessions en revue ?",
      "completeAllReviewDescription": "Cela marquera comme terminées toutes les {count, plural, one {# session} other {# sessions}} en Revue.",
      "completing": "Finalisation...",
      "toasts": {
        "importedSessions": "{imported, plural, one {# session} other {# sessions}} importée(s), {skipped} ignorée(s)",
        "importedAndUpdated": "{imported, plural, one {# session} other {# sessions}} importée(s), {updated, plural, one {# titre} other {# titres}} mis à jour, {skipped} ignorée(s)",
        "updatedTitles": "{updated, plural, one {# titre} other {# titres}} mis à jour, {skipped} ignorée(s)",
        "noNewSessionsFound": "Aucune nouvelle session trouvée ({skipped} ignorée(s))",
        "importFailed": "Échec de l’import : {message}",
        "reviewCompleted": "{count, plural, one {# session en revue} other {# sessions en revue}} marquée(s) comme terminée(s)",
        "completeReviewFailed": "Échec de la finalisation des sessions en revue : {message}",
        "folderOpened": "Dossier {name} ouvert",
        "folderRemoved": "Dossier {name} retiré",
        "openFolderFailed": "Échec de l'ouverture du dossier",
        "removeFolderFailed": "Échec de la suppression du dossier : {message}",
        "reorderFoldersFailed": "Échec du réordonnancement des dossiers : {message}",
        "changeFolderColorFailed": "Échec du changement de couleur : {message}",
        "changeFolderDefaultAgentFailed": "Échec de la définition de l'agent par défaut : {message}"
      },
      "statsLabel": "{folders} dossiers · {convos} conversations",
      "reorderHandle": "Glisser pour réorganiser",
      "openFolder": "Ouvrir le dossier",
      "searchPlaceholder": "Rechercher des conversations...",
      "showCompleted": "Afficher les conversations terminées",
      "moreOptions": "Plus d'options",
      "sortBy": "Trier par",
      "sortByCreatedAt": "Date de création",
      "sortByUpdatedAt": "Date de mise à jour",
      "statusRunningBadge": "En cours",
      "statusCancelledBadge": "Annulé",
      "conversationCountUnit": "{count, plural, one {# conversation} other {# conversations}}",
      "emptyFolderHint": "Aucune conversation",
      "noMatchingConversations": "Aucune conversation correspondante",
      "noUnfinishedConversations": "Aucune conversation en cours. Activez « Afficher les terminées » dans le menu en haut à droite.",
      "removeFolderConfirmTitle": "Retirer le dossier de l'espace de travail ?",
      "removeFolderConfirmDescription": "Retirer \"{name}\" de l'espace de travail ? Les onglets et terminaux associés seront fermés.",
      "folderHeaderMenu": {
        "manageConversations": "Gérer les conversations…",
        "changeColor": "Changer la couleur",
        "useThemeColor": "Utiliser le thème de l'app",
        "setDefaultAgent": "Définir l'agent par défaut",
        "defaultAgentNone": "Aucun (utiliser la valeur globale)",
        "agentUnavailableSuffix": "(indisponible)",
        "loadingAgents": "Chargement des agents…",
        "removeFromWorkspace": "Retirer de l'espace de travail"
      },
      "manageConversations": {
        "title": "Gérer les conversations — {name}",
        "searchPlaceholder": "Rechercher par titre…",
        "agentFilterAll": "Tous les agents",
        "statusFilterAll": "Tous les statuts",
        "selectAllVisible": "Tout sélectionner",
        "deselectAll": "Tout désélectionner",
        "selectedCount": "{count} sélectionnée(s)",
        "matchedCount": "{count} correspondance(s)",
        "messagesShort": "{count} msg",
        "untitledConversation": "Conversation sans titre",
        "setStatus": "Définir le statut…",
        "deleteSelected": "Supprimer",
        "noConversations": "Aucune conversation dans ce dossier.",
        "noMatchingConversations": "Aucune conversation ne correspond aux filtres.",
        "confirmDeleteTitle": "Supprimer {count} conversation(s) ?",
        "confirmDeleteDescription": "Cette action est irréversible.",
        "toastDeleted": "{count} conversation(s) supprimée(s)",
        "toastStatusUpdated": "Statut mis à jour pour {count} conversation(s)",
        "toastOpFailed": "Échec de l'opération : {message}"
      },
      "sectionPinned": "Épinglées",
      "sectionFolders": "Dossiers",
      "sectionChats": "Discussion",
      "noChats": "Aucune discussion",
      "newChatAction": "Nouvelle discussion"
    },
    "conversation": {
      "reloadFailed": "Échec du rechargement de la conversation : {message}",
      "reloaded": "Conversation rechargée",
      "reload": "Recharger",
      "activeConversationIndicator": "Conversation active",
      "newConversation": "Nouvelle conversation",
      "closeConversation": "Fermer la conversation",
      "copyText": "Copier le texte",
      "copyTextSuccess": "Copié",
      "copyTextFailed": "Échec de la copie",
      "forkSession": "Dupliquer la session",
      "forkSessionSuccess": "Session dupliquée avec succès",
      "forkSessionFailed": "Échec de la duplication de la session : {error}",
      "exportConversation": "Exporter la conversation",
      "exportImage": "Image",
      "exportMarkdown": "Markdown",
      "exportHtml": "HTML",
      "exportSuccess": "Conversation exportée",
      "exportFailed": "Échec de l'exportation",
      "exportImageTooLong": "La conversation est trop longue pour être exportée en image",
      "exportLabels": {
        "untitledConversation": "Conversation sans titre",
        "agent": "Agent",
        "model": "Modèle",
        "status": "Statut",
        "started": "Début",
        "updated": "Mis à jour",
        "tokens": "Statistiques de tokens",
        "duration": "Durée",
        "inputTokens": "Entrée",
        "outputTokens": "Sortie",
        "cacheRead": "Cache lu",
        "cacheWrite": "Cache écrit",
        "user": "Utilisateur",
        "assistant": "Assistant",
        "system": "Système",
        "toolResult": "Résultat",
        "toolError": "Erreur"
      }
    },
    "conversationCard": {
      "untitledConversation": "Conversation sans titre",
      "newConversation": "Nouvelle conversation",
      "rename": "Renommer",
      "status": "Statut",
      "delete": "Supprimer",
      "importLocalSessions": "Importer les sessions locales",
      "importing": "Import en cours...",
      "renameConversation": "Renommer la conversation",
      "deleteConversationTitle": "Supprimer la conversation ?",
      "deleteConversationDescription": "Cela supprimera \"{title}\". Cette action est irréversible.",
      "cancel": "Annuler",
      "save": "Enregistrer",
      "pin": "Épingler",
      "unpin": "Désépingler",
      "markCompleted": "Marquer comme terminé",
      "reopen": "Rouvrir"
    },
    "search": {
      "dialogTitle": "Rechercher",
      "dialogTitleWithFolder": "Rechercher — {name}",
      "tabConversations": "Conversations",
      "tabFiles": "Fichiers",
      "placeholder": "Rechercher des conversations...",
      "filePlaceholder": "Rechercher des fichiers ou répertoires...",
      "allAgents": "Tout",
      "searching": "Recherche...",
      "typeToSearch": "Tapez pour rechercher des conversations",
      "typeToSearchFiles": "Tapez pour rechercher des fichiers ou répertoires",
      "noResults": "Aucun résultat trouvé.",
      "untitledConversation": "Conversation sans titre"
    },
    "folderTitleBar": {
      "showSidebar": "Afficher la barre latérale",
      "hideSidebar": "Masquer la barre latérale",
      "toggleTerminal": "Basculer le terminal",
      "toggleAuxPanel": "Basculer le panneau auxiliaire",
      "search": "Rechercher",
      "openSettings": "Ouvrir les paramètres",
      "withShortcut": "{label} (raccourci : {shortcut})"
    },
    "statusBar": {
      "connection": {
        "connected": "Connecté",
        "connecting": "Connexion...",
        "prompting": "Réponse...",
        "error": "Erreur de connexion",
        "disconnected": "Déconnecté",
        "tooltip": "{agent} : {status}",
        "tooltipError": "{agent} : {error}"
      },
      "tasks": {
        "title": "Tâches"
      },
      "alerts": {
        "title": "Alertes",
        "empty": "Aucune alerte"
      },
      "stats": {
        "conversations": "{count} discussions",
        "summary": "{conversations} discussions / {messages} messages"
      },
      "tokens": {
        "contextWindowUsageAria": "Utilisation de la fenêtre de contexte",
        "contextWindow": "Fenêtre de contexte",
        "usedMax": "Utilisé / Max",
        "tokenUsage": "Utilisation des tokens",
        "input": "Entrée",
        "output": "Sortie",
        "cacheRead": "Lecture cache",
        "cacheWrite": "Écriture cache",
        "total": "Total des tokens"
      }
    },
    "auxPanel": {
      "tabs": {
        "files": "Fichiers",
        "changes": "Changements",
        "commits": "Validations"
      },
      "noFolderTitle": "Aucun dossier ouvert",
      "noFolderHint": "Ouvrez un dossier pour voir son contenu ici"
    },
    "windowControls": {
      "minimizeWindow": "Minimiser la fenêtre",
      "minimize": "Minimiser",
      "maximizeWindow": "Maximiser la fenêtre",
      "maximize": "Maximiser",
      "restoreWindow": "Restaurer la fenêtre",
      "restore": "Restaurer",
      "closeWindow": "Fermer la fenêtre",
      "close": "Fermer"
    },
    "tabs": {
      "closeConversationTab": "Fermer l’onglet de conversation",
      "close": "Fermer",
      "closeOthers": "Fermer les autres",
      "closeAll": "Tout fermer",
      "tileDisplay": "Affichage en mosaïque",
      "untileDisplay": "Quitter la mosaïque"
    },
    "fileWorkspace": {
      "files": "Fichiers",
      "closeFileTab": "Fermer l’onglet fichier",
      "close": "Fermer",
      "closeOthers": "Fermer les autres",
      "closeAll": "Tout fermer",
      "preview": "Aperçu",
      "editSource": "Modifier la source",
      "maximize": "Agrandir",
      "restore": "Restaurer"
    },
    "terminal": {
      "rename": "Renommer",
      "close": "Fermer",
      "closeOthers": "Fermer les autres",
      "closeAll": "Tout fermer",
      "hideTerminal": "Masquer le terminal ({shortcut})",
      "openFolderFirst": "Ouvrez d'abord un dossier"
    },
    "folderNameDropdown": {
      "fallbackFolderName": "Dossier",
      "openFolder": "Ouvrir le dossier",
      "cloneRepository": "Cloner le dépôt",
      "projectBoot": "Lanceur de projet",
      "opened": "Ouvert",
      "recentOpen": "Ouvert récemment"
    },
    "fileWorkspacePanel": {
      "viewDiff": "Voir le Diff",
      "openFile": "Ouvrir le fichier",
      "fileCount": "{count, plural, one {# fichier} other {# fichiers}}",
      "openFileOrDiff": "Ouvrez un fichier ou un diff depuis le panneau de droite",
      "disk": "Disque",
      "head": "HEAD",
      "unsaved": "Non enregistré",
      "workingTree": "Arbre de travail",
      "loading": "Chargement...",
      "compareWithBranch": "{path} · comparer avec {branch}",
      "hunkCount": "{count, plural, one {# bloc} other {# blocs}}",
      "prev": "Précédent",
      "next": "Suivant",
      "jumpToLine": "Aller à la ligne {line}",
      "noParsedDiffSections": "Aucune section de diff analysée",
      "loadingEditor": "Chargement de l’éditeur...",
      "imageZoomIn": "Agrandir",
      "imageZoomOut": "Réduire",
      "imageZoomReset": "Réinitialiser le zoom",
      "htmlPreviewTitle": "Aperçu HTML",
      "htmlPreviewTrust": "Activer les scripts",
      "htmlPreviewTrustHint": "Exécuter les scripts de ce fichier et autoriser l'accès réseau. À activer uniquement pour les fichiers de confiance."
    },
    "branchDropdown": {
      "toasts": {
        "commitCodeCompleted": "Commit de code terminé",
        "pushCodeCompleted": "Push de code terminé",
        "committedFiles": "{count, plural, one {# fichier commit} other {# fichiers commit}}",
        "taskCompleted": "{label} terminé",
        "taskFailed": "{label} échoué",
        "mergeNoNewCommits": "{branchName} n’a pas de nouveaux commits",
        "mergedCommits": "{count, plural, one {# commit fusionné} other {# commits fusionnés}}",
        "allFilesUpToDate": "Tous les fichiers sont à jour",
        "updatedFiles": "{count, plural, one {# fichier mis à jour} other {# fichiers mis à jour}}",
        "openCommitWindowFailed": "Impossible d’ouvrir la fenêtre de commit",
        "openPushWindowFailed": "Impossible d’ouvrir la fenêtre de push",
        "upstreamSet": "La branche upstream a été définie",
        "upstreamSetAndPushed": "Branche upstream définie et {count, plural, one {# commit} other {# commits}} poussé(s)",
        "noCommitsToPush": "Aucun commit à pousser",
        "pushedCommits": "{count, plural, one {# commit poussé} other {# commits poussés}}",
        "switchedToFolder": "Basculé vers {name}",
        "switchFailed": "Échec du changement de branche"
      },
      "tasks": {
        "newBranch": "Créer la branche {name}",
        "newWorktree": "Créer le worktree {name}",
        "checkoutTo": "Basculer vers {branchName}",
        "mergeBranch": "Fusionner {branchName}",
        "rebaseTo": "Rebase vers {branchName}",
        "deleteRemoteBranch": "Supprimer la branche distante {branchName}",
        "initGitRepo": "Initialiser le dépôt Git",
        "pullCode": "Pull du code",
        "fetchInfo": "Récupérer les infos",
        "pushCode": "Push du code",
        "stashChanges": "Stash des changements",
        "stashPop": "Appliquer le stash",
        "deleteBranch": "Supprimer la branche {branchName}"
      },
      "confirm": {
        "mergeTitle": "Fusionner la branche",
        "rebaseTitle": "Rebase de la branche",
        "mergeDescription": "Fusionner {branchName} dans la branche actuelle {currentBranch} ?",
        "rebaseDescription": "Rebaser la branche actuelle {currentBranch} sur {branchName} ?",
        "deleteRemoteTitle": "Supprimer la branche distante",
        "deleteRemoteDescription": "Supprimer la branche distante {branchName} ? Cette action la supprimera du dépôt distant et ne pourra pas être annulée.",
        "deleteTitle": "Supprimer la branche",
        "deleteDescription": "Supprimer la branche {branchName} ? Cette action est irréversible.",
        "forceDeleteTitle": "Forcer la suppression de la branche",
        "forceDeleteDescription": "La branche {branchName} n'est pas entièrement fusionnée. Êtes-vous sûr de vouloir la supprimer de force ? Cette action est irréversible."
      },
      "current": "Actuelle",
      "switchToBranch": "Basculer vers cette branche",
      "mergeBranchIntoCurrent": "Fusionner {branchName} dans {currentBranch}",
      "rebaseCurrentToBranch": "Rebaser {currentBranch} sur {branchName}",
      "noBranch": "Aucune branche",
      "initGitRepo": "Initialiser le dépôt Git",
      "pullCode": "Pull du code",
      "fetchRemoteBranches": "Récupérer les branches distantes",
      "openCommitWindow": "Commit du code...",
      "pushCode": "Pousser...",
      "newBranch": "Nouvelle branche...",
      "newWorktree": "Nouveau worktree...",
      "stashChanges": "Remiser les changements...",
      "stashPop": "Appliquer le stash...",
      "manageRemotes": "Gérer les dépôts distants...",
      "localBranches": "Branches locales ({count, plural, one {#} other {#}})",
      "noLocalBranches": "Aucune branche locale",
      "remoteBranches": "Branches distantes ({count, plural, one {#} other {#}})",
      "noRemoteBranches": "Aucune branche distante",
      "dialogs": {
        "newBranchTitle": "Nouvelle branche",
        "newBranchDescription": "Créer une nouvelle branche depuis la branche actuelle {branch}",
        "branchNamePlaceholder": "Nom de la branche",
        "newWorktreeTitle": "Nouveau worktree",
        "newWorktreeDescription": "Créer un nouveau worktree depuis la branche actuelle {branch}",
        "branchNameLabel": "Nom de la branche",
        "worktreePathLabel": "Chemin du worktree",
        "worktreePathPlaceholder": "Chemin du worktree",
        "manageRemotesTitle": "Gérer les dépôts distants",
        "manageRemotesEmpty": "Aucun dépôt distant configuré",
        "remoteNamePlaceholder": "Nom du dépôt distant",
        "remoteUrlPlaceholder": "URL du dépôt distant",
        "addRemote": "Ajouter",
        "savingRemotes": "Enregistrement..."
      },
      "conflict": {
        "title": "Conflits de fusion",
        "description": "Les fichiers suivants ont des conflits qui doivent être résolus :",
        "abort": "Abandonner la fusion",
        "openMergeTool": "Ouvrir l'outil de fusion",
        "completeMerge": "Terminer la fusion",
        "abortSuccess": "Fusion abandonnée avec succès",
        "completeSuccess": "Fusion terminée avec succès"
      },
      "stashDialog": {
        "title": "Remiser les changements",
        "description": "Sauvegarder les changements actuels dans la remise",
        "messageLabel": "Message",
        "messagePlaceholder": "Message de remise (optionnel)",
        "keepIndex": "Conserver l'index (les changements indexés restent indexés)",
        "cancel": "Annuler",
        "stash": "Remiser",
        "success": "Changements remisés",
        "error": "Échec de la remise"
      },
      "unstashDialog": {
        "title": "Appliquer la remise",
        "noStashes": "Aucune remise trouvée",
        "selectFile": "Sélectionner un fichier pour voir le diff",
        "viewDiff": "Voir le diff",
        "original": "Original",
        "modified": "Modifié",
        "apply": "Appliquer",
        "drop": "Supprimer",
        "applySuccess": "Remise appliquée",
        "dropSuccess": "Remise supprimée",
        "confirmApply": "Appliquer la remise {ref} au répertoire de travail ?",
        "cancel": "Annuler"
      },
      "deleteBranch": "Supprimer la branche"
    },
    "commitDialog": {
      "toasts": {
        "commitCompleted": "Commit de code terminé",
        "pushFailed": "Échec du push",
        "committedFiles": "{count, plural, one {# fichier commit} other {# fichiers commit}}",
        "addedToVcs": "Ajouté à VCS",
        "addToVcsFailed": "Échec de l’ajout à VCS",
        "fileDeleted": "Fichier supprimé",
        "deleteFailed": "Échec de la suppression",
        "fileRolledBack": "Fichier restauré",
        "rollbackFailed": "Échec du rollback",
        "dirRolledBack": "Répertoire restauré",
        "dirDeleted": "Répertoire supprimé"
      },
      "confirm": {
        "deleteTitle": "Confirmer la suppression",
        "deleteDescription": "Supprimer le fichier \"{file}\" ? Cette action est irréversible.",
        "rollbackTitle": "Confirmer le rollback",
        "rollbackDescription": "Restaurer le fichier \"{file}\" vers HEAD ? Les modifications non enregistrées seront perdues.",
        "rollbackDirDescription": "Restaurer le répertoire \"{dir}\" vers HEAD ? Les modifications non enregistrées seront perdues.",
        "deleteDirDescription": "Supprimer le répertoire \"{dir}\" ? Cette action est irréversible."
      },
      "actions": {
        "select": "Sélectionner",
        "unselect": "Désélectionner",
        "rollback": "Annuler",
        "addToVcs": "Ajouter à VCS"
      },
      "aria": {
        "selectFile": "{action} : {path}",
        "unselectAllFiles": "Désélectionner tous les fichiers",
        "selectAllFiles": "Sélectionner tous les fichiers",
        "unselectTracked": "Désélectionner les changements suivis",
        "selectTracked": "Sélectionner les changements suivis",
        "unselectUntracked": "Désélectionner les fichiers non suivis",
        "selectUntracked": "Sélectionner les fichiers non suivis"
      },
      "loading": "Chargement...",
      "selectionCount": "{selected} / {total} fichiers",
      "emptyFiles": "Aucun fichier modifié",
      "trackedChanges": "Changements suivis ({count})",
      "untrackedFiles": "Fichiers non suivis ({count})",
      "commitMessage": "Message de commit",
      "commitMessagePlaceholder": "Saisissez le message de commit...",
      "commitButton": "Valider ({count})",
      "commitAndPushButton": "Valider et pousser ({count})",
      "head": "HEAD",
      "workingTree": "Arbre de travail",
      "clickFileToDiff": "Cliquez sur un nom de fichier pour voir le diff",
      "loadingDiff": "Chargement du diff..."
    },
    "pushWindow": {
      "title": "Pousser le code",
      "noUnpushedCommits": "Aucun commit non poussé",
      "noRemoteConfigured": "Aucun dépôt distant Git configuré\nAjoutez-en un dans « Gérer les dépôts distants »",
      "newBranchNoPushedCommits": "Nouvelle branche — pousser pour créer la branche de suivi distante",
      "unpushed": "Non poussé",
      "selectFileToViewDiff": "Sélectionnez un fichier pour voir les différences",
      "before": "Avant",
      "after": "Après",
      "push": "Pousser",
      "toasts": {
        "pushSuccess": "Push réussi",
        "pushFailed": "Échec du push",
        "upstreamSet": "La branche distante a été configurée",
        "upstreamSetAndPushed": "Branche distante configurée et {count} commits poussés",
        "noCommitsToPush": "Aucun commit à pousser",
        "pushedCommits": "{count} commits poussés"
      }
    },
    "gitLogTab": {
      "filesTitle": "Fichiers",
      "expandAllFiles": "Développer tous les fichiers",
      "collapseAllFiles": "Réduire tous les fichiers",
      "workspace": "espace de travail",
      "retry": "Réessayer",
      "noCommitsFound": "Aucun commit trouvé",
      "notAGitRepoTitle": "Pas un dépôt Git",
      "notAGitRepoHint": "Initialisez Git depuis le menu des branches ci-dessus, ou ouvrez un dépôt existant.",
      "hash": "Empreinte",
      "copyHash": "Copier le hash",
      "copyMessage": "Copier le message",
      "author": "Auteur",
      "noFileChangeDetails": "Aucun détail de changement de fichier disponible.",
      "branchesTitle": "Branches Git",
      "loadingBranches": "Chargement des branches...",
      "noContainingBranches": "Aucune branche contenant ce commit.",
      "newBranch": "Nouvelle branche...",
      "resetToHere": "Réinitialiser ici",
      "resetDisabledReasonNotCurrentBranchView": "Disponible uniquement en affichant la branche actuelle",
      "viewCommitDiffAria": "Voir le diff du commit {hash}",
      "copyFullCommitHashAria": "Copier le hash complet du commit {hash}",
      "pushStatus": {
        "pushed": "Poussé vers le remote",
        "notPushed": "Non poussé vers le remote",
        "unknown": "Statut de push inconnu (aucun upstream configuré)"
      },
      "time": {
        "monthsAgo": "{count, plural, one {il y a # mois} other {il y a # mois}}",
        "daysAgo": "{count, plural, one {il y a # jour} other {il y a # jours}}",
        "hoursAgo": "{count, plural, one {il y a # heure} other {il y a # heures}}",
        "minsAgo": "{count, plural, one {il y a # min} other {il y a # mins}}",
        "justNow": "à l’instant"
      },
      "toasts": {
        "createdAndSwitchedNewBranch": "Nouvelle branche créée et activée",
        "newBranchFromCommit": "{name} (depuis {shortHash})",
        "createBranchFailed": "Échec de la création de la branche",
        "openPushWindowFailed": "Échec de l'ouverture de la fenêtre de push",
        "resetSuccess": "Réinitialisation réussie",
        "resetSuccessDescription": "{branch} a été réinitialisée sur {shortHash} avec {mode}",
        "resetFailed": "Échec de la réinitialisation"
      },
      "branchSelector": {
        "selectBranchPlaceholder": "Sélectionner une branche...",
        "localBranches": "Branches locales",
        "current": "Actuelle",
        "remoteBranches": "Branches distantes",
        "refreshCommitHistory": "Actualiser l’historique des commits"
      },
      "dialogs": {
        "newBranchTitle": "Nouvelle branche",
        "newBranchDescription": "Créer une nouvelle branche avec le commit {shortHash} comme dernier commit.",
        "branchNamePlaceholder": "Nom de la branche",
        "reset": {
          "title": "Réinitialiser la branche actuelle jusqu’ici",
          "branchLabel": "Branche",
          "targetLabel": "Commit cible",
          "messageLabel": "Message",
          "modeLabel": "Mode de réinitialisation",
          "confirmButton": "Réinitialiser",
          "modes": {
            "soft": {
              "label": "--soft",
              "description": "Déplace HEAD et le pointeur de la branche actuelle vers le commit cible.\nConserve Index et Working Tree inchangés.\nLes changements des commits retirés restent staged."
            },
            "mixed": {
              "label": "--mixed (par défaut)",
              "description": "Déplace HEAD vers le commit cible.\nRéinitialise Index au commit cible tout en conservant les changements du Working Tree.\nLes changements passent de staged à unstaged."
            },
            "hard": {
              "label": "--hard",
              "description": "Déplace HEAD et réinitialise à la fois Index et Working Tree au commit cible.\nLes changements locaux suivis après le commit cible sont supprimés.\nC’est une opération destructive."
            },
            "keep": {
              "label": "--keep",
              "description": "Déplace HEAD vers le commit cible en conservant les changements locaux quand c’est possible.\nSeuls les changements sans conflit sont conservés.\nEn cas de conflit, la réinitialisation est annulée pour protéger votre travail."
            }
          }
        }
      }
    },
    "gitChangesTab": {
      "workspace": "espace de travail",
      "noChanges": "Aucun changement local",
      "notAGitRepoTitle": "Pas un dépôt Git",
      "notAGitRepoHint": "Initialisez Git depuis le menu des branches ci-dessus, ou ouvrez un dépôt existant.",
      "trackedChanges": "Changements suivis ({count})",
      "untrackedFiles": "Fichiers non suivis ({count})",
      "expandTracked": "Développer les changements suivis",
      "collapseTracked": "Réduire les changements suivis",
      "expandUntracked": "Développer les fichiers non suivis",
      "collapseUntracked": "Réduire les fichiers non suivis",
      "actions": {
        "commitCode": "Commit du code",
        "rollback": "Annuler",
        "addToVcs": "Ajouter à VCS",
        "delete": "Supprimer"
      },
      "toasts": {
        "noAddableFilesInDir": "Aucun fichier modifié de ce répertoire ne peut être ajouté à VCS",
        "noRollbackFilesInDir": "Aucun fichier modifié de ce répertoire ne peut être rollback",
        "addedToVcs": "{name} ajouté à VCS",
        "addToVcsFailed": "Échec de l’ajout à VCS",
        "openCommitWindowFailed": "Impossible d’ouvrir la fenêtre de commit",
        "rolledBack": "{name} restauré",
        "rollbackFailed": "Échec du rollback",
        "addedFilesToVcs": "{count, plural, one {# fichier} other {# fichiers}} ajouté(s) à VCS",
        "rolledBackFiles": "{count, plural, one {# fichier restauré} other {# fichiers restaurés}}",
        "deleted": "{name} supprimé",
        "deleteFailed": "Échec de la suppression",
        "deletedFiles": "{count} fichiers supprimés",
        "noDeletableFilesInDir": "Aucun fichier modifié dans ce répertoire ne peut être supprimé"
      },
      "directoryDialog": {
        "descriptionAdd": "Sélectionnez les fichiers du répertoire {path} à ajouter à VCS.",
        "descriptionRollback": "Sélectionnez les fichiers du répertoire {path} à rollback.",
        "descriptionDelete": "Sélectionnez les fichiers du répertoire {path} à supprimer. Cette action est irréversible.",
        "descriptionFallback": "Sélectionnez les fichiers pour continuer.",
        "selectionCount": "{selected} / {total} fichiers sélectionnés",
        "selectAll": "Tout sélectionner",
        "unselectAll": "Tout désélectionner",
        "loadingCandidates": "Chargement des changements du répertoire...",
        "noOperableFiles": "Aucun fichier opérable"
      },
      "rollbackConfirm": {
        "title": "Confirmer le rollback",
        "descriptionWithTarget": "Rollback des changements locaux pour {kind} \"{name}\" ?",
        "descriptionFallback": "Rollback des changements locaux ?",
        "kindDirectory": "répertoire",
        "kindFile": "fichier"
      },
      "deleteConfirm": {
        "title": "Confirmer la suppression",
        "descriptionWithTarget": "Supprimer {kind} \"{name}\" ? Cette action est irréversible.",
        "descriptionFallback": "Cette action est irréversible.",
        "kindDirectory": "répertoire",
        "kindFile": "fichier"
      }
    },
    "tabContext": {
      "loadingConversation": "Chargement...",
      "untitledConversation": "Conversation sans titre",
      "newConversation": "Nouvelle conversation"
    },
    "fileTreeTab": {
      "workspace": "Espace de travail",
      "retry": "Réessayer",
      "git": "Git",
      "openInFileManager": "Ouvrir dans le gestionnaire de fichiers",
      "openInFinder": "Ouvrir dans Finder",
      "openInExplorer": "Ouvrir dans Explorer",
      "attachToCurrentSession": "Ajouter à la session",
      "compareWithBranch": "Comparer avec la branche...",
      "reloadFromDisk": "Recharger depuis le disque",
      "new": "Nouveau",
      "newFile": "Fichier",
      "newDirectory": "Répertoire",
      "openIn": "Ouvrir dans",
      "openInTerminal": "Ouvrir dans le terminal",
      "copyPath": "Copier le chemin",
      "upload": "Téléverser fichiers/dossier",
      "download": "Télécharger le fichier",
      "downloadAsZip": "Télécharger en ZIP",
      "actions": {
        "select": "Sélectionner",
        "unselect": "Désélectionner",
        "commitCode": "Committer le code",
        "rollback": "Annuler",
        "addToVcs": "Ajouter au VCS"
      },
      "aria": {
        "selectPath": "{action} : {path}"
      },
      "toasts": {
        "openDirectoryFailed": "Échec de l'ouverture du dossier",
        "openBuiltinTerminalFailed": "Impossible d'ouvrir le terminal intégré",
        "openCommitWindowFailed": "Échec de l'ouverture de la fenêtre de commit",
        "noAddableFilesInDir": "Aucun fichier modifié de ce dossier ne peut être ajouté au VCS",
        "noRollbackFilesInDir": "Aucun fichier modifié de ce dossier ne peut être annulé",
        "addedToVcs": "{name} ajouté au VCS",
        "addToVcsFailed": "Échec de l'ajout au VCS",
        "loadBranchesFailed": "Échec du chargement des branches",
        "renameFailed": "Échec du renommage",
        "deleteFailed": "Échec de la suppression",
        "rolledBack": "{name} annulé",
        "rollbackFailed": "Échec de l'annulation",
        "addedFilesToVcs": "{count, plural, one {# fichier ajouté au VCS} other {# fichiers ajoutés au VCS}}",
        "rolledBackFiles": "{count, plural, one {# fichier annulé} other {# fichiers annulés}}",
        "savedAsCopy": "Enregistré en copie",
        "saveCopyFailed": "Échec de l'enregistrement en copie",
        "watchStartFailed": "Échec du démarrage de la surveillance de fichiers",
        "createFailed": "Échec de la création",
        "downloadFailed": "Échec du téléchargement de {name}",
        "downloadSaved": "{name} téléchargé",
        "pathCopied": "Chemin copié",
        "copyPathFailed": "Échec de la copie du chemin"
      },
      "createDialog": {
        "newFile": "Nouveau fichier",
        "newDirectory": "Nouveau répertoire",
        "description": "Entrez un nom pour le nouveau {kind}.",
        "placeholderFile": "file-name.ext",
        "placeholderDirectory": "folder-name"
      },
      "renameDialog": {
        "renameDirectory": "Renommer le dossier",
        "renameFile": "Renommer le fichier",
        "description": "Saisissez un nouveau nom (nom uniquement, sans chemin).",
        "placeholderDirectory": "nouveau-nom-dossier",
        "placeholderFile": "nouveau-nom-fichier.ext"
      },
      "uploadDialog": {
        "title": "Téléverser vers l'espace de travail",
        "description": "Ajustez la destination si besoin, puis ajoutez des fichiers ou dossiers.",
        "workspaceRoot": "racine de l'espace de travail",
        "targetPathLabel": "Téléverser vers",
        "targetPathHint": "Chemin résolu : {path}",
        "dropHint": "Déposez des fichiers ou dossiers ici, ou utilisez les boutons ci-dessous",
        "dropHintActive": "Relâchez pour ajouter à la file d'attente",
        "selectFiles": "Sélectionner des fichiers",
        "selectFolder": "Sélectionner un dossier",
        "startUpload": "Lancer le téléversement",
        "clearQueue": "Effacer terminés",
        "removeItem": "Retirer de la file",
        "retry": "Réessayer",
        "dropZoneAria": "Déposez ici ou activez pour parcourir",
        "folderEmpty": "Aucun fichier trouvé dans le dossier déposé",
        "summary": "Total : {total} · Réussis : {succeeded} · Échoués : {failed}",
        "status": {
          "pending": "En attente",
          "uploading": "Téléversement",
          "success": "Terminé",
          "error": "Échec",
          "cancelled": "Annulé"
        }
      },
      "directoryDialog": {
        "descriptionAdd": "Sélectionnez des fichiers sous le dossier {path} à ajouter au VCS.",
        "descriptionRollback": "Sélectionnez des fichiers sous le dossier {path} à annuler.",
        "descriptionFallback": "Sélectionnez des fichiers pour continuer.",
        "selectionCount": "{selected} / {total} fichiers sélectionnés",
        "selectAll": "Tout sélectionner",
        "unselectAll": "Tout désélectionner",
        "loadingCandidates": "Chargement des changements du dossier...",
        "noOperableFiles": "Aucun fichier exploitable"
      },
      "compareDialog": {
        "title": "Comparer avec la branche",
        "descriptionWithTarget": "Sélectionnez une branche et comparez avec {kind} {path}",
        "descriptionFallback": "Sélectionnez une branche à comparer.",
        "kindDirectory": "dossier",
        "kindFile": "fichier",
        "filterPlaceholder": "Filtrer les branches, ex. main / origin/main",
        "singleClickHint": "Cliquez sur une branche pour comparer directement",
        "loadingBranches": "Chargement des branches...",
        "recentBranches": "Branches récentes ({count})",
        "noCurrentBranch": "Aucune branche courante",
        "localBranches": "Branches locales ({count})",
        "remoteBranches": "Branches distantes ({count})",
        "noMatchingBranches": "Aucune branche correspondante"
      },
      "externalConflictDialog": {
        "title": "Modifications externes de fichiers détectées",
        "descriptionWithPath": "Le fichier {path} a changé sur le disque et les modifications actuelles ne sont pas enregistrées.",
        "descriptionFallback": "Le fichier actuel a changé sur le disque et les modifications actuelles ne sont pas enregistrées.",
        "compare": "Comparer",
        "savingCopy": "Enregistrement de la copie...",
        "saveAsCopy": "Enregistrer en copie",
        "reload": "Recharger"
      },
      "deleteConfirm": {
        "title": "Confirmer la suppression",
        "descriptionWithTarget": "Supprimer {kind} \"{name}\" ? Cette action est irréversible.",
        "descriptionFallback": "Cette action est irréversible.",
        "kindDirectory": "dossier",
        "kindFile": "fichier"
      },
      "rollbackConfirm": {
        "title": "Confirmer l'annulation",
        "descriptionWithTarget": "Annuler les modifications locales du fichier \"{name}\" ?",
        "descriptionFallback": "Annuler les modifications locales de ce fichier ?"
      },
      "terminalTitle": "Console · {name}"
    },
    "commandDropdown": {
      "loading": "Chargement...",
      "addCommand": "Ajouter une commande",
      "manageCommands": "Gérer les commandes...",
      "runCommandTitle": "Exécuter : {command}",
      "stopCommandTitle": "Arrêter : {command}",
      "manageDialog": {
        "title": "Gérer les commandes",
        "empty": "Aucune commande pour le moment",
        "namePlaceholder": "Nom",
        "commandPlaceholder": "Commande",
        "add": "Ajouter",
        "saving": "Enregistrement..."
      }
    },
    "workspaceContext": {
      "confirmCloseDirtyTab": "Fermer « {title} » sans enregistrer ?",
      "confirmCloseOtherDirtyTabs": "Fermer les autres onglets avec des modifications non enregistrées ?",
      "confirmCloseAllDirtyTabs": "Fermer tous les onglets avec des modifications non enregistrées ?",
      "unableLoadContent": "Impossible de charger le contenu.\n\n{message}",
      "previewRequestTimedOut": "La requête de prévisualisation a expiré",
      "diffRequestTimedOut": "La requête Diff a expiré",
      "branchCompareRequestTimedOut": "La requête de comparaison de branches a expiré",
      "commitDiffRequestTimedOut": "La requête de Diff de commit a expiré",
      "saveRequestTimedOut": "La requête d’enregistrement a expiré",
      "reloadRequestTimedOut": "La requête de rechargement a expiré",
      "noChanges": "Aucun changement.",
      "noDiffOutput": "Aucune sortie diff.",
      "diffTitleWorkspace": "Diff · Espace de travail",
      "diffDescriptionWorkingTree": "Arbre de travail (HEAD)",
      "diffTitleFile": "Différence · {name}",
      "compareTitleFile": "Comparer · {name}",
      "compareTitleBranch": "Comparer · {branch}",
      "compareDescriptionPath": "{path} · comparer avec {branch}",
      "compareDescriptionBranch": "comparer avec {branch}",
      "diffTitleCommitFile": "Différence · {name} @ {hash}",
      "diffTitleCommit": "Différence · {hash}",
      "diffDescriptionCommitPath": "{path} · validation {commit}",
      "diffDescriptionCommit": "validation {commit}",
      "diffTitleConflictFile": "Conflit · {name}",
      "diffDescriptionConflict": "{path} · disque vs non enregistré"
    },
    "chat": {
      "acpConnections": {
        "actions": {
          "openAgentsSettings": "Ouvrir les paramètres des agents",
          "retry": "Réessayer"
        },
        "agentsSetupHint": "Ouvrez Paramètres > Agents pour gérer l'installation.",
        "withSetupHint": "{message}\n{hint}",
        "blocked": {
          "missingConfig": "Impossible de lire la configuration actuelle de l'agent.",
          "disabled": "{agent} est désactivé dans les paramètres des agents. Activez-le avant de vous connecter.",
          "unavailable": "{agent} n'est pas disponible sur la plateforme actuelle.",
          "sdkMissing": "Le SDK de {agent} n'est pas installé"
        },
        "backendErrors": {
          "initializeTimeout": "Le handshake de connexion de {agent} a expiré (aucune réponse après 60 secondes). Ouvrez Paramètres pour vérifier la configuration de l'agent et du réseau.",
          "processExited": "Le processus {agent} s'est arrêté de manière inattendue.",
          "spawnFailed": "Impossible de démarrer {agent} : {message}",
          "downloadFailed": "Échec du téléchargement de {agent} : {message}",
          "sessionLoadResourceNotFound": "Échec du chargement de la session de {agent}. Rechargez pour réessayer ou démarrez une nouvelle conversation.",
          "turnFailedRefusal": "{agent} a refusé de poursuivre ce tour. Cela indique souvent une erreur de backend ou de passerelle. Vérifiez les journaux de l'agent.",
          "turnFailedMaxTokens": "{agent} a atteint la limite maximale de jetons pour ce tour.",
          "turnFailedMaxTurnRequests": "{agent} a atteint le nombre maximal de requêtes autorisées pour ce tour.",
          "turnFailedUnknown": "{agent} a terminé le tour avec une raison d'arrêt inconnue.",
          "turnFailedEmpty": "{agent} a terminé le tour sans produire de réponse. Vérifiez la configuration de l'agent."
        },
        "unableReadAgentConfig": "Impossible de lire la configuration de l'agent : {message}",
        "connectFailedTitle": "Échec de la connexion de {agent}",
        "toolFallbackTitle": "Outil",
        "eventErrorTitle": "Erreur de l'agent",
        "notificationTurnComplete": "{agent} a terminé de répondre",
        "notificationError": "{agent} erreur : {message}",
        "claudeApiRetry": {
          "fallbackError": "authentication_failed",
          "retryingWithMax": "nouvelle tentative {attempt}/{max}",
          "retryingAttempt": "nouvelle tentative {attempt}",
          "retrying": "nouvelle tentative",
          "nextRetryIn": "prochaine dans {seconds}s",
          "line": "{error}{status} · {retry}",
          "lineWithDelay": "{error}{status} · {retry}, {delay}",
          "httpStatus": " (HTTP {status})"
        }
      },
      "connectionLifecycle": {
        "tasks": {
          "connectingTitle": "Connexion à {agent}",
          "connectingDescription": "Établissement de la connexion",
          "loadingSelectorsTitle": "Chargement des sélecteurs de {agent}",
          "loadingSelectorsDescription": "Récupération des options de mode et de configuration de session",
          "initSessionTitle": "Initializing {agent} session",
          "initSessionDescription": "Creating session and loading configuration"
        },
        "errors": {
          "connectionFailed": "Échec de la connexion"
        }
      },
      "shared": {
        "attachedResources": "Ressources jointes",
        "toolCallFailed": "Échec de l'appel d'outil"
      },
      "messageThread": {
        "emptyTitle": "Aucun message pour le moment",
        "emptyDescription": "Commencez une conversation pour voir les messages ici"
      },
      "chatInput": {
        "connecting": "Connexion...",
        "agentResponding": "{agent} répond...",
        "sendMessage": "Envoyer un message..."
      },
      "messageInput": {
        "askAnything": "Posez n'importe quelle question...",
        "removeAttachmentAria": "Retirer {name}",
        "attachFiles": "Joindre des fichiers",
        "addActions": "Ajouter",
        "quickMessages": "Messages rapides",
        "quickMessagesEmpty": "Aucun message rapide pour l'instant",
        "quickMessagesLoading": "Chargement...",
        "quickMessageUntitled": "Sans titre",
        "liveFeedback": "Retour en direct",
        "liveFeedbackDisabledHint": "Disponible pendant que l'agent travaille",
        "dropFilesToAttach": "Déposez des fichiers à joindre",
        "loadingSettings": "Chargement des paramètres...",
        "loadingMode": "Chargement du mode...",
        "modeLabel": "Mode",
        "agentSettings": "Paramètres de l'agent",
        "cancel": "Annuler",
        "send": "Envoyer",
        "forkAndSend": "Fork & Envoyer",
        "slashCommands": "Commandes slash",
        "expertSkills": "Compétences d'expert",
        "expertsEmptyForAgent": "Cet agent n'a aucun expert activé. Activez-les dans Paramètres > Experts.",
        "slashSearchPlaceholder": "Rechercher des commandes...",
        "slashSearchEmpty": "Aucune commande correspondante",
        "attachLocalUpload": "Téléverser un fichier local",
        "attachServerFile": "Sélectionner un fichier serveur",
        "attachUploadTooLarge": "{names} dépasse la limite de téléversement de {limit} Mo et a été ignoré.",
        "attachUploadFailed": "Échec du téléversement de {names}.",
        "attachUploadNotAFile": "{names} n'est pas un fichier régulier (répertoire ou fichier spécial) et a été ignoré.",
        "attachUploadQuotaExceeded": "Le serveur n'a plus d'espace pour les téléversements ; {names} n'a pas pu être envoyé."
      },
      "messageQueue": {
        "addToQueue": "Mettre en file",
        "saveEdit": "Enregistrer",
        "cancelEdit": "Annuler la modification",
        "editItem": "Modifier",
        "deleteItem": "Supprimer"
      },
      "welcomeInputPanel": {
        "agentsSettingsPath": "Paramètres > Agents",
        "autoConnectFallback": "Cliquez pour ouvrir {path} et gérer l'installation.",
        "autoConnectAppend": "{message}. Cliquez pour ouvrir {path} et gérer l'installation.",
        "enableAgentFirstPlaceholder": "Activez au moins un agent avant de démarrer une session...",
        "prepareSessionFailed": "Impossible de préparer la session de chat. Veuillez réessayer.",
        "createConversationFailed": "Impossible de créer la conversation. Veuillez réessayer.",
        "askAnythingPlaceholder": "Posez n'importe quelle question..."
      },
      "welcomePanel": {
        "greeting": "Que souhaites-tu <highlight>faire aujourd'hui</highlight> ?",
        "tips": {
          "tileTabs": "Faites un clic droit sur un onglet de conversation et choisissez Affichage en mosaïque pour comparer plusieurs sessions côte à côte.",
          "pinTab": "Double-cliquez sur un onglet de conversation pour l'épingler : une nouvelle session ne le remplacera plus automatiquement.",
          "shortcutsNewSearch": "<shortcut>{newConversation}</shortcut> ouvre une nouvelle conversation, <shortcut>{searchConversations}</shortcut> recherche dans l'historique.",
          "slashAtMention": "Saisissez / dans la zone de saisie pour les commandes slash, ou @ pour référencer un fichier du projet.",
          "pasteDropFiles": "Collez une capture d'écran ou déposez un fichier directement dans la zone de saisie pour le joindre.",
          "queueMessage": "Pendant que l'agent répond, continuez à écrire : votre message suivant est mis en file et envoyé automatiquement à la fin.",
          "draftAutoSave": "Les brouillons non envoyés sont sauvegardés automatiquement par conversation et restaurés à votre retour.",
          "forkSend": "Le menu déroulant du bouton d'envoi propose Bifurquer et envoyer pour ouvrir une branche dans un nouvel onglet à partir du point actuel.",
          "exportConversation": "Faites un clic droit dans la conversation pour l'exporter en Markdown, HTML ou image.",
          "chatChannels": "Connectez Telegram / Lark / WeChat dans Paramètres → Canaux de discussion pour continuer depuis votre téléphone.",
          "shortcutsAuxPanel": "<shortcut>{toggleAuxPanel}</shortcut> bascule le panneau droit pour voir les fichiers modifiés et les changements Git de cette session.",
          "shortcutsTerminalSidebar": "<shortcut>{toggleTerminal}</shortcut> ouvre le terminal intégré, <shortcut>{toggleSidebar}</shortcut> bascule la barre latérale.",
          "customShortcuts": "Tous les raccourcis peuvent être réassignés dans Paramètres → Raccourcis.",
          "webService": "Activez Paramètres → Service Web pour que votre équipe accède au même codeg depuis un navigateur.",
          "fusionMode": "Ouvrez un fichier ou un diff pour l'afficher automatiquement à côté de la conversation.",
          "quickMessages": "Ouvrez le bouton + à côté de la saisie et choisissez Messages rapides pour insérer un extrait enregistré (à gérer dans Paramètres → Messages rapides).",
          "experts": "Le bouton + propose un menu Compétences expertes — chargez en un clic des rôles comme Débogage ou Planification."
        }
      },
      "agentSelector": {
        "noEnabledAgents": "Aucun agent activé",
        "openAgentsSettings": "Ouvrir les paramètres des agents"
      },
      "subAgentOverlay": {
        "title": "Sous-agents",
        "collapsedSummary": "Sous-agents {count}",
        "collapseAria": "Réduire les sous-agents"
      },
      "agentPlanOverlay": {
        "title": "Plan de l'agent",
        "collapsePlanAria": "Réduire le plan",
        "collapsedSummary": "Plan de travail {completed}/{total}",
        "status": {
          "completed": "Terminé",
          "inProgress": "En cours",
          "pending": "En attente",
          "unknown": "Inconnu"
        },
        "priority": {
          "high": "Haute",
          "medium": "Moyenne",
          "low": "Basse",
          "unknown": "Inconnue"
        }
      },
      "permissionDialog": {
        "subtitle": "L'agent demande une autorisation pour continuer ce tour.",
        "kindFallbackTool": "outil",
        "command": "Commande",
        "cwd": "Répertoire de travail : {cwd}",
        "filesSummary": "Fichiers : {count}",
        "moreFiles": "+{count} fichiers supplémentaires",
        "plan": "Plan de travail",
        "allowedActions": "Actions autorisées",
        "targetMode": "Mode cible : {mode}"
      },
      "questionDialog": {
        "title": "L'agent pose une question",
        "placeholder": "Tapez votre réponse...",
        "send": "Envoyer"
      },
      "messageBranch": {
        "previousBranchAria": "Branche précédente",
        "nextBranchAria": "Branche suivante",
        "pageOf": "{current} sur {total}"
      },
      "terminal": {
        "title": "Console",
        "running": "En cours"
      },
      "reasoning": {
        "thinking": "Réflexion…",
        "thoughtForFewSeconds": "Réflexion",
        "thoughtForSeconds": "Réflexion"
      },
      "linkSafety": {
        "errorCannotOpen": "Impossible d'ouvrir le fichier local",
        "errorNoWorkspace": "Aucun dossier d'espace de travail n'est actuellement actif.",
        "errorOutsideWorkspace": "Le fichier se trouve en dehors du dossier de l'espace de travail actuel.",
        "errorFailedOpen": "Échec de l'ouverture du fichier local",
        "errorFailedLink": "Échec de l'ouverture du lien",
        "errorUnsupportedLinkProtocol": "Ce protocole de lien n’est pas pris en charge."
      },
      "messageList": {
        "attachedResources": "Ressources jointes",
        "loading": "Chargement...",
        "error": "Erreur : {message}",
        "errorTitle": "Échec du chargement de la session",
        "errorActionReload": "Recharger",
        "errorActionNewSession": "Nouvelle conversation",
        "emptyConversation": "Aucun message dans cette conversation.",
        "systemMessage": "Message système",
        "copyMessage": "Copier",
        "copied": "Copié",
        "downloadImage": "Télécharger l'image",
        "downloadFailed": "Échec du téléchargement : {message}",
        "imageGeneration": "Génération d'image",
        "imageGenerationPending": "Génération de l'image…",
        "imageGenerationFailed": "Échec de la génération d'image",
        "model": "Modèle",
        "tokenStats": "Utilisation des tokens",
        "tokenInput": "Entrée",
        "tokenOutput": "Sortie",
        "tokenCacheRead": "Lecture du cache",
        "tokenCacheWrite": "Écriture du cache",
        "duration": "Durée",
        "completedAt": "Terminé à",
        "jumpToPreviousUserMessage": "Aller au message utilisateur"
      },
      "liveTurnStats": {
        "thinking": "Réflexion...",
        "streaming": "Diffusion",
        "elapsedHours": "{value} h",
        "elapsedMinutes": "{value} min",
        "elapsedSeconds": "{value} s",
        "toolUseCount": "{count} outil {count, plural, one {use} other {uses}}"
      },
      "tool": {
        "parameters": "Paramètres",
        "error": "Erreur",
        "result": "Résultat",
        "status": {
          "approvalRequested": "En attente d'approbation",
          "approvalResponded": "Répondu",
          "inputAvailable": "En cours",
          "inputStreaming": "En attente",
          "outputAvailable": "Terminé",
          "outputDenied": "Refusé",
          "outputError": "Erreur"
        }
      },
      "toolCallBlock": {
        "tool": "Outil",
        "error": "Erreur",
        "result": "Résultat"
      },
      "delegation": {
        "subAgentRunning": "Sous-agent en cours…",
        "noDetail": "No detail available yet.",
        "unknownAgent": "Sous-agent",
        "openDetail": "Voir la conversation",
        "detailTitle": "Conversation du sous-agent",
        "detailDescription": "Vue en lecture seule de la conversation du sous-agent délégué.",
        "waitForResult": "En attente du résultat de la tâche {task}",
        "waitForResultNoTask": "En attente du résultat de la tâche",
        "cancelTask": "Annulation de la tâche {task}",
        "cancelTaskNoTask": "Annulation de la tâche",
        "resultPageOf": "{current} / {total}",
        "prevResult": "Résultat précédent",
        "nextResult": "Résultat suivant",
        "noResultText": "Aucun résultat pour cette vérification.",
        "status": {
          "starting": "démarrage",
          "running": "en cours",
          "checked": "vérifié",
          "waiting": "en attente d'approbation",
          "ok": "terminé",
          "err": {
            "default": "échec",
            "delegation_disabled": "désactivé",
            "depth_limit": "limite de profondeur",
            "invalid_agent_type": "agent invalide",
            "spawn_failed": "échec du démarrage",
            "send_failed": "échec de l'envoi",
            "timeout": "délai dépassé",
            "canceled": "annulé",
            "child_refusal": "sous-agent refusé",
            "child_max_tokens": "sous-agent : limite de jetons",
            "child_max_turn_requests": "sous-agent : limite de requêtes",
            "child_empty": "sous-agent sans sortie",
            "child_unknown": "sous-agent : erreur",
            "unknown": "tâche inconnue"
          }
        }
      },
      "contentParts": {
        "showingTailOutput": "Affichage de la fin de la sortie pendant le streaming pour de meilleures performances.",
        "result": "Résultat",
        "unknown": "inconnu",
        "inputTruncated": "L'entrée a été tronquée — le diff peut être incomplet.",
        "replaceAll": "TOUT REMPLACER",
        "filesCount": "Fichiers : {count}",
        "update": "mettre à jour",
        "moreFiles": "+{count} fichiers supplémentaires",
        "timeoutMs": "Délai d'expiration : {timeout}ms",
        "backgroundTrue": "Arrière-plan : true",
        "offset": "Décalage : {offset}",
        "limit": "Limite : {limit}",
        "pages": "Pages : {pages}",
        "mode": "Mode : {mode}",
        "cell": "Cellule : {cell}",
        "pathLabel": "Chemin :",
        "globLabel": "Glob :",
        "typeLabel": "Type :",
        "outputLabel": "Sortie :",
        "caseInsensitive": "Insensible à la casse",
        "multiline": "Multiligne",
        "promptLabel": "Instruction",
        "subjectLabel": "Sujet",
        "taskLabel": "Tâche",
        "nameLabel": "Nom :",
        "agentPromptLabel": "Instruction",
        "agentModelLabel": "Modèle",
        "agentRunning": "En cours...",
        "agentFallbackTitle": "Démarrage du sous-agent…",
        "agentStatsBash": "Commandes",
        "agentStatsRead": "Fichiers lus",
        "agentStatsSearch": "Recherches",
        "agentStatsEdit": "Modifications",
        "agentStatsOther": "Autres",
        "goal": {
          "title": "Objectif :",
          "titleWithStatus": "Objectif {status}",
          "objective": "Objectif",
          "statusLabel": "Statut",
          "tokensUsed": "Tokens utilisés",
          "budget": "Budget",
          "remaining": "Restant",
          "elapsed": "Écoulé",
          "tokens": "tokens",
          "status": {
            "active": "actif",
            "paused": "en pause",
            "blocked": "bloqué",
            "usageLimited": "utilisation limitée",
            "budgetLimited": "budget limité",
            "complete": "terminé"
          }
        },
        "field": {
          "file": "Fichier",
          "notebook": "Carnet",
          "command": "Commande",
          "old": "Ancien",
          "new": "Nouveau",
          "pattern": "Motif",
          "path": "Chemin",
          "query": "Requête",
          "url": "URL :",
          "description": "Détails",
          "content": "Contenu",
          "source": "Origine",
          "prompt": "Instruction",
          "subject": "Sujet",
          "taskId": "ID de tâche",
          "status": "Statut",
          "skill": "Skill",
          "args": "Arguments",
          "offset": "Décalage",
          "limit": "Limite",
          "glob": "Motif glob",
          "type": "Type de donnée",
          "output": "Sortie",
          "replaceAll": "Tout remplacer",
          "language": "Langue",
          "timeout": "Délai",
          "background": "Arrière-plan",
          "agentType": "Type d'agent",
          "library": "Bibliothèque",
          "libraryId": "ID de bibliothèque"
        },
        "title": {
          "edit": "Modifier",
          "command": "Commande",
          "todoWrite": "TodoWrite (mise à jour des tâches)",
          "read": "Lire",
          "write": "Écrire",
          "notebookEdit": "NotebookEdit (édition du carnet)",
          "editFiles": "Modifier ({count} fichiers)",
          "editWithTarget": "Modifier {target}",
          "readWithTarget": "Lire {target}",
          "writeWithTarget": "Écrire {target}",
          "notebookEditWithTarget": "NotebookEdit ({target})",
          "globWithPattern": "Motif glob {pattern}",
          "grepWithPattern": "Motif grep {pattern}",
          "taskCreateWithSubject": "Créer une tâche : {subject}",
          "taskUpdateWithStatus": "Mettre à jour la tâche #{id} -> {status}",
          "taskUpdate": "Mettre à jour la tâche #{id}",
          "webFetchWithUrl": "WebFetch ({url})",
          "webSearchWithQuery": "Recherche web : {query}",
          "todosProgress": "Tâches ({done}/{total})",
          "skillWithName": "Skill : {name}",
          "genericWithContext": "{tool} ({context})"
        },
        "toolGroup": {
          "search": "{count, plural, one {A exploré # recherche} other {A exploré # recherches}}",
          "command": "{count, plural, one {A exécuté # commande} other {A exécuté # commandes}}",
          "read": "{count, plural, one {A lu des fichiers # fois} other {A lu des fichiers # fois}}",
          "memory": "{count, plural, one {A rappelé # souvenir} other {A rappelé # souvenirs}}",
          "edit": "{count, plural, one {A modifié des fichiers # fois} other {A modifié des fichiers # fois}}",
          "fetch": "{count, plural, one {A récupéré # ressource} other {A récupéré # ressources}}",
          "think": "{count, plural, one {A réfléchi # fois} other {A réfléchi # fois}}",
          "todo": "{count, plural, one {A mis à jour # tâche} other {A mis à jour # tâches}}",
          "task": "{count, plural, one {A lancé # tâche} other {A lancé # tâches}}",
          "other": "{count, plural, one {A utilisé # outil} other {A utilisé # outils}}",
          "errorSuffix": "{count, plural, one {# échec} other {# échecs}}",
          "joiner": " · "
        }
      },
      "messageNav": {
        "title": "Navigation des messages",
        "collapse": "Réduire la navigation des messages",
        "collapsedSummary": "Messages {count}",
        "fileCount": "{count, plural, one {# fichier} other {# fichiers}}",
        "remove": "Retirer",
        "noDiffDataAvailable": "Aucune donnée de diff disponible pour {filePath}"
      },
      "askQuestion": {
        "title": "L'agent attend votre choix",
        "subtitle": "Répondez puis envoyez. Vous pouvez ignorer à tout moment.",
        "recommended": "Recommandé",
        "other": "Autre",
        "otherPlaceholder": "Saisissez votre réponse…",
        "singleSelect": "Unique",
        "multiSelect": "Multiple",
        "skip": "Ignorer",
        "next": "Suivant",
        "submit": "Envoyer",
        "submitError": "Échec de l'envoi. Veuillez réessayer."
      },
      "feedbackCheckResult": {
        "count": "{count, plural, =1 {1 retour} other {# retours}}",
        "expand": "Afficher tous les retours",
        "collapse": "Réduire",
        "errorTitle": "Échec de la vérification des retours"
      },
      "askQuestionResult": {
        "title": "Question",
        "answeredLabel": "Question et réponse :",
        "awaiting": "En attente de ta réponse…",
        "declined": "Tu as ignoré cette question — l’agent a utilisé son propre jugement.",
        "noSelection": "Aucune sélection"
      },
      "configStale": {
        "agentConfigTitle": "Paramètres de l'agent mis à jour",
        "modelProviderTitle": "Fournisseur de modèle mis à jour",
        "description": "Cette session utilise encore son ancienne configuration. Reconnectez-vous pour l'appliquer (l'historique de conversation est conservé).",
        "reconnect": "Reconnecter pour appliquer",
        "reconnecting": "Reconnexion…",
        "reconnectDisabledDuringTurn": "Disponible une fois le tour en cours terminé",
        "dismiss": "Ignorer",
        "reconnectFailed": "Échec de la reconnexion de la session",
        "applied": "Nouvelle configuration appliquée"
      }
    },
    "diffPreview": {
      "mode": {
        "added": "Ajouté",
        "deleted": "Supprimé",
        "renamed": "Renommé",
        "modified": "Modifié"
      },
      "hunkLabel": "Bloc {index}",
      "loadingHunk": "Chargement du hunk...",
      "noDiffData": "Aucune donnée diff"
    },
    "conversationContextBar": {
      "folderTitle": "Dossier de travail",
      "branchTitle": "Branche de travail",
      "searchFolder": "Search folder...",
      "searchBranch": "Search branch...",
      "noFolders": "No folders",
      "noBranches": "No branches",
      "noBranch": "(no branch)",
      "chatModeLabel": "Mode sans dossier",
      "commit": "Commit",
      "push": "Push",
      "merge": "Merge",
      "toasts": {
        "folderChanged": "Switched to {name}",
        "openFolderFailed": "Failed to open folder",
        "switchedToChatMode": "Basculé en mode discussion",
        "openStashFailed": "Failed to open stash window",
        "openMergeFailed": "Failed to open merge window"
      }
    },
    "cloneDialog": {
      "title": "Cloner un dépôt",
      "repositoryUrl": "URL du dépôt",
      "repositoryUrlPlaceholder": "https://github.com/user/repo.git",
      "directory": "Répertoire",
      "directoryPlaceholder": "Sélectionnez le répertoire cible...",
      "browseDirectory": "Parcourir le répertoire",
      "cancel": "Annuler",
      "clone": "Cloner",
      "clonePath": "Chemin de clonage : {path}"
    },
    "toasts": {
      "cloneFailed": "Échec du clonage du dépôt"
    }
  },
  "ProjectBoot": {
    "title": "Lanceur de projet",
    "tabs": {
      "shadcn": "shadcn",
      "hyperframes": "HyperFrames"
    },
    "hyperframes": {
      "title": "Projet vidéo HyperFrames",
      "subtitle": "Générez un projet HTML-vers-vidéo. L'agent de l'espace de travail peut ensuite l'écrire et le rendre.",
      "resolution": "Résolution",
      "skillsTitle": "Skills des agents",
      "skillsDesc": "Installe globalement les skills HyperFrames (lien symbolique) pour les agents sélectionnés, afin qu'ils puissent créer et rendre des vidéos.",
      "recheck": "Revérifier",
      "installedBadge": "Installé",
      "skillsInstall": "Installer / mettre à jour les skills",
      "skillsInstalling": "Installation des skills…",
      "skillsInstalled": "Skills HyperFrames installées",
      "skillsInstallFailed": "Impossible d'installer les skills HyperFrames"
    },
    "config": {
      "base": "Base",
      "style": "Style",
      "baseColor": "Couleur de base",
      "theme": "Thème",
      "chartColor": "Couleur du graphique",
      "iconLibrary": "Bibliothèque d'icônes",
      "font": "Police",
      "fontHeading": "Police de titre",
      "menuAccent": "Accent du menu",
      "menuColor": "Couleur du menu",
      "radius": "Rayon",
      "template": "Modèle",
      "createProject": "Créer un projet",
      "sectionStyle": "Style",
      "sectionColors": "Couleurs",
      "sectionTypography": "Typographie",
      "sectionInterface": "Interface"
    },
    "preview": {
      "loading": "Chargement de l'aperçu..."
    },
    "createDialog": {
      "title": "Créer un projet",
      "projectName": "Nom du projet",
      "projectNamePlaceholder": "my-app",
      "frameworkTemplate": "Modèle de framework",
      "packageManager": "Gestionnaire de paquets",
      "saveDirectory": "Répertoire de sauvegarde",
      "saveDirectoryPlaceholder": "Sélectionner un répertoire...",
      "browseDirectory": "Parcourir",
      "projectPath": "Le projet sera créé dans : {path}",
      "advancedOptions": "Options avancées",
      "base": "Bibliothèque de base",
      "enableRtl": "Activer le support RTL",
      "enableRtlDescription": "Activer la prise en charge de la mise en page pour les langues de droite à gauche (ex. arabe, hébreu)",
      "pmChecking": "Vérification...",
      "pmNotInstalled": "Non installé",
      "cancel": "Annuler",
      "create": "Créer",
      "creating": "Création du projet..."
    },
    "toasts": {
      "createFailed": "Échec de la création du projet",
      "createSuccess": "Projet créé avec succès",
      "openWorkspaceFailed": "Projet créé, mais impossible de l'ouvrir dans l'espace de travail"
    },
    "errors": {
      "directoryExists": "Le répertoire cible existe déjà",
      "commandFailed": "La commande de création du projet a échoué."
    }
  },
  "WebServiceSettings": {
    "addressSwitchHint": "Changer ne modifie que l'adresse affichée et ouverte ici ; le service écoute sur toutes les interfaces et reste accessible à chaque adresse.",
    "sectionTitle": "Service Web",
    "sectionDescription": "Activer pour accéder à Codeg à distance via le navigateur",
    "port": "Port",
    "status": "Statut",
    "autoStart": "Démarrage auto",
    "autoStartHint": "Démarrer le service Web au lancement de Codeg",
    "running": "En cours",
    "stopped": "Arrêté",
    "processing": "Traitement...",
    "start": "Démarrer",
    "stop": "Arrêter",
    "startFailed": "Échec du démarrage",
    "stopFailed": "Échec de l'arrêt",
    "saveConfigFailed": "Échec de l'enregistrement des paramètres du service Web",
    "open": "Ouvrir",
    "hide": "Masquer",
    "show": "Afficher",
    "copy": "Copier",
    "qrcode": "Code QR",
    "qrcodeTitle": "Scanner pour ouvrir",
    "qrcodeHint": "Scannez avec votre téléphone pour ouvrir Codeg dans un navigateur",
    "addressLabel": "Adresse d'accès",
    "tokenLabel": "Token d'accès",
    "tokenHint": "Entrez ce token lors du premier accès au client Web",
    "tokenPlaceholder": "Laisser vide pour générer automatiquement",
    "regenerate": "Régénérer",
    "stalePortOccupiedTitle": "Le port {port} est utilisé par un autre processus",
    "stalePortUnknownTitle": "L'état du port {port} est indéterminé",
    "stalePortHint": "Codeg ne peut pas s'attacher tant que le port n'est pas libéré. Changez de port ci-dessus, ou fermez le processus qui le retient.",
    "errors": {
      "alreadyRunning": "Le service Web est déjà en cours d'exécution",
      "invalidAddress": "Format d'hôte ou de port non valide",
      "portInUse": "Le port {port} est déjà utilisé. Fermez le processus qui l'utilise ou choisissez un autre port.",
      "permissionDenied": "Permission refusée. Utilisez un port supérieur à 1024 ou exécutez avec des privilèges plus élevés.",
      "addressUnavailable": "Cette adresse n'est pas disponible sur cette machine",
      "bindFailed": "Échec de la liaison à l'adresse"
    }
  },
  "DirectoryBrowser": {
    "title": "Parcourir le répertoire",
    "pathPlaceholder": "Entrez le chemin du répertoire...",
    "goHome": "Aller au répertoire personnel",
    "navigateUp": "Aller au répertoire parent",
    "select": "Sélectionner",
    "cancel": "Annuler",
    "loading": "Chargement...",
    "emptyDirectory": "Ce répertoire est vide",
    "errorLoadingDir": "Échec du chargement du répertoire",
    "permissionDenied": "Permission refusée"
  },
  "ChatChannelSettings": {
    "loading": "Chargement...",
    "sectionTitle": "Canaux de chat",
    "sectionDescription": "Configurez des bots IM pour recevoir des notifications d'événements et interroger l'activité de codage.",
    "addChannel": "Ajouter un canal",
    "noChannels": "Aucun canal de chat configuré pour le moment.",
    "channelName": "Nom",
    "channelNamePlaceholder": "Mon bot Telegram",
    "channelType": "Type de canal",
    "lark": "Lark (Feishu)",
    "weixin": "WeChat",
    "dailyReport": "Rapport quotidien",
    "dailyReportTime": "Heure du rapport",
    "nameRequired": "Le nom du canal est requis.",
    "tokenRequired": "Le token est requis.",
    "chatIdRequired": "Le Chat ID est requis.",
    "loadFailed": "Échec du chargement des canaux.",
    "saveFailed": "Échec de l'enregistrement.",
    "connectSuccess": "Canal connecté.",
    "connectFailed": "Échec de la connexion",
    "disconnectSuccess": "Canal déconnecté.",
    "disconnectFailed": "Échec de la déconnexion.",
    "testSuccess": "Test de connexion réussi.",
    "testFailed": "Test de connexion échoué",
    "deleteSuccess": "Canal supprimé.",
    "deleteFailed": "Échec de la suppression du canal.",
    "deleteConfirmTitle": "Supprimer le canal",
    "deleteConfirmMessage": "Le canal et ses journaux de messages seront définitivement supprimés. Êtes-vous sûr ?",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "create": "Créer",
    "save": "Enregistrer",
    "channelListTitle": "Canaux configurés",
    "channelListDescription": "Les canaux activés se connectent automatiquement au démarrage du service.",
    "editChannel": "Modifier le canal",
    "editSuccess": "Canal mis à jour.",
    "tokenPlaceholderKeep": "Laisser vide pour conserver l'actuel",
    "weixinScanTitle": "Scanner le QR code",
    "weixinScanDescription": "Ouvrez WeChat et scannez le QR code pour vous connecter.",
    "weixinQrcodeExpired": "QR code expiré.",
    "weixinRefreshQrcode": "Actualiser",
    "weixinWaitingScan": "En attente du scan...",
    "weixinPollError": "Connexion instable, nouvelle tentative...",
    "weixinReconnectNotice": "En raison des limitations du protocole iLink, après chaque reconnexion vous devez envoyer un message au bot pour que les déclencheurs d'événements prennent effet.",
    "connect": "Connecter",
    "disconnect": "Déconnecter",
    "test": "Tester la connexion",
    "tabs": {
      "channels": "Canaux",
      "commands": "Commandes",
      "events": "Événements",
      "other": "Autres"
    },
    "commands": {
      "title": "Commandes intégrées",
      "description": "Commandes bot disponibles dans les canaux de chat. Dans les chats de groupe, @Bot est requis pour traiter les messages.",
      "prefixLabel": "Préfixe de commande",
      "prefixDescription": "1-3 caractères non alphanumériques pour déclencher les commandes du bot (par défaut /).",
      "prefixSaved": "Préfixe de commande enregistré.",
      "prefixSaveFailed": "Échec de l'enregistrement du préfixe.",
      "prefixInvalid": "Le préfixe doit être de 1-3 caractères non alphanumériques.",
      "save": "Enregistrer",
      "folderDesc": "Sélectionner le dossier de travail",
      "agentDesc": "Sélectionner l'agent IA",
      "taskDesc": "Créer une session et exécuter la tâche",
      "sessionsDesc": "Lister les sessions actives du dossier",
      "resumeDesc": "Conversations récentes / reprendre une session",
      "cancelDesc": "Annuler la tâche en cours",
      "approveDesc": "Approuver la demande de permission de l'agent",
      "denyDesc": "Refuser la demande de permission de l'agent",
      "searchDesc": "Rechercher des conversations par mot-clé",
      "todayDesc": "Résumé de l'activité du jour",
      "statusDesc": "État de connexion du canal",
      "helpDesc": "Afficher l'aide"
    },
    "events": {
      "title": "Notifications d'événements",
      "description": "Une fois activés, les événements déclenchés seront envoyés au canal.",
      "turnComplete": "Tour terminé",
      "turnCompleteDesc": "Lorsqu'un tour d'agent se termine",
      "error": "Erreur de l'agent",
      "errorDesc": "Lorsqu'un agent rencontre une erreur",
      "permissionRequest": "Demande d'autorisation",
      "permissionRequestDesc": "Lorsqu'un agent demande une autorisation",
      "questionRequest": "Question de l'agent",
      "questionRequestDesc": "Quand un agent vous pose une question",
      "userPromptSent": "Message de l'utilisateur",
      "userPromptSentDesc": "Lorsque vous envoyez un message (le texte du message est inclus dans la notification)",
      "saved": "Filtre d'événements mis à jour.",
      "saveFailed": "Échec de l'enregistrement du filtre d'événements.",
      "loadFailed": "Échec du chargement des paramètres.",
      "retry": "Réessayer",
      "webhooksTitle": "Webhooks",
      "webhooksDescription": "Envoie une charge JSON via POST vers une ou plusieurs URL lorsqu'un événement activé se déclenche. Le filtre d'événements ci-dessus s'applique aussi aux webhooks.",
      "webhookUrlPlaceholder": "https://example.com/webhook",
      "addWebhook": "Ajouter un webhook",
      "removeWebhook": "Supprimer le webhook",
      "webhookSave": "Enregistrer",
      "webhooksSaved": "Webhooks enregistrés.",
      "webhooksSaveFailed": "Échec de l'enregistrement des webhooks.",
      "webhookInvalidUrl": "Saisissez des URL http(s) valides.",
      "docsTitle": "Format de la requête",
      "docsMethod": "Méthode",
      "docsContentType": "Content-Type",
      "docsNote": "Chaque événement activé est envoyé à toutes les URL. Les webhooks ne sont pas anti-rebond ; le filtre d'événements ci-dessus s'applique toujours.",
      "editWebhook": "Modifier le webhook",
      "enableWebhook": "Activer le webhook",
      "webhookDuplicate": "Cette URL est déjà configurée.",
      "cancel": "Annuler",
      "webhooksEmpty": "Aucun webhook configuré pour le moment.",
      "deleteWebhookTitle": "Supprimer le webhook",
      "deleteWebhookMessage": "Supprimer ce webhook ? Les événements ne seront plus envoyés à cette URL.",
      "delete": "Supprimer"
    },
    "language": {
      "title": "Langue des messages",
      "description": "Langue utilisée pour les notifications d'événements, les réponses aux commandes et les rapports quotidiens envoyés aux canaux de chat.",
      "saved": "Langue des messages enregistrée.",
      "saveFailed": "Échec de l'enregistrement de la langue des messages.",
      "en": "Anglais",
      "zh-cn": "Chinois simplifié",
      "zh-tw": "Chinois traditionnel",
      "ja": "Japonais",
      "ko": "Coréen",
      "es": "Espagnol",
      "de": "Allemand",
      "fr": "Français",
      "pt": "Portugais",
      "ar": "Arabe"
    }
  },
  "ModelProviderSettings": {
    "sectionTitle": "Fournisseurs de Modèles",
    "sectionDescription": "Gérer les identifiants des fournisseurs d'API pour les agents.",
    "filterAll": "Tous",
    "providerListTitle": "Fournisseurs Configurés",
    "addProvider": "Ajouter un Fournisseur",
    "editProvider": "Modifier le Fournisseur",
    "noProviders": "Aucun fournisseur de modèle configuré.",
    "providerName": "Nom",
    "providerNamePlaceholder": "Ex. OpenAI, Anthropic",
    "apiUrl": "URL de l'API",
    "apiUrlPlaceholder": "https://api.openai.com/v1",
    "apiKey": "Clé API",
    "apiKeyPlaceholder": "sk-...",
    "apiKeyKeepCurrent": "Laisser vide pour conserver l'actuelle",
    "agentTypes": "Types d'Agent",
    "agentTypesRequired": "Au moins un type d'agent est requis.",
    "agentType": "Type d'Agent",
    "agentTypeRequired": "Le type d'agent est requis.",
    "agentTypeImmutableHint": "Le type d'agent ne peut pas être modifié après la création.",
    "model": "Modèle",
    "modelPlaceholderCodex": "gpt-5 / gpt-5-mini",
    "modelPlaceholderGemini": "gemini-3-pro-preview",
    "claudeMainModel": "Modèle Principal",
    "claudeReasoningModel": "Modèle de Raisonnement (réflexion)",
    "claudeHaikuDefaultModel": "Modèle Haiku par Défaut",
    "claudeSonnetDefaultModel": "Modèle Sonnet par Défaut",
    "claudeOpusDefaultModel": "Modèle Opus par Défaut",
    "nameRequired": "Le nom du fournisseur est requis.",
    "apiUrlRequired": "L'URL de l'API est requise.",
    "apiKeyRequired": "La clé API est requise.",
    "loadFailed": "Échec du chargement des fournisseurs.",
    "saveFailed": "Échec de la sauvegarde.",
    "createSuccess": "Fournisseur créé.",
    "editSuccess": "Fournisseur mis à jour.",
    "deleteSuccess": "Fournisseur supprimé.",
    "deleteConfirmTitle": "Supprimer le Fournisseur",
    "deleteConfirmMessage": "Le fournisseur \"{name}\" sera définitivement supprimé. Êtes-vous sûr ?",
    "deleteBlockedByAgent": "{agents} utilise ce fournisseur. Veuillez le dissocier avant de supprimer.",
    "cancel": "Annuler",
    "delete": "Supprimer",
    "create": "Créer",
    "save": "Enregistrer",
    "affectedRunningSessions": "{count, plural, one {# session active doit se reconnecter pour appliquer la modification} other {# sessions actives doivent se reconnecter pour appliquer la modification}}"
  },
  "ExpertsSettings": {
    "title": "Compétences d'experts",
    "description": "Activez des workflows de compétences soigneusement sélectionnés et éprouvés pour vos agents de codage IA. Chaque expert est une compétence autonome du projet superpowers — codeg gère la copie centrale et la lie aux agents que vous choisissez.",
    "loading": "Chargement des experts…",
    "loadingContent": "Chargement du contenu…",
    "emptyExperts": "Aucun expert disponible. Vérifiez les journaux de l'application.",
    "emptySelection": "Sélectionnez un expert pour voir son contenu et gérer son activation.",
    "emptySearch": "Aucun expert ne correspond à la recherche actuelle.",
    "searchPlaceholder": "Rechercher des experts par nom, ID ou description",
    "enableForAgents": "Activer pour les agents",
    "noAgents": "Aucun agent ACP détecté.",
    "copyModeWarning": "Copié (non lié). Réactivez après les mises à jour de codeg pour obtenir la dernière version.",
    "previewTitle": "Aperçu de SKILL.md",
    "categories": {
      "discovery": "Découverte et conception",
      "planning": "Planification",
      "execution": "Exécution",
      "quality": "Qualité et tests",
      "debugging": "Débogage",
      "review": "Révision et intégration",
      "meta": "Meta"
    },
    "states": {
      "not_linked": "Non activé",
      "linked_to_codeg": "Activé",
      "linked_elsewhere": "Bloqué — un autre lien existe",
      "blocked_by_real_directory": "Bloqué — une compétence personnalisée occupe ce nom",
      "broken": "Lien cassé"
    },
    "badges": {
      "userModified": "Modifié par l'utilisateur"
    },
    "actions": {
      "openCentralDir": "Ouvrir le dossier central",
      "refresh": "Actualiser"
    },
    "toasts": {
      "loadFailed": "Échec du chargement des détails de l'expert",
      "enabled": "Expert activé pour cet agent",
      "disabled": "Expert désactivé pour cet agent",
      "enableFailed": "Échec de l'activation de l'expert",
      "disableFailed": "Échec de la désactivation de l'expert",
      "openFolderFailed": "Échec de l'ouverture du dossier"
    }
  },
  "QuickMessagesSettings": {
    "title": "Messages rapides",
    "description": "Gérez des extraits de messages réutilisables. Glissez pour réorganiser.",
    "loading": "Chargement des messages rapides…",
    "emptyList": "Aucun message rapide. Cliquez sur « Nouveau » pour en créer un.",
    "emptySelection": "Sélectionnez un message rapide à modifier.",
    "searchPlaceholder": "Rechercher par titre ou contenu",
    "untitled": "Sans titre",
    "actions": {
      "new": "Nouveau",
      "save": "Enregistrer",
      "delete": "Supprimer",
      "dragSort": "Glisser pour réorganiser",
      "dragSortMessage": "Réorganiser le message rapide : {name}"
    },
    "fields": {
      "title": "Titre",
      "titlePlaceholder": "Donnez un titre court à ce message",
      "content": "Contenu",
      "contentPlaceholder": "Saisissez ici le contenu du message"
    },
    "confirmDelete": {
      "title": "Supprimer le message rapide ?",
      "message": "Cela supprimera définitivement « {name} ». Êtes-vous sûr ?",
      "cancel": "Annuler",
      "confirm": "Supprimer"
    },
    "toasts": {
      "loadFailed": "Échec du chargement des messages rapides",
      "createFailed": "Échec de la création du message rapide",
      "saveFailed": "Échec de l'enregistrement du message rapide",
      "deleteFailed": "Échec de la suppression du message rapide",
      "saveOrderFailed": "Échec de l'enregistrement de l'ordre",
      "created": "Message rapide créé",
      "saved": "Message rapide enregistré",
      "deleted": "Message rapide supprimé"
    }
  },
  "Pet": {
    "badge": {
      "running": "{count} en cours",
      "waiting": "{count} en attente d'approbation",
      "error": "{count} en erreur"
    },
    "panel": {
      "title": "Sessions actives",
      "empty": "Aucune session active",
      "emptyHint": "Les agents en cours et ceux qui vous attendent apparaissent ici.",
      "statusRunning": "En cours",
      "statusWaiting": "En attente",
      "statusError": "Erreur"
    },
    "menu": {
      "scale": "Échelle",
      "openManager": "Gérer les mascottes",
      "close": "Fermer"
    },
    "loadError": "Échec du chargement de la mascotte",
    "missingPetIdParam": "Aucune mascotte sélectionnée",
    "summonButton": "Mascotte",
    "manager": {
      "title": "Mascottes",
      "description": "Compagnons flottants de bureau avec des sprites compatibles Codex.",
      "addPet": "Ajouter une mascotte",
      "importFromCodex": "Importer depuis Codex",
      "noPets": "Aucune mascotte. Ajoutez-en ou importez depuis Codex.",
      "setActive": "Activer",
      "active": "Active",
      "edit": "Modifier",
      "delete": "Supprimer",
      "deleteConfirm": "Supprimer la mascotte « {name} » ? Elle sera retirée du disque.",
      "summon": "Invoquer la fenêtre de la mascotte",
      "openCodexHelp": "Les mascottes Codex doivent être dans ~/.codex/pets/. Aucune trouvée.",
      "specRequirement": "Le sprite doit être un PNG/WebP 1536x1872 avec transparence.",
      "form": {
        "id": "ID mascotte",
        "idHelp": "Lettres minuscules, chiffres, '-' et '_'. Max 64 caractères.",
        "displayName": "Nom affiché",
        "description": "Description (facultative)",
        "spritesheet": "Sprite",
        "chooseFile": "Choisir un fichier",
        "replaceFile": "Remplacer le sprite",
        "saveCreate": "Ajouter la mascotte",
        "saveUpdate": "Enregistrer",
        "cancel": "Annuler"
      },
      "errors": {
        "missingId": "ID requis",
        "missingName": "Nom requis",
        "missingSpritesheet": "Sprite requis",
        "addFailed": "Ajout impossible",
        "updateFailed": "Mise à jour impossible",
        "deleteFailed": "Suppression impossible",
        "loadFailed": "Chargement impossible",
        "setActiveFailed": "Activation impossible",
        "summonFailed": "Ouverture de la fenêtre impossible"
      }
    },
    "import": {
      "title": "Importer depuis Codex",
      "subtitle": "Mascottes disponibles sous ~/.codex/pets/.",
      "selectAll": "Tout sélectionner",
      "alreadyImported": "Déjà importée",
      "renameOnConflict": "Renommer en -imported en cas de conflit",
      "import": "Importer la sélection",
      "noneFound": "Aucune mascotte Codex importable.",
      "imported": "Import réussi",
      "failed": "Import échoué",
      "close": "Fermer"
    },
    "marketplace": {
      "openMarketplace": "Marketplace de mascottes",
      "title": "Marketplace de mascottes",
      "search": "Rechercher des mascottes",
      "kindFilter": {
        "all": "Toutes",
        "object": "Objet",
        "animal": "Animal",
        "person": "Personne",
        "creature": "Créature"
      },
      "sortFilter": {
        "latest": "Récents",
        "popular": "Populaires",
        "views": "Vues"
      },
      "refresh": "Actualiser",
      "install": "Installer",
      "installing": "Installation",
      "reinstall": "Réinstaller",
      "reinstallConfirm": "Remplacer la mascotte locale « {name} » ? Les données existantes seront écrasées.",
      "cancel": "Annuler",
      "stats": {
        "views": "Vues",
        "downloads": "Téléchargements",
        "likes": "J’aime"
      },
      "actions": {
        "idle": "Repos",
        "running_right": "Course dr.",
        "running_left": "Course g.",
        "waving": "Salut",
        "jumping": "Saut",
        "failed": "Échec",
        "waiting": "Attente",
        "running": "Course",
        "review": "Revue"
      },
      "page": "Page {page} sur {total}",
      "prev": "Précédent",
      "next": "Suivant",
      "empty": "Aucune mascotte ne correspond.",
      "successInstalled": "« {name} » installée",
      "errors": {
        "loadFailed": "Impossible de charger le marketplace",
        "installFailed": "Échec de l’installation",
        "alreadyInstalled": "La mascotte existe déjà localement"
      }
    }
  },
  "RemoteWorkspace": {
    "openRemoteWorkspace": "Open remote workspace",
    "manage": "Manage remote workspace",
    "manageTitle": "Remote Workspace connections",
    "empty": "No remote connections",
    "searchPlaceholder": "Search remote workspaces",
    "orderFailed": "Failed to save remote workspace order",
    "dragSort": "Drag to sort",
    "dragSortConnection": "Drag to sort {name}",
    "newConnection": "New connection",
    "loading": "Loading",
    "loadingConnection": "Loading remote connection",
    "name": "Name",
    "baseUrl": "Service URL",
    "token": "Access token",
    "save": "Save",
    "delete": "Delete",
    "confirmDelete": {
      "title": "Delete remote connection?",
      "message": "This will remove \"{name}\" from this device. This action cannot be undone.",
      "cancel": "Cancel",
      "confirm": "Delete"
    },
    "saved": "Remote connection saved.",
    "deleted": "Remote connection deleted.",
    "loadFailed": "Failed to load remote connections",
    "saveFailed": "Failed to save remote connection",
    "deleteFailed": "Failed to delete remote connection",
    "openFailed": "Failed to open remote workspace",
    "connectionLoadFailed": "Failed to load remote connection: {message}",
    "connectionExpired": "Remote connection \"{name}\" is expired. Update its token and reload this window."
  },
  "ServerFileBrowser": {
    "title": "Sélectionner un fichier serveur",
    "pathPlaceholder": "Saisir le chemin du dossier...",
    "goHome": "Aller au dossier personnel",
    "navigateUp": "Aller au dossier parent",
    "select": "Sélectionner",
    "cancel": "Annuler",
    "loading": "Chargement...",
    "emptyDirectory": "Ce dossier est vide",
    "errorLoadingDir": "Échec du chargement du dossier",
    "selectedCount": "{count} sélectionné(s)"
  },
  "BackupSettings": {
    "title": "Sauvegarde et restauration",
    "description": "Exportez une sauvegarde portable de vos données codeg, ou restaurez à partir d'une sauvegarde.",
    "tabs": {
      "backup": "Sauvegarde",
      "restore": "Restauration"
    },
    "export": {
      "includeExternal": "Inclure le contenu des conversations",
      "includeExternalHint": "Archive aussi les transcriptions des CLI (Claude, Codex, Gemini, …). Augmente la taille.",
      "passphrase": "Phrase secrète (facultatif)",
      "passphrasePlaceholder": "Laissez vide pour une archive non chiffrée",
      "passphraseConfirm": "Confirmer la phrase secrète",
      "passphraseMismatch": "Les phrases secrètes ne correspondent pas.",
      "noPassphraseWarning": "Cette sauvegarde contiendra des secrets (clés d'API, jetons) en clair. Conservez-la en lieu sûr.",
      "passphraseLossWarning": "Chiffrée avec cette phrase secrète. Si vous la perdez, la sauvegarde ne pourra pas être récupérée.",
      "button": "Exporter la sauvegarde",
      "inProgress": "Création de la sauvegarde…",
      "success": "Sauvegarde créée.",
      "started": "Téléchargement de la sauvegarde lancé."
    },
    "restore": {
      "selectFile": "Sélectionner le fichier de sauvegarde",
      "passphrasePrompt": "Cette sauvegarde est chiffrée. Saisissez sa phrase secrète.",
      "unlock": "Déverrouiller",
      "preview": {
        "title": "Détails de la sauvegarde",
        "encrypted": "Chiffrée",
        "compatible": "Compatible",
        "incompatible": "Incompatible",
        "createdAt": "Créée : {value}",
        "appVersion": "Version de l'app : {value}",
        "incompatibleHint": "Cette sauvegarde a été créée par une version plus récente de codeg et ne peut pas être restaurée."
      },
      "replaceWarning": "La restauration remplace toutes les données codeg actuelles (base de données et téléversements). Vos données actuelles sont d'abord sauvegardées en instantané pour pouvoir être récupérées.",
      "keyringNote": "Les jetons GitHub/chat du bureau sont dans le trousseau du système et ne sont pas inclus ; ressaisissez-les après la restauration.",
      "button": "Restaurer",
      "staging": "Préparation de la restauration…",
      "staged": "Restauration préparée. Redémarrage…",
      "restarting": "Restauration préparée. Redémarrage du serveur…",
      "restartTimeout": "Le serveur n'est pas revenu à temps. Rechargez la page une fois qu'il est actif.",
      "externalSideLocation": "Les transcriptions de conversations ont été restaurées dans {path}",
      "confirmTitle": "Remplacer toutes les données ?",
      "confirmBody": "Cela remplacera votre base de données et vos téléversements codeg actuels par la sauvegarde, puis redémarrera. Vos données actuelles sont d'abord sauvegardées en instantané.",
      "cancel": "Annuler",
      "confirmAction": "Remplacer et redémarrer",
      "external": {
        "title": "Contenu des conversations",
        "hint": "Cette sauvegarde inclut des transcriptions des CLI. Choisissez où les restaurer.",
        "modeSkip": "Ne pas restaurer",
        "modeSide": "Restaurer dans un dossier annexe sûr",
        "modeOriginal": "Restaurer aux emplacements d'origine des CLI",
        "forceOverwrite": "Écraser les fichiers existants",
        "forceOverwriteHint": "Remplace les fichiers déjà présents dans les dossiers des CLI.",
        "scanning": "Vérification des conflits…",
        "noConflicts": "Aucun fichier existant ne sera écrasé.",
        "conflictCount": "{count} fichier(s) existant(s) seraient concerné(s).",
        "conflictSkipNote": "Les fichiers existants sont conservés (ignorés) sauf si vous activez l'écrasement."
      },
      "restartFailed": "Restauration préparée, mais le serveur n'a pas pu redémarrer. Redémarrez-le manuellement pour l'appliquer."
    },
    "remoteUnsupported": "La sauvegarde et la restauration agissent sur les données de la machine qui exécute codeg. Vous êtes connecté à un espace de travail distant : gérez ses sauvegardes directement depuis ce serveur."
  },
  "backup": {
    "restore": {
      "error": {
        "badPassphrase": "Phrase secrète incorrecte ou sauvegarde corrompue.",
        "corrupted": "L'archive de sauvegarde est corrompue.",
        "unknownFormat": "Ce fichier n'est pas une sauvegarde codeg reconnue.",
        "newerVersion": "Cette sauvegarde a été créée par codeg {backupVersion}, plus récent que cette version ({appVersion}).",
        "alreadyPending": "Une restauration est déjà préparée. Redémarrez pour l'appliquer avant d'en préparer une autre."
      }
    },
    "error": {
      "diskSpace": "Espace disque insuffisant pour terminer l'opération.",
      "cancelled": "L'opération a été annulée."
    }
  },
  "WebConnection": {
    "disconnectedTitle": "Connexion perdue",
    "reconnectingDescription": "Tentative de reconnexion au serveur. Cela se rétablit généralement tout seul en quelques secondes.",
    "reconnectNow": "Se reconnecter maintenant",
    "sessionExpiredTitle": "Session expirée",
    "sessionExpiredDescription": "Votre session n'est plus valide. Veuillez vous reconnecter pour continuer.",
    "goToLogin": "Aller à la connexion"
  },
  "SessionFeedbackSettings": {
    "title": "Retour en direct",
    "description": "Envoyez des notes et corrections à un agent pendant qu'il travaille. Une fois activé, l'agent dispose d'un outil pour consulter les retours en direct et les conversations affichent une entrée de notes. Astuce : l'agent ne consulte généralement les retours que lorsque vous le mentionnez dans votre message — par exemple, ajoutez « vérifie régulièrement mes retours en direct pendant le travail ».",
    "enable": "Activer le retour en direct",
    "enableHint": "Ajoute un outil de consultation des retours aux agents démarrés après l'activation.",
    "save": "Enregistrer",
    "saving": "Enregistrement…",
    "saved": "Paramètres de retour enregistrés",
    "saveFailed": "Échec de l'enregistrement des paramètres de retour",
    "loadFailed": "Échec du chargement : {detail}"
  },
  "LiveFeedback": {
    "placeholder": "Envoyez une note à {agent} pendant qu'il travaille…",
    "agentFallback": "l'agent",
    "ariaLabel": "Note de retour en direct",
    "dialogTitle": "Retour en direct",
    "dialogDescription": "Envoyez une note à l'agent pendant qu'il travaille. Il la lira lors de sa prochaine vérification, sans interrompre l'étape en cours.",
    "send": "Envoyer",
    "cancel": "Annuler",
    "pending": "en attente",
    "delivered": "reçue",
    "turnEndedUnread": "L'agent a terminé avant de lire votre retour.",
    "sendAsMessage": "Envoyer comme message",
    "dismiss": "Ignorer",
    "turnEndedResent": "Le tour est terminé : envoyé comme nouveau message.",
    "turnEnded": "Le tour est déjà terminé.",
    "submitFailed": "Impossible d'envoyer votre note"
  },
  "AskQuestionSettings": {
    "title": "Poser une question à l'utilisateur",
    "description": "Permet aux agents de s'interrompre et de vous poser une question à choix multiples affichée au-dessus de la zone de saisie de la conversation. L'agent attend votre réponse (ou que vous ignoriez).",
    "enable": "Activer les questions à l'utilisateur",
    "enableHint": "Ajoute l'outil ask_user_question aux agents démarrés après l'activation.",
    "save": "Enregistrer",
    "saving": "Enregistrement…",
    "saved": "Paramètres de question enregistrés",
    "saveFailed": "Échec de l'enregistrement des paramètres de question",
    "loadFailed": "Échec du chargement : {detail}"
  }
}
