Files
Hermes-ui/packages/client/src/i18n/locales/fr.ts
T
ekko badb17cf8e [codex] integrate goal command workflow (#1025)
* feat: integrate goal command workflow

* fix: keep goal done visible

* fix: add goal done slash command

* fix: promote queued message on run start
2026-05-25 19:26:23 +08:00

1342 lines
60 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é',
},
// 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: '<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',
},
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',
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. 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 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',
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é',
},
},
// 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 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_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 davatar 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 dimages 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 dexé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 nest choisi',
new_0_5_33_3: 'La page Skills affiche des documents de recommandation chinois/anglais quand aucun skill nest 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 nest 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 lusage final du contexte Bridge et les états de tools après les exécutions',
new_0_5_34_4: 'Améliore les filtres Kanban, laffichage 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',
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',
},
},
}