Import AITURK IDE 1.0.0-beta.1 from Hermes 63279301; preserve MIT license

This commit is contained in:
2026-09-05 13:26:46 +03:00
commit 03634b1ca3
11340 changed files with 3442369 additions and 0 deletions
+461
View File
@@ -0,0 +1,461 @@
# Hermes static-message catalog -- French (français)
# See locales/en.yaml for the source of truth; keep keys in sync.
approval:
dangerous_header: "⚠️ COMMANDE DANGEREUSE : {description}"
choose_long: " [o]ne fois | [s]ession | [t]oujours | [r]efuser"
choose_short: " [o]ne fois | [s]ession | [r]efuser"
prompt_long: " Choix [o/s/t/R] : "
prompt_short: " Choix [o/s/R] : "
choose_smart_deny: " [o]ne fois | [r]efuser"
prompt_smart_deny: " Choix [o/R] : "
smart_deny_once_inputs: "o,once"
smart_deny_deny_inputs: "r,refuser"
timeout: " ⏱ Délai dépassé — commande refusée"
allowed_once: " ✓ Autorisé une fois"
allowed_session: " ✓ Autorisé pour cette session"
allowed_always: " ✓ Ajouté à la liste d'autorisation permanente"
denied: " ✗ Refusé"
cancelled: " ✗ Annulé"
blocklist_message: "Cette commande est sur la liste de blocage inconditionnel et ne peut pas être approuvée."
gateway:
approval_expired: "⚠️ Approbation expirée (l'agent n'attend plus). Demandez à l'agent de réessayer."
draining: "⏳ Vidage de {count} agent(s) actif(s) avant redémarrage..."
goal_cleared: "✓ Objectif effacé."
no_active_goal: "Aucun objectif actif."
config_read_failed: "⚠️ Impossible de lire config.yaml : {error}"
config_save_failed: "⚠️ Impossible de sauvegarder la configuration : {error}"
model:
error_prefix: "Erreur : {error}"
switched: "Modèle changé pour `{model}`"
provider_label: "Fournisseur : {provider}"
context_label: "Contexte : {tokens} tokens"
max_output_label: "Sortie max. : {tokens} tokens"
cost_label: "Coût : {cost}"
capabilities_label: "Capacités : {capabilities}"
prompt_caching_enabled: "Cache de prompts : activé"
warning_prefix: "Avertissement : {warning}"
saved_global: "Enregistré dans config.yaml (`--global`)"
session_only_hint: "_(session uniquement — ajoutez `--global` pour conserver)_"
current_label: "Actuel : `{model}` chez {provider}"
current_tag: " (actuel)"
more_models_suffix: " (+{count} autres)"
usage_switch_model: "`/model <name>` — changer de modèle"
usage_switch_provider: "`/model <name> --provider <slug>` — changer de fournisseur"
usage_persist: "`/model <name> --global` — conserver"
agents:
header: "🤖 **Agents et tâches actifs**"
active_agents: "**Agents actifs :** {count}"
this_chat: " · ce chat"
more: "... et {count} de plus"
running_processes: "**Processus d'arrière-plan en cours :** {count}"
async_jobs: "**Tâches asynchrones du gateway :** {count}"
background_delegations: "**Délégations en arrière-plan :** {count}"
none: "Aucun agent actif ni tâche en cours."
state_starting: "démarrage"
state_running: "en cours"
approve:
no_pending: "Aucune commande en attente d'approbation."
once_singular: "✅ Commande approuvée. L'agent reprend..."
once_plural: "✅ Commandes approuvées ({count} commandes). L'agent reprend..."
session_singular: "✅ Commande approuvée (modèle approuvé pour cette session). L'agent reprend..."
session_plural: "✅ Commandes approuvées (modèle approuvé pour cette session) ({count} commandes). L'agent reprend..."
always_singular: "✅ Commande approuvée (modèle approuvé de manière permanente). L'agent reprend..."
always_plural: "✅ Commandes approuvées (modèle approuvé de manière permanente) ({count} commandes). L'agent reprend..."
background:
usage: "Usage : /bg <prompt>\nExemple : /bg Résume les meilleures histoires HN d'aujourd'hui\n\nExécute le prompt dans une session séparée. Vous pouvez continuer à discuter — le résultat apparaîtra ici une fois terminé."
started: "🔄 Tâche d'arrière-plan démarrée : « {preview} »\nID de tâche : {task_id}\nVous pouvez continuer à discuter — les résultats apparaîtront ici une fois terminés."
btw:
usage: "Usage : /btw <question>\nExemple : /btw dans quel fichier était cette erreur ?\n\nRépond à une question rapide sur cette conversation sans l'interrompre. Pour une tâche d'arrière-plan indépendante, utilisez /bg <prompt>."
no_history: "Pas encore de conversation — envoyez plutôt votre question comme un message normal."
no_provider: "❌ Impossible de répondre : aucun identifiant de fournisseur configuré."
started: "💬 Question annexe : « {preview} »\nRéponse à partir d'un instantané de cette conversation — le travail en cours continue."
answer: "💬 /btw : « {preview} »\n\n{answer}"
failed: "❌ /btw a échoué : « {preview} »\n{error}"
branch:
db_unavailable: "Base de données des sessions indisponible."
no_conversation: "Aucune conversation à brancher — envoyez d'abord un message."
create_failed: "Échec de la création de la branche : {error}"
switch_failed: "Branche créée mais impossible de basculer dessus."
branched_one: "⑂ Branche **{title}** créée ({count} message copié)\nOriginal : `{parent}`\nBranche : `{new}`\nUtilisez `/resume` pour revenir à l'original."
branched_many: "⑂ Branche **{title}** créée ({count} messages copiés)\nOriginal : `{parent}`\nBranche : `{new}`\nUtilisez `/resume` pour revenir à l'original."
commands:
usage: "Utilisation : `/commands [page]`"
skill_header: "⚡ **Commandes de skill** :"
default_desc: "Commande de skill"
none: "Aucune commande disponible."
header: "📚 **Commandes** ({total} au total, page {page}/{total_pages})"
nav_prev: "`/commands {page}` ← précédent"
nav_next: "suivant → `/commands {page}`"
out_of_range: "_(La page demandée {requested} était hors limites, affichage de la page {page}.)_"
compress:
not_enough: "Conversation insuffisante pour la compression (au moins 4 messages nécessaires)."
no_provider: "Aucun fournisseur configuré — compression impossible."
nothing_to_do: "Rien à compresser pour l'instant (la transcription est encore entièrement du contexte protégé)."
aggressive_unsupported: "--aggressive n'est pas pris en charge ; utilisez '/compress here [N]' pour ne conserver que les échanges récents, ou /undo pour supprimer des tours."
focus_line: "Focus : \"{topic}\""
summary_failed: "⚠️ Échec de la génération du résumé ({error}). {count} message(s) historique(s) ont été supprimés et remplacés par un espace réservé ; le contexte antérieur n'est plus récupérable. Vérifiez la configuration du modèle auxiliary.compression."
aborted: "⚠️ Compression interrompue ({error}). Aucun message n'a été supprimé — la conversation est inchangée. Lancez /compress pour réessayer, /reset pour une nouvelle session, ou vérifiez la configuration de votre modèle auxiliary.compression."
aux_failed: "️ Le modèle de compression configuré `{model}` a échoué ({error}). Récupéré avec votre modèle principal — le contexte est intact — mais vous pouvez vérifier `auxiliary.compression.model` dans config.yaml."
turnhold_deferred: "️ Compression du contexte différée — le résumé est encore en cours de diffusion. Poursuite sans compression pour ce tour."
failed: "Échec de la compression : {error}"
debug:
upload_failed: "✗ Échec de l'envoi du rapport de débogage : {error}"
header: "**Rapport de débogage envoyé :**"
auto_delete: "⏱ Les pastes s'effaceront automatiquement dans 6 heures."
full_logs_hint: "Pour envoyer les journaux complets, utilisez `hermes debug share` depuis la CLI."
share_hint: "Partagez ces liens avec l'équipe Hermes pour obtenir de l'aide."
deny:
stale: "❌ Commande refusée (l'approbation était périmée)."
no_pending: "Aucune commande en attente de refus."
denied_singular: "❌ Commande refusée."
denied_plural: "❌ Commandes refusées ({count} commandes)."
denied_reason_singular: "❌ Commande refusée. Raison transmise à l'agent: \"{reason}\""
denied_reason_plural: "❌ Commandes refusées ({count} commandes). Raison transmise à l'agent: \"{reason}\""
fast:
not_supported: "⚡ /fast n'est disponible que pour les modèles OpenAI qui prennent en charge Priority Processing."
status: "⚡ Priority Processing\n\nMode actuel : `{mode}`\n\n_Usage :_ `/fast <normal|fast|status>`"
unknown_arg: "⚠️ Argument inconnu : `{arg}`\n\n**Options valides :** normal, fast, status"
saved: "⚡ ✓ Priority Processing : **{label}** (enregistré dans la configuration)\n_(prend effet au prochain message)_"
session_only: "⚡ ✓ Priority Processing : **{label}** (cette session uniquement)"
label_fast: "FAST"
label_normal: "NORMAL"
status_fast: "fast"
status_normal: "normal"
picker_title: "⚡ **Priority Processing**\\n\\nMode actuel : `{mode}`\\n\\nChoisissez une option :"
choice_fast: "fast — Priority Processing activé"
choice_normal: "normal — traitement standard"
choice_auto: "auto — rapide pendant les premières secondes de chaque tour"
choice_cold: "cold — rapide uniquement au premier tour d'une session"
footer:
status: "📎 Pied de page d'exécution : **{state}**\nChamps : `{fields}`\nPlateforme : `{platform}`"
usage: "Usage : `/footer [on|off|status]`"
saved: "📎 Pied de page d'exécution : **{state}**{example}\n_(enregistré globalement — prend effet au prochain message)_"
example_line: "\nExemple : `{preview}`"
state_on: "ON"
state_off: "OFF"
goal:
unavailable: "Les objectifs ne sont pas disponibles dans cette session."
no_goal_set: "Aucun objectif défini."
paused: "⏸ Objectif en pause : {goal}"
no_resume: "Aucun objectif à reprendre."
resumed: "▶ Objectif repris : {goal}\nReprise immédiate — je passe tout de suite à l'étape suivante."
invalid: "Objectif invalide : {error}"
set: "⊙ Objectif défini (budget de {budget} tours) : {goal}\nJe continuerai jusqu'à ce que l'objectif soit terminé, que vous le mettiez en pause/effaciez, ou que le budget soit épuisé.\nContrôles : /goal status · /goal pause · /goal resume · /goal clear"
help:
header: "📖 **Commandes Hermes**\n"
skill_header: "\n⚡ **Commandes de skill** ({count} actives) :"
more_use_commands: "\n... et {count} de plus. Utilisez `/commands` pour la liste paginée complète."
insights:
invalid_days: "Valeur --days invalide : {value}"
error: "Erreur lors de la génération des analyses : {error}"
kanban:
error_prefix: "⚠ erreur kanban : {error}"
subscribed_suffix: "(abonné — vous serez notifié lorsque {task_id} se terminera ou sera bloqué)"
truncated_suffix: "… (tronqué ; utilisez `hermes kanban …` dans votre terminal pour la sortie complète)"
no_output: "(aucune sortie)"
wake:
completed: "completed"
gave_up: "gave up (retries exhausted)"
crashed: "crashed (worker exited); dispatcher will retry"
timed_out: "timed out; dispatcher will retry"
blocked: "blocked; needs attention"
review_requested: "handed off for review; the implementation is done"
changes_requested: "review requested changes (BLOCK); implementation is not approved"
block_loop_detected: "routed to triage after repeated blocks; needs a decision"
status_default: "status changed"
status_joiner: ", "
message: "[kanban] Task {task_id} {status}.\nTitle: {title}\nAssignee: @{assignee}\nBoard: {board}\n\nCheck the result or decide the next step."
handoff: "Result: {summary}"
review_detail: "Review feedback: {reason}\nInspect the existing card and its current review run; return work to the same implementation task. Do not treat this BLOCK as approval and do not create a duplicate task."
guidance: "This is an automatic task-status notification, not a request to decompose the task again. Inspect the current board before creating follow-up tasks; do not recreate tasks or graphs that already exist."
personality:
none_configured: "Aucune personnalité configurée dans `{path}/config.yaml`"
header: "🎭 **Personnalités disponibles**\n"
none_option: "• `none` — (aucune superposition de personnalité)"
item: "• `{name}` — {preview}"
usage: "\nUtilisation : `/personality <name>`"
save_failed: "⚠️ Échec de l'enregistrement du changement de personnalité : {error}"
cleared: "🎭 Personnalité effacée — comportement de base de l'agent utilisé.\n_(prend effet au prochain message)_"
set_to: "🎭 Personnalité définie sur **{name}**\n_(prend effet au prochain message)_"
unknown: "Personnalité inconnue : `{name}`\n\nDisponibles : {available}"
profile:
header: "👤 **Profil :** `{profile}`"
home: "📂 **Dossier personnel :** `{home}`"
reasoning:
level_default: "medium (par défaut)"
level_disabled: "none (désactivé)"
scope_session: "remplacement de session"
scope_global: "configuration globale"
status: "🧠 **Paramètres de raisonnement**\n\n**Effort :** `{level}`\n**Portée :** {scope}\n**Affichage :** {display}\n\n_Usage :_ `/reasoning <none|minimal|low|medium|high|xhigh|max|ultra|reset|show|hide> [--global]`"
display_on: "activé ✓"
display_off: "désactivé"
display_set_on: "🧠 ✓ Affichage du raisonnement : **ACTIVÉ**\nLa réflexion du modèle sera affichée avant chaque réponse sur **{platform}**."
display_set_off: "🧠 ✓ Affichage du raisonnement : **DÉSACTIVÉ** pour **{platform}**"
reset_global_unsupported: "⚠️ `/reasoning reset --global` n'est pas pris en charge. Utilisez `/reasoning <level> --global` pour modifier la valeur globale par défaut."
reset_done: "🧠 ✓ Remplacement de raisonnement de la session effacé ; retour à la configuration globale."
unknown_arg: "⚠️ Argument inconnu : `{arg}`\n\n**Niveaux valides :** none, minimal, low, medium, high, xhigh, max, ultra\n**Affichage :** show, hide\n**Persister :** ajoutez `--global` pour enregistrer au-delà de cette session"
picker_title: "🧠 **Paramètres de raisonnement**\\n\\n**Effort :** `{level}`\\n**Portée :** {scope}\\n**Affichage :** {display}\\n\\nChoisissez une option :"
choice_none: "none — désactiver le raisonnement"
choice_reset: "reset — effacer le réglage de session"
choice_show: "afficher le raisonnement dans les réponses"
choice_hide: "masquer le raisonnement dans les réponses"
set_global: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (enregistré dans la configuration)\n_(prend effet au prochain message)_"
set_global_save_failed: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (session uniquement — échec de l'enregistrement de la configuration)\n_(prend effet au prochain message)_"
set_session: "🧠 ✓ Effort de raisonnement défini sur `{effort}` (session uniquement — ajoutez `--global` pour persister)\n_(prend effet au prochain message)_"
reload_mcp:
cancelled: "🟡 /reload-mcp annulé. Outils MCP inchangés."
always_followup: "️ Les prochains appels `/reload-mcp` s'exécuteront sans confirmation. Réactivez via `approvals.mcp_reload_confirm: true` dans `config.yaml`."
confirm_prompt: "⚠️ **Confirmer /reload-mcp**\n\nRecharger les serveurs MCP reconstruit l'ensemble d'outils de cette session et **invalide le cache de prompt du fournisseur** — le prochain message renverra l'intégralité des jetons d'entrée. Sur les modèles à long contexte ou à raisonnement élevé, cela peut être coûteux.\n\nChoisissez :\n• **Approuver une fois** — recharger maintenant\n• **Toujours approuver** — recharger maintenant et masquer cette confirmation définitivement\n• **Annuler** — laisser les outils MCP inchangés\n\n_Alternative texte : répondez `/approve`, `/always` ou `/cancel`._"
header: "🔄 **Serveurs MCP rechargés**\n"
reconnected: "♻️ Reconnectés : {names}"
added: " Ajoutés : {names}"
removed: " Supprimés : {names}"
none_connected: "Aucun serveur MCP connecté."
tools_available: "\n🔧 {tools} outil(s) disponible(s) sur {servers} serveur(s)"
failed: "❌ Échec du rechargement MCP : {error}"
reload_skills:
header: "🔄 **Skills rechargées**\n"
no_new: "Aucune nouvelle skill détectée."
total: "\n📚 {count} skill(s) disponible(s)"
added_header: " **Skills ajoutées :**"
removed_header: " **Skills supprimées :**"
item_with_desc: " - {name} : {desc}"
item_no_desc: " - {name}"
failed: "❌ Échec du rechargement des skills : {error}"
reset:
header_default: "✨ Session réinitialisée ! Nouveau départ."
header_new: "✨ Nouvelle session démarrée !"
header_titled: "✨ Nouvelle session démarrée : {title}"
title_rejected: "\n⚠️ Titre refusé : {error}"
title_error_untitled: "\n⚠️ {error} — session démarrée sans titre."
title_empty_untitled: "\n⚠️ Le titre est vide après nettoyage — session démarrée sans titre."
tip: "\n✦ Astuce : {tip}"
restart:
in_progress: "⏳ Redémarrage du gateway déjà en cours..."
restarting: "♻ Redémarrage du gateway. Si vous n'êtes pas notifié dans les 60 secondes, redémarrez depuis la console avec `hermes gateway restart`."
resume:
db_unavailable: "Base de données des sessions indisponible."
parse_error: "⚠️ Could not parse `/resume` arguments: {error}.
Use quotes around titles with spaces, for example: `/resume \"Project A Plan\"`."
matrix_no_named_sessions: "No named sessions found for this Matrix room.
Use `/title My Session` to name the current room session, `/resume --all` to list all Matrix sessions, or `/resume --cross-room <session name>` to explicitly cross room boundaries."
matrix_blocked_no_origin: "⚠️ Matrix /resume blocked: this named session has no recorded room origin, so Hermes will not resume it inside the current room by default. Use `/resume --cross-room {name}` if you intentionally want to cross room boundaries."
matrix_blocked_other_room: "⚠️ Matrix /resume blocked: that session belongs to a different Matrix room ({room}). Use `/resume --cross-room {name}` if you intentionally want to resume it here."
matrix_cross_room_success: "⚠️ Cross-room resume: resumed **{title}** inside Matrix room **{room}**.
Future messages in this room will use that transcript until `/reset` or another `/resume`.{msg_part}"
blocked_not_owner: "⚠️ /resume blocked: '**{name}**' belongs to a different user or chat. You can only resume sessions from this chat."
no_named_sessions: "Aucune session nommée trouvée.\nUtilisez `/title Ma session` pour nommer la session actuelle, puis `/resume Ma session` pour y revenir plus tard."
all_requires_admin: "_Remarque : `--all` (liste inter-discussions) nécessite un administrateur configuré ; seules les sessions de cette discussion sont affichées._"
list_header: "📋 **Sessions nommées**\n"
list_item: "• **{title}**{preview_part}"
list_item_numbered: "{index}. **{title}**{preview_part}"
list_preview_suffix: " — _{preview}_"
list_footer: "\nUsage : `/resume <nom de session>`"
list_footer_numbered: "\nUtilisation : `/resume <nom de session>` ou `/resume <numéro>` (par exemple `/resume 1` pour la plus récente)"
list_failed: "Impossible de lister les sessions : {error}"
out_of_range: "L'index de reprise {index} est hors limites.\nUtilisez `/resume` sans arguments pour voir les sessions disponibles."
not_found: "Aucune session correspondant à '**{name}**' trouvée.\nUtilisez `/resume` sans argument pour voir les sessions disponibles."
already_on: "📌 Déjà sur la session **{name}**."
switch_failed: "Échec du changement de session."
resumed_one: "↻ Session **{title}** reprise ({count} message). Conversation restaurée."
resumed_many: "↻ Session **{title}** reprise ({count} messages). Conversation restaurée."
resumed_no_count: "↻ Session **{title}** reprise. Conversation restaurée."
retry:
no_previous: "Aucun message précédent à réessayer."
rollback:
not_enabled: "Les points de contrôle ne sont pas activés.\nActivez-les dans config.yaml :\n```\ncheckpoints:\n enabled: true\n```"
none_found: "Aucun point de contrôle trouvé pour {cwd}"
invalid_number: "Numéro de point de contrôle invalide. Utilisez 1-{max}."
restored: "✅ Restauré au point de contrôle {hash} : {reason}\nUn instantané pré-rollback a été enregistré automatiquement."
kept_user_edits: "↷ Vos modifications manuelles ont été conservées : {files}\nUtilisez /rollback <N> --all pour les restaurer aussi."
kept_oversize: "↷ Conservé (trop volumineux pour les checkpoints, aucune copie enregistrée vers laquelle revenir) : {files}"
failed_deletes: "⚠️ Suppression impossible (laissé en place) : {files}"
restore_failed: "❌ {error}"
diff:
not_enabled: "Les points de contrôle ne sont pas activés, il n'y a donc pas de référence de session.\nActivez-les dans config.yaml :\n```\ncheckpoints:\n enabled: true\n```\nLe /diff simple fonctionne toujours — il utilise git directement."
no_changes: "Aucun changement."
failed: "{error}"
set_home:
save_failed: "Impossible d'enregistrer le canal principal : {error}"
success: "✅ Canal principal défini sur **{name}** (ID : {chat_id}).\nLes tâches cron et les messages multi-plateformes seront livrés ici."
context:
header: "🧠 **Context Window**"
model: "Model: `{model}`"
window: "Window: {total} tokens"
in_use: "In use: {used} / {total} ({pct}%)"
bar: "{bar}"
headroom: "Headroom to limit: {headroom} tokens"
threshold: "Auto-compresses at: {threshold} ({threshold_pct}%) — {to_go} to go"
over_threshold: "⚠️ **Over auto-compression threshold ({threshold}, {threshold_pct}%)**"
compressions: "Compressions this session: {count}"
last_savings: "Last compression freed: {savings}% of context"
totals_header: "Session totals (cumulative across {calls} API calls)"
totals_line: "Input {input} · Output {output} · Reasoning {reasoning}"
total_billed: "Total billed: {total}"
throughput_note: "_Throughput, not context size — each call re-sends the window above._"
estimated: "Estimated context: ~{count} tokens across {messages} messages"
detail_after_first: "_(Full compression and throughput stats available after the first agent response)_"
no_data: "No context data available yet. Send a message to start a session."
status:
header: "📊 **État de Hermes Gateway**"
matrix_scope_header: "**Matrix scope:**"
matrix_scope_room: " room: {room}"
matrix_scope_room_id: " room_id: {room_id}"
matrix_scope_thread: " thread_id: {thread_id}"
matrix_scope_mode: " session_scope: {scope}"
matrix_scope_key: " session_key: {session_key}"
session_id: "**ID de session :** `{session_id}`"
title: "**Titre :** {title}"
created: "**Créé :** {timestamp}"
last_activity: "**Dernière activité :** {timestamp}"
model: "**Model:** `{model}`"
model_provider: "**Model:** `{model}` ({provider})"
context: "**Context:** {used} / {total} ({pct}%)"
context_used: "**Context:** ~{used} tokens"
tokens: "**Lifetime tokens billed:** {tokens} _(not your current context size; use `/context`)_"
agent_running: "**Agent en cours :** {state}"
state_yes: "Oui ⚡"
state_no: "Non"
queued: "**Suivis en file :** {count}"
platforms: "**Plateformes connectées :** {platforms}"
stop:
stopped_pending: "⚡ Arrêté. L'agent n'avait pas encore commencé — vous pouvez continuer cette session."
stopped: "⚡ Arrêté. Vous pouvez continuer cette session."
no_active: "Aucune tâche active à arrêter."
title:
db_unavailable: "Base de données des sessions indisponible."
warn_prefix: "⚠️ {error}"
empty_after_clean: "⚠️ Le titre est vide après nettoyage. Utilisez des caractères imprimables."
set_to: "✏️ Titre de session défini : **{title}**"
not_found: "Session introuvable dans la base de données."
current_with_title: "📌 Session : `{session_id}`\nTitre : **{title}**"
current_no_title: "📌 Session : `{session_id}`\nAucun titre défini. Usage : `/title Mon nom de session`"
topic:
not_telegram_dm: "La commande /topic n'est disponible que dans les chats privés Telegram."
no_session_db: "Base de données de sessions non disponible."
unauthorized: "Vous n'êtes pas autorisé à utiliser /topic sur ce bot."
restore_needs_topic: "Pour restaurer une session, créez ou ouvrez d'abord un topic Telegram, puis envoyez /topic <session-id> dans ce topic. Pour créer un nouveau topic, ouvrez All Messages et envoyez-y n'importe quel message."
topics_disabled: "Les topics Telegram ne sont pas encore activés pour ce bot.\n\nComment les activer :\n1. Ouvrez @BotFather.\n2. Choisissez votre bot.\n3. Ouvrez Bot Settings → Threads Settings.\n4. Activez Threaded Mode et assurez-vous que les utilisateurs sont autorisés à créer de nouveaux threads.\n\nPuis envoyez /topic à nouveau."
topics_user_disallowed: "Les topics Telegram sont activés, mais les utilisateurs ne peuvent pas en créer.\n\nOuvrez @BotFather → choisissez votre bot → Bot Settings → Threads Settings, puis désactivez 'Disallow users to create new threads'.\n\nPuis envoyez /topic à nouveau."
enable_failed: "Échec de l'activation du mode topic Telegram : {error}"
bound_status: "Ce topic est lié à :\nSession : {label}\nID : {session_id}\n\nUtilisez /new pour remplacer ce topic par une nouvelle session.\nPour un travail parallèle, ouvrez All Messages et envoyez-y un message pour créer un autre topic."
thread_ready: "Les topics multi-sessions Telegram sont activés.\n\nCe topic sera utilisé comme session Hermes indépendante. Utilisez /new pour remplacer la session actuelle de ce topic. Pour un travail parallèle, ouvrez All Messages et envoyez-y un message pour créer un autre topic."
untitled_session: "Session sans titre"
undo:
nothing: "Rien à annuler."
removed: "↩️ {turns} tour(s) annulé(s) ({count} message(s)).\nSauvegardé dans : « {preview} »\nCopiez/modifiez le texte ci-dessus et envoyez-le pour relancer à partir d'ici."
invalid_count: "Nombre invalide « {arg} » — utilisez /undo ou /undo N."
update:
platform_not_messaging: "✗ /update n'est disponible que depuis les plateformes de messagerie. Exécutez `hermes update` depuis le terminal."
not_git_repo: "✗ Pas un dépôt git — impossible de mettre à jour."
hermes_cmd_not_found: "✗ Impossible de localiser la commande `hermes`. Hermes est en cours d'exécution, mais la commande de mise à jour n'a pas pu trouver l'exécutable dans le PATH ni via l'interpréteur Python actuel. Essayez d'exécuter `hermes update` manuellement dans votre terminal."
start_failed: "✗ Échec du démarrage de la mise à jour : {error}"
starting: "⚕ Démarrage de la mise à jour Hermes… Je diffuserai la progression ici."
usage:
rate_limits: "⏱️ **Limites de débit :** {state}"
header_session: "📊 **Utilisation des jetons de session**"
label_model: "Modèle : `{model}`"
label_input_tokens: "Jetons d'entrée : {count}"
label_cache_read: "Jetons de lecture du cache : {count}"
label_cache_write: "Jetons d'écriture du cache : {count}"
label_output_tokens: "Jetons de sortie : {count}"
label_total: "Total : {count}"
label_api_calls: "Appels API : {count}"
label_cost: "Coût : {prefix}${amount}"
label_cost_included: "Coût : inclus"
label_context: "Contexte : {used} / {total} ({pct}%)"
label_compressions: "Compressions : {count}"
breakdown_header: "🧩 **Répartition du contexte** _(estimée)_"
breakdown_line: "• {label} : ~{count} ({pct} %)"
breakdown_cat_system_prompt: "Invite système"
breakdown_cat_tool_definitions: "Définitions des outils"
breakdown_cat_rules: "Règles"
breakdown_cat_skills: "Compétences"
breakdown_cat_mcp: "MCP"
breakdown_cat_subagent_definitions: "Définitions des sous-agents"
breakdown_cat_memory: "Mémoire"
breakdown_cat_conversation: "Conversation"
header_session_info: "📊 **Infos de session**"
label_messages: "Messages : {count}"
label_estimated_context: "Contexte estimé : ~{count} jetons"
detailed_after_first: "_(Utilisation détaillée disponible après la première réponse de l'agent)_"
no_data: "Aucune donnée d'utilisation disponible pour cette session."
unknown_subcommand: "Sous-commande /usage inconnue : `{args}`. Essayez `/usage` ou `/usage reset [--force]`."
reset_wrong_provider: "Les réinitialisations de limite en réserve ne sont disponibles qu'avec le fournisseur openai-codex. Changez d'abord avec `/model`."
credits:
not_logged_in: "Non connecté à Nous Portal. Connecte-toi pour voir ton solde de crédits et recharger."
verbose:
not_enabled: "La commande `/verbose` n'est pas activée pour les plateformes de messagerie.\n\nActivez-la dans `config.yaml` :\n```yaml\ndisplay:\n tool_progress_command: true\n```"
mode_off: "⚙️ Progression des outils : **OFF** — aucune activité d'outil affichée."
mode_new: "⚙️ Progression des outils : **NEW** — affichée lors d'un changement d'outil (longueur d'aperçu : `display.tool_preview_length`, par défaut 40)."
mode_all: "⚙️ Progression des outils : **ALL** — chaque appel d'outil est affiché (longueur d'aperçu : `display.tool_preview_length`, par défaut 40)."
mode_verbose: "⚙️ Progression des outils : **VERBOSE** — chaque appel d'outil avec ses arguments complets."
mode_log: "⚙️ Progression des outils : **LOG** — silencieux dans le chat ; les appels d'outils sont écrits dans ~/.hermes/logs/tool_calls.log."
saved_suffix: "_(enregistré pour **{platform}** — prend effet au prochain message)_"
save_failed: "_(impossible d'enregistrer dans la configuration : {error})_"
voice:
enabled_voice_only: "Mode vocal activé.\nJe répondrai en vocal quand vous envoyez des messages vocaux.\nUtilisez /voice tts pour obtenir des réponses vocales à tous les messages."
disabled_text: "Mode vocal désactivé. Réponses uniquement textuelles."
tts_enabled: "TTS automatique activé.\nToutes les réponses incluront un message vocal."
status_mode: "Mode vocal : {label}"
status_channel: "Canal vocal : #{channel}"
status_participants: "Participants : {count}"
status_member: " - {name}{status}"
speaking: " (parle)"
enabled_short: "Mode vocal activé."
disabled_short: "Mode vocal désactivé."
label_off: "Désactivé (texte seulement)"
label_voice_only: "Activé (réponse vocale aux messages vocaux)"
label_all: "TTS (réponse vocale à tous les messages)"
help: "{toggle}\n\n**Comment fonctionne /voice**\n• `/voice on` — réponse vocale quand vous envoyez un message vocal\n• `/voice tts` — réponse vocale à *chaque* message\n• `/voice off` — retour aux réponses texte uniquement\n• `/voice status` — afficher le mode actuel\n• `/voice` (sans argument) — bascule rapide entre activé et désactivé{channels}"
help_channels: "\n\n**Salons vocaux en direct (Discord)**\n• Rejoignez d'abord un salon vocal, puis `/voice channel` — je rejoins, j'écoute et je parle mes réponses\n• `/voice leave` — se déconnecter du salon vocal"
yolo:
disabled: "⚠️ Mode YOLO **DÉSACTIVÉ** pour cette session — les commandes dangereuses nécessiteront une approbation."
enabled: "⚡ Mode YOLO **ACTIVÉ** pour cette session — toutes les commandes sont auto-approuvées. À utiliser avec prudence."
shared:
session_db_unavailable: "Base de données de sessions indisponible."
session_db_unavailable_prefix: "Base de données de sessions indisponible"
session_not_found: "Session introuvable dans la base de données."
warn_passthrough: "⚠️ {error}"