export default { // Login login: { title: 'Hermes Web UI', description: 'Entrez votre jeton d\'acces pour continuer. Retrouvez-le dans les journaux de demarrage du serveur.', placeholder: 'Jeton d\'acces', submit: 'Connexion', tokenRequired: 'Veuillez entrer votre jeton d\'acces', invalidToken: 'Jeton invalide', connectionFailed: 'Impossible de se connecter au serveur', passwordLogin: 'Mot de passe', tokenLogin: 'Jeton', usernamePlaceholder: 'Nom d\'utilisateur', passwordPlaceholder: 'Mot de passe', credentialsRequired: 'Veuillez entrer le nom d\'utilisateur et le mot de passe', invalidCredentials: 'Nom d\'utilisateur ou mot de passe incorrect', tooManyAttempts: 'Trop de tentatives echouees, veuillez reessayer plus tard', passwordMismatch: 'Les mots de passe ne correspondent pas', passwordTooShort: 'Le mot de passe doit contenir au moins 6 caracteres', setupSuccess: 'Login par mot de passe configure avec succes', passwordChanged: 'Mot de passe change avec succes', passwordRemoved: 'Login par mot de passe supprime', setupPassword: 'Configurer le login par mot de passe', changePassword: 'Changer le mot de passe', changeUsername: 'Changer le nom d\'utilisateur', removePasswordLogin: 'Supprimer', username: 'Nom d\'utilisateur', currentPassword: 'Mot de passe actuel', newPassword: 'Nouveau mot de passe', confirmPassword: 'Confirmer le mot de passe', newUsername: 'Nouveau nom d\'utilisateur', usernameChanged: 'Nom d\'utilisateur change avec succes', usernameTooShort: 'Le nom d\'utilisateur doit contenir au moins 2 caracteres', setupDescription: 'Configurez un nom d\'utilisateur et un mot de passe pour un login rapide. Le jeton d\'acces reste disponible.', removeConfirm: 'Voulez-vous vraiment supprimer le login par mot de passe? Vous devrez utiliser le jeton d\'acces.', passwordLoginNotConfigured: 'Login par mot de passe non configure', passwordLoginConfigured: 'Login par mot de passe active ({username})', }, // Common common: { loading: 'Chargement...', cancel: 'Annuler', retry: 'Réessayer', delete: 'Supprimer', edit: 'Modifier', save: 'Enregistrer', saved: 'Enregistre', update: 'Mettre a jour', create: 'Creer', saveFailed: 'Echec de l\'enregistrement', deleteFailed: 'Echec de la suppression', ok: 'OK', copied: 'Copie', copy: 'Copier', noData: 'Aucune donnee', fetch: 'Recuperer', add: 'Ajouter', enable: 'Activer', disable: 'Desactiver', configured: 'Configure', notConfigured: 'Non configure', confirm: 'Confirmer', expand: 'Developper', collapse: 'Reduire', stop: 'Arrêter', start: 'Démarrer', expired: 'Expiré', }, // Sidebar sidebar: { chat: 'Discussion', search: 'Rechercher', apiRelay: 'API Relay', history: 'Historique', jobs: 'Taches planifiees', models: 'Modeles', profiles: 'Profils', plugins: 'Plugins', skills: 'Competences', memory: 'Memoire', logs: 'Journaux', usage: 'Utilisation', performance: 'Performance', skillsUsage: 'Utilisation des compétences', channels: 'Canaux', terminal: 'Terminal', files: 'Fichiers', groupChat: 'Chat de groupe', groupConversation: 'Conversation', groupConversationShort: 'Conv.', groupAgent: 'Agent', groupAgentShort: 'Agent', groupSystem: 'Systeme', groupSystemShort: 'Sys', groupMonitoring: 'Suivi', groupMonitoringShort: 'Suivi', settings: 'Parametres', connected: 'Connecte', disconnected: 'Deconnecte', updateTip: 'Executez "hermes-web-ui update" dans le terminal pour mettre a jour', updateVersion: 'Mettre a jour vers v{version}', reloadClientVersion: 'Recharger pour v{version}', updating: 'Mise a jour...', updateSuccess: 'Mise a jour terminee. Veuillez actualiser la page sous peu. Si le service ne demarre pas apres un moment, demarrez-le manuellement.', updateFailed: 'Echec de la mise a jour', logout: 'Deconnexion', nodeVersionWarning: 'Node.js v{version} detecte. Veuillez passer a la version 23 ou ulterieure.', changelog: 'Journal des modifications', noChangelog: 'Aucun journal disponible', kanban: 'Kanban', groupTools: 'Outils', groupPlatform: 'Plateforme', gateways: 'Passerelles', expand: 'Déplier le menu', collapse: 'Replier le menu', }, performance: { title: 'Performance', subtitle: 'Surveiller les ressources système, Bridge Broker, Workers et sessions actives', refresh: 'Actualiser', autoRefreshOn: 'Actualisation auto', autoRefreshOff: 'Actualisation manuelle', loadFailed: 'Échec du chargement des métriques de performance', systemCpu: 'CPU système', systemMemory: 'Mémoire système', activeSessions: 'Sessions actives', runningSessions: 'En cours {count}', workers: 'Workers', totalWorkerMemory: 'Mémoire totale Worker', processes: 'Processus', uptime: 'Disponibilité', running: 'En cours', stopped: 'Arrêté', workerMemory: 'Mémoire Worker', lastUpdated: 'Mis à jour', profile: 'Profile', memory: 'Mémoire', sessions: 'Sessions', runningActiveSessions: 'En cours / Actives', lastUsed: 'Dernière utilisation', status: 'Statut', noWorkers: 'Aucun Worker', sessionsByProfile: 'Sessions par Profile', noActiveSessions: 'Aucune session active', }, // Drawer drawer: { terminal: 'Terminal', files: 'Espace de travail', }, // Chat chat: { contextRemaining: 'restant', contextClickToEdit: 'Cliquez pour modifier la longueur du contexte', contextEditTitle: 'Modifier la longueur du contexte', contextEditDesc: 'Définir la limite de longueur du contexte pour le modèle actuel (en tokens)', contextEditPlaceholder: 'Entrez la longueur du contexte', contextEditHint: 'Valeurs courantes : 200k (Claude), 128k (GPT-4), 32k (GPT-3.5)', contextEditSave: 'Enregistrer', contextEditCancel: 'Annuler', contextEditInvalid: 'Veuillez entrer une longueur de contexte valide', contextEditSuccess: 'Longueur du contexte mise à jour', contextEditFailed: 'Échec de la mise à jour', emptyState: 'Demarrer une conversation avec Hermes Agent', outlineTitle: 'Plan de la conversation', outlineEmpty: 'Aucun contenu de conversation', outlineUserQuestion: 'Question utilisateur', inputPlaceholder: 'Tapez un message... (Entree pour envoyer, Shift+Entree pour un saut de ligne)', slashCommandArgs: { message: '', title: '', text: '', }, slashCommands: { usage: 'Calculer l’utilisation de la session actuelle', status: 'Afficher l’état de la session et la file', abort: 'Arrêter l’exécution Bridge active', queue: 'Mettre un message en file après l’exécution active', clear: 'Effacer l’affichage actuel', clearHistory: 'Supprimer l’historique des messages enregistrés de cette session', title: 'Renommer cette session', compress: 'Lancer la compression du contexte au repos', steer: 'Envoyer un guidage à l’exécution Bridge active', destroy: 'Libérer l’agent Bridge de cette session', }, attachFiles: 'Joindre des fichiers', showToolCalls: 'Afficher les appels d’outils', hideToolCalls: 'Masquer les appels d’outils', messageQueue: 'File de messages', removeQueuedMessage: 'Retirer le message de la file', stop: 'Arreter', send: 'Envoyer', contextUsed: 'Contexte utilise :', sessions: 'Sessions', webUiSessions: 'Sessions', allProfiles: 'Tous les profils', profileMissingModelsTip: 'Le profil "{profile}" n’a aucun fournisseur ni modèle disponible pour cette session', sessionScopeHint: 'Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.', openHistory: 'Ouvrir l’historique', hermesHistory: 'Historique Hermes', historyScopeHint: 'Sessions d’historique Hermes du profil actuel en lecture seule, regroupées par source.', noSessions: 'Aucune session', newChat: 'Nouvelle discussion', approvalKicker: 'Permission terminal', approvalTitle: 'Vérifier la commande avant exécution', approvalAllowOnce: 'Autoriser une fois', approvalAllowSession: 'Autoriser la session', approvalAlways: 'Toujours', approvalDeny: 'Refuser', deleteSession: 'Supprimer cette session ?', toggleBatchMode: 'Sélection par lot', selectAll: 'Tout sélectionner', confirmBatchDelete: 'Supprimer {count} sessions sélectionnées?', batchDeleteSuccess: '{count} sessions supprimées', batchDeletePartial: '{failed} sessions ont échoué', batchDeleteFailed: 'Échec de la suppression par lot', sessionDeleted: 'Session supprimee', rename: 'Renommer', pin: 'Épingler', unpin: 'Désépingler', pinned: 'Épinglés', chatMode: 'Mode chat', liveMode: 'Direct', liveSessions: 'Sessions en direct', recentBadge: 'Récent', linkedSessions: '{count} sessions liées', noVisibleMessages: 'Aucun message visible par l’humain.', monitorRoleUser: 'Utilisateur', monitorRoleAssistant: 'Assistant', copySessionId: "Copier l'ID de session", export: 'Exporter', exportFull: 'Export complet (JSON)', exportCompressed: 'Export compressé (TXT)', exportCompressing: 'Compression du contexte, veuillez patienter...', exportSuccess: 'Session exportée', exportFailed: "Échec de l'export", renamed: 'Renomme', renameFailed: 'Echec du renommage', renameSession: 'Renommer la session', sessionNotFound: 'Session non trouvee', enterNewTitle: 'Entrez un nouveau titre', other: 'Autre', runFailed: 'Echec de l\'execution', error: 'Erreur', tool: 'Outil', arguments: 'Arguments', result: 'Resultat', truncated: '... (tronque)', executionDuration: 'Temps d’exécution', thinkingLabel: 'Raisonnement', thinkingInProgress: 'En réflexion…', thinkingShow: 'Afficher le raisonnement', thinkingHide: 'Masquer le raisonnement', thinkingDuration: 'Observé {duration}', thinkingChars: '{count} caractères', copyBubble: 'Copier le message', copiedBubble: 'Message copié', copyFailed: 'Échec de la copie', playSpeech: 'Lire à voix haute', pauseSpeech: 'Pause', resumeSpeech: 'Reprendre', stopSpeech: 'Arrêter', speechNotSupported: 'Reproduction vocale non prise en charge dans ce navigateur', searchEnterHint: 'Entrée pour ouvrir · Échap pour fermer', searchHint: 'Cmd/Ctrl+K', searchScope: 'Portée de recherche : base locale des sessions Web UI uniquement ; les sessions d’historique Hermes en lecture seule ne sont pas incluses.', searchFailed: 'Échec de la recherche de sessions', searchNoSnippet: 'Aucun extrait disponible', searchNoResults: 'Aucune session correspondante', searchRecent: 'Session récente', searchEmpty: 'Sessions récentes', searchPlaceholder: 'Rechercher des sessions...', searchSubtitle: 'Rechercher par titre ou contenu des messages', searchTitle: 'Rechercher des sessions', stopGateway: 'Arrêter le gateway', start: 'Démarrer', workspaceSetFailed: 'Échec de la définition du workspace', workspaceSet: 'Workspace défini', workspacePlaceholder: 'Saisissez le chemin du projet, ex. /home/user/project', workspace: 'Espace de travail', setWorkspaceTitle: 'Définir le workspace de session', setWorkspace: 'Définir le workspace', modelSetFailed: 'Échec de la définition du modèle', modelSet: 'Modèle défini', setModelTitle: 'Définir le modèle de session', setModel: 'Définir le modèle', newCliChat: 'Nouveau CLI', cliEmptyState: 'Démarrer un chat CLI', autoPlaySpeech: 'Lire la voix automatiquement', }, // Jobs jobs: { title: 'Taches planifiees', createJob: 'Creer une tache', editJob: 'Modifier la tache', noJobs: 'Aucune tache planifiee. Creez-en une pour commencer.', name: 'Nom', namePlaceholder: 'Nom de la tache', schedule: 'Planification (expression Cron)', schedulePlaceholder: 'ex. 0 9 * * *', quickPresets: 'Presets rapides', selectPreset: 'Selectionner un preset...', presetEveryMinute: 'Chaque minute', presetEvery5Min: 'Toutes les 5 minutes', presetEveryHour: 'Chaque heure', presetEveryDay: 'Tous les jours a 00:00', presetEveryDay9: 'Tous les jours a 09:00', presetEveryMonday: 'Chaque lundi a 09:00', presetEveryMonth: 'Le 1er de chaque mois a 09:00', prompt: 'Invite', promptPlaceholder: 'L\'invite a executer', deliverTarget: 'Cible de livraison', origin: 'Origine', local: 'Local', repeatCount: 'Nombre de repetitions (facultatif)', modelPlaceholder: 'Modele par defaut', repeatPlaceholder: 'Laisser vide pour infini', jobCreated: 'Tache creee', jobUpdated: 'Tache mise a jour', nameRequired: 'Le nom est requis', scheduleRequired: 'La planification est requise', loadFailed: 'Echec du chargement de la tache', jobPaused: 'Tache en pause', jobResumed: 'Tache reprise', jobTriggered: 'Job declenche', modelUpdated: 'Modele mis a jour', jobDeleted: 'Tache supprimee', status: { running: 'En cours', paused: 'En pause', disabled: 'Desactivee', scheduled: 'Planifiee', }, info: { model: 'Modele', schedule: 'Planification', lastRun: 'Derniere execution', nextRun: 'Prochaine execution', deliver: 'Livraison', repeat: 'Repetition', }, action: { pause: 'Pause', pauseJob: 'Mettre en pause', resume: 'Reprendre', resumeJob: 'Reprendre la tache', runNow: 'Executer maintenant', triggerImmediately: 'Déclencher immédiatement', }, runHistory: { title: 'Historique', runs: 'exécutions', noRuns: 'Aucun historique trouvé.', }, }, // Skills skills: { title: 'Competences', searchPlaceholder: 'Rechercher des competences...', noMatch: 'Aucune competence ne correspond a votre recherche', noSkills: 'Aucune competence trouvee', backTo: 'Retour a', attachedFiles: 'Fichiers joints', loadFailed: 'Echec du chargement de la competence', fileLoadFailed: 'Echec du chargement du fichier', modified: "Modifi\u00e9 par l'utilisateur", archived: 'Archivé', pinned: 'Épinglé', pin: 'Épingler la compétence', unpin: 'Désépingler la compétence', pinFailed: "Impossible de changer le statut d'épinglage", toggleFailed: 'Echec de l\'activation/desactivation de la competence', source: { builtin: 'Intégré', hub: 'Hub', local: 'Local', }, }, // Plugins plugins: { title: 'Plugins', refresh: 'Actualiser', notice: 'Inventaire en lecture seule des manifests de plugins Hermes détectables. Les métadonnées de découverte sont lues sans charger le code des plugins. En v1, la gestion reste dans le CLI; les changements prennent effet dans les nouvelles sessions Hermes.', loadFailed: 'Échec du chargement des plugins', commandCopied: 'Commande copiée', searchPlaceholder: 'Rechercher key, nom, description, chemin...', source: 'Source', kind: 'Type', statusTitle: 'Statut', configStatus: 'config : {status}', notAvailable: 'n/a', copyCommand: 'Copier la commande', managedElsewhere: 'géré ailleurs', noMatch: 'Aucun plugin ne correspond aux filtres actuels', enabled: 'activé', disabled: 'désactivé', summary: { total: 'Total', active: 'Activé / auto', inactive: 'Inactif', disabled: 'Désactivé', providerManaged: 'Géré par provider', }, status: { enabled: 'Activé', 'auto-active': 'Auto-actif', inactive: 'Inactif', disabled: 'Désactivé', 'provider-managed': 'Géré par provider', }, statusLabel: { enabled: 'Activé par configuration', 'auto-active': 'Auto-actif', inactive: 'Inactif', disabled: 'Désactivé', 'provider-managed': 'Géré par provider', }, configStatuses: { enabled: 'activé', disabled: 'désactivé', 'not-enabled': 'non activé', auto: 'auto', 'provider-managed': 'géré par provider', }, table: { plugin: 'Plugin', status: 'Statut', source: 'Source', kind: 'Type', capabilities: 'Capacités', path: 'Chemin / entrypoint', cli: 'CLI', }, capabilities: { tools: '{count} outils', hooks: '{count} hooks', env: '{count} env', }, metadata: { agentRoot: 'Racine de l’agent', python: 'Python', scanCwd: 'Analyser cwd', projectPlugins: 'Plugins du projet', }, }, // Memory memory: { title: 'Memoire', refresh: 'Actualiser', loadFailed: 'Echec du chargement de la memoire', myNotes: 'Mes notes', noNotes: 'Aucune note pour l\'instant.', notesPlaceholder: 'Ecrivez vos notes...', userProfile: 'Profil utilisateur', noProfile: 'Aucun profil pour l\'instant.', profilePlaceholder: 'Ecrivez votre profil...', soul: 'Ame', noSoul: 'Aucune configuration d\'ame pour l\'instant.', soulPlaceholder: 'Ecrivez la configuration de l\'ame...', }, // Models models: { title: 'Modeles', addProvider: 'Ajouter un fournisseur', providerType: 'Type de fournisseur', preset: 'Préréglage', custom: 'Personnalise', selectProvider: 'Selectionner un fournisseur', chooseProvider: 'Choisir un fournisseur...', name: 'Nom', autoGeneratedName: 'Genere automatiquement a partir de l\'URL de base', baseUrl: 'URL de base', region: 'Région', regionIntl: 'International', regionCn: 'Chine continentale', baseUrlPlaceholder: 'ex. https://api.example.com/v1', apiKey: 'Cle API', apiKeyPlaceholder: 'sk-...', defaultModel: 'Modele par defaut', selectOrInput: 'Sélectionner ou saisir un modèle...', selectModel: 'Selectionner un modele...', providerAdded: 'Fournisseur ajoute', providerDeleted: 'Fournisseur supprime', deleteProvider: 'Supprimer le fournisseur', deleteConfirm: 'Etes-vous sur de vouloir supprimer "{name}" ?', codexLoginTitle: 'Connexion OpenAI Codex', codexWaiting: 'Entrez ce code sur la page d\'autorisation pour vous connecter :', codexCopyCode: 'Code copié', codexOpenLink: 'Ouvrir la page d\'autorisation', codexApproved: 'Connexion réussie', codexExpired: 'L\'autorisation a expiré. Veuillez réessayer.', nousLoginTitle: 'Connexion Nous Portal', nousWaiting: 'Entrez ce code sur la page d\'autorisation:', nousCopyCode: 'Code copié', nousOpenLink: 'Ouvrir la page d\'autorisation', nousApproved: 'Connexion réussie', nousDenied: 'Autorisation refusée', nousExpired: 'Autorisation expirée', copilotLoginTitle: 'Connexion GitHub Copilot', copilotWaiting: 'Ouvrez GitHub et saisissez le code ci-dessous pour autoriser. La fenêtre se fermera automatiquement après approbation.', copilotCopyCode: 'Code copié', copilotOpenLink: 'Ouvrir la page d\'autorisation GitHub', copilotApproved: 'Connexion réussie !', copilotDenied: 'Autorisation refusée.', copilotExpired: 'Le lien d\'autorisation a expiré. Veuillez réessayer.', copilotAddDetectedTitle: 'GitHub Copilot détecté', copilotAddDetected: 'Un token OAuth GitHub Copilot a été détecté sur cette machine. Cliquez sur Ajouter pour activer Copilot dans Hermes.', copilotAddSourceEnv: 'Source : ~/.hermes/.env (COPILOT_GITHUB_TOKEN)', copilotAddSourceGhCli: 'Source : gh CLI (gh auth token)', copilotAddSourceAppsJson: 'Source : extension Copilot de VS Code (apps.json)', copilotDeleteHintEnv: 'Cela supprimera COPILOT_GITHUB_TOKEN dans ~/.hermes/.env. Les autres outils ne sont pas affectés.', copilotDeleteHintGhCli: 'Copilot sera masqué dans Hermes. Votre connexion gh CLI n\'est pas affectée — `gh auth status` indiquera toujours que vous êtes connecté.', copilotDeleteHintAppsJson: 'Copilot sera masqué dans Hermes. Votre extension Copilot de VS Code reste connectée.', customBadge: 'PERSONNALISÉ', previewBadge: 'APERÇU', disabledBadge: 'INDISPONIBLE', disabledTooltip: "Ce modèle n'est pas disponible pour votre compte.", customModelPlaceholder: 'ID de modèle non listé', customModelHint: 'Pour les modèles pris en charge par le fournisseur mais non renvoyés par l’API ; ce n’est pas un renommage affiché. Entrée pour charger.', noProviders: 'Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.', clearVisibleModels: 'Effacer la sélection', currentDefault: 'Par défaut actuel', defaultShort: 'Défaut', builtIn: 'Integre', customType: 'Personnalise', provider: 'Fournisseur', contextLength: 'Longueur du contexte', contextLengthPlaceholder: 'ex. 200000 (facultatif)', local: 'Local ({host})', selectProviderRequired: 'Veuillez selectionner un fournisseur', baseUrlRequired: 'L\'URL de base est requise', apiKeyRequired: 'La cle API est requise', modelRequired: 'Le modele par defaut est requis', enterBaseUrl: 'Veuillez d\'abord entrer l\'URL de base', unexpectedFormat: 'Format de reponse inattendu', foundModels: '{count} modeles trouves', fetchFailed: 'Echec de la recuperation des modeles', xaiWaiting: 'Terminez l’autorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.', xaiOpenLink: 'Ouvrir la page d’autorisation xAI', xaiLoginTitle: 'Connexion OAuth xAI Grok', xaiExpired: 'Le lien d’autorisation a expiré. Veuillez réessayer.', xaiCopyLink: 'Copier le lien d’autorisation', xaiApproved: 'Connexion réussie !', visibilitySelectOne: 'Conserver au moins un modèle visible', visibilitySaved: 'Modèles visibles enregistrés', visibilitySaveFailed: 'Échec de l’enregistrement des modèles visibles', visibilityHint: 'Affecte uniquement le sélecteur de modèles et la page Modèles de la Web UI. La configuration provider/model de Hermes CLI n’est pas modifiée ; les appels utilisent toujours l’ID de modèle d’origine.', showAllModels: 'Afficher tous les modèles', searchPlaceholder: 'Rechercher des modèles...', removeCustomModel: 'Retirer ce modèle non listé', more: 'de plus', models: 'Liste des modèles', manageVisibleModelsFor: 'Gérer les modèles visibles de {name}', manageVisibleModels: 'Gérer les modèles visibles', getApiKey: 'Obtenir une API Key', count: 'modèles', aliasUseOriginal: 'Restaurer l’ID d’origine', aliasTitleFor: 'Nom affiché pour {model}', aliasTitle: 'Nom affiché du modèle', aliasSaveFailed: 'Échec de l’enregistrement du nom affiché', aliasPlaceholder: 'Laisser vide pour utiliser l’ID de modèle d’origine', aliasManageFor: 'Noms affichés pour {provider}', aliasManage: 'Noms affichés', aliasHint: 'Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours l’ID de modèle d’origine.', aliasEdit: 'Renommer', aliasCanonical: 'ID d’origine : {model}', }, // Profiles profiles: { title: 'Profils', create: 'Creer un profil', import: 'Importer', export: 'Exporter', rename: 'Renommer', delete: 'Supprimer', switchTo: 'Passer a', switchConfirm: 'Le passage au profil "{name}" redemarrera la passerelle. Continuer ?', switchSuccess: 'Profil "{name}" actif', switchFailed: 'Echec du changement de profil. La passerelle peut necessiter un redemarrage manuel.', createSuccess: 'Profil "{name}" cree', createFailed: 'Echec de la creation du profil', renameSuccess: 'Profil renomme', renameFailed: 'Echec du renommage du profil', deleteConfirm: 'Etes-vous sur de vouloir supprimer le profil "{name}" ?', deleteSuccess: 'Profil supprime', deleteFailed: 'Echec de la suppression du profil', exportSuccess: 'Profil exporte', exportFailed: 'Echec de l\'exportation du profil', importSuccess: 'Profil importe', importFailed: 'Echec de l\'importation du profil', importSelectFile: 'Selectionner un fichier d\'archive', importInvalidFile: 'Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)', name: 'Nom du profil', namePlaceholder: 'Lettres, chiffres et tirets uniquement', nameValidation: 'Le nom du profil ne peut contenir que des lettres minuscules, des chiffres, des tirets bas et des tirets', newName: 'Nouveau nom', newNamePlaceholder: 'Entrez un nouveau nom', cloneFromCurrent: 'Cloner depuis le profil actuel', cloneCleanupNotice: 'Lors du clonage, les identifiants de plateformes exclusives (Weixin / Telegram / Slack, etc.) sont automatiquement ignorés pour éviter les conflits avec le profil source', cloneStrippedCredentials: '{count} identifiant(s) exclusif(s) supprimé(s) : {list}', cloneDisabledPlatforms: '{count} plateforme(s) désactivée(s) : {list}', cloneStrippedConfigCredentials: '{count} identifiant(s) intégré(s) supprimé(s) de config.yaml : {list}', archivePath: 'Chemin de l\'archive', archivePathPlaceholder: 'Chemin serveur du fichier d\'archive', importName: 'Nom du profil (facultatif)', importNamePlaceholder: 'Laisser vide pour utiliser le nom de l\'archive', active: 'Actif', model: 'Modele', gateway: 'Passerelle', alias: 'Alias', provider: 'Fournisseur', path: 'Chemin', skills: 'Competences', hasEnv: 'A un .env', hasSoulMd: 'A un soul.md', noProfiles: 'Aucun profil trouve. Creez-en un pour commencer.', avatar: { title: 'Avatar personnalisé', customize: 'Personnaliser l’avatar', upload: 'Importer une image', random: 'Générer au hasard', reset: 'Restaurer par défaut', hint: 'PNG, JPEG ou WebP, 1 Mo maximum', invalidType: 'Veuillez choisir une image PNG, JPEG ou WebP', tooLarge: 'L’image d’avatar ne doit pas dépasser 1 Mo', saveSuccess: 'Avatar enregistré', saveFailed: 'Échec de l’enregistrement de l’avatar', resetSuccess: 'Avatar par défaut restauré', resetFailed: 'Échec de la restauration de l’avatar par défaut', }, runtime: { activeProfile: 'Actuel : {name}', bridgeWorker: 'État du Bridge', gateway: 'Passerelle', active: 'Actif', activeTag: 'Actuel', idle: 'Inactif', running: 'En cours', stopped: 'Arrêté', restartGateway: 'Redémarrer le gateway', restartProfile: 'Redémarrer le profil', switchProfile: 'Changer de profil', gatewayRestarted: 'Gateway redémarré : {name}', gatewayRestartFailed: 'Échec du redémarrage du gateway', profileRestarted: 'Profil redémarré : {name}', profileRestartFailed: 'Échec du redémarrage du profil', }, }, // Logs logs: { title: 'Journaux', all: 'Tout', searchPlaceholder: 'Rechercher...', refresh: 'Actualiser', noEntries: 'Aucune entree de journal', }, // Settings settings: { title: 'Parametres', saved: 'Enregistre', saveFailed: 'Echec de l\'enregistrement', tabs: { display: 'Affichage', account: 'Compte', agent: 'Agent', memory: 'Memoire', compression: 'Compression', session: 'Session', privacy: 'Confidentialite', apiServer: 'Serveur API', models: 'Modèles', voice: 'Voix', }, display: { streaming: 'Reponses en continu', streamingHint: 'Afficher les reponses de l\'IA en temps reel', compact: 'Mode compact', compactHint: 'Reduire l\'espacement des messages', showReasoning: 'Afficher le raisonnement', showReasoningHint: 'Afficher le processus de reflexion du modele', showCost: 'Afficher le cout', showCostHint: 'Afficher l\'utilisation des jetons dans les reponses', inlineDiffs: 'Diffs en ligne', inlineDiffsHint: 'Afficher les changements de code en ligne', bellOnComplete: 'Son de fin', bellOnCompleteHint: 'Jouer un son lorsque l\'IA a termine', busyInputMode: 'Mode saisie active', busyInputModeHint: 'Permettre la saisie pendant le traitement de l\'IA', theme: 'Thème', themeHint: 'Choisir clair, sombre ou suivre les preferences du systeme', themeLight: 'Clair', themeDark: 'Sombre', themeSystem: 'Systeme', }, agent: { maxTurns: 'Tours maximum', maxTurnsHint: 'Nombre maximum de tours d\'interaction par conversation', gatewayTimeout: 'Delai d\'attente de la passerelle', gatewayTimeoutHint: 'Delai d\'attente de la requete en secondes', restartDrainTimeout: 'Delai de vidange au redemarrage', restartDrainTimeoutHint: 'Delai de vidange avant redemarrage en secondes', toolEnforcement: 'Application des outils', toolEnforcementHint: 'Controler le mode d\'execution des appels d\'outils', auto: 'Automatique', always: 'Toujours', never: 'Jamais', }, memory: { enabled: 'Activer la memoire', enabledHint: 'Permettre a l\'IA de memoriser le contexte de conversation', userProfile: 'Profil utilisateur', userProfileHint: 'Permettre a l\'IA de memoriser les preferences utilisateur', charLimit: 'Limite de caracteres de la memoire', charLimitHint: 'Nombre maximum de caracteres pour MEMORY.md', userCharLimit: 'Limite de caracteres du profil utilisateur', userCharLimitHint: 'Nombre maximum de caracteres pour USER.md', }, compression: { enabled: 'Activer la compression', enabledHint: 'Compresser automatiquement un long historique avant de depasser le contexte du modele', threshold: 'Seuil de compression', thresholdHint: 'Demarrer la compression quand les jetons estimes depassent ce ratio de contexte', targetRatio: 'Ratio cible', targetRatioHint: 'Taille cible de l\'historique apres compression comme ratio du contexte', protectLastN: 'Proteger les messages recents', protectLastNHint: 'Garder autant de messages recents non compresses', protectFirstN: 'Proteger les premiers messages', protectFirstNHint: 'Garder autant de premiers messages non compresses', }, session: { mode: 'Mode de reinitialisation', modeHint: 'Condition de declenchement de la reinitialisation de session', modeBoth: 'Inactivite + Planifie', modeIdle: 'Inactivite uniquement', modeDaily: 'Planifie uniquement', modeNone: 'Jamais (manuel uniquement)', idleMinutes: 'Delai d\'inactivite', idleMinutesHint: 'Temps d\'attente avant reinitialisation automatique (minutes)', atHour: 'Heure de reinitialisation planifiee', humanOnly: 'Afficher uniquement les sessions humaines', humanOnlyHint: 'Masquer par défaut le bruit des sous-agents et du moniteur de session', liveMonitorHumanOnly: 'Moniteur live : n’afficher que les sessions humaines', liveMonitorHumanOnlyHint: 'Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live', atHourHint: 'Reinitialiser la session a cette heure chaque jour', requireAuth: 'Autorisation de session', requireAuthHint: 'Requiere l\'autorisation pour les operations de session', }, privacy: { redactPii: 'Masquer les DPI', redactPiiHint: 'Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)', }, apiServer: { enable: 'Activer', enableHint: 'Activer le serveur API', host: 'Hote', hostHint: 'Adresse d\'ecoute', port: 'Port', portHint: 'Port d\'ecoute', key: 'Cle', keyHint: 'Cle d\'acces API', cors: 'Origines CORS', corsHint: 'Sources cross-origin autorisees', }, voice: { ttsProvider: 'Fournisseur TTS', ttsProviderHint: 'Choisir le moteur de synthese vocale pour la lecture des messages', providerWebSpeech: 'WebSpeech API (Navigateur)', providerOpenai: 'OpenAI TTS', providerCustom: "Point d'acces personnalise (compatible OpenAI)", providerEdge: 'Edge TTS (Gratuit, sans cle API)', // WebSpeech webspeechVoice: 'Voix', webspeechVoiceHint: "Choisir une voix depuis le navigateur ou l'OS", webspeechVoicePlaceholder: 'Auto (voix par defaut)', // OpenAI openaiKey: 'Cle API', openaiKeyHint: 'Votre cle API OpenAI avec acces TTS', openaiUrl: 'URL de base API', openaiUrlHint: 'ex. https://api.openai.com/v1/audio/speech', openaiModel: 'Modele', openaiModelHint: 'tts-1 (rapide) / tts-1-hd (haute qualite)', openaiVoice: 'Voix', openaiVoiceHint: 'Voix a utiliser pour la synthese', // Custom endpoint customHint: 'Utilisez toute API TTS compatible OpenAI — fonctionne avec GPT-SoVITS, CosyVoice, etc.', customUrl: 'URL API', customUrlHint: 'URL de base de votre service TTS', customUrlPlaceholder: "Adresse configuree dans l'adaptateur local, ex. http://127.0.0.1:9880", customApiKey: 'Cle API (optionnelle)', customApiKeyHint: "Certains points d'acces personnalises necessitent une authentification", customApiKeyPlaceholder: 'Laisser vide si inutile', // Edge TTS edgeHint: 'Propulse par Microsoft Edge TTS (node-edge-tts).', edgeUrl: "URL de l'adaptateur", edgeUrlHint: "Adresse de l'adaptateur Edge TTS, ex. http://127.0.0.1:9882", edgeUrlPlaceholder: 'http://127.0.0.1:9882', edgeVoice: 'Voix', edgeVoiceHint: 'Choisir une voix pour la synthese vocale', edgeRate: 'Vitesse', edgeRateHint: "Ajuster la vitesse de la voix (0.5x ~ 2.0x)", edgePitch: 'Hauteur', edgePitchHint: "Ajuster la hauteur de la voix (-20 ~ +20 Hz)", // Test testTitle: 'Test vocal', testText: 'Texte de test', testTextPlaceholder: 'Entrez le texte a tester...', testTextDefault: 'Bonjour, ceci est un test vocal.', testButton: 'Tester', testButtonPlaying: 'Lecture...', testFailed: 'Echec du test : {error}', // MiMo TTS providerMimo: 'MiMo TTS', mimoHint: 'Xiaomi MiMo TTS — voices predefinies, conception vocale et clonage vocal', mimoApiKey: 'Cle API', mimoApiKeyHint: 'Obtenez votre cle sur platform.xiaomimimo.com', mimoApiKeyPlaceholder: 'Cle API MiMo', mimoBaseUrl: 'URL de base', mimoBaseUrlHint: 'URL de l\'endpoint API MiMo', mimoModel: 'Modele', mimoModelHint: 'Selectionnez le modele de synthese vocale', mimoModelPreset: 'Voix predefinies', mimoModelVoiceDesign: 'Conception vocale', mimoModelVoiceClone: 'Clonage vocal', mimoVoice: 'Voix', mimoVoiceHint: 'Selectionnez une voix predefinie', mimoVoiceDesignPrompt: 'Description vocale', mimoVoiceDesignPromptHint: 'Decrivez les caracteristiques vocales souhaitees', mimoVoiceDesignPromptPlaceholder: 'Ex : Une voix feminine chaude et jeune, legerement lente, avec un ton magnetique', mimoCloneAudio: 'Televerser un audio', mimoCloneAudioHint: 'Televersez un echantillon audio pour le clonage (mp3/wav, max 10 Mo)', mimoCloneAudioUpload: 'Choisir un fichier', mimoCloneAudioClear: 'Effacer', mimoStylePrompt: 'Invite de style', mimoStylePromptHint: 'Optionnel — decrivez le style de parole en langage naturel', mimoStylePromptPlaceholder: 'Ex : Ton vif et entrain, rythme rapide', }, lockedIps: { title: 'IPs bloquees', count: '{count} bloquees', empty: 'Aucune IP bloquee', unlock: 'Debloquer', unlockAll: 'Tout debloquer', unlockAllConfirm: 'Debloquer toutes les IPs?', unlocked: 'IP debloquee', allUnlocked: '{count} IPs debloquees', }, models: { apiKey: 'API Key', apiKeyPlaceholder: 'Saisir l’API Key', noProviders: 'Aucun fournisseur configuré', save: 'Enregistrer', saveFailed: 'Échec de l’enregistrement', saved: 'Enregistré', }, }, // Platform channel settings platform: { requireMention: "Exiger une mention {'@'}", requireMentionGroup: "Exiger une mention {'@'} dans les groupes pour repondre", requireMentionChannel: "Exiger une mention {'@'} dans les canaux pour repondre", requireMentionRoom: "Exiger une mention {'@'} dans les salles pour repondre", reactions: 'Réactions', reactionsHint: 'Reagir aux messages avec des emoji', freeResponseChats: 'Discussions en reponse libre', freeResponseChatsHint: "ID de discussions repondant sans mention {'@'} (separes par des virgules)", freeResponseChannels: 'Canaux en reponse libre', freeResponseChannelsHint: "ID de canaux repondant sans mention {'@'} (separes par des virgules)", freeResponseRooms: 'Salles en reponse libre', freeResponseRoomsHint: "ID de salles repondant sans mention {'@'} (separes par des virgules)", mentionPatterns: 'Motifs de mention personnalises', mentionPatternsHint: 'Motifs de declenchement supplementaires', autoThread: 'Fil automatique', autoThreadHint: "Creer automatiquement des fils de reponse apres une mention {'@'}", autoThreadHintRoom: 'Creer automatiquement des fils de reponse dans les salles', dmMentionThreads: 'Fils de mention en MP', dmMentionThreadsHint: 'Utiliser des fils de reponse pour les mentions en MP', allowBots: 'Autoriser les messages de bots', allowBotsHint: 'Repondre aux messages d\'autres bots', allowedChannels: 'Canaux autorises', allowedChannelsHint: 'Liste blanche des ID de canaux (separes par des virgules)', ignoredChannels: 'Canaux ignores', ignoredChannelsHint: 'Canaux ou le bot ne repond jamais (separes par des virgules)', noThreadChannels: 'Canaux sans fil', noThreadChannelsHint: 'Canaux ou le bot repond sans fil (separes par des virgules)', exclusiveTokenWarning: 'Cette plateforme utilise un verrou de jeton exclusif. Chaque profil doit utiliser un jeton d\'identite different pour eviter les conflits avec les autres profils.', botToken: 'Jeton de bot', botTokenHint: 'Jeton de bot depuis le portail developpeur', accessToken: 'Jeton d\'acces', accessTokenHint: 'Jeton d\'acces Matrix', homeserver: 'URL du serveur domestique', homeserverHint: 'URL du serveur domestique Matrix', appId: 'ID de l\'application', appIdHint: 'ID de l\'application Feishu', appSecret: 'Secret de l\'application', appSecretHint: 'Secret de l\'application Feishu', clientId: 'ID client', clientIdHint: 'ID client DingTalk', clientSecret: 'Secret client', clientSecretHint: 'Secret client DingTalk', botId: 'ID du bot', botIdHint: 'ID du bot WeCom', wecomSecretHint: 'Secret du bot WeCom', waEnabled: 'Activer WhatsApp', waEnabledHint: 'Activer WhatsApp via appairage par code QR', weixinToken: 'Jeton Weixin', weixinTokenHint: 'Depuis la connexion QR de la CLI weixin (hermes weixin)', accountId: 'ID de compte', accountIdHint: 'ID du compte Weixin', qrLogin: 'Connexion QR', qrRelogin: 'Reconnexion', qrFetching: 'Recuperation du code QR...', qrScanHint: 'Scannez avec WeChat pour vous connecter', qrScanedHint: 'Scanne, veuillez confirmer sur le telephone...', qqSandboxHint: 'Activer l’environnement sandbox (pour les tests)', qqSandbox: 'Mode sandbox', qqQrScanHint: 'Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer l’association', qqMarkdownHint: 'Activer les messages au format Markdown (certains clients peuvent ne pas le prendre en charge)', qqMarkdown: 'Support Markdown', qqAppSecretHint: 'App Secret du bot QQ Open Platform', qqAppSecret: 'App Secret', qqAppIdHint: 'App ID du bot QQ Open Platform', qqAppId: 'App ID', allowedUsersHint: 'Liste blanche d’ID utilisateur ou OpenID, séparés par des virgules', allowedUsers: 'Utilisateurs autorisés', allowAllUsersHint: 'Autoriser les messages de tout utilisateur ; désactivez pour utiliser la liste blanche', allowAllUsers: 'Autoriser tous les utilisateurs', }, // Language language: { label: 'Langue', zh: '中文', en: 'English', fr: 'Francais', }, // Terminal terminal: { sessions: 'Sessions', newTab: 'Nouveau terminal', closeSession: 'Fermer cette session ?', sessionExited: 'Terminee', processExited: 'Processus termine avec le code {code}', noSessions: 'Aucune session terminal', connectionFailed: 'Connexion au terminal impossible', connectionError: 'Erreur de connexion', connectionClosed: 'Connexion fermée', }, // Usage usage: { title: 'Statistiques d\'utilisation', refresh: 'Actualiser', totalTokens: 'Total des jetons', inputTokens: 'Entree', outputTokens: 'Sortie', totalSessions: 'Total des sessions', avgPerDay: '~{n}/jour en moy.', estimatedCost: 'Cout est.', cacheHitRate: 'Taux de succes du cache', modelBreakdown: 'Repartition par modele', dailyTrend: 'Utilisation quotidienne', date: 'Date', tokens: 'Jetons', cache: 'Cache', cacheRead: 'Lecture cache', cacheWrite: 'Écriture cache', sessions: 'Sessions', cost: 'Cout', noData: 'Aucune donnee d\'utilisation', }, skillsUsage: { title: 'Utilisation des compétences', subtitle: 'Suivre les chargements et modifications de compétences dans les sessions Hermes', refresh: 'Actualiser', periodSelector: 'Période d\'utilisation des compétences', periodLabel: '{days} j', summary: 'Résumé', totalActions: 'Act.', loads: 'Charg.', edits: 'Modif.', distinctSkills: 'Comp.', topSkills: 'Top comp.', dailyTrend: 'Tendance', periodSummary: '{days} derniers jours', skill: 'Comp.', share: '%', lastUsed: 'Dern. usage', noData: 'Aucune donnée d\'utilisation des compétences', loadFailed: 'Impossible de charger l\'utilisation des compétences', otherSkills: 'Autres comp.', }, // Journal des modifications changelog: { new_0_5_22_1: 'L’API de liste des sessions Hermes lit la base du profil au lieu du store local Web UI', new_0_5_23_1: 'Commandes slash de chat réservées au Bridge avec suggestions localisées', new_0_5_23_2: 'Historique de commandes persistant pour rejouer les sessions sans polluer le contexte, l’usage ou la compression', new_0_5_23_3: 'Variables d’environnement du profil gateway isolées pour éviter les fuites d’identifiants entre profils', new_0_5_23_4: 'Port Web UI réservé pendant l’allocation gateway pour éviter les conflits de démarrage', new_0_5_23_5: 'Redémarrage d’auto-mise à jour corrigé pour ne pas signaler comme échec les sorties réussies du helper', new_0_5_24_1: 'Chat Bridge aligné sur API Server pour l’entrée multimodale, le prompt système et le contexte workspace', new_0_5_25_1: 'Actions de réinitialisation et clonage des salons de chat de groupe', new_0_5_25_2: 'Répertoire d’état Web UI configurable pour les déploiements personnalisés', new_0_5_25_3: 'MiMo ajouté comme fournisseur TTS dans les paramètres vocaux', new_0_5_25_4: 'Listes de modèles des fournisseurs personnalisés chargées via le backend pour éviter les erreurs CORS navigateur', new_0_5_25_5: 'Flux d’approbation des outils corrigé pour les sessions Bridge', new_0_5_25_6: 'Indice de plateforme CLI forcé retiré des prompts Bridge afin de préserver les instructions personnalisées de média/fichier', new_0_5_25_7: 'Contenu image base64 affiché correctement dans l’historique des messages utilisateur', new_0_5_25_8: 'Tests navigateur Playwright, couverture du contrat de streaming chat, couverture des modèles fournisseur et baseline de couverture ajoutés', new_0_5_26_1: 'Chemins média Markdown Windows et locaux pris en charge dans l’historique et les messages rendus', new_0_5_26_2: 'Historique assistant vide filtré et état de compression obsolète nettoyé au démarrage d’un nouveau run', new_0_5_26_3: 'Écritures verrouillées pour config et profils afin de réduire la corruption par écritures concurrentes', new_0_5_26_4: 'Paramètres de canaux QQBot et DingTalk ajoutés', new_0_5_26_5: 'Détection de port CLI rendue portable et tiroir terminal mobile amélioré', new_0_5_26_6: 'Environnements de profil Bridge isolés et découverte des plugins Hermes corrigée entre environnements Python', new_0_5_26_7: 'États gateway arrêtés expliqués avec diagnostics Web UI et état de chargement des logs stabilisé', new_0_5_26_8: 'Options de réinitialisation de session, base URL fournisseur personnalisé et cibles de livraison dynamiques corrigées', new_0_5_26_9: 'Bascule locale d’affichage des traces tool-call ajoutée dans la barre de saisie du chat', new_0_5_26_10: 'Installations du paquet Hermes Agent prises en charge quand aucun checkout source n’est disponible', new_0_5_26_11: 'Connexion OAuth xAI Grok pour les abonnés SuperGrok et presets de modèles Grok mis à jour', new_0_5_26_12: 'Couverture étendue pour navigateur, streaming chat, fournisseur, gateway, config, plugin et Bridge', new_0_5_27_1: 'Paramètres de modèle par session pour les chats Bridge, avec fournisseur et modèle indépendants enregistrés par session', new_0_5_27_2: 'Clic droit sur une session Bridge puis Définir le modèle pour changer le modèle de cette session', new_0_5_27_3: 'Les runs valident le modèle de session et reviennent au modèle par défaut actuel si le modèle enregistré est indisponible', new_0_5_27_4: 'La compression de contexte suit par défaut le modèle sélectionné par défaut du profil courant', new_0_5_30_1: 'Bridge chat conserve l’historique structuré, corrigeant les absences de réponse et outils ignorés causés par l’historique d’outils aplati', new_0_5_30_2: 'Le routage des mentions en chat de groupe est plus fiable avec plusieurs agents, retire la mention @ de chaque agent avant livraison et garde les noms utilisateur après actualisation', new_0_5_30_3: 'Pages modèles, menus de modèle chat et sélection de modèle de session sont limités au profil actif avec marqueurs par défaut précis', new_0_5_30_4: 'Gestion gateway simplifiée : page Gateway autonome retirée, chaque profil vérifie sa configuration plateforme avant démarrage et un runner léger gère démarrages/redémarrages', new_0_5_30_5: 'Démarrage gateway amélioré sur Docker, Termux et Windows avec gestion runtime-lock, nettoyage des conflits de port, exécution en arrière-plan et support du redémarrage', new_0_5_30_6: 'Compatibilité Windows renforcée pour détection de chemins, téléchargements et sous-processus job/update sans fenêtres terminal furtives', new_0_5_30_7: 'Écritures config et presets fournisseur corrigés : validation des clés .env, routage FUN-Codex via Responses API et listes modèles Z.AI/GLM actualisées', new_0_5_30_8: 'Détails frontend polis : barre latérale repliée, libellés courts de groupe, séparateur latéral et style de plan de conversation', new_0_5_30_9: 'La compression de contexte suit les paramètres de profil et durcit les snapshots obsolètes en réutilisant les résumés précédents avec une queue sûre', new_0_5_31_1: 'Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {\'@\'}all ajouté', new_0_5_31_2: 'Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat', new_0_5_31_3: 'Sélecteur de profils avec avatars, upload d’avatar personnalisé, modal d’état runtime et actions de redémarrage gateway/profil', new_0_5_31_4: 'Avatars de profil dans chat individuel, chat de groupe et barre latérale repliée, avec métadonnées Web UI et chemins compatibles Windows', new_0_5_31_5: 'Détection et redémarrage gateway améliorés sur Docker, Termux et Windows via gateway_state/gateway.pid pour la vivacité du gateway géré', new_0_5_31_6: 'Endpoint média APIKEY.FUN de génération d’images et skill apikey-image-gen intégré pour texte-image, image-image et édition via le fournisseur fun-codex du profil actif', new_0_5_33_1: 'Les échecs d’exécution et erreurs Socket en chat individuel et groupe restent maintenant dans la liste comme messages Agent rouges', new_0_5_33_2: 'La recherche de sessions peut être limitée au profil sélectionné, ou couvrir tous les profils si aucun profil n’est choisi', new_0_5_33_3: 'La page Skills affiche des documents de recommandation chinois/anglais quand aucun skill n’est sélectionné, et un second clic désélectionne le skill', new_0_5_33_4: 'Suppression des entrées changelog i18n inutilisées pour réduire la taille frontend', new_0_5_33_5: 'Correction du démarrage agent bridge sur Windows chinois lorsque la sortie netstat n’est pas décodée en UTF-8', new_0_5_33_6: 'Liste des modèles Nous Portal mise à jour depuis le catalog public et les recommandations Portal', new_0_5_33_7: 'Les listes de profils et états runtime lisent les noms depuis les dossiers et les modèles par défaut depuis config, évitant les erreurs de colonnes CLI', new_0_5_34_1: 'Normalise les résultats de tools multimodaux lors du stockage des messages session/groupe, afin d’éviter les images base64 dans les replays', new_0_5_34_2: 'Persiste les modèles Hermes personnalisés dans une configuration backend et ajoute les endpoints ajout/suppression', new_0_5_34_3: 'Maintient corrects l’usage final du contexte Bridge et les états de tools après les exécutions', new_0_5_34_4: 'Améliore les filtres Kanban, l’affichage des responsables, les actions de cartes et les détails de tâches', new_0_5_34_5: 'Corrige le comptage de compression avec cache du contexte fixe prompt/tools et totaux complets de tokens', new_0_5_34_6: 'Met en cache le contexte fixe par agent de chat de groupe et affiche la progression seulement au vrai démarrage de la compression', new_0_5_34_7: 'Synchronise les skills intégrées Web UI dans tous les profils et journalise le profil cible', new_0_5_34_8: 'Si Kanban échoue sous Windows, mettez Hermes à niveau pour obtenir les derniers correctifs de migration de la base Kanban', }, // Fichiers files: { title: 'Fichiers', tree: 'Arborescence', list: 'Liste des fichiers', breadcrumbRoot: 'Accueil', newFile: 'Nouveau fichier', newFolder: 'Nouveau dossier', upload: 'Telecharger', refresh: 'Actualiser', open: 'Ouvrir', edit: 'Modifier', preview: 'Apercu', download: 'Telecharger', copyPath: 'Copier le chemin', rename: 'Renommer', delete: 'Supprimer', name: 'Nom', size: 'Taille', modified: 'Modifie', actions: 'Actions', emptyDir: 'Dossier vide', loading: 'Chargement...', confirmDelete: 'Voulez-vous vraiment supprimer "{name}" ?', confirmDeleteDir: 'Voulez-vous vraiment supprimer le dossier "{name}" et tout son contenu ?', deleteFailed: 'Echec de la suppression', deleted: 'Supprime', renameTo: 'Renommer en', newFileName: 'Nom du fichier', newFolderName: 'Nom du dossier', created: 'Cree', createFailed: 'Echec de la creation', renamed: 'Renomme', renameFailed: 'Echec du renommage', uploadSuccess: '{count} fichier(s) televerse(s)', uploadFailed: 'Echec du televersement', saveFailed: 'Echec de l\'enregistrement', saved: 'Enregistre', unsavedChanges: 'Vous avez des modifications non enregistrees. Annuler ?', pathCopied: 'Chemin copie', fileTooLarge: 'Fichier trop volumineux (max 10 Mo)', permissionDenied: 'Impossible de modifier un fichier protege', notFound: 'Fichier ou dossier introuvable', backendError: 'Echec de l\'operation sur le fichier', dragDropHint: 'Glissez des fichiers ici pour les televerser', closeEditor: 'Fermer l\'editeur', closePreview: 'Fermer', saveFile: 'Enregistrer', fileTree: 'Arborescence des fichiers', }, // Chat de groupe groupChat: { title: 'Chat de groupe', createRoom: 'Creer un salon', joinByCode: 'Rejoindre avec un code', roomName: 'Nom du salon', roomNamePlaceholder: 'Entrez le nom du salon', inviteCode: "Code d'invitation", autoGenerate: 'Generer automatiquement', noRooms: 'Aucun salon pour le moment', selectOrCreate: 'Selectionnez ou creez un salon pour commencer a discuter', agents: 'Agents', addAgent: 'Ajouter un agent', selectProfile: 'Selectionnez un profil', agentAdded: 'Agent ajoute', agentAlreadyInRoom: "L'agent est deja dans ce salon", agentAddFailedCount: "{count} agent(s) n'ont pas ete ajoutes : {details}", noAgents: 'Aucun agent dans ce salon', members: 'Membres', roomCreated: 'Salon cree', roomDeleted: 'Salon supprime', roomCloned: 'Salon clone', cloneRoom: 'Cloner le salon', deleteRoomConfirm: 'Supprimer ce salon ?', clearContext: 'Effacer le contexte', clearContextConfirm: 'Effacer le contexte de ce salon ? Les messages et instantanés de compression seront supprimés, les agents et membres restent.', contextCleared: 'Contexte effacé', you: 'Vous', joined: 'Vous avez rejoint le salon', joinFailed: 'Echec de la connexion au salon', inputPlaceholder: 'Tapez un message... (Entree pour envoyer)', enterCode: "Entrez le code d'invitation", yourName: 'Votre nom', yourNamePlaceholder: "Entrez votre nom d'affichage", yourDescription: 'Description (facultatif)', yourDescriptionPlaceholder: 'Decrivez-vous aux autres...', agentName: 'Nom de l\'agent', agentNamePlaceholder: 'Nom personnalise (vide = nom du profil)', agentDesc: 'Description de l\'agent', agentDescPlaceholder: 'Decrivez le role de cet agent...', agentReplying: 'est en train de répondre...', agentCompressing: 'compresse le contexte...', compressionSettings: 'Paramètres de compression', triggerTokens: 'Seuil de tokens', triggerTokensDesc: 'Seuil de tokens pour déclencher la compression', maxHistoryTokens: 'Max tokens historique', maxHistoryTokensDesc: 'Maximum de tokens pour le contexte compressé', tailMessageCount: 'Messages récents', tailMessageCountDesc: 'Nombre de messages récents à conserver', compressionConfig: 'Config. compression', compressNow: 'Comprimer maintenant', compressingInProgress: 'Compression en cours', compressionSaved: 'Configuration enregistrée', }, // Telechargement download: { downloading: 'Telechargement...', downloadFailed: 'Echec du telechargement', fileNotFound: 'Fichier introuvable ou supprime', fileTooLarge: 'Fichier trop volumineux (limite depassee)', backendError: 'Echec de la lecture du fichier, l\'environnement distant est peut-etre indisponible', backendTimeout: 'Delai de lecture du fichier depasse', unsupportedBackend: 'Le backend de terminal actuel ne prend pas en charge le telechargement de fichiers', invalidPath: 'Chemin de fichier invalide', contentDisplay: 'Affichage du contenu', download: 'Telecharger', downloadFile: 'Telecharger le fichier', }, gateways: { title: 'Passerelles', running: 'En cours', stopped: 'Arrêté', started: 'Démarré', startFailed: 'Échec du démarrage du gateway', stopFailed: 'Échec de l’arrêt du gateway', }, kanban: { title: 'Tableau Kanban', createTask: 'Nouvelle tâche', noTasks: 'Aucune tâche', allStatuses: 'Tous les statuts', allAssignees: 'Tous les responsables', columns: { triage: 'Triage', todo: 'À faire', ready: 'Prêt', running: 'En cours', blocked: 'Bloqué', done: 'Terminé', archived: 'Archivé', }, card: { assigneeTooltip: 'Responsable', priority: { low: 'Basse', medium: 'Moyenne', high: 'Haute', }, timeAgo: { justNow: 'à l’instant', minutes: 'il y a {count} min', hours: 'il y a {count} h', days: 'il y a {count} j', }, }, board: { create: 'Nouveau tableau', archive: 'Archiver le tableau', archiveConfirm: 'Archiver le tableau actuel ?', archived: 'Tableau archivé', created: 'Tableau créé', slugPlaceholder: 'Identifiant du tableau, ex. project-a', namePlaceholder: 'Nom affiché (facultatif)', slugRequired: 'L’identifiant du tableau est requis', }, form: { title: 'Titre', titlePlaceholder: 'Titre de la tâche', titleRequired: 'Le titre est requis', body: 'Description', bodyPlaceholder: 'Description de la tâche (facultatif)', assignee: 'Responsable', selectAssignee: 'Choisir un responsable...', priority: 'Priorité', selectPriority: 'Choisir une priorité...', }, detail: { status: 'Statut', priority: 'Priorité', assignee: 'Responsable', tenant: 'Locataire', createdAt: 'Créé', startedAt: 'Démarré', completedAt: 'Terminé', comments: 'Commentaires', events: 'Événements', runs: 'Exécutions', artifacts: 'Fichiers produits', result: 'Résultat', highlights: 'Informations clés', sources: 'Sources de données', sessions: 'Sessions liées', sessionMessages: 'Messages de session', noSessions: 'Aucune session liée trouvée.', }, action: { title: 'Actions', assign: 'Assigner', assignTo: 'Assigner à...', block: 'Bloquer', blockReason: 'Raison du blocage', unblock: 'Débloquer', complete: 'Terminer', completeSummary: 'Résumé de fin (facultatif)', }, message: { loadFailed: 'Échec du chargement de la tâche', taskCreated: 'Tâche créée', taskAssigned: 'Tâche assignée', taskBlocked: 'Tâche bloquée', taskUnblocked: 'Tâche débloquée', taskCompleted: 'Tâche terminée', }, stats: { total: 'Total', tasks: 'Tâches', }, }, }