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

1268 lines
56 KiB
TypeScript
Raw Normal View History

export default {
// Login
login: {
title: 'Hermes Web UI',
description: 'Entrez votre jeton d\'acces pour continuer. Retrouvez-le dans les journaux de demarrage du serveur.',
placeholder: 'Jeton d\'acces',
submit: 'Connexion',
tokenRequired: 'Veuillez entrer votre jeton d\'acces',
invalidToken: 'Jeton invalide',
connectionFailed: 'Impossible de se connecter au serveur',
passwordLogin: 'Mot de passe',
tokenLogin: 'Jeton',
usernamePlaceholder: 'Nom d\'utilisateur',
passwordPlaceholder: 'Mot de passe',
credentialsRequired: 'Veuillez entrer le nom d\'utilisateur et le mot de passe',
invalidCredentials: 'Nom d\'utilisateur ou mot de passe incorrect',
tooManyAttempts: 'Trop de tentatives echouees, veuillez reessayer plus tard',
passwordMismatch: 'Les mots de passe ne correspondent pas',
passwordTooShort: 'Le mot de passe doit contenir au moins 6 caracteres',
setupSuccess: 'Login par mot de passe configure avec succes',
passwordChanged: 'Mot de passe change avec succes',
passwordRemoved: 'Login par mot de passe supprime',
setupPassword: 'Configurer le login par mot de passe',
changePassword: 'Changer le mot de passe',
changeUsername: 'Changer le nom d\'utilisateur',
removePasswordLogin: 'Supprimer',
username: 'Nom d\'utilisateur',
currentPassword: 'Mot de passe actuel',
newPassword: 'Nouveau mot de passe',
confirmPassword: 'Confirmer le mot de passe',
newUsername: 'Nouveau nom d\'utilisateur',
usernameChanged: 'Nom d\'utilisateur change avec succes',
usernameTooShort: 'Le nom d\'utilisateur doit contenir au moins 2 caracteres',
setupDescription: 'Configurez un nom d\'utilisateur et un mot de passe pour un login rapide. Le jeton d\'acces reste disponible.',
removeConfirm: 'Voulez-vous vraiment supprimer le login par mot de passe? Vous devrez utiliser le jeton d\'acces.',
passwordLoginNotConfigured: 'Login par mot de passe non configure',
passwordLoginConfigured: 'Login par mot de passe active ({username})',
},
// Common
common: {
loading: 'Chargement...',
cancel: 'Annuler',
retry: 'Réessayer',
delete: 'Supprimer',
edit: 'Modifier',
save: 'Enregistrer',
saved: 'Enregistre',
update: 'Mettre a jour',
create: 'Creer',
saveFailed: 'Echec de l\'enregistrement',
deleteFailed: 'Echec de la suppression',
ok: 'OK',
copied: 'Copie',
copy: 'Copier',
noData: 'Aucune donnee',
fetch: 'Recuperer',
add: 'Ajouter',
enable: 'Activer',
disable: 'Desactiver',
configured: 'Configure',
notConfigured: 'Non configure',
confirm: 'Confirmer',
expand: 'Developper',
collapse: 'Reduire',
2026-05-20 17:13:32 +08:00
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',
2026-05-10 13:50:39 +02:00
plugins: 'Plugins',
skills: 'Competences',
memory: 'Memoire',
logs: 'Journaux',
usage: 'Utilisation',
skillsUsage: 'Utilisation des compétences',
channels: 'Canaux',
terminal: 'Terminal',
files: 'Fichiers',
groupChat: 'Chat de groupe',
groupConversation: 'Conversation',
2026-05-20 17:13:32 +08:00
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...',
2026-05-14 12:06:39 +08:00
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',
2026-05-20 17:13:32 +08:00
kanban: 'Kanban',
groupTools: 'Outils',
groupPlatform: 'Plateforme',
gateways: 'Passerelles',
expand: 'Déplier le menu',
collapse: 'Replier le menu',
},
2026-05-03 22:10:40 +08:00
// 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',
2026-05-19 08:25:01 +08:00
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)',
2026-05-15 12:04:03 +08:00
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',
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',
2026-05-17 09:01:59 +08:00
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',
2026-05-16 00:11:51 +08:00
approvalKicker: 'Permission terminal',
approvalTitle: 'Vérifier la commande avant exécution',
approvalAllowOnce: 'Autoriser une fois',
approvalAllowSession: 'Autoriser la session',
approvalAlways: 'Toujours',
approvalDeny: 'Refuser',
deleteSession: 'Supprimer cette session ?',
toggleBatchMode: 'Sélection par lot',
selectAll: 'Tout sélectionner',
confirmBatchDelete: 'Supprimer {count} sessions sélectionnées?',
batchDeleteSuccess: '{count} sessions supprimées',
batchDeletePartial: '{failed} sessions ont échoué',
batchDeleteFailed: 'Échec de la suppression par lot',
sessionDeleted: 'Session supprimee',
rename: 'Renommer',
pin: 'Épingler',
unpin: 'Désépingler',
pinned: 'Épinglés',
2026-05-20 17:13:32 +08:00
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',
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',
2026-05-03 22:10:40 +08:00
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)',
2026-05-20 17:13:32 +08:00
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',
2026-05-20 17:13:32 +08:00
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',
},
},
2026-05-10 13:50:39 +02:00
// 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: {
2026-05-20 17:13:32 +08:00
agentRoot: 'Racine de lagent',
2026-05-10 13:50:39 +02:00
python: 'Python',
2026-05-20 17:13:32 +08:00
scanCwd: 'Analyser cwd',
2026-05-10 13:50:39 +02:00
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',
2026-05-20 17:13:32 +08:00
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',
2026-05-20 17:13:32 +08:00
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: 'Passer a',
switchConfirm: 'Le passage au profil "{name}" redemarrera la passerelle. Continuer ?',
switchSuccess: 'Profil "{name}" actif',
switchFailed: 'Echec du changement de profil. La passerelle peut necessiter un redemarrage manuel.',
createSuccess: 'Profil "{name}" cree',
createFailed: 'Echec de la creation du profil',
renameSuccess: 'Profil renomme',
renameFailed: 'Echec du renommage du profil',
deleteConfirm: 'Etes-vous sur de vouloir supprimer le profil "{name}" ?',
deleteSuccess: 'Profil supprime',
deleteFailed: 'Echec de la suppression du profil',
exportSuccess: 'Profil exporte',
exportFailed: 'Echec de l\'exportation du profil',
importSuccess: 'Profil importe',
importFailed: 'Echec de l\'importation du profil',
importSelectFile: 'Selectionner un fichier d\'archive',
importInvalidFile: 'Veuillez selectionner une archive valide (.tar.gz, .tgz, .gz, .zip)',
name: 'Nom du profil',
namePlaceholder: 'Lettres, chiffres et tirets uniquement',
2026-05-03 22:10:40 +08:00
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: {
2026-05-20 17:13:32 +08:00
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 de profil',
gatewayRestarted: 'Gateway redémarré : {name}',
gatewayRestartFailed: 'Échec du redémarrage du gateway',
profileRestarted: 'Profil redémarré : {name}',
profileRestartFailed: 'Échec du redémarrage du profil',
},
},
// Logs
logs: {
title: 'Journaux',
all: 'Tout',
searchPlaceholder: 'Rechercher...',
refresh: 'Actualiser',
noEntries: 'Aucune entree de journal',
},
// Settings
settings: {
title: 'Parametres',
saved: 'Enregistre',
saveFailed: 'Echec de l\'enregistrement',
tabs: {
display: 'Affichage',
account: 'Compte',
agent: 'Agent',
memory: 'Memoire',
compression: 'Compression',
session: 'Session',
privacy: 'Confidentialite',
apiServer: 'Serveur API',
models: 'Modèles',
voice: 'Voix',
},
display: {
streaming: 'Reponses en continu',
streamingHint: 'Afficher les reponses de l\'IA en temps reel',
compact: 'Mode compact',
compactHint: 'Reduire l\'espacement des messages',
showReasoning: 'Afficher le raisonnement',
showReasoningHint: 'Afficher le processus de reflexion du modele',
showCost: 'Afficher le cout',
showCostHint: 'Afficher l\'utilisation des jetons dans les reponses',
inlineDiffs: 'Diffs en ligne',
inlineDiffsHint: 'Afficher les changements de code en ligne',
bellOnComplete: 'Son de fin',
bellOnCompleteHint: 'Jouer un son lorsque l\'IA a termine',
busyInputMode: 'Mode saisie active',
busyInputModeHint: 'Permettre la saisie pendant le traitement de l\'IA',
2026-05-20 17:13:32 +08:00
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',
},
2026-05-20 17:13:32 +08:00
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",
2026-05-20 17:13:32 +08:00
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...',
2026-05-20 17:13:32 +08:00
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}',
2026-05-20 17:13:32 +08:00
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',
2026-05-20 17:13:32 +08:00
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: {
2026-05-20 17:13:32 +08:00
new_0_5_22_1: 'LAPI de liste des sessions Hermes lit la base du profil au lieu du store local Web UI',
new_0_5_23_1: 'Commandes slash de chat réservées au Bridge avec suggestions localisées',
new_0_5_23_2: 'Historique de commandes persistant pour rejouer les sessions sans polluer le contexte, lusage ou la compression',
new_0_5_23_3: 'Variables denvironnement du profil gateway isolées pour éviter les fuites didentifiants entre profils',
new_0_5_23_4: 'Port Web UI réservé pendant lallocation gateway pour éviter les conflits de démarrage',
new_0_5_23_5: 'Redémarrage dauto-mise à jour corrigé pour ne pas signaler comme échec les sorties réussies du helper',
new_0_5_24_1: 'Chat Bridge aligné sur API Server pour lentrée multimodale, le prompt système et le contexte workspace',
new_0_5_25_1: 'Actions de réinitialisation et clonage des salons de chat de groupe',
new_0_5_25_2: 'Répertoire d’état Web UI configurable pour les déploiements personnalisés',
new_0_5_25_3: 'MiMo ajouté comme fournisseur TTS dans les paramètres vocaux',
new_0_5_25_4: 'Listes de modèles des fournisseurs personnalisés chargées via le backend pour éviter les erreurs CORS navigateur',
new_0_5_25_5: 'Flux dapprobation des outils corrigé pour les sessions Bridge',
new_0_5_25_6: 'Indice de plateforme CLI forcé retiré des prompts Bridge afin de préserver les instructions personnalisées de média/fichier',
new_0_5_25_7: 'Contenu image base64 affiché correctement dans lhistorique des messages utilisateur',
new_0_5_25_8: 'Tests navigateur Playwright, couverture du contrat de streaming chat, couverture des modèles fournisseur et baseline de couverture ajoutés',
new_0_5_26_1: 'Chemins média Markdown Windows et locaux pris en charge dans lhistorique et les messages rendus',
new_0_5_26_2: 'Historique assistant vide filtré et état de compression obsolète nettoyé au démarrage dun nouveau run',
new_0_5_26_3: 'Écritures verrouillées pour config et profils afin de réduire la corruption par écritures concurrentes',
new_0_5_26_4: 'Paramètres de canaux QQBot et DingTalk ajoutés',
new_0_5_26_5: 'Détection de port CLI rendue portable et tiroir terminal mobile amélioré',
new_0_5_26_6: 'Environnements de profil Bridge isolés et découverte des plugins Hermes corrigée entre environnements Python',
new_0_5_26_7: 'États gateway arrêtés expliqués avec diagnostics Web UI et état de chargement des logs stabilisé',
new_0_5_26_8: 'Options de réinitialisation de session, base URL fournisseur personnalisé et cibles de livraison dynamiques corrigées',
new_0_5_26_9: 'Bascule locale daffichage des traces tool-call ajoutée dans la barre de saisie du chat',
new_0_5_26_10: 'Installations du paquet Hermes Agent prises en charge quand aucun checkout source nest disponible',
new_0_5_26_11: 'Connexion OAuth xAI Grok pour les abonnés SuperGrok et presets de modèles Grok mis à jour',
new_0_5_26_12: 'Couverture étendue pour navigateur, streaming chat, fournisseur, gateway, config, plugin et Bridge',
new_0_5_27_1: 'Paramètres de modèle par session pour les chats Bridge, avec fournisseur et modèle indépendants enregistrés par session',
new_0_5_27_2: 'Clic droit sur une session Bridge puis Définir le modèle pour changer le modèle de cette session',
new_0_5_27_3: 'Les runs valident le modèle de session et reviennent au modèle par défaut actuel si le modèle enregistré est indisponible',
new_0_5_27_4: 'La compression de contexte suit par défaut le modèle sélectionné par défaut du profil courant',
new_0_5_30_1: 'Bridge chat conserve lhistorique structuré, corrigeant les absences de réponse et outils ignorés causés par lhistorique doutils aplati',
new_0_5_30_2: 'Le routage des mentions en chat de groupe est plus fiable avec plusieurs agents, retire la mention de chaque agent avant livraison et garde les noms utilisateur après actualisation',
new_0_5_30_3: 'Pages modèles, menus de modèle chat et sélection de modèle de session sont limités au profil actif avec marqueurs par défaut précis',
new_0_5_30_4: 'Gestion gateway simplifiée : page Gateway autonome retirée, chaque profil vérifie sa configuration plateforme avant démarrage et un runner léger gère démarrages/redémarrages',
new_0_5_30_5: 'Démarrage gateway amélioré sur Docker, Termux et Windows avec gestion runtime-lock, nettoyage des conflits de port, exécution en arrière-plan et support du redémarrage',
new_0_5_30_6: 'Compatibilité Windows renforcée pour détection de chemins, téléchargements et sous-processus job/update sans fenêtres terminal furtives',
new_0_5_30_7: 'Écritures config et presets fournisseur corrigés : validation des clés .env, routage FUN-Codex via Responses API et listes modèles Z.AI/GLM actualisées',
new_0_5_30_8: 'Détails frontend polis : barre latérale repliée, libellés courts de groupe, séparateur latéral et style de plan de conversation',
new_0_5_30_9: 'La compression de contexte suit les paramètres de profil et durcit les snapshots obsolètes en réutilisant les résumés précédents avec une queue sûre',
new_0_5_31_1: 'Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {\'@\'}all ajouté',
new_0_5_31_2: 'Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat',
new_0_5_31_3: 'Sélecteur de profils avec avatars, upload 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',
2026-05-21 14:31:52 +08:00
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',
2026-05-22 11:12:21 +08:00
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',
},
// 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',
2026-05-20 17:13:32 +08:00
fileTree: 'Arborescence des fichiers',
},
// Chat de groupe
groupChat: {
title: 'Chat de groupe',
createRoom: 'Creer un salon',
joinByCode: 'Rejoindre avec un code',
roomName: 'Nom du salon',
roomNamePlaceholder: 'Entrez le nom du salon',
inviteCode: "Code d'invitation",
autoGenerate: 'Generer automatiquement',
noRooms: 'Aucun salon pour le moment',
selectOrCreate: 'Selectionnez ou creez un salon pour commencer a discuter',
agents: 'Agents',
addAgent: 'Ajouter un agent',
selectProfile: 'Selectionnez un profil',
agentAdded: 'Agent ajoute',
agentAlreadyInRoom: "L'agent est deja dans ce salon",
agentAddFailedCount: "{count} agent(s) n'ont pas ete ajoutes : {details}",
noAgents: 'Aucun agent dans ce salon',
members: 'Membres',
roomCreated: 'Salon cree',
roomDeleted: 'Salon supprime',
roomCloned: 'Salon clone',
cloneRoom: 'Cloner le salon',
deleteRoomConfirm: 'Supprimer ce salon ?',
clearContext: 'Effacer le contexte',
clearContextConfirm: 'Effacer le contexte de ce salon ? Les messages et instantanés de compression seront supprimés, les agents et membres restent.',
contextCleared: 'Contexte effacé',
you: 'Vous',
joined: 'Vous avez rejoint le salon',
joinFailed: 'Echec de la connexion au salon',
inputPlaceholder: 'Tapez un message... (Entree pour envoyer)',
enterCode: "Entrez le code d'invitation",
yourName: 'Votre nom',
yourNamePlaceholder: "Entrez votre nom d'affichage",
yourDescription: 'Description (facultatif)',
yourDescriptionPlaceholder: 'Decrivez-vous aux autres...',
agentName: 'Nom de l\'agent',
agentNamePlaceholder: 'Nom personnalise (vide = nom du profil)',
agentDesc: 'Description de l\'agent',
agentDescPlaceholder: 'Decrivez le role de cet agent...',
agentReplying: 'est en train de répondre...',
agentCompressing: 'compresse le contexte...',
compressionSettings: 'Paramètres de compression',
triggerTokens: 'Seuil de tokens',
triggerTokensDesc: 'Seuil de tokens pour déclencher la compression',
maxHistoryTokens: 'Max tokens historique',
maxHistoryTokensDesc: 'Maximum de tokens pour le contexte compressé',
tailMessageCount: 'Messages récents',
tailMessageCountDesc: 'Nombre de messages récents à conserver',
compressionConfig: 'Config. compression',
compressNow: 'Comprimer maintenant',
compressingInProgress: 'Compression en cours',
compressionSaved: 'Configuration enregistrée',
},
// Telechargement
download: {
downloading: 'Telechargement...',
downloadFailed: 'Echec du telechargement',
fileNotFound: 'Fichier introuvable ou supprime',
fileTooLarge: 'Fichier trop volumineux (limite depassee)',
backendError: 'Echec de la lecture du fichier, l\'environnement distant est peut-etre indisponible',
backendTimeout: 'Delai de lecture du fichier depasse',
unsupportedBackend: 'Le backend de terminal actuel ne prend pas en charge le telechargement de fichiers',
invalidPath: 'Chemin de fichier invalide',
download: 'Telecharger',
downloadFile: 'Telecharger le fichier',
},
2026-05-20 17:13:32 +08:00
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',
},
},
}