{
  "app": {
    "brand": "nanobot",
    "loading": {
      "connecting": "Connexion à nanobot…",
      "boot": "Chargement de nanobot…"
    },
    "error": {
      "title": "Impossible de joindre nanobot",
      "gatewayHint": "Assurez-vous que la gateway est en cours d’exécution (`nanobot gateway`) et que cette page est ouverte sur la même machine."
    },
    "auth": {
      "title": "Authentification requise",
      "hint": "Saisissez le secret configuré comme tokenIssueSecret dans la configuration de votre gateway.",
      "placeholder": "Mot de passe",
      "submit": "Se connecter",
      "invalid": "Mot de passe invalide. Réessayez."
    },
    "account": {
      "section": "Compte",
      "logoutHint": "Déconnecter ce navigateur du gateway.",
      "logout": "Se déconnecter"
    },
    "system": {
      "section": "Système",
      "restartHint": "Redémarrez nanobot pour appliquer les changements d’exécution.",
      "restart": "Redémarrer nanobot",
      "restarting": "Redémarrage...",
      "restartEngine": "Redémarrer le moteur",
      "restartingEngine": "Redémarrage du moteur..."
    },
    "restart": {
      "completed": "Redémarrage terminé en {{seconds}} s."
    },
    "documentTitle": {
      "base": "nanobot",
      "chat": "{{title}} · nanobot"
    },
    "meta": {
      "description": "Interface web nanobot — discutez avec votre espace de travail nanobot."
    }
  },
  "sidebar": {
    "navigation": "Navigation de la barre latérale",
    "collapse": "Réduire la barre latérale",
    "newChat": "Nouvelle discussion",
    "searchAria": "Rechercher",
    "searchPlaceholder": "Rechercher",
    "searchResults": "Résultats",
    "noSearchResults": "Aucun chat correspondant.",
    "recent": "Récentes",
    "settings": "Paramètres",
    "language": {
      "label": "Langue",
      "ariaLabel": "Changer de langue"
    },
    "apps": "Apps",
    "automations": "Automatisations",
    "skills": {
      "title": "Compétences"
    }
  },
  "settings": {
    "backToChat": "Retour au chat",
    "sidebar": {
      "title": "Réglages",
      "ariaLabel": "Sections des réglages"
    },
    "nav": {
      "general": "Général",
      "byok": "BYOK",
      "overview": "Aperçu",
      "appearance": "Apparence",
      "models": "Modèles",
      "providers": "Fournisseurs",
      "image": "Images",
      "voice": "Voix",
      "browser": "Internet",
      "runtime": "Système",
      "advanced": "Sécurité",
      "cliApps": "Apps CLI",
      "mcp": "MCP",
      "apps": "Applications",
      "automations": "Automatisations",
      "skills": "Compétences"
    },
    "sections": {
      "interface": "Interface utilisateur",
      "ai": "AI",
      "system": "Système",
      "about": "À propos",
      "status": "État",
      "localPreferences": "Préférences locales",
      "presets": "Préréglages",
      "imageGeneration": "Génération d’images",
      "imageDefaults": "Valeurs par défaut",
      "webSearch": "Recherche web",
      "webBehavior": "Comportement",
      "identity": "Identité",
      "webuiSafety": "Sécurité WebUI",
      "capabilities": "Capacités",
      "cliApps": "Applications CLI",
      "mcp": "Services MCP",
      "apps": "Applications",
      "nativeHost": "Hôte natif",
      "hostSafety": "Sécurité de l’app",
      "voiceInput": "Saisie vocale"
    },
    "rows": {
      "theme": "Thème",
      "language": "Langue",
      "provider": "Fournisseur",
      "model": "Modèle",
      "restart": "Redémarrer nanobot",
      "configPath": "Chemin de config",
      "activePreset": "Préréglage actif",
      "gateway": "Passerelle",
      "restartState": "État du redémarrage",
      "pendingChanges": "Modifications en attente",
      "selectedPreset": "Préréglage sélectionné",
      "presetModel": "Modèle du préréglage",
      "density": "Densité",
      "activityMode": "Détail d’activité",
      "fileEditDisplay": "Affichage des modifications de fichiers",
      "codeWrap": "Retour à la ligne du code",
      "maxResults": "Résultats max.",
      "timeout": "Délai d’attente",
      "jinaReader": "Lecteur Jina",
      "imageGeneration": "Génération d’images",
      "imageProvider": "Fournisseur d’images",
      "imageProviderStatus": "État du fournisseur",
      "imageProviderBase": "Base du fournisseur",
      "imageModel": "Modèle d’image",
      "defaultAspectRatio": "Ratio par défaut",
      "defaultImageSize": "Taille par défaut",
      "maxImagesPerTurn": "Images max. par tour",
      "imageSaveDir": "Dossier d’enregistrement",
      "botName": "Nom du bot",
      "botIcon": "Icône du bot",
      "timezone": "Fuseau horaire",
      "workspacePath": "Espace de travail par défaut",
      "localServiceAccess": "Services locaux",
      "webuiDefaultAccess": "Accès par défaut",
      "currentModel": "Configuration actuelle",
      "brandLogos": "Logos de marque",
      "cliAppsCatalog": "Catalogue",
      "cliAppsFilter": "Filtre",
      "engine": "Moteur",
      "logs": "Journaux",
      "diagnostics": "Diagnostic",
      "contextWindow": "Fenêtre de contexte",
      "transcription": "Transcription",
      "transcriptionProvider": "Fournisseur",
      "transcriptionProviderStatus": "Etat du fournisseur",
      "transcriptionModel": "Modele",
      "transcriptionLanguage": "Langue",
      "voiceLimits": "Limites"
    },
    "help": {
      "theme": "Basculer entre l’apparence claire et sombre.",
      "language": "Choisissez la langue utilisée par WebUI.",
      "provider": "Sélectionnez le fournisseur à utiliser pour les nouvelles requêtes de modèle.",
      "model": "Définissez le nom du modèle utilisé par défaut par nanobot.",
      "configPath": "Le fichier de configuration actuellement utilisé par la passerelle.",
      "selectedPreset": "Les préréglages nommés sont en lecture seule ici ; modifiez-les dans config.json.",
      "presetModel": "Passez à Default pour modifier le modèle et le fournisseur depuis WebUI.",
      "density": "Enregistré seulement dans ce navigateur.",
      "activityMode": "Choisissez le niveau de détail d’activité agent affiché par défaut.",
      "fileEditDisplay": "Choisissez si l’activité de modification affiche le nombre de lignes ou le diff.",
      "codeWrap": "Garde les longues lignes de code lisibles sur les petits écrans.",
      "maxResults": "Résultats renvoyés par chaque appel web_search.",
      "timeout": "Nombre de secondes avant l’expiration d’une requête de recherche.",
      "jinaReader": "Utilise Jina Reader pour web_fetch lorsque disponible.",
      "imageGeneration": "Expose generate_image dans les chats lorsqu’un fournisseur d’image configuré est disponible.",
      "imageProvider": "Choisissez le fournisseur inscrit utilisé par generate_image.",
      "imageProviderStatus": "La génération d’images réutilise les identifiants des fournisseurs.",
      "imageModel": "Nom du modèle envoyé au fournisseur d’images sélectionné.",
      "defaultAspectRatio": "Utilisé lorsque le prompt ne choisit pas de ratio.",
      "defaultImageSize": "Indication de taille envoyée aux fournisseurs compatibles.",
      "maxImagesPerTurn": "Limite supérieure pour une requête generate_image.",
      "botName": "Affiché là où nanobot utilise un nom visible.",
      "botIcon": "Emoji ou texte court affiché avec le nom du bot.",
      "timezone": "Utilisé pour les horaires et les réponses tenant compte du temps.",
      "localServiceAccess": "Autorise les commandes shell Full Access à atteindre les services localhost.",
      "webuiDefaultAccess": "Utilisé par les chats web sans permission propre au projet.",
      "securityManagedControls": "Les récupérations web protègent toujours les services locaux, privés et de métadonnées. La sécurité des canaux principaux reste gérée dans config.json.",
      "currentModel": "Utilisée pour les nouvelles réponses.",
      "selectedModelProvider": "Défini par le modèle sélectionné.",
      "selectedModelValue": "Défini par le modèle sélectionné.",
      "brandLogos": "Affiche les logos de fournisseurs tiers et CLI dans les Réglages.",
      "cliAppsCatalog": "Installe uniquement les adaptateurs CLI d’apps que nanobot peut exécuter localement ; les apps natives restent inchangées.",
      "cliAppsFilter": "Recherchez par app, catégorie ou capacité.",
      "logs": "Ouvre le dossier des journaux du moteur natif.",
      "diagnostics": "Exporte un petit rapport d’exécution pour le support.",
      "localServiceAccessNative": "Autorise les commandes shell Full Access à atteindre les services sur ce Mac.",
      "webuiDefaultAccessNative": "Utilisé par les chats natifs sans permission propre au projet.",
      "contextWindow": "Choisissez le budget de contexte par défaut pour cette configuration de modèle.",
      "transcription": "Transcrit l'entree micro avant l'envoi. Les messages vocaux des canaux utilisent les memes reglages.",
      "transcriptionProvider": "Utilise les identifiants du fournisseur correspondant dans Fournisseurs.",
      "transcriptionProviderStatus": "Les cles API restent dans les fournisseurs, pas dans les reglages de transcription.",
      "transcriptionModel": "Laissez le modele resolu par defaut sauf si votre fournisseur exige un id personnalise.",
      "transcriptionLanguage": "Indice ISO-639 facultatif, comme en, zh, ja ou ko."
    },
    "values": {
      "light": "Clair",
      "dark": "Sombre",
      "notAvailable": "Indisponible",
      "enabled": "Activé",
      "disabled": "Désactivé",
      "restartPending": "Redémarrage en attente",
      "ready": "Prêt",
      "privateEngine": "Moteur privé",
      "unixSocket": "Socket Unix",
      "defaultWorkspace": "Espace par défaut",
      "comfortable": "Confortable",
      "compact": "Compacte",
      "auto": "Automatique",
      "expanded": "Développé",
      "summary": "Résumé",
      "diff": "Diff",
      "collapsedDiff": "Diff replié",
      "on": "Activé",
      "off": "Désactivé",
      "defaultPermission": "Autorisation par défaut",
      "fullAccess": "Accès complet",
      "configured": "Configuré",
      "notConfigured": "Non configuré",
      "pending": "En attente",
      "restartingEngine": "Redémarrage"
    },
    "status": {
      "loading": "Chargement des réglages...",
      "loadError": "Impossible de charger les réglages",
      "unsaved": "Modifications non enregistrées.",
      "upToDate": "À jour.",
      "savedRestart": "Enregistré. Redémarrez nanobot pour appliquer.",
      "restartAfterSaving": "Enregistrez les changements, puis redémarrez quand vous êtes prêt.",
      "savedRestartApply": "Enregistré. Redémarrez quand vous êtes prêt.",
      "imageProviderRestart": "Changements du fournisseur d’image enregistrés. Redémarrez quand vous êtes prêt.",
      "hostRestartAfterSaving": "En enregistrant, nanobot redémarrera son moteur.",
      "hostRestartPending": "Enregistré. Le moteur redémarrera lorsqu’il sera prêt.",
      "hostApiUnavailable": "Les actions de l’hôte ne sont disponibles que dans l’app native.",
      "logsOpened": "Dossier des journaux ouvert.",
      "logsOpenFailed": "Impossible d’ouvrir le dossier des journaux.",
      "diagnosticsExported": "Diagnostic exporté vers {{path}}.",
      "diagnosticsExportFailed": "Impossible d’exporter le diagnostic."
    },
    "actions": {
      "save": "Enregistrer",
      "saving": "Enregistrement",
      "edit": "Modifier",
      "cancel": "Annuler",
      "open": "Ouvrir",
      "export": "Exporter",
      "opening": "Ouverture...",
      "exporting": "Exportation..."
    },
    "byok": {
      "description": "Utilisez vos propres clés de fournisseur. Nanobot lit ces valeurs depuis la configuration actuelle, et seuls les fournisseurs configurés peuvent être sélectionnés dans Général.",
      "configured": "Configuré",
      "notConfigured": "Non configuré",
      "configuredSection": "Configurés",
      "notConfiguredSection": "Non configurés",
      "showMore": "Afficher {{count}} de plus",
      "showLess": "Afficher moins",
      "apiKey": "API key",
      "apiBase": "API base",
      "apiKeyPlaceholder": "Saisir l'API key",
      "apiKeyConfiguredPlaceholder": "Laisser vide pour conserver la key actuelle",
      "configuredKeyHint": "Key configurée",
      "apiBasePlaceholder": "Utiliser la valeur par défaut du fournisseur",
      "apiKeyRequired": "Une API key est requise pour configurer ce fournisseur.",
      "showApiKey": "Afficher l'API key",
      "hideApiKey": "Masquer l'API key",
      "noConfiguredProviders": "Aucun fournisseur configuré",
      "configureFirst": "Configurez d'abord un fournisseur dans BYOK.",
      "openByok": "Ouvrir BYOK",
      "tabs": {
        "ariaLabel": "Type d'identifiants BYOK",
        "llm": "LLM",
        "webSearch": "Recherche web"
      },
      "webSearch": {
        "provider": "Fournisseur de recherche",
        "providerHelp": "Choisissez le backend utilisé par l'outil web search.",
        "selectProvider": "Choisir un fournisseur",
        "credentials": "Identifiants",
        "noCredentialRequired": "Aucune key requise",
        "noCredentialHelp": "DuckDuckGo fonctionne sans API key enregistrée.",
        "apiKeyHelp": "Enregistrée dans la config et masquée après l'enregistrement.",
        "baseUrl": "Base URL",
        "baseUrlHelp": "SearXNG nécessite l'URL de votre propre instance.",
        "baseUrlPlaceholder": "https://search.example.com",
        "apiKeyRequired": "Ce fournisseur de recherche nécessite une API key.",
        "baseUrlRequired": "SearXNG nécessite une Base URL.",
        "missingCredential": "Ajoutez l'identifiant requis avant d'enregistrer.",
        "saveHint": "Les changements s'appliquent aux nouvelles requêtes web search."
      }
    },
    "overview": {
      "model": "Modèle actuel",
      "providers": "Fournisseurs",
      "configuredCount": "{{count}} configurés",
      "totalProviders": "{{count}} disponibles",
      "webSearch": "Recherche web",
      "imageGeneration": "Génération d’images",
      "voiceInput": "Saisie vocale",
      "workspace": "Espace de travail"
    },
    "usage": {
      "title": "Activité des tokens",
      "shortTitle": "Token Usage",
      "subtitle": "Usage signalé par le fournisseur sur les 12 derniers mois.",
      "empty": "L’activité des tokens apparaîtra après les nouvelles réponses du modèle.",
      "totalTokens": "Tokens cumulés",
      "peakTokens": "Pic de tokens",
      "thirtyDayTokens": "Tokens sur 30 jours",
      "currentStreak": "Série actuelle",
      "longestStreak": "Plus longue série",
      "daysValue": "{{count}} j",
      "last30": "30 jours",
      "activeDays": "Jours actifs",
      "requests": "Requêtes",
      "estimated": "estimé",
      "includesEstimates": "inclut des estimations",
      "cellTitle": "{{date}} : {{tokens}} tokens, {{requests}} requêtes",
      "sources": {
        "user": "Chat",
        "api": "API",
        "cron": "Automatisations",
        "dream": "Mémoire",
        "system": "Système"
      }
    },
    "providers": {
      "searchPlaceholder": "Rechercher des fournisseurs",
      "noMatches": "Aucun fournisseur ne correspond.",
      "saveProvider": "Enregistrer le fournisseur"
    },
    "image": {
      "selectProvider": "Choisir un fournisseur",
      "selectAspect": "Choisir un ratio",
      "selectSize": "Choisir une taille",
      "configureProvider": "Configurer le fournisseur",
      "missingCredential": "Configura este proveedor antes de activar la generación de imágenes."
    },
    "models": {
      "selectModel": "Choisir un modèle",
      "addConfiguration": "Ajouter une configuration",
      "newConfiguration": "Nouvelle configuration de modèle",
      "newConfigurationHelp": "Enregistre un fournisseur et un modèle comme option en un clic.",
      "configurationName": "Nom de la configuration",
      "configurationNameHelp": "Renomme cette configuration de modèle enregistrée.",
      "configurationNamePlaceholder": "Rédaction rapide",
      "searchModels": "Rechercher ou saisir un ID de modèle",
      "useCustomModel": "Utiliser",
      "loadingModels": "Chargement des modèles...",
      "searchCatalog": "Rechercher dans le catalogue du fournisseur pour choisir un modèle.",
      "modelsAvailable": "disponibles",
      "noModelResults": "Aucun modèle correspondant.",
      "loadFailed": "Liste des modèles indisponible.",
      "unsupportedModelList": "Saisissez manuellement un ID de modèle.",
      "providerNotConfigured": "Configurez ce fournisseur avant de charger les modèles.",
      "autoProviderCustomOnly": "Le mode fournisseur automatique utilise des IDs de modèle personnalisés."
    },
    "timezone": {
      "select": "Choisir un fuseau horaire",
      "search": "Rechercher un fuseau horaire",
      "empty": "Aucun fuseau horaire correspondant."
    },
    "cliApps": {
      "allCategories": "Toutes les catégories",
      "availableCount": "{{count}} applications",
      "installedCount": "{{count}} installées",
      "summary": "{{installed}} CLIs installées sur {{total}}",
      "filterAll": "Tout",
      "filterInstalled": "CLIs installées",
      "filterNotInstalled": "Non installées",
      "searchPlaceholder": "Rechercher des CLIs",
      "statusInstalled": "Installée",
      "statusAvailable": "Disponible",
      "statusMissing": "Dépendance manquante",
      "statusUnsupported": "Non compatible",
      "statusNotInstalled": "Non installée",
      "unsupported": "Non compatible",
      "loading": "Chargement des apps CLI...",
      "empty": "Aucune app CLI ne correspond à ce filtre.",
      "readyTitle": "@{{name}} est prêt",
      "readyStatus": "Prêt",
      "readyPrompt": "Utilisez @{{name}} pour voir ce que ce CLI peut faire.",
      "readyTry": "Essayer @{{name}}",
      "readyCopied": "Copié",
      "openChat": "Ouvrir le chat",
      "requires": "Requiert",
      "test": "Tester le CLI",
      "update": "Mettre à jour le CLI",
      "uninstall": "Désinstaller le CLI",
      "install": "Installer le CLI",
      "unavailable": "Indisponible",
      "noDescription": "Aucune description disponible."
    },
    "about": {
      "version": "Version",
      "checking": "Recherche de mises à jour...",
      "checkForUpdates": "Rechercher les mises à jour",
      "upToDate": "Vous êtes à jour",
      "updateAvailable": "Mise à jour disponible v{{version}}"
    },
    "mcp": {
      "allCategories": "Toutes les catégories",
      "summary": "{{installed}} presets activés sur {{total}}",
      "filterAll": "Tout",
      "filterInstalled": "Activés",
      "filterNotInstalled": "Non activés",
      "searchPlaceholder": "Rechercher des presets MCP",
      "moreOptions": "Plus d'options MCP",
      "moreOptionsSubtitle": "Ajoutez un serveur personnalisé ou importez mcp.json.",
      "customTitle": "MCP personnalisé",
      "customSubtitle": "Ajoutez n'importe quel serveur MCP stdio, HTTP ou SSE.",
      "customAction": "Personnalisé",
      "importAction": "Importer",
      "serverName": "Nom du serveur",
      "serverUrl": "URL",
      "transport": "Transport",
      "command": "Commande",
      "args": "Args JSON",
      "headers": "Headers JSON",
      "env": "Env JSON",
      "timeout": "Délai d'outil",
      "advancedOptions": "Options avancées",
      "hideAdvanced": "Masquer les options avancées",
      "saveCustom": "Enregistrer MCP",
      "configImport": "Importer mcp.json",
      "importConfig": "Importer",
      "restartRequired": "Redémarrez nanobot pour connecter les outils MCP mis à jour.",
      "toolsFound": "{{count}} outils",
      "loading": "Chargement des presets MCP...",
      "empty": "Aucun preset MCP ne correspond à ce filtre.",
      "openDocs": "Ouvrir la doc",
      "test": "Tester",
      "remove": "Supprimer",
      "enable": "Activer",
      "enabled": "Activé",
      "setup": "Connecter",
      "configure": "Connecter",
      "connectTitle": "Connecter {{name}}",
      "connectHint": "Ajoutez la clé depuis les paramètres de votre compte.",
      "saveAndEnable": "Enregistrer et activer",
      "updateSetup": "Mettre à jour la configuration",
      "configured": "configuré",
      "keepExisting": "Laissez vide pour conserver la valeur actuelle",
      "statusConfigured": "Configuré",
      "statusMissingCredentials": "Clé requise",
      "statusMissingDependency": "Dépendance requise",
      "statusComingSoon": "Bientôt disponible",
      "statusNotInstalled": "Non activé",
      "toolScope": "Outils",
      "allTools": "Tous",
      "noTools": "Aucun",
      "testForTools": "Exécutez Tester pour inspecter et choisir des outils individuels."
    },
    "legal": {
      "thirdPartyBrands": "Les noms, logos et marques de produits appartiennent à leurs propriétaires respectifs. Leur utilisation sert uniquement à l'identification et n'implique aucune approbation."
    },
    "apps": {
      "description": "Activez des extensions, des adaptateurs d’apps locales et des serveurs d’outils connectés.",
      "cliLabel": "CLI",
      "mcpLabel": "MCP",
      "channelLabel": "Canal",
      "featureLabel": "Fonction",
      "filterAll": "Tout",
      "filterPlugins": "Extensions",
      "filterCli": "Apps CLI",
      "filterMcp": "Services MCP",
      "enabledSummary": "{{count}} activés",
      "caption": "{{plugins}} extensions · {{cli}} CLI · {{mcp}} MCP",
      "searchPlaceholder": "Rechercher des apps",
      "featured": "Catalogue",
      "loading": "Chargement des apps...",
      "empty": "Aucune app ne correspond.",
      "restartRequired": "Redémarrez nanobot pour appliquer les apps et fonctions mises à jour."
    },
    "nanobotFeatures": {
      "enabled": "Activé",
      "enable": "Activer",
      "disable": "Désactiver",
      "ready": "Prêt",
      "missingDependency": "Support manquant",
      "installSupport": "Installer le support",
      "installConfirmTitle": "Installer le support pour {{name}} ?",
      "installConfirmDescription": "nanobot ajoutera ce dont {{name}} a besoin, puis l'activera. Continuer ?",
      "installConfirmAction": "Installer et activer",
      "websocketRequired": "Requis pour la WebUI",
      "channelDisabled": "Canal désactivé",
      "notEnabled": "Non activé"
    },
    "automations": {
      "filters": {
        "all": "Toutes",
        "active": "Actives",
        "paused": "En pause",
        "failed": "À traiter",
        "system": "Système"
      },
      "sort": {
        "next": "Prochaine exécution",
        "last": "Dernière exécution",
        "updated": "Mise à jour",
        "name": "Nom"
      },
      "search": "Rechercher tâche, message, discussion liée ou planning",
      "queue": "File",
      "loading": "Chargement des automatisations...",
      "noMatches": "Aucune automatisation ne correspond à cette vue.",
      "empty": "Aucune automatisation pour le moment.",
      "emptyHint": "Créez-la depuis son point d'exécution pour que nanobot conserve le bon contexte.",
      "oneShot": "Ponctuelle",
      "systemTask": "Automatisation gérée par le système",
      "localTrigger": "Déclencheur local",
      "labels": {
        "schedule": "Planning",
        "next": "Prochaine",
        "origin": "Discussion liée",
        "created": "Créée",
        "updated": "Modifiée"
      },
      "runNow": "Exécuter maintenant",
      "pause": "Mettre en pause",
      "resume": "Reprendre",
      "edit": "Modifier",
      "delete": "Supprimer",
      "protected": "Protégée",
      "editTitle": "Modifier l’automatisation",
      "save": "Enregistrer",
      "deleteTitle": "Supprimer l’automatisation",
      "deleteDescription": "Cela supprime {{name}} du stockage cron. Les anciens messages de chat restent dans la session.",
      "cancel": "Annuler",
      "status": {
        "system": "Système",
        "running": "En cours d’exécution",
        "paused": "En pause",
        "failed": "Échouée",
        "completed": "Terminée",
        "noSchedule": "Aucun planning",
        "active": "En cours"
      },
      "origin": {
        "system": "Système",
        "unknown": "Aucune discussion liée"
      },
      "channels": {
        "api": "API",
        "cli": "CLI",
        "dingtalk": "DingTalk",
        "discord": "Discord",
        "email": "Email",
        "feishu": "Feishu",
        "matrix": "Matrix",
        "msteams": "Microsoft Teams",
        "qq": "QQ",
        "slack": "Slack",
        "telegram": "Telegram",
        "wechat": "WeChat",
        "wecom": "WeCom",
        "weixin": "WeChat",
        "whatsapp": "WhatsApp"
      },
      "schedule": {
        "at": "À {{time}}",
        "every": "Toutes les {{duration}}",
        "cron": "Cron {{expr}}",
        "cronWithTz": "Cron {{expr}} · {{tz}}",
        "withTz": "{{summary}} · {{tz}}",
        "dailyAt": "Chaque jour à {{time}}",
        "weekdaysAt": "Jours ouvrés à {{time}}",
        "hourlyAt": "Toutes les heures à :{{minute}}",
        "hourlyWindow": "Toutes les heures {{start}}-{{end}} à :{{minute}}",
        "local": "Déclencheur local",
        "custom": "Planning personnalisé"
      },
      "next": {
        "paused": "En pause",
        "pending": "En cours d’exécution",
        "local": "En attente du déclencheur",
        "none": "Aucune prochaine exécution"
      },
      "message": {
        "showMore": "Afficher le message complet",
        "showLess": "Afficher moins"
      },
      "fields": {
        "name": "Nom",
        "message": "Message",
        "scheduleType": "Type de planning",
        "every": "Toutes les",
        "unit": "Unité",
        "cronExpression": "Expression cron",
        "timezone": "Fuseau horaire",
        "runAt": "Exécuter à"
      },
      "scheduleTypes": {
        "every": "Intervalle",
        "cron": "Cron",
        "at": "Une fois"
      },
      "everyUnits": {
        "second": "Secondes",
        "minute": "Minutes",
        "hour": "Heures",
        "day": "Jours"
      },
      "validation": {
        "nameRequired": "Le nom est obligatoire.",
        "messageRequired": "Le message est obligatoire.",
        "intervalRequired": "L’intervalle doit être un nombre positif.",
        "cronRequired": "L’expression cron est obligatoire.",
        "timeRequired": "L’heure d’exécution est obligatoire.",
        "futureRequired": "L’heure d’exécution doit être dans le futur."
      }
    },
    "oauth": {
      "authentication": "Authentification OAuth",
      "signIn": "Se connecter",
      "signingIn": "Connexion...",
      "signInAgain": "Se reconnecter",
      "signOut": "Se déconnecter",
      "signedInAs": "Connecté en tant que {{account}}",
      "signInHelp": "Inicia sesión desde este dispositivo; no se guarda API key en config.",
      "signInRequired": "Connexion requise",
      "signInBeforeSaving": "Inicia sesión antes de guardar este proveedor OAuth como proveedor activo.",
      "signedIn": "Connecté",
      "notSignedIn": "Non connecté"
    },
    "skills": {
      "description": "Consultez les compétences d’instruction que cet agent peut charger pendant une conversation.",
      "caption": "{{available}} disponibles · {{total}} au total",
      "featured": "Compétences agent",
      "empty": "Aucune compétence disponible.",
      "sourceWorkspace": "Personnalisée",
      "sourceBuiltin": "Intégrée",
      "statusAvailable": "Disponible",
      "statusUnavailable": "Indisponible",
      "unavailableReason": "Manquant : {{reason}}",
      "openDetails": "Ouvrir les détails de {{name}}",
      "loadingDetail": "Chargement des détails...",
      "loadFailed": "Impossible de charger les détails.",
      "descriptionTitle": "Description",
      "source": "Source",
      "status": "Statut",
      "requirements": "Prérequis",
      "noRequirements": "Aucun prérequis explicite.",
      "commands": "Commandes",
      "environment": "Variables d’environnement",
      "missingCommands": "CLI manquant",
      "missingEnvironment": "ENV manquant",
      "unavailableReasonLabel": "Raison d’indisponibilité",
      "rawInstructions": "SKILL.md brut",
      "rawInstructionsEmpty": "Aucune instruction brute.",
      "detailDescription": "Détails de {{name}}."
    },
    "voice": {
      "selectProvider": "Choisir un fournisseur",
      "configureProvider": "Configurer le fournisseur",
      "languageAuto": "Auto"
    }
  },
  "chat": {
    "fallbackTitle": "Discussion {{id}}",
    "forkTitle": "Branche : {{title}}",
    "loading": "Chargement…",
    "noSessions": "Aucune session pour le moment.",
    "showMore": "Afficher {{count}} de plus",
    "collapsed": "{{count}} discussions masquées",
    "showLess": "Afficher moins",
    "actions": "Actions de la discussion {{title}}",
    "newInProject": "Démarrer une nouvelle discussion dans {{project}}",
    "activity": {
      "running": "Agent running",
      "complete": "Agent finished",
      "updated": "New activity"
    },
    "pin": "Pin",
    "unpin": "Unpin",
    "rename": "Rename",
    "renameTitle": "Rename chat",
    "renameDescription": "Choose a local sidebar name for this chat.",
    "renamePlaceholder": "Chat name",
    "renameProjectTitle": "Rename project",
    "renameProjectDescription": "Choose a local sidebar name for this project.",
    "renameProjectPlaceholder": "Project name",
    "renameSave": "Save",
    "archive": "Archive",
    "unarchive": "Unarchive",
    "showArchived": "Show archived",
    "hideArchived": "Hide archived",
    "delete": "Supprimer",
    "newChat": "Nouvelle discussion",
    "groups": {
      "pinned": "Pinned",
      "all": "Chats",
      "projects": "Projects",
      "today": "Today",
      "yesterday": "Yesterday",
      "earlier": "Earlier",
      "archived": "Archived"
    }
  },
  "deleteConfirm": {
    "title": "Supprimer cette discussion ?",
    "description": "Cette action est irréversible.",
    "cancel": "Annuler",
    "confirm": "Supprimer",
    "automationsDescription": "Cette discussion contient des automatisations planifiées. La supprimer les supprimera aussi.",
    "moreAutomations": "+ {{count}} autres",
    "confirmWithAutomations": "Supprimer",
    "schedule": {
      "at": "{{time}}",
      "every": "Tous les {{duration}}",
      "cron": "Cron {{expr}}",
      "cronWithTz": "Cron {{expr}} · {{tz}}",
      "local": "Déclencheur local",
      "unknown": "Planification personnalisée"
    },
    "next": {
      "label": "Prochaine exécution : {{time}}",
      "disabled": "En pause",
      "local": "En attente du déclencheur",
      "none": "Aucune prochaine exécution"
    }
  },
  "connection": {
    "idle": "Inactif",
    "connecting": "Connexion…",
    "open": "Connecté",
    "reconnecting": "Reconnexion…",
    "closed": "Déconnecté",
    "error": "Erreur de connexion"
  },
  "thread": {
    "loadingConversation": "Chargement de la conversation…",
    "empty": {
      "greetings": {
        "workOn": "Sur quoi travaillons-nous ensemble ?",
        "start": "Par où commence-t-on ?",
        "build": "Que construisons-nous aujourd'hui ?",
        "tackle": "Que résout-on ensemble ?"
      },
      "quickActions": {
        "plan": {
          "title": "Créer un plan de projet",
          "prompt": "Créez un plan de projet concis pour ce que je devrais construire ensuite."
        },
        "analyze": {
          "title": "Analyser ces données",
          "prompt": "Aidez-moi à analyser ces données et à faire ressortir les tendances les plus importantes."
        },
        "brainstorm": {
          "title": "Trouver des idées",
          "prompt": "Proposez quelques idées pratiques et leurs compromis pour ce problème."
        },
        "code": {
          "title": "Écrire du code",
          "prompt": "Aidez-moi à écrire le code pour cette tâche, en commençant par le plus petit changement utile."
        },
        "summarize": {
          "title": "Résumer ce document",
          "prompt": "Résumez ce document et listez les points clés à retenir."
        },
        "more": {
          "title": "Plus",
          "prompt": "Montrez-moi quelques façons utiles dont vous pouvez m’aider dans cet espace de travail."
        }
      },
      "imageQuickActions": {
        "icon": {
          "title": "Créer une icône d’app",
          "prompt": "Générez une icône d’application 1:1 propre pour nanobot : robot sympathique, style vectoriel simple, palette douce bleu et blanc, sans texte."
        },
        "sticker": {
          "title": "Créer un sticker",
          "prompt": "Générez une image façon sticker d’un petit assistant robot, avec un fond d’apparence transparente, expressive et ludique."
        },
        "poster": {
          "title": "Créer une affiche",
          "prompt": "Générez un concept d’affiche soigné pour un assistant IA personnel, composition moderne, hiérarchie visuelle forte, adapté à une landing page."
        },
        "product": {
          "title": "Maquette produit",
          "prompt": "Générez une maquette produit propre pour une application web d’IA conversationnelle, interface minimale, éclairage premium, cadre d’appareil réaliste."
        },
        "portrait": {
          "title": "Portrait stylisé",
          "prompt": "Générez un portrait stylisé d’un compagnon IA sympathique, lumière douce, détaillé mais accessible, style illustration moderne."
        },
        "edit": {
          "title": "Modifier une image",
          "prompt": "Aidez-moi à modifier une image. Demandez-moi d’abord de téléverser ou d’indiquer l’image, puis générez le résultat modifié."
        }
      }
    },
    "header": {
      "toggleSidebar": "Afficher ou masquer la barre latérale",
      "newChat": "Démarrer un nouveau chat",
      "toggleTheme": "Changer le thème depuis l’en-tête",
      "settings": "Ouvrir les paramètres",
      "sessionInfo": "Détails de la session"
    },
    "sessionInfo": {
      "title": "Session",
      "untitled": "Chat sans titre",
      "automations": "Automatisations",
      "count": "{{count}}",
      "loading": "Chargement des automatisations...",
      "loadFailed": "Impossible de charger les automatisations.",
      "empty": "Aucune automatisation dans cette session pour le moment.",
      "disabled": "Désactivé",
      "schedule": {
        "at": "À {{time}}",
        "every": "Toutes les {{duration}}",
        "cron": "Cron {{expr}}",
        "cronWithTz": "Cron {{expr}} · {{tz}}",
        "local": "Déclencheur local",
        "unknown": "Planification personnalisée"
      },
      "next": {
        "label": "Prochaine {{time}}",
        "pending": "Exécution imminente",
        "disabled": "En pause",
        "local": "En attente du déclencheur",
        "none": "Aucune prochaine exécution"
      }
    },
    "composer": {
      "placeholderThread": "Saisissez votre message…",
      "placeholderHero": "Qu’avez-vous en tête ?",
      "placeholderOpening": "Ouverture d’une nouvelle discussion…",
      "placeholderStreaming": "Le modèle est en train de répondre…",
      "inputAria": "Champ de message",
      "sendHint": "Entrée pour envoyer · Maj+Entrée pour un retour à la ligne",
      "runRuntimeTitle": "Exécution · {{elapsed}}",
      "goalStateStrip": "Objectif · {{label}}",
      "goalStateFallback": "Objectif",
      "goalStateExpandAria": "Afficher l’objectif complet",
      "goalStateSheetTitle": "Objectif",
      "goalStateCloseAria": "Fermer l’objectif",
      "send": "Envoyer le message",
      "stop": "Arrêter la réponse",
      "modelNotConfigured": "Modèle non configuré",
      "configureModel": "Configurer le modèle",
      "queued": {
        "label": "Guidage en attente",
        "guide": "Guider",
        "delete": "Supprimer le guidage",
        "edit": "Modifier le guidage",
        "drag": "Faire glisser pour réordonner"
      },
      "attachImage": "Joindre une image",
      "imageMode": {
        "label": "Génération d’image",
        "toggle": "Activer ou désactiver le mode génération d’image",
        "placeholder": "Décrire ou modifier une image…",
        "aspectAria": "Format de l’image",
        "aspectLabel": "Format de l’image",
        "aspect": {
          "auto": "Auto",
          "1_1": "Carré 1:1",
          "3_4": "Portrait 3:4",
          "9_16": "Story 9:16",
          "4_3": "Paysage 4:3",
          "16_9": "Large 16:9"
        }
      },
      "tools": {
        "search": "Rechercher",
        "reason": "Raisonner",
        "deepResearch": "Recherche approfondie",
        "voice": "Entrée vocale"
      },
      "voice": {
        "hint": "Cliquez pour dicter ou maintenez",
        "stop": "Arrêter l'enregistrement",
        "transcribing": "Transcription...",
        "recordingStatus": "Enregistrement {{time}}"
      },
      "voiceErrors": {
        "unsupported": "La saisie vocale n'est pas prise en charge par ce navigateur.",
        "permission": "L'autorisation du microphone est requise.",
        "notConfigured": "Configurez d'abord un fournisseur de transcription.",
        "tooLong": "L'enregistrement est trop long.",
        "tooShort": "Maintenez un peu plus longtemps pour enregistrer la voix.",
        "noInput": "Aucune entrée microphone détectée.",
        "failed": "Impossible de transcrire l'audio."
      },
      "slash": {
        "ariaLabel": "Commandes slash",
        "label": "commandes",
        "navigateHint": "↑↓ Naviguer",
        "selectHint": "Entrée/Tab Insérer",
        "closeHint": "Échap Fermer",
        "commands": {
          "new": {
            "title": "Nouvelle discussion",
            "description": "Réinitialiser cette discussion et démarrer une nouvelle conversation."
          },
          "stop": {
            "title": "Arrêter la tâche en cours",
            "description": "Annuler le tour agent actif pour cette discussion."
          },
          "restart": {
            "title": "Redémarrer nanobot",
            "description": "Redémarrer le processus du bot sur place."
          },
          "status": {
            "title": "Afficher l’état",
            "description": "Afficher l’état du runtime, du provider et des channels."
          },
          "model": {
            "title": "Modèle",
            "description": "Afficher ou changer le préréglage de modèle actif."
          },
          "history": {
            "title": "Afficher l’historique",
            "description": "Afficher les N derniers messages persistés de la conversation."
          },
          "dream": {
            "title": "Lancer Dream",
            "description": "Déclencher manuellement la consolidation de la mémoire."
          },
          "dream_log": {
            "title": "Afficher le journal Dream",
            "description": "Afficher ce que la dernière consolidation Dream a changé."
          },
          "dream_restore": {
            "title": "Restaurer la mémoire",
            "description": "Revenir à un instantané Dream précédent."
          },
          "dream_prompt": {
            "title": "Mémoire Dream",
            "description": "Indiquez à Dream comment organiser la mémoire de cet espace de travail."
          },
          "goal": {
            "title": "Objectif long terme",
            "description": "Demandez à l’agent de traiter ceci comme un objectif multi‑étapes durable."
          },
          "trigger": {
            "title": "Créer un trigger local",
            "description": "Crée un trigger CLI lié à cette session de chat."
          },
          "help": {
            "title": "Afficher l’aide",
            "description": "Lister les commandes slash disponibles."
          },
          "pairing": {
            "title": "Appairage",
            "description": "Gérer les demandes d’appairage."
          }
        },
        "badges": {
          "current": "Actuel",
          "recent": "Récent"
        },
        "details": {
          "goalActive": "L’objectif est en cours",
          "goalReady": "Démarrer un objectif durable",
          "history": "Afficher les messages récents",
          "stopRunning": "En cours"
        }
      },
      "encoding": "Traitement…",
      "remove": "Retirer la pièce jointe",
      "normalizedSizeHint": "{{orig}} → {{current}} (auto)",
      "imageRejected": {
        "unsupported_type": "Type de fichier non pris en charge",
        "too_many_images": "Maximum {{max}} images par message",
        "magic_mismatch": "Ce fichier n'est pas une image",
        "decode_failed": "Impossible de décoder cette image",
        "too_large": "Image trop grande — essayez-en une plus petite",
        "io": "Impossible de lire ce fichier"
      },
      "mentions": {
        "ariaLabel": "Apps",
        "label": "Apps",
        "cliGroup": "Apps CLI",
        "mcpGroup": "Services MCP",
        "cliBadge": "CLI",
        "mcpBadge": "MCP",
        "cliDescription": "Utiliser @{{name}} comme app CLI locale",
        "mcpDescription": "Utiliser @{{name}} comme serveur MCP"
      },
      "workspace": {
        "accessAria": "Mode d’accès à l’espace de travail",
        "projectAria": "Choisir un projet",
        "projectPlaceholder": "Sélectionner un projet",
        "default": "Autorisation par défaut",
        "full": "Accès complet"
      }
    },
    "scrollToBottom": "Faire défiler vers le bas",
    "loadEarlier": "Charger les messages précédents",
    "forkedFromHistory": "Bifurqué depuis l'historique",
    "promptNavigator": {
      "open": "Ouvrir le navigateur de prompts",
      "title": "Prompts",
      "search": "Rechercher des prompts",
      "noResults": "Aucun prompt correspondant.",
      "jumpTo": "Aller au prompt : {{label}}"
    }
  },
  "message": {
    "streaming": "en cours de génération",
    "assistantTyping": "L’assistant est en train d’écrire",
    "toolSingle": "Utilisation d’un outil",
    "toolMany": "{{count}} outils utilisés",
    "toolSummary": "{{count}} outil",
    "toolSummaryMany": "{{count}} outils",
    "reasoningTools": "Raisonnement · {{count}} outils",
    "reasoningToolsSingular": "Raisonnement · 1 outil",
    "reasoning": "Raisonnement",
    "reasoningStreaming": "En réflexion…",
    "reasoningSummary": "Raisonnement",
    "agentActivitySummary": "{{reasoning}} étapes · {{tools}} appels d’outils",
    "agentActivityToolsOnly": "{{tools}} appels d’outils",
    "agentActivityLiveSummary": "En cours… · {{reasoning}} étapes · {{tools}} appels d’outils",
    "agentActivityLiveToolsOnly": "En cours… · {{tools}} appels d’outils",
    "imageAttachment": "Pièce jointe image",
    "forkFromHere": "Bifurquer",
    "copyReply": "Copier",
    "copiedReply": "Copié",
    "turnLatencyTitle": "Temps de réponse (de bout en bout)",
    "fileEditViewDiff": "Voir le diff",
    "fileEditViewLargeDiff": "Voir le grand diff",
    "fileEditDiffLineCount": "{{count}} lignes",
    "fileEditUnchangedLinesHidden": "{{count}} lignes inchangées masquées",
    "fileEditShowMoreLines": "Afficher {{count}} lignes de plus",
    "fileEditShowFewerLines": "Afficher moins de lignes",
    "fileEditOpenFile": "Ouvrir le fichier",
    "fileEditDiffTruncated": "Diff tronqué. Ouvrez le fichier pour voir la modification complète.",
    "activityThinkingFor": "Réflexion pendant {{duration}}",
    "activityThought": "Réflexion terminée",
    "activityThoughtFor": "Réflexion terminée en {{duration}}",
    "activityWorkingFor": "Travail en cours depuis {{duration}}",
    "activityWorked": "Travail terminé",
    "activityWorkedFor": "Travail terminé en {{duration}}",
    "cliActivityRunningOne": "Utilisation de @{{name}}",
    "cliActivityRanOne": "@{{name}} utilisé",
    "cliActivityFailedOne": "Échec de @{{name}}",
    "cliActivityRunningMany": "Utilisation de {{count}} apps CLI",
    "cliActivityRanMany": "{{count}} apps CLI utilisées",
    "cliActivityFailedMany": "Échec de {{count}} apps CLI",
    "cliRunRunning": "Utilisation",
    "cliRunRan": "Utilisé",
    "cliRunFailed": "Échec",
    "automationSourceFallback": "Automatisation",
    "automationTriggered": "Déclenché automatiquement"
  },
  "lightbox": {
    "title": "Aperçu de l’image",
    "open": "Voir l’image",
    "prev": "Image précédente",
    "next": "Image suivante",
    "close": "Fermer l’aperçu"
  },
  "filePreview": {
    "aria": "Aperçu du fichier",
    "close": "Fermer l’aperçu du fichier",
    "loading": "Chargement de l’aperçu...",
    "failed": "Impossible de prévisualiser ce fichier.",
    "routeMissing": "L’aperçu du fichier nécessite le dernier gateway. Redémarrez nanobot gateway puis réessayez.",
    "resize": "Redimensionner l’aperçu du fichier",
    "truncated": "L’aperçu est tronqué car le fichier est volumineux."
  },
  "code": {
    "fallbackLanguage": "code",
    "copyAria": "Copier le code",
    "copy": "Copier",
    "copied": "Copié"
  },
  "common": {
    "dismiss": "Fermer"
  },
  "errors": {
    "messageTooBig": {
      "title": "Message trop volumineux",
      "body": "Le serveur a rejeté votre dernier message car il dépasse la taille autorisée. Retirez des images ou choisissez des fichiers plus légers, puis renvoyez-le."
    },
    "workspaceScopeRejected": {
      "title": "L’espace de travail n’a pas changé",
      "body": "La passerelle a refusé le projet ou le mode d’accès demandé ; Nanobot a conservé l’espace de travail précédent."
    }
  },
  "workspace": {
    "dialog": {
      "defaultProject": "Espace de travail par défaut",
      "manual": "Coller un chemin",
      "manualPlaceholder": "/Users/name/project",
      "usePath": "Utiliser le chemin",
      "absolutePathRequired": "Saisissez un chemin absolu de dossier sur cette machine."
    }
  }
}
