badb17cf8e
* feat: integrate goal command workflow * fix: keep goal done visible * fix: add goal done slash command * fix: promote queued message on run start
1342 lines
60 KiB
TypeScript
1342 lines
60 KiB
TypeScript
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 l’utilisation de la session actuelle',
|
||
status: 'Afficher l’état de la session et la file',
|
||
abort: 'Arrêter l’exécution Bridge active',
|
||
queue: 'Mettre un message en file après l’exécution active',
|
||
plan: 'Rédiger un plan d’implé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 l’affichage actuel',
|
||
clearHistory: 'Supprimer l’historique des messages enregistrés de cette session',
|
||
title: 'Renommer cette session',
|
||
compress: 'Lancer la compression du contexte au repos',
|
||
steer: 'Envoyer un guidage à l’exécution Bridge active',
|
||
destroy: 'Libérer l’agent Bridge de cette session',
|
||
},
|
||
attachFiles: 'Joindre des fichiers',
|
||
showToolCalls: 'Afficher les appels d’outils',
|
||
hideToolCalls: 'Masquer les appels d’outils',
|
||
messageQueue: 'File de messages',
|
||
removeQueuedMessage: 'Retirer le message de la file',
|
||
stop: 'Arreter',
|
||
send: 'Envoyer',
|
||
contextUsed: 'Contexte utilise :',
|
||
sessions: 'Sessions',
|
||
webUiSessions: 'Sessions',
|
||
allProfiles: 'Tous les profils',
|
||
profileMissingModelsTip: 'Le profil "{profile}" n’a aucun fournisseur ni modèle disponible pour cette session',
|
||
sessionScopeHint: 'Le chat affiche uniquement les sessions Web UI/API Server. Les sessions CLI, Telegram, Discord, Cron et autres canaux sont en lecture seule dans Historique.',
|
||
openHistory: 'Ouvrir l’historique',
|
||
hermesHistory: 'Historique Hermes',
|
||
historyScopeHint: 'Sessions d’historique Hermes du profil actuel en lecture seule, regroupées par source.',
|
||
noSessions: 'Aucune session',
|
||
newChat: 'Nouvelle discussion',
|
||
approvalKicker: 'Permission terminal',
|
||
approvalTitle: 'Vérifier la commande avant exécution',
|
||
approvalAllowOnce: 'Autoriser une fois',
|
||
approvalAllowSession: 'Autoriser la session',
|
||
approvalAlways: 'Toujours',
|
||
approvalDeny: 'Refuser',
|
||
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 l’humain.',
|
||
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 d’exécution', thinkingLabel: 'Raisonnement',
|
||
thinkingInProgress: 'En réflexion…',
|
||
thinkingShow: 'Afficher le raisonnement',
|
||
thinkingHide: 'Masquer le raisonnement',
|
||
thinkingDuration: 'Observé {duration}',
|
||
thinkingChars: '{count} caractères',
|
||
copyBubble: 'Copier le message',
|
||
copiedBubble: 'Message copié',
|
||
copyFailed: 'Échec de la copie',
|
||
playSpeech: 'Lire à voix haute',
|
||
pauseSpeech: 'Pause',
|
||
resumeSpeech: 'Reprendre',
|
||
stopSpeech: 'Arrêter',
|
||
speechNotSupported: 'Reproduction vocale non prise en charge dans ce navigateur',
|
||
searchEnterHint: 'Entrée pour ouvrir · Échap pour fermer',
|
||
searchHint: 'Cmd/Ctrl+K',
|
||
searchScope: 'Portée de recherche : base locale des sessions Web UI uniquement ; les sessions d’historique Hermes en lecture seule ne sont pas incluses.',
|
||
searchFailed: 'Échec de la recherche de sessions',
|
||
searchNoSnippet: 'Aucun extrait disponible',
|
||
searchNoResults: 'Aucune session correspondante',
|
||
searchRecent: 'Session récente',
|
||
searchEmpty: 'Sessions récentes',
|
||
searchPlaceholder: 'Rechercher des sessions...',
|
||
searchSubtitle: 'Rechercher par titre ou contenu des messages',
|
||
searchTitle: 'Rechercher des sessions',
|
||
stopGateway: 'Arrêter le gateway',
|
||
start: 'Démarrer',
|
||
workspaceSetFailed: 'Échec de la définition du workspace',
|
||
workspaceSet: 'Workspace défini',
|
||
workspacePlaceholder: 'Saisissez le chemin du projet, ex. /home/user/project',
|
||
workspace: 'Espace de travail',
|
||
setWorkspaceTitle: 'Définir le workspace de session',
|
||
setWorkspace: 'Définir le workspace',
|
||
modelSetFailed: 'Échec de la définition du modèle',
|
||
modelSet: 'Modèle défini',
|
||
setModelTitle: 'Définir le modèle de session',
|
||
setModel: 'Définir le modèle',
|
||
newCliChat: 'Nouveau CLI',
|
||
cliEmptyState: 'Démarrer un chat CLI',
|
||
autoPlaySpeech: 'Lire la voix automatiquement',
|
||
},
|
||
|
||
// Jobs
|
||
jobs: {
|
||
title: 'Taches planifiees',
|
||
createJob: 'Creer une tache',
|
||
editJob: 'Modifier la tache',
|
||
noJobs: 'Aucune tache planifiee. Creez-en une pour commencer.',
|
||
name: 'Nom',
|
||
namePlaceholder: 'Nom de la tache',
|
||
schedule: 'Planification (expression Cron)',
|
||
schedulePlaceholder: 'ex. 0 9 * * *',
|
||
quickPresets: 'Presets rapides',
|
||
selectPreset: 'Selectionner un preset...',
|
||
presetEveryMinute: 'Chaque minute',
|
||
presetEvery5Min: 'Toutes les 5 minutes',
|
||
presetEveryHour: 'Chaque heure',
|
||
presetEveryDay: 'Tous les jours a 00:00',
|
||
presetEveryDay9: 'Tous les jours a 09:00',
|
||
presetEveryMonday: 'Chaque lundi a 09:00',
|
||
presetEveryMonth: 'Le 1er de chaque mois a 09:00',
|
||
prompt: 'Invite',
|
||
promptPlaceholder: 'L\'invite a executer',
|
||
deliverTarget: 'Cible de livraison',
|
||
origin: 'Origine',
|
||
local: 'Local',
|
||
repeatCount: 'Nombre de repetitions (facultatif)',
|
||
modelPlaceholder: 'Modele par defaut',
|
||
repeatPlaceholder: 'Laisser vide pour infini',
|
||
jobCreated: 'Tache creee',
|
||
jobUpdated: 'Tache mise a jour',
|
||
nameRequired: 'Le nom est requis',
|
||
scheduleRequired: 'La planification est requise',
|
||
loadFailed: 'Echec du chargement de la tache',
|
||
jobPaused: 'Tache en pause',
|
||
jobResumed: 'Tache reprise',
|
||
jobTriggered: 'Job declenche',
|
||
modelUpdated: 'Modele mis a jour',
|
||
jobDeleted: 'Tache supprimee',
|
||
status: {
|
||
running: 'En cours',
|
||
paused: 'En pause',
|
||
disabled: 'Desactivee',
|
||
scheduled: 'Planifiee',
|
||
},
|
||
info: {
|
||
model: 'Modele',
|
||
schedule: 'Planification',
|
||
lastRun: 'Derniere execution',
|
||
nextRun: 'Prochaine execution',
|
||
deliver: 'Livraison',
|
||
repeat: 'Repetition',
|
||
},
|
||
action: {
|
||
pause: 'Pause',
|
||
pauseJob: 'Mettre en pause',
|
||
resume: 'Reprendre',
|
||
resumeJob: 'Reprendre la tache',
|
||
runNow: 'Executer maintenant',
|
||
triggerImmediately: 'Déclencher immédiatement',
|
||
},
|
||
runHistory: {
|
||
title: 'Historique',
|
||
runs: 'exécutions',
|
||
noRuns: 'Aucun historique trouvé.',
|
||
},
|
||
},
|
||
|
||
// Skills
|
||
skills: {
|
||
title: 'Competences',
|
||
searchPlaceholder: 'Rechercher des competences...',
|
||
noMatch: 'Aucune competence ne correspond a votre recherche',
|
||
noSkills: 'Aucune competence trouvee',
|
||
backTo: 'Retour a',
|
||
attachedFiles: 'Fichiers joints',
|
||
loadFailed: 'Echec du chargement de la competence',
|
||
fileLoadFailed: 'Echec du chargement du fichier',
|
||
modified: "Modifi\u00e9 par l'utilisateur",
|
||
archived: 'Archivé',
|
||
pinned: 'Épinglé',
|
||
pin: 'Épingler la compétence',
|
||
unpin: 'Désépingler la compétence',
|
||
pinFailed: "Impossible de changer le statut d'épinglage",
|
||
toggleFailed: 'Echec de l\'activation/desactivation de la competence',
|
||
source: {
|
||
builtin: 'Intégré',
|
||
hub: 'Hub',
|
||
local: 'Local',
|
||
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 l’agent',
|
||
python: 'Python',
|
||
scanCwd: 'Analyser cwd',
|
||
projectPlugins: 'Plugins du projet',
|
||
},
|
||
},
|
||
|
||
// Memory
|
||
memory: {
|
||
title: 'Memoire',
|
||
refresh: 'Actualiser',
|
||
loadFailed: 'Echec du chargement de la memoire',
|
||
myNotes: 'Mes notes',
|
||
noNotes: 'Aucune note pour l\'instant.',
|
||
notesPlaceholder: 'Ecrivez vos notes...',
|
||
userProfile: 'Profil utilisateur',
|
||
noProfile: 'Aucun profil pour l\'instant.',
|
||
profilePlaceholder: 'Ecrivez votre profil...',
|
||
soul: 'Ame',
|
||
noSoul: 'Aucune configuration d\'ame pour l\'instant.',
|
||
soulPlaceholder: 'Ecrivez la configuration de l\'ame...',
|
||
},
|
||
|
||
// Models
|
||
models: {
|
||
title: 'Modeles',
|
||
addProvider: 'Ajouter un fournisseur',
|
||
providerType: 'Type de fournisseur',
|
||
preset: 'Préréglage',
|
||
custom: 'Personnalise',
|
||
selectProvider: 'Selectionner un fournisseur',
|
||
chooseProvider: 'Choisir un fournisseur...',
|
||
name: 'Nom',
|
||
autoGeneratedName: 'Genere automatiquement a partir de l\'URL de base',
|
||
baseUrl: 'URL de base',
|
||
region: 'Région',
|
||
regionIntl: 'International',
|
||
regionCn: 'Chine continentale',
|
||
baseUrlPlaceholder: 'ex. https://api.example.com/v1',
|
||
apiKey: 'Cle API',
|
||
apiKeyPlaceholder: 'sk-...',
|
||
defaultModel: 'Modele par defaut',
|
||
selectOrInput: 'Sélectionner ou saisir un modèle...',
|
||
selectModel: 'Selectionner un modele...',
|
||
providerAdded: 'Fournisseur ajoute',
|
||
providerDeleted: 'Fournisseur supprime',
|
||
deleteProvider: 'Supprimer le fournisseur',
|
||
deleteConfirm: 'Etes-vous sur de vouloir supprimer "{name}" ?',
|
||
codexLoginTitle: 'Connexion OpenAI Codex',
|
||
codexWaiting: 'Entrez ce code sur la page d\'autorisation pour vous connecter :',
|
||
codexCopyCode: 'Code copié',
|
||
codexOpenLink: 'Ouvrir la page d\'autorisation',
|
||
codexApproved: 'Connexion réussie',
|
||
codexExpired: 'L\'autorisation a expiré. Veuillez réessayer.',
|
||
nousLoginTitle: 'Connexion Nous Portal',
|
||
nousWaiting: 'Entrez ce code sur la page d\'autorisation:',
|
||
nousCopyCode: 'Code copié',
|
||
nousOpenLink: 'Ouvrir la page d\'autorisation',
|
||
nousApproved: 'Connexion réussie',
|
||
nousDenied: 'Autorisation refusée',
|
||
nousExpired: 'Autorisation expirée',
|
||
copilotLoginTitle: 'Connexion GitHub Copilot',
|
||
copilotWaiting: 'Ouvrez GitHub et saisissez le code ci-dessous pour autoriser. La fenêtre se fermera automatiquement après approbation.',
|
||
copilotCopyCode: 'Code copié',
|
||
copilotOpenLink: 'Ouvrir la page d\'autorisation GitHub',
|
||
copilotApproved: 'Connexion réussie !',
|
||
copilotDenied: 'Autorisation refusée.',
|
||
copilotExpired: 'Le lien d\'autorisation a expiré. Veuillez réessayer.',
|
||
copilotAddDetectedTitle: 'GitHub Copilot détecté',
|
||
copilotAddDetected: 'Un token OAuth GitHub Copilot a été détecté sur cette machine. Cliquez sur Ajouter pour activer Copilot dans Hermes.',
|
||
copilotAddSourceEnv: 'Source : ~/.hermes/.env (COPILOT_GITHUB_TOKEN)',
|
||
copilotAddSourceGhCli: 'Source : gh CLI (gh auth token)',
|
||
copilotAddSourceAppsJson: 'Source : extension Copilot de VS Code (apps.json)',
|
||
copilotDeleteHintEnv: 'Cela supprimera COPILOT_GITHUB_TOKEN dans ~/.hermes/.env. Les autres outils ne sont pas affectés.',
|
||
copilotDeleteHintGhCli: 'Copilot sera masqué dans Hermes. Votre connexion gh CLI n\'est pas affectée — `gh auth status` indiquera toujours que vous êtes connecté.',
|
||
copilotDeleteHintAppsJson: 'Copilot sera masqué dans Hermes. Votre extension Copilot de VS Code reste connectée.',
|
||
customBadge: 'PERSONNALISÉ',
|
||
previewBadge: 'APERÇU',
|
||
disabledBadge: 'INDISPONIBLE',
|
||
disabledTooltip: "Ce modèle n'est pas disponible pour votre compte.",
|
||
customModelPlaceholder: 'ID de modèle non listé',
|
||
customModelHint: 'Pour les modèles pris en charge par le fournisseur mais non renvoyés par l’API ; ce n’est pas un renommage affiché. Entrée pour charger.',
|
||
noProviders: 'Aucun fournisseur trouve. Ajoutez un fournisseur personnalise pour commencer.',
|
||
clearVisibleModels: 'Effacer la sélection',
|
||
currentDefault: 'Par défaut actuel',
|
||
defaultShort: 'Défaut',
|
||
builtIn: 'Integre',
|
||
customType: 'Personnalise',
|
||
provider: 'Fournisseur',
|
||
contextLength: 'Longueur du contexte',
|
||
contextLengthPlaceholder: 'ex. 200000 (facultatif)',
|
||
local: 'Local ({host})',
|
||
selectProviderRequired: 'Veuillez selectionner un fournisseur',
|
||
baseUrlRequired: 'L\'URL de base est requise',
|
||
apiKeyRequired: 'La cle API est requise',
|
||
modelRequired: 'Le modele par defaut est requis',
|
||
enterBaseUrl: 'Veuillez d\'abord entrer l\'URL de base',
|
||
unexpectedFormat: 'Format de reponse inattendu',
|
||
foundModels: '{count} modeles trouves',
|
||
fetchFailed: 'Echec de la recuperation des modeles',
|
||
xaiWaiting: 'Terminez l’autorisation sur la page xAI ouverte. La fenêtre se fermera automatiquement après approbation.',
|
||
xaiOpenLink: 'Ouvrir la page d’autorisation xAI',
|
||
xaiLoginTitle: 'Connexion OAuth xAI Grok',
|
||
xaiExpired: 'Le lien d’autorisation a expiré. Veuillez réessayer.',
|
||
xaiCopyLink: 'Copier le lien d’autorisation',
|
||
xaiApproved: 'Connexion réussie !',
|
||
visibilitySelectOne: 'Conserver au moins un modèle visible',
|
||
visibilitySaved: 'Modèles visibles enregistrés',
|
||
visibilitySaveFailed: 'Échec de l’enregistrement des modèles visibles',
|
||
visibilityHint: 'Affecte uniquement le sélecteur de modèles et la page Modèles de la Web UI. La configuration provider/model de Hermes CLI n’est pas modifiée ; les appels utilisent toujours l’ID de modèle d’origine.',
|
||
showAllModels: 'Afficher tous les modèles',
|
||
searchPlaceholder: 'Rechercher des modèles...',
|
||
removeCustomModel: 'Retirer ce modèle non listé',
|
||
more: 'de plus',
|
||
models: 'Liste des modèles',
|
||
manageVisibleModelsFor: 'Gérer les modèles visibles de {name}',
|
||
manageVisibleModels: 'Gérer les modèles visibles',
|
||
getApiKey: 'Obtenir une API Key',
|
||
count: 'modèles',
|
||
aliasUseOriginal: 'Restaurer l’ID d’origine',
|
||
aliasTitleFor: 'Nom affiché pour {model}',
|
||
aliasTitle: 'Nom affiché du modèle',
|
||
aliasSaveFailed: 'Échec de l’enregistrement du nom affiché',
|
||
aliasPlaceholder: 'Laisser vide pour utiliser l’ID de modèle d’origine',
|
||
aliasManageFor: 'Noms affichés pour {provider}',
|
||
aliasManage: 'Noms affichés',
|
||
aliasHint: 'Modifie uniquement le nom affiché dans la Web UI. Hermes reçoit toujours l’ID de modèle d’origine.',
|
||
aliasEdit: 'Renommer',
|
||
aliasCanonical: 'ID d’origine : {model}',
|
||
},
|
||
|
||
// Profiles
|
||
profiles: {
|
||
title: 'Profils',
|
||
create: 'Creer un profil',
|
||
import: 'Importer',
|
||
export: 'Exporter',
|
||
rename: 'Renommer',
|
||
delete: 'Supprimer',
|
||
switchTo: '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 l’avatar',
|
||
upload: 'Importer une image',
|
||
random: 'Générer au hasard',
|
||
reset: 'Restaurer par défaut',
|
||
hint: 'PNG, JPEG ou WebP, 1 Mo maximum',
|
||
invalidType: 'Veuillez choisir une image PNG, JPEG ou WebP',
|
||
tooLarge: 'L’image d’avatar ne doit pas dépasser 1 Mo',
|
||
saveSuccess: 'Avatar enregistré',
|
||
saveFailed: 'Échec de l’enregistrement de l’avatar',
|
||
resetSuccess: 'Avatar par défaut restauré',
|
||
resetFailed: 'Échec de la restauration de l’avatar par défaut',
|
||
},
|
||
runtime: {
|
||
activeProfile: 'Actuel : {name}',
|
||
bridgeWorker: 'État du Bridge',
|
||
gateway: 'Passerelle',
|
||
active: 'Actif',
|
||
activeTag: 'Actuel',
|
||
idle: 'Inactif',
|
||
running: 'En cours',
|
||
stopped: 'Arrêté',
|
||
restartGateway: 'Redémarrer le gateway',
|
||
restartProfile: 'Redémarrer le profil',
|
||
switchProfile: 'Changer 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 : n’afficher que les sessions humaines',
|
||
liveMonitorHumanOnlyHint: 'Masquer par défaut le bruit des sous-agents et du moniteur de session dans le moniteur live',
|
||
atHourHint: 'Reinitialiser la session a cette heure chaque jour',
|
||
requireAuth: 'Autorisation de session',
|
||
requireAuthHint: 'Requiere l\'autorisation pour les operations de session',
|
||
},
|
||
privacy: {
|
||
redactPii: 'Masquer les DPI',
|
||
redactPiiHint: 'Detecter et masquer automatiquement les informations sensibles (mots de passe, cles, etc.)',
|
||
},
|
||
apiServer: {
|
||
enable: 'Activer',
|
||
enableHint: 'Activer le serveur API',
|
||
host: 'Hote',
|
||
hostHint: 'Adresse d\'ecoute',
|
||
port: 'Port',
|
||
portHint: 'Port d\'ecoute',
|
||
key: 'Cle',
|
||
keyHint: 'Cle d\'acces API',
|
||
cors: 'Origines CORS',
|
||
corsHint: 'Sources cross-origin autorisees',
|
||
},
|
||
voice: {
|
||
ttsProvider: 'Fournisseur TTS',
|
||
ttsProviderHint: 'Choisir le moteur de synthese vocale pour la lecture des messages',
|
||
providerWebSpeech: 'WebSpeech API (Navigateur)',
|
||
providerOpenai: 'OpenAI TTS',
|
||
providerCustom: "Point d'acces personnalise (compatible OpenAI)",
|
||
providerEdge: 'Edge TTS (Gratuit, sans cle API)',
|
||
|
||
// WebSpeech
|
||
webspeechVoice: 'Voix',
|
||
webspeechVoiceHint: "Choisir une voix depuis le navigateur ou l'OS",
|
||
webspeechVoicePlaceholder: 'Auto (voix par defaut)',
|
||
|
||
// OpenAI
|
||
openaiKey: 'Cle API',
|
||
openaiKeyHint: 'Votre cle API OpenAI avec acces TTS',
|
||
openaiUrl: 'URL de base API',
|
||
openaiUrlHint: 'ex. https://api.openai.com/v1/audio/speech',
|
||
openaiModel: 'Modele',
|
||
openaiModelHint: 'tts-1 (rapide) / tts-1-hd (haute qualite)',
|
||
openaiVoice: 'Voix',
|
||
openaiVoiceHint: 'Voix a utiliser pour la synthese',
|
||
|
||
// Custom endpoint
|
||
customHint: 'Utilisez toute API TTS compatible OpenAI — fonctionne avec GPT-SoVITS, CosyVoice, etc.',
|
||
customUrl: 'URL API',
|
||
customUrlHint: 'URL de base de votre service TTS',
|
||
customUrlPlaceholder: "Adresse configuree dans l'adaptateur local, ex. http://127.0.0.1:9880",
|
||
customApiKey: 'Cle API (optionnelle)',
|
||
customApiKeyHint: "Certains points d'acces personnalises necessitent une authentification",
|
||
customApiKeyPlaceholder: 'Laisser vide si inutile',
|
||
|
||
// Edge TTS
|
||
edgeHint: 'Propulse par Microsoft Edge TTS (node-edge-tts).',
|
||
edgeUrl: "URL de l'adaptateur",
|
||
edgeUrlHint: "Adresse de l'adaptateur Edge TTS, ex. http://127.0.0.1:9882",
|
||
edgeUrlPlaceholder: 'http://127.0.0.1:9882',
|
||
edgeVoice: 'Voix',
|
||
edgeVoiceHint: 'Choisir une voix pour la synthese vocale',
|
||
edgeRate: 'Vitesse',
|
||
edgeRateHint: "Ajuster la vitesse de la voix (0.5x ~ 2.0x)",
|
||
edgePitch: 'Hauteur',
|
||
edgePitchHint: "Ajuster la hauteur de la voix (-20 ~ +20 Hz)",
|
||
|
||
// Test
|
||
testTitle: 'Test vocal',
|
||
testText: 'Texte de test',
|
||
testTextPlaceholder: 'Entrez le texte a tester...',
|
||
testTextDefault: 'Bonjour, ceci est un test vocal.',
|
||
testButton: 'Tester',
|
||
testButtonPlaying: 'Lecture...',
|
||
testFailed: 'Echec du test : {error}',
|
||
|
||
// MiMo TTS
|
||
providerMimo: 'MiMo TTS',
|
||
mimoHint: 'Xiaomi MiMo TTS — voices predefinies, conception vocale et clonage vocal',
|
||
mimoApiKey: 'Cle API',
|
||
mimoApiKeyHint: 'Obtenez votre cle sur platform.xiaomimimo.com',
|
||
mimoApiKeyPlaceholder: 'Cle API MiMo',
|
||
mimoBaseUrl: 'URL de base',
|
||
mimoBaseUrlHint: 'URL de l\'endpoint API MiMo',
|
||
mimoModel: 'Modele',
|
||
mimoModelHint: 'Selectionnez le modele de synthese vocale',
|
||
mimoModelPreset: 'Voix predefinies',
|
||
mimoModelVoiceDesign: 'Conception vocale',
|
||
mimoModelVoiceClone: 'Clonage vocal',
|
||
mimoVoice: 'Voix',
|
||
mimoVoiceHint: 'Selectionnez une voix predefinie',
|
||
mimoVoiceDesignPrompt: 'Description vocale',
|
||
mimoVoiceDesignPromptHint: 'Decrivez les caracteristiques vocales souhaitees',
|
||
mimoVoiceDesignPromptPlaceholder: 'Ex : Une voix feminine chaude et jeune, legerement lente, avec un ton magnetique',
|
||
mimoCloneAudio: 'Televerser un audio',
|
||
mimoCloneAudioHint: 'Televersez un echantillon audio pour le clonage (mp3/wav, max 10 Mo)',
|
||
mimoCloneAudioUpload: 'Choisir un fichier',
|
||
mimoCloneAudioClear: 'Effacer',
|
||
mimoStylePrompt: 'Invite de style',
|
||
mimoStylePromptHint: 'Optionnel — decrivez le style de parole en langage naturel',
|
||
mimoStylePromptPlaceholder: 'Ex : Ton vif et entrain, rythme rapide',
|
||
},
|
||
lockedIps: {
|
||
title: 'IPs bloquees',
|
||
count: '{count} bloquees',
|
||
empty: 'Aucune IP bloquee',
|
||
unlock: 'Debloquer',
|
||
unlockAll: 'Tout debloquer',
|
||
unlockAllConfirm: 'Debloquer toutes les IPs?',
|
||
unlocked: 'IP debloquee',
|
||
allUnlocked: '{count} IPs debloquees',
|
||
},
|
||
models: {
|
||
apiKey: 'API Key',
|
||
apiKeyPlaceholder: 'Saisir l’API Key',
|
||
noProviders: 'Aucun fournisseur configuré',
|
||
save: 'Enregistrer',
|
||
saveFailed: 'Échec de l’enregistrement',
|
||
saved: 'Enregistré',
|
||
},
|
||
},
|
||
|
||
// Platform channel settings
|
||
platform: {
|
||
requireMention: "Exiger une mention {'@'}",
|
||
requireMentionGroup: "Exiger une mention {'@'} dans les groupes pour repondre",
|
||
requireMentionChannel: "Exiger une mention {'@'} dans les canaux pour repondre",
|
||
requireMentionRoom: "Exiger une mention {'@'} dans les salles pour repondre",
|
||
reactions: 'Réactions',
|
||
reactionsHint: 'Reagir aux messages avec des emoji',
|
||
freeResponseChats: 'Discussions en reponse libre',
|
||
freeResponseChatsHint: "ID de discussions repondant sans mention {'@'} (separes par des virgules)",
|
||
freeResponseChannels: 'Canaux en reponse libre',
|
||
freeResponseChannelsHint: "ID de canaux repondant sans mention {'@'} (separes par des virgules)",
|
||
freeResponseRooms: 'Salles en reponse libre',
|
||
freeResponseRoomsHint: "ID de salles repondant sans mention {'@'} (separes par des virgules)",
|
||
mentionPatterns: 'Motifs de mention personnalises',
|
||
mentionPatternsHint: 'Motifs de declenchement supplementaires',
|
||
autoThread: 'Fil automatique',
|
||
autoThreadHint: "Creer automatiquement des fils de reponse apres une mention {'@'}",
|
||
autoThreadHintRoom: 'Creer automatiquement des fils de reponse dans les salles',
|
||
dmMentionThreads: 'Fils de mention en MP',
|
||
dmMentionThreadsHint: 'Utiliser des fils de reponse pour les mentions en MP',
|
||
allowBots: 'Autoriser les messages de bots',
|
||
allowBotsHint: 'Repondre aux messages d\'autres bots',
|
||
allowedChannels: 'Canaux autorises',
|
||
allowedChannelsHint: 'Liste blanche des ID de canaux (separes par des virgules)',
|
||
ignoredChannels: 'Canaux ignores',
|
||
ignoredChannelsHint: 'Canaux ou le bot ne repond jamais (separes par des virgules)',
|
||
noThreadChannels: 'Canaux sans fil',
|
||
noThreadChannelsHint: 'Canaux ou le bot repond sans fil (separes par des virgules)',
|
||
exclusiveTokenWarning: 'Cette plateforme utilise un verrou de jeton exclusif. Chaque profil doit utiliser un jeton d\'identite different pour eviter les conflits avec les autres profils.',
|
||
botToken: 'Jeton de bot',
|
||
botTokenHint: 'Jeton de bot depuis le portail developpeur',
|
||
accessToken: 'Jeton d\'acces',
|
||
accessTokenHint: 'Jeton d\'acces Matrix',
|
||
homeserver: 'URL du serveur domestique',
|
||
homeserverHint: 'URL du serveur domestique Matrix',
|
||
appId: 'ID de l\'application',
|
||
appIdHint: 'ID de l\'application Feishu',
|
||
appSecret: 'Secret de l\'application',
|
||
appSecretHint: 'Secret de l\'application Feishu',
|
||
clientId: 'ID client',
|
||
clientIdHint: 'ID client DingTalk',
|
||
clientSecret: 'Secret client',
|
||
clientSecretHint: 'Secret client DingTalk',
|
||
botId: 'ID du bot',
|
||
botIdHint: 'ID du bot WeCom',
|
||
wecomSecretHint: 'Secret du bot WeCom',
|
||
waEnabled: 'Activer WhatsApp',
|
||
waEnabledHint: 'Activer WhatsApp via appairage par code QR',
|
||
weixinToken: 'Jeton Weixin',
|
||
weixinTokenHint: 'Depuis la connexion QR de la CLI weixin (hermes weixin)',
|
||
accountId: 'ID de compte',
|
||
accountIdHint: 'ID du compte Weixin',
|
||
qrLogin: 'Connexion QR',
|
||
qrRelogin: 'Reconnexion',
|
||
qrFetching: 'Recuperation du code QR...',
|
||
qrScanHint: 'Scannez avec WeChat pour vous connecter',
|
||
qrScanedHint: 'Scanne, veuillez confirmer sur le telephone...',
|
||
qqSandboxHint: 'Activer l’environnement sandbox (pour les tests)',
|
||
qqSandbox: 'Mode sandbox',
|
||
qqQrScanHint: 'Scannez le QR code avec QQ ou ouvrez le lien sur téléphone pour terminer l’association',
|
||
qqMarkdownHint: 'Activer les messages au format Markdown (certains clients peuvent ne pas le prendre en charge)',
|
||
qqMarkdown: 'Support Markdown',
|
||
qqAppSecretHint: 'App Secret du bot QQ Open Platform',
|
||
qqAppSecret: 'App Secret',
|
||
qqAppIdHint: 'App ID du bot QQ Open Platform',
|
||
qqAppId: 'App ID',
|
||
allowedUsersHint: 'Liste blanche d’ID utilisateur ou OpenID, séparés par des virgules',
|
||
allowedUsers: 'Utilisateurs autorisés',
|
||
allowAllUsersHint: 'Autoriser les messages de tout utilisateur ; désactivez pour utiliser la liste blanche',
|
||
allowAllUsers: 'Autoriser tous les utilisateurs',
|
||
},
|
||
|
||
// Language
|
||
language: {
|
||
label: 'Langue',
|
||
zh: '中文',
|
||
en: 'English',
|
||
fr: 'Francais',
|
||
},
|
||
|
||
// Terminal
|
||
terminal: {
|
||
sessions: 'Sessions',
|
||
newTab: 'Nouveau terminal',
|
||
closeSession: 'Fermer cette session ?',
|
||
sessionExited: 'Terminee',
|
||
processExited: 'Processus termine avec le code {code}',
|
||
noSessions: 'Aucune session terminal',
|
||
connectionFailed: 'Connexion au terminal impossible',
|
||
connectionError: 'Erreur de connexion',
|
||
connectionClosed: 'Connexion fermée',
|
||
},
|
||
|
||
// Usage
|
||
usage: {
|
||
title: 'Statistiques d\'utilisation',
|
||
refresh: 'Actualiser',
|
||
totalTokens: 'Total des jetons',
|
||
inputTokens: 'Entree',
|
||
outputTokens: 'Sortie',
|
||
totalSessions: 'Total des sessions',
|
||
avgPerDay: '~{n}/jour en moy.',
|
||
estimatedCost: 'Cout est.',
|
||
cacheHitRate: 'Taux de succes du cache',
|
||
modelBreakdown: 'Repartition par modele',
|
||
dailyTrend: 'Utilisation quotidienne',
|
||
date: 'Date',
|
||
tokens: 'Jetons',
|
||
cache: 'Cache',
|
||
cacheRead: 'Lecture cache',
|
||
cacheWrite: 'Écriture cache',
|
||
sessions: 'Sessions',
|
||
cost: 'Cout',
|
||
noData: 'Aucune donnee d\'utilisation',
|
||
},
|
||
|
||
skillsUsage: {
|
||
title: 'Utilisation des compétences',
|
||
subtitle: 'Suivre les chargements et modifications de compétences dans les sessions Hermes',
|
||
refresh: 'Actualiser',
|
||
periodSelector: 'Période d\'utilisation des compétences',
|
||
periodLabel: '{days} j',
|
||
summary: 'Résumé',
|
||
totalActions: 'Act.',
|
||
loads: 'Charg.',
|
||
edits: 'Modif.',
|
||
distinctSkills: 'Comp.',
|
||
topSkills: 'Top comp.',
|
||
dailyTrend: 'Tendance',
|
||
periodSummary: '{days} derniers jours',
|
||
skill: 'Comp.',
|
||
share: '%',
|
||
lastUsed: 'Dern. usage',
|
||
noData: 'Aucune donnée d\'utilisation des compétences',
|
||
loadFailed: 'Impossible de charger l\'utilisation des compétences',
|
||
otherSkills: 'Autres comp.',
|
||
},
|
||
|
||
// Journal des modifications
|
||
changelog: {
|
||
new_0_5_31_1: 'Redémarrages Bridge broker renforcés, rendu final du flux de chat de groupe corrigé et routage {\'@\'}all ajouté',
|
||
new_0_5_31_2: 'Le gestionnaire de fichiers peut copier les chemins absolus et le tiroir mobile des sessions ne passe plus derrière le chat',
|
||
new_0_5_31_3: 'Sélecteur de profils avec avatars, upload d’avatar personnalisé, modal d’état runtime et actions de redémarrage gateway/profil',
|
||
new_0_5_31_4: 'Avatars de profil dans chat individuel, chat de groupe et barre latérale repliée, avec métadonnées Web UI et chemins compatibles Windows',
|
||
new_0_5_31_5: 'Détection et redémarrage gateway améliorés sur Docker, Termux et Windows via gateway_state/gateway.pid pour la vivacité du gateway géré',
|
||
new_0_5_31_6: 'Endpoint média APIKEY.FUN de génération d’images et skill apikey-image-gen intégré pour texte-image, image-image et édition via le fournisseur fun-codex du profil actif',
|
||
new_0_5_33_1: 'Les échecs d’exécution et erreurs Socket en chat individuel et groupe restent maintenant dans la liste comme messages Agent rouges',
|
||
new_0_5_33_2: 'La recherche de sessions peut être limitée au profil sélectionné, ou couvrir tous les profils si aucun profil n’est choisi',
|
||
new_0_5_33_3: 'La page Skills affiche des documents de recommandation chinois/anglais quand aucun skill n’est sélectionné, et un second clic désélectionne le skill',
|
||
new_0_5_33_4: 'Suppression des entrées changelog i18n inutilisées pour réduire la taille frontend',
|
||
new_0_5_33_5: 'Correction du démarrage agent bridge sur Windows chinois lorsque la sortie netstat n’est pas décodée en UTF-8',
|
||
new_0_5_33_6: 'Liste des modèles Nous Portal mise à jour depuis le catalog public et les recommandations Portal',
|
||
new_0_5_33_7: 'Les listes de profils et états runtime lisent les noms depuis les dossiers et les modèles par défaut depuis config, évitant les erreurs de colonnes CLI',
|
||
new_0_5_34_1: 'Normalise les résultats de tools multimodaux lors du stockage des messages session/groupe, afin d’éviter les images base64 dans les replays',
|
||
new_0_5_34_2: 'Persiste les modèles Hermes personnalisés dans une configuration backend et ajoute les endpoints ajout/suppression',
|
||
new_0_5_34_3: 'Maintient corrects l’usage final du contexte Bridge et les états de tools après les exécutions',
|
||
new_0_5_34_4: 'Améliore les filtres Kanban, l’affichage des responsables, les actions de cartes et les détails de tâches',
|
||
new_0_5_34_5: 'Corrige le comptage de compression avec cache du contexte fixe prompt/tools et totaux complets de tokens',
|
||
new_0_5_34_6: 'Met en cache le contexte fixe par agent de chat de groupe et affiche la progression seulement au vrai démarrage de la compression',
|
||
new_0_5_34_7: 'Synchronise les skills intégrées Web UI dans tous les profils et journalise le profil cible',
|
||
new_0_5_34_8: 'Si Kanban échoue sous Windows, mettez Hermes à niveau pour obtenir les derniers correctifs de migration de la base Kanban',
|
||
new_0_5_35_1: 'Les sessions Bridge peuvent maintenant s’exécuter en parallèle entre sessions différentes, tandis que les runs d’une même session restent sérialisés pour préserver l’ordre',
|
||
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 d’exé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 l’arrê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 l’initialisation 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 l’UI du chat avec les états démarrage, outil, progression et fin',
|
||
new_0_6_0_5: 'L’arrêt ou l’abandon d’un 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 s’applique que s’il est explicite, et CLI start/stop/status n’affichent plus l’avertissement node:sqlite',
|
||
new_0_6_1_2: 'Les réponses Clarify et de confirmation passent maintenant par le socket de chat authentifié jusqu’au 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 d’outils Bridge persiste maintenant les préfixes partiels aux limites d’outil 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: 'L’ancien 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 l’arrêt du gateway',
|
||
},
|
||
kanban: {
|
||
title: 'Tableau Kanban',
|
||
createTask: 'Nouvelle tâche',
|
||
noTasks: 'Aucune tâche',
|
||
allStatuses: 'Tous les statuts',
|
||
allAssignees: 'Tous les responsables',
|
||
columns: {
|
||
triage: 'Triage',
|
||
todo: 'À faire',
|
||
ready: 'Prêt',
|
||
running: 'En cours',
|
||
blocked: 'Bloqué',
|
||
done: 'Terminé',
|
||
archived: 'Archivé',
|
||
},
|
||
card: {
|
||
assigneeTooltip: 'Responsable',
|
||
priority: {
|
||
low: 'Basse',
|
||
medium: 'Moyenne',
|
||
high: 'Haute',
|
||
},
|
||
timeAgo: {
|
||
justNow: 'à l’instant',
|
||
minutes: 'il y a {count} min',
|
||
hours: 'il y a {count} h',
|
||
days: 'il y a {count} j',
|
||
},
|
||
},
|
||
board: {
|
||
create: 'Nouveau tableau',
|
||
archive: 'Archiver le tableau',
|
||
archiveConfirm: 'Archiver le tableau actuel ?',
|
||
archived: 'Tableau archivé',
|
||
created: 'Tableau créé',
|
||
slugPlaceholder: 'Identifiant du tableau, ex. project-a',
|
||
namePlaceholder: 'Nom affiché (facultatif)',
|
||
slugRequired: 'L’identifiant du tableau est requis',
|
||
},
|
||
form: {
|
||
title: 'Titre',
|
||
titlePlaceholder: 'Titre de la tâche',
|
||
titleRequired: 'Le titre est requis',
|
||
body: 'Description',
|
||
bodyPlaceholder: 'Description de la tâche (facultatif)',
|
||
assignee: 'Responsable',
|
||
selectAssignee: 'Choisir un responsable...',
|
||
priority: 'Priorité',
|
||
selectPriority: 'Choisir une priorité...',
|
||
},
|
||
detail: {
|
||
status: 'Statut',
|
||
priority: 'Priorité',
|
||
assignee: 'Responsable',
|
||
tenant: 'Locataire',
|
||
createdAt: 'Créé',
|
||
startedAt: 'Démarré',
|
||
completedAt: 'Terminé',
|
||
comments: 'Commentaires',
|
||
events: 'Événements',
|
||
runs: 'Exécutions',
|
||
artifacts: 'Fichiers produits',
|
||
result: 'Résultat',
|
||
highlights: 'Informations clés',
|
||
sources: 'Sources de données',
|
||
sessions: 'Sessions liées',
|
||
sessionMessages: 'Messages de session',
|
||
noSessions: 'Aucune session liée trouvée.',
|
||
},
|
||
action: {
|
||
title: 'Actions',
|
||
assign: 'Assigner',
|
||
assignTo: 'Assigner à...',
|
||
block: 'Bloquer',
|
||
blockReason: 'Raison du blocage',
|
||
unblock: 'Débloquer',
|
||
complete: 'Terminer',
|
||
completeSummary: 'Résumé de fin (facultatif)',
|
||
},
|
||
message: {
|
||
loadFailed: 'Échec du chargement de la tâche',
|
||
taskCreated: 'Tâche créée',
|
||
taskAssigned: 'Tâche assignée',
|
||
taskBlocked: 'Tâche bloquée',
|
||
taskUnblocked: 'Tâche débloquée',
|
||
taskCompleted: 'Tâche terminée',
|
||
},
|
||
stats: {
|
||
total: 'Total',
|
||
tasks: 'Tâches',
|
||
},
|
||
},
|
||
}
|