Files
Hermes-ui/packages/client/src/i18n/locales/fr.ts
T

1550 lines
71 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Entrez votre nom d\'utilisateur et votre mot de passe pour continuer.',
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',
defaultCredentialsHint: 'Nom d utilisateur par defaut : admin. Mot de passe par defaut : 123456.',
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',
lockResetHint: 'Si c est votre serveur, supprimez le verrouillage de connexion avec :',
defaultLoginResetHint: 'Pour reinitialiser le mot de passe admin par defaut, executez :',
sessionExpired: 'La session a expire. Veuillez vous reconnecter.',
accessDenied: 'Vous n\'avez pas l\'autorisation d\'acceder a cette ressource.',
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: 'Gerez le nom d\'utilisateur et le mot de passe utilises pour vous connecter.',
removeConfirm: 'Le login par mot de passe est requis pour les comptes utilisateur.',
passwordLoginNotConfigured: 'Login par mot de passe non configure',
passwordLoginConfigured: 'Compte actuel : {username}',
defaultCredentialTitle: 'Modifiez le compte et le mot de passe par defaut',
defaultCredentialMessage: 'Le compte connecte utilise encore le nom d utilisateur ou le mot de passe par defaut. Pour eviter tout acces non autorise, modifiez rapidement le nom d utilisateur et le mot de passe du compte actuel.',
defaultCredentialAction: 'Modifier maintenant',
defaultCredentialLater: 'Me le rappeler plus tard',
},
users: {
title: 'Gestion des comptes',
description: 'Creez des utilisateurs, attribuez des roles et controlez les profils accessibles aux administrateurs standard.',
create: 'Creer un utilisateur',
edit: 'Modifier l utilisateur',
username: 'Nom d utilisateur',
role: 'Role',
statusLabel: 'Statut',
profiles: 'Profils accessibles',
profilesPlaceholder: 'Selectionner les profils accessibles',
allProfiles: 'Tous les profils',
noProfiles: 'Aucun profil assigne',
lastLogin: 'Derniere connexion',
newPasswordOptional: 'Nouveau mot de passe (laisser vide pour conserver)',
loadFailed: 'Echec du chargement des utilisateurs',
deleteConfirm: 'Supprimer cet utilisateur ?',
enable: 'Activer',
disable: 'Desactiver',
roles: {
superAdmin: 'Super admin',
admin: 'Admin',
},
status: {
active: 'Actif',
disabled: 'Desactive',
},
},
// 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é',
},
// Gestion de MCP
mcp: {
title: 'Serveurs MCP',
loadFailed: 'Echec du chargement des serveurs MCP',
reloadAll: 'Tout recharger',
refresh: 'Rafraichir',
total: 'Total',
connected: 'Connecte',
disconnected: 'Deconnecte',
tools: 'outils',
tool: 'Outils',
searchPlaceholder: 'Rechercher des serveurs...',
addServer: '+ Ajouter un serveur',
zeroTools: '0 outils',
loading: 'Chargement...',
empty: 'Aucun serveur MCP configure',
reloaded: '{server} recharge',
reloadedAll: 'Tous les serveurs MCP recharges',
reloadFailed: 'Echec du rechargement',
serverAdded: 'Serveur "{name}" ajoute',
addFailed: 'Echec de l ajout du serveur',
serverUpdated: 'Serveur "{name}" mis a jour',
updateFailed: 'Echec de la mise a jour du serveur',
saveFailed: 'Echec de la sauvegarde',
serverRemoved: '"{name}" supprime',
enabled: "Activé : {name}",
disabled: "Désactivé : {name}",
connectedStatus: 'Connecté',
disconnectedStatus: 'Déconnecté',
disabledStatus: 'Désactivé',
toolList: 'Liste des outils',
count: ' ',
more: 'de plus',
removeFailed: 'Echec de la suppression du serveur',
testOk: 'Test OK — {count} outils disponibles',
testEmpty: 'Le test n a retourne aucun outil',
testFailed: 'Echec du test',
edit: 'Modifier',
test: 'Tester',
reload: 'Recharger',
remove: 'Supprimer',
confirmRemove: 'Supprimer le serveur "{name}" ?',
cancel: 'Annuler',
add: 'Ajouter',
save: 'Enregistrer',
addTitle: 'Ajouter un serveur MCP',
editTitle: 'Modifier le serveur MCP',
invalidJson: 'JSON invalide',
invalidYaml: 'Format YAML invalide',
invalidConfig: 'Configuration invalide',
invalidServerConfig: 'Configuration du serveur invalide',
missingCommandOrUrl: 'Doit contenir command ou url',
manageTools: 'Gérer les outils',
toolsVisibilityTitle: 'Gestion de la visibilité des outils',
fetchTools: 'Récupérer la liste des outils',
fetchToolsFailed: 'Échec de la récupération de la liste des outils',
toolsMode: 'Mode :',
toolsModeAll: 'Tous',
toolsModeInclude: 'Inclure',
toolsModeExclude: 'Exclure',
toolsListHeader: 'Nom de l\'outil',
toolsEmpty: 'Aucun outil disponible, veuillez d\'abord récupérer la liste des outils',
toolsSummaryAll: '{count} outils au total, tous activés',
toolsSummaryInclude: '{total} outils au total, {count} sélectionnés',
toolsSummaryExclude: '{total} outils au total, {count} exclus',
toolsVisibilitySaved: 'Visibilité des outils enregistrée',
toolsSelectAll: 'Tout sélectionner',
toolsClearSelection: 'Effacer la sélection',
toolsExcludeAll: 'Tout exclure',
toolsClearExcluded: 'Effacer les exclusions',
},
// Sidebar
sidebar: {
chat: 'Discussion',
search: 'Rechercher',
apiRelay: 'API Relay',
history: 'Historique',
jobs: 'Taches planifiees',
models: 'Modeles',
profiles: 'Profils',
plugins: 'Plugins',
mcp: 'MCP',
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',
groupToolsShort: "Outils",
codingAgents: "Agents de code",
versionPreview: "Aperçu de version",
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 : 256k (Hermes par défaut), 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: '<message>',
title: '<titre>',
text: '<texte>',
},
slashCommands: {
usage: 'Calculer lutilisation de la session actuelle',
status: 'Afficher l’état de la session et la file',
abort: 'Arrêter lexécution Bridge active',
queue: 'Mettre un message en file après lexécution active',
plan: 'Rédiger un plan dimplémentation Markdown',
goal: 'Set a standing goal that continues across turns',
goalStatus: 'Show the active goal status',
goalPause: 'Pause the active goal loop',
goalResume: 'Resume the paused goal loop',
goalDone: 'Complete and clear the active goal',
goalClear: 'Clear the active goal',
subgoal: 'Add a criterion to the active goal',
clear: 'Effacer laffichage actuel',
clearHistory: 'Supprimer lhistorique des messages enregistrés de cette session',
title: 'Renommer cette session',
compress: 'Lancer la compression du contexte au repos',
steer: 'Envoyer un guidage à lexécution Bridge active',
destroy: 'Libérer lagent Bridge de cette session',
reloadMcp: 'Recharger les serveurs MCP',
},
attachFiles: 'Joindre des fichiers',
showToolCalls: 'Afficher les appels doutils',
hideToolCalls: 'Masquer les appels doutils',
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}" na 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 lhistorique',
hermesHistory: 'Historique Hermes',
historyScopeHint: 'Sessions dhistorique 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',
clarifyKicker: 'L\'agent a besoin d\'éclaircissements',
clarifyTitle: 'L\'agent a une question pour vous',
clarifyPlaceholder: 'Tapez votre réponse...',
clarifySubmit: 'Répondre',
clarifyDismiss: 'Ignorer',
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',
importToWebUi: 'Importer dans Web UI',
importSessionSuccess: 'Session importée dans Web UI',
importSessionAlreadyExists: 'La session existe déjà dans Web UI',
importSessionFailed: 'Échec de limport de la session',
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 lhumain.',
monitorRoleUser: 'Utilisateur',
monitorRoleAssistant: 'Assistant',
copySessionLink: 'Copier le lien de session',
openSessionInNewTab: 'Ouvrir dans un nouvel onglet',
sessionLinkCopied: 'Session link copied',
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 dexé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 dhistorique 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',
external: 'Externe',
},
},
// 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 lagent',
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 lAPI ; ce nest 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. 256000 (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 lautorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.',
xaiOpenLink: 'Ouvrir la page dautorisation xAI',
xaiLoginTitle: 'Connexion OAuth xAI Grok',
xaiExpired: 'Le lien dautorisation a expiré. Veuillez réessayer.',
xaiCopyLink: 'Copier le lien dautorisation',
xaiApproved: 'Connexion réussie !',
visibilitySelectOne: 'Conserver au moins un modèle visible',
visibilitySaved: 'Modèles visibles enregistrés',
visibilitySaveFailed: 'Échec de lenregistrement 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 nest pas modifiée ; les appels utilisent toujours lID de modèle dorigine.',
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 lID dorigine',
aliasTitleFor: 'Nom affiché pour {model}',
aliasTitle: 'Nom affiché du modèle',
aliasSaveFailed: 'Échec de lenregistrement du nom affiché',
aliasPlaceholder: 'Laisser vide pour utiliser lID de modèle dorigine',
aliasManageFor: 'Noms affichés pour {provider}',
aliasManage: 'Noms affichés',
aliasHint: 'Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours lID de modèle dorigine.',
aliasEdit: 'Renommer',
aliasCanonical: 'ID dorigine : {model}',
},
// Profiles
profiles: {
title: 'Profils',
create: 'Creer un profil',
import: 'Importer',
export: 'Exporter',
rename: 'Renommer',
delete: 'Supprimer',
switchTo: 'Changer Hermes Profile',
switchConfirm: 'Cette action execute `hermes profile use {name}` et change le active profile Hermes CLI. Continuer ?',
switchSuccess: 'Hermes active profile change vers "{name}"',
switchFailed: 'Echec du changement Hermes Profile. 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 lavatar',
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: 'Limage davatar ne doit pas dépasser 1 Mo',
saveSuccess: 'Avatar enregistré',
saveFailed: 'Échec de lenregistrement de lavatar',
resetSuccess: 'Avatar par défaut restauré',
resetFailed: 'Échec de la restauration de lavatar par défaut',
},
runtime: {
activeProfile: 'Actuel : {name}',
bridgeWorker: 'État du Bridge',
gateway: 'Passerelle',
active: 'Actif',
activeTag: 'Actuel',
idle: 'Inactif',
checking: 'Vérification',
running: 'En cours',
stopped: 'Arrêté',
restartGateway: 'Redémarrer le gateway',
restartProfile: 'Redémarrer le profil',
switchProfile: 'Changer le profil frontend',
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 actuel',
users: 'Gestion des comptes',
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 : nafficher 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 lAPI Key',
noProviders: 'Aucun fournisseur configuré',
save: 'Enregistrer',
saveFailed: 'Échec de lenregistrement',
saved: 'Enregistré',
},
},
githubPreview: {
title: "Aperçu de version",
description: "Clone le tag GitHub sélectionné dans lespace de prévisualisation Web UI, installe les dépendances, puis lance lapplication sur les ports de développement.",
refresh: "Actualiser",
selectTag: "Sélectionner un tag",
prepare: "Préparer le code",
install: "Installer les dépendances",
start: "Démarrer laperçu",
stop: "Arrêter",
note: "Le code de prévisualisation est stocké dans le dossier de données Web UI. La production reste sur le port 8648 ; la prévisualisation utilise le frontend 8651 et le backend 8650.",
path: "Chemin de prévisualisation",
webuiHome: "Données de prévisualisation",
currentTag: "Tag actuel",
repoReady: "Dépôt prêt",
dependencies: "Dépendances installées",
running: "État",
notRunning: "Arrêté",
open: "Ouvrir laperçu",
log: "Chemin du journal daction",
logOutput: "Sortie des journaux",
actionLog: "Journal daction",
devLog: "Journal du serveur dev",
yes: "Oui",
no: "Non",
actionFailed: "Échec de laction",
nodeEnvironmentMissing: "Node/npm na pas été détecté. Installez Node.js puis réessayez.",
prepareSuccess: "Code de prévisualisation prêt",
installSuccess: "Dépendances installées",
startSuccess: "Prévisualisation démarrée",
stopSuccess: "Prévisualisation arrêtée",
},
codingAgents: {
title: "Agents de code",
notice: "Tous les fournisseurs et modèles ne sont pas compatibles.",
claudeDescription: "CLI Anthropic pour les tâches ponctuelles en print mode et les sessions de code interactives.",
codexDescription: "CLI OpenAI et flux fournisseur Hermes openai-codex pour les tâches de dépôt.",
copyCommand: "Copier",
commandCopied: "Commande copiée",
commandCopyFailed: "Échec de la copie",
refresh: "Actualiser",
checking: "Vérification",
installStatus: "État dinstallation",
installed: "Installé",
notInstalled: "Non installé",
installNow: "Installer",
installing: "Installation",
installSuccess: "Installé",
installFailed: "Échec de linstallation",
nodeEnvironmentMissing: "Node/npm na pas été détecté. Installez Node.js puis réessayez.",
deleteNow: "Supprimer",
deleting: "Suppression",
deleteSuccess: "Supprimé",
deleteFailed: "Échec de la suppression",
configFiles: "Fichiers de configuration",
profileScope: "Profil",
providerScope: "Fournisseur",
providerPlaceholder: "ex. custom:glm",
modelScope: "Modèle",
modelPlaceholder: "Sélectionner un modèle",
launchModeScope: "Mode de lancement",
launchModeGlobal: "Configuration globale",
launchModeScoped: "Fournisseur et modèle",
protocolScope: "Protocole",
protocolOpenAiChat: "OpenAI Chat Completions (/v1/chat/completions)",
protocolOpenAiResponses: "OpenAI Responses (/v1/responses)",
protocolAnthropicMessages: "Anthropic Messages (/v1/messages)",
reloadConfig: "Recharger la configuration",
configFileNotCreated: "Non créé",
configLoadFailed: "Impossible de lire le fichier de configuration",
loadFailed: "Impossible dinspecter les agents de code",
launch: "Lancer",
launchTitle: "Lancer lagent de code",
nativeTerminal: "Terminal natif",
builtInTerminal: "Terminal intégré",
launchPrepared: "Configuration de lancement prête",
launchPrepareFailed: "Échec de la préparation du lancement",
nativeLaunchStarted: "Terminal natif ouvert",
nativeLaunchFailed: "Impossible douvrir le terminal natif",
terminalTitle: "Terminal de lagent de code",
loadProvidersFailed: "Impossible de charger les fournisseurs du profil actuel",
selectProviderModel: "Sélectionnez un fournisseur et un modèle",
launchConfigDir: "Dossier de configuration de lancement",
launchCommand: "Commande de lancement",
table: {
tool: "Outil",
kind: "Étape",
command: "Commande",
note: "Note",
action: "Action",
},
kinds: {
install: "Installer",
auth: "Auth",
health: "Santé",
run: "Exécuter",
},
notes: {
claudeInstall: "Installe la CLI Claude Code globalement.",
codexInstall: "Installe la CLI Codex globalement.",
claudeAuth: "Vérifie l’état de connexion Claude Code ; exécutez claude une fois si la connexion manque.",
codexAuth: "Ajoute les identifiants OAuth OpenAI Codex gérés par Hermes.",
claudeHealth: "Vérifie le programme de mise à jour et l’état de la CLI locale.",
codexHealth: "Confirme que la CLI Codex est disponible dans PATH.",
claudeRun: "Print mode est le chemin le plus propre pour les tâches ponctuelles pilotées par API.",
codexRun: "Les tâches ponctuelles Codex doivent sexécuter dans un dépôt git.",
},
},
// 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',
cardTemplateId: 'ID du modèle de carte IA',
cardTemplateIdHint: 'ID du modèle de carte IA DingTalk ; laisser vide pour désactiver les cartes IA',
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 lenvironnement sandbox (pour les tests)',
qqSandbox: 'Mode sandbox',
qqQrScanHint: 'Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer lassociation',
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 dID 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_6_7_1: 'L application desktop utilise maintenant le port 8748 par défaut, prend en charge l accès LAN et peut être ouverte directement depuis un navigateur local',
new_0_6_7_9: 'Les liens de téléchargement desktop sont maintenant disponibles sur le site officiel https://ekkolearnai.com/, et les derniers installateurs restent disponibles via GitHub Releases',
new_0_6_7_2: 'Les outils MCP sont plus complets avec des corrections de découverte bridge, de cycle de vie MCP et des contrôles de visibilité par modèle dans le gestionnaire',
new_0_6_7_3: 'Les listes de messages centrent mieux les états vides, réduisent les sauts de scroll, évitent d afficher le chat actif pendant le chargement de History, conservent la position par session et ajoutent un fondu de 1,5 seconde au changement de session',
new_0_6_7_4: 'Bridge et runtime sont plus stables avec ordre texte/tool-call préservé, chargement du statut runtime de Profile corrigé, meilleure détection Node/npm et création du dossier de données production évitée',
new_0_6_7_5: 'La distribution Desktop couvre packaging Electron, nom d application, builds preload, uploads des artifacts, lancement Hermes CLI sous Windows, icônes Linux et chemins de données inscriptibles, macOS sans certificat de signature et sous-processus Windows masqués au démarrage',
new_0_6_7_6: 'Le site web ajoute les téléchargements et le workflow de déploiement, avec déploiement corrigé pour les environnements sans rsync',
new_0_6_7_7: 'Les corrections serveur et auth utilisent dirname pour les dossiers de credentials Windows et augmentent la limite d upload avatar afin d éviter les erreurs 413 sur les grandes images',
new_0_6_7_8: 'Le harness du dépôt, les docs de validation et les guides agent pour Coding Agents ont été ajoutés, tandis que les anciens docs de setup script ont été retirés',
new_0_6_4_1: 'CI est renforcé avec une installation npm figée et une couverture Docker smoke pour les PR',
new_0_6_4_2: 'Le chat utilise maintenant une pagination virtualisée pour rendre les longues conversations plus fiables au scroll et au chargement',
new_0_6_4_3: 'La publication des images Docker ne s exécute désormais que pour les releases, pas pour les checks PR ordinaires',
new_0_6_4_4: 'Version Preview est disponible pour les super admins, avec sélection main/tag, checkout preview, installation des dépendances, start/stop et logs',
new_0_6_4_5: 'Les instances preview isolent les ports frontend/backend, le Web UI home et l agent bridge endpoint, avec des patches runtime pour les anciens tags couvrant ports, WebSocket, base URL et navigation preview imbriquée',
new_0_6_4_6: 'Les tables legacy session_usage sans created_at migrent maintenant correctement avec une valeur par défaut',
new_0_6_4_7: 'Les endpoints bridge profile worker sont maintenant séparés par broker endpoint, évitant que production et preview avec le même Profile se volent les worker sockets et provoquent des erreurs unknown run',
new_0_6_5_1: 'Coding Agents ajoute un workflow complet pour Claude Code et Codex, avec configuration globale, espaces isolés par profile/provider et terminal intégré ou natif',
new_0_6_5_2: 'Le lancement Codex prend en charge OpenAI Chat Completions, OpenAI Responses et Anthropic Messages, avec proxy local pour différents fournisseurs',
new_0_6_5_3: 'Coding Agents est plus fiable sous Windows avec détection des shims .cmd/.bat, corrections de terminal et Claude Code custom model sans validation locale',
new_0_6_5_4: 'Listes de messages, pagination History, authentification TTS, mentions agent en chat de groupe, désactivation des checks update et bridge worker transport améliorent la stabilité',
new_0_6_3_1: 'Le statut du spinner Bridge n est plus stocke comme reasoning du modele, evitant que du texte thinking decoratif contamine le contexte futur',
new_0_6_3_2: 'History ajoute des controles pour importer les sessions Hermes CLI dans l historique local Web UI avec une normalisation de messages plus sure',
new_0_6_3_3: 'La configuration Provider prend en charge les base URLs integrees editables, LM Studio comme provider integre et la decouverte live via LM Studio /models',
new_0_6_3_4: 'Les requetes OpenRouter envoyees par le bridge Web UI incluent maintenant les headers d attribution Hermes Web UI',
new_0_6_3_5: 'L endpoint public auth status n expose plus le premier nom utilisateur aux requetes non authentifiees',
new_0_6_3_6: 'Les reglages DingTalk incluent maintenant un champ AI Card Template ID persiste en DINGTALK_CARD_TEMPLATE_ID',
new_0_6_3_7: 'La sortie JSON du socket Bridge nettoie les caracteres Unicode surrogate isoles afin d eviter les crashs SSE du chat',
new_0_6_2_1: 'Web Bridge prend désormais en charge les commandes /plan avec démarrage correct du run et état de commande visible',
new_0_6_2_2: 'Le menu de commandes du champ de chat inclut maintenant /goal et /subgoal, avec les actions état, pause, reprise, terminé et effacer',
new_0_6_2_3: 'Les workflows Goal et subgoal sont intégrés aux sessions de chat, avec reprises de goal et mises à jour de statut',
new_0_6_2_4: 'Les options de canal cible des jobs sont restaurées afin que les jobs planifiés choisissent la bonne destination',
new_0_6_2_5: 'Lusage des tokens de contexte reprend correctement après reconnexion grâce aux calculs tenant compte des snapshots',
new_0_6_2_6: 'La compression des checkpoints de contexte est plus fiable quand le résumé Codex est lent : Web UI attend 5 minutes et le Python bridge broker ne coupe plus les requêtes worker après 2 minutes',
new_0_6_2_7: 'La promotion de la file du chat est corrigée afin que les messages queued nentrent plus trop tôt dans la liste, y compris dans les fenêtres synchronisées',
new_0_6_2_8: 'Les prompts Clarify nenvoient plus les réponses texte avec Entrée, et les prompts déjà répondus ne se rouvrent plus après changement de session',
new_0_6_2_9: 'Le refresh denvironnement terminal Bridge et le nettoyage stale pid sont mieux limités, réduisant les états runtime obsolètes dans lUI',
new_0_6_2_10: 'La longueur de contexte par défaut suit désormais le standard Hermes de 256 000 tokens',
new_0_5_35_1: 'Les sessions Bridge peuvent maintenant sexécuter en parallèle entre sessions différentes, tandis que les runs dune même session restent sérialisés pour préserver lordre',
new_0_5_35_2: 'Ajoute la page Performance Monitor pour le CPU/mémoire système, Web UI, Bridge Broker, Workers et l’état des sessions actives',
new_0_5_35_3: 'Ajoute des métriques par worker avec CPU, mémoire, Profile, nombre de sessions et état dexécution',
new_0_5_35_4: 'Améliore le nettoyage du cycle de vie des Bridge workers afin de récupérer les workers lors de larrêt du Broker ou du processus parent et réduire les processus Python orphelins',
new_0_5_35_5: 'Renforce la compatibilité du monitoring avec des fallbacks de collecte pour macOS, Windows, Linux, Docker et Termux',
new_0_5_35_6: 'Performance Monitor ne bloque plus sur les requêtes worker pendant linitialisation des Agents, réduisant les request timeouts sous Windows',
new_0_5_35_7: 'Chat Markdown prend désormais en charge la prévisualisation inline du contenu texte, et les icônes de téléchargement téléchargent directement les fichiers',
new_0_5_35_8: 'Améliore le drawer de contenu avec fermeture mobile, largeur complète sur mobile, largeur desktop 800px et fonds texte/Markdown cohérents',
new_0_6_0_1: 'La gestion par compte et par Profile protège désormais de façon cohérente les sessions, modèles, usage, Kanban, jobs, uploads, médias et APIs Hermes associées',
new_0_6_0_2: 'Les Skills média intégrés utilisent le token serveur généré uniquement pour les endpoints média et résolvent les identifiants fun-codex/xAI depuis le Profile demandé',
new_0_6_0_3: 'Le chat individuel et le chat de groupe injectent le Hermes Profile courant dans les instructions de run afin que les Skills envoient X-Hermes-Profile',
new_0_6_0_4: 'La progression des subagents delegate_task est maintenant diffusée dans lUI du chat avec les états démarrage, outil, progression et fin',
new_0_6_0_5: 'Larrêt ou labandon dun run nettoie les événements temporaires afin que les anciens états abort ne passent pas au chat suivant',
new_0_6_0_6: 'Met à jour la documentation et le site pour la gestion des comptes, les identifiants par défaut, la gestion compte/Profile, les uploads/downloads et les Skills média',
new_0_6_0_7: 'Ajoute des commandes CLI de maintenance pour effacer les verrous IP de connexion et réinitialiser le login par défaut admin / 123456',
new_0_6_0_8: 'La version 0.6.0 marque la limite entre la Web UI mono-utilisateur et multi-utilisateur. En cas de problème avec le mode multi-utilisateur, ouvrez une issue et revenez si besoin à la version mono-utilisateur 0.5.35',
new_0_6_1_1: 'Les listes de sessions affichent par défaut tous les Profiles disponibles pour le compte ; le filtrage Profile ne sapplique que sil est explicite, et CLI start/stop/status naffichent plus lavertissement node:sqlite',
new_0_6_1_2: 'Les réponses Clarify et de confirmation passent maintenant par le socket de chat authentifié jusquau bridge Hermes, avec des tests du chemin de réponse',
new_0_6_1_3: 'Les entrées de navigation et lignes de sessions utilisent des liens natifs pour ouvrir dans un nouvel onglet, copier le lien et conserver les groupes latéraux repliés',
new_0_6_1_4: 'Les liens de session ne propagent plus le Profile de route dans le filtrage normal, et les libellés Ouvrir dans un nouvel onglet sont localisés',
new_0_6_1_5: 'Skills lit skills.external_dirs dans la configuration du Profile actif, marque les skills externes, conserve la priorité locale et résout les fichiers externes',
new_0_6_1_6: 'Le verrouillage IP de connexion autorise maintenant 10 échecs et l’écran verrouillé affiche les commandes de récupération pour lever le verrou et réinitialiser le login par défaut',
new_0_6_1_7: 'Les déconnexions chat mobile ou arrière-plan sont traitées comme temporaires, puis la reconnexion reprend l’état du run depuis le serveur',
new_0_6_1_8: 'Le flush des marqueurs doutils Bridge persiste maintenant les préfixes partiels aux limites doutil et de run',
new_0_6_1_9: 'Les actions History conscientes du Profile suppriment les sessions avec des cibles qualifiées par Profile et rafraîchissent History au changement global de Profile',
new_0_6_1_10: 'Lancien bypass AUTH_DISABLED a été retiré pour le modèle multi-utilisateur, tandis que AUTH_TOKEN reste pris en charge',
},
// 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',
copyRoomLink: 'Copier le lien du 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 larrê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: 'à linstant',
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: 'Lidentifiant 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',
},
},
}