Packs de langue Hermes : faire parler votre langue au CLI, au gateway et au Desktop

La moitié de votre équipe lit un terminal en anglais, l’autre moitié non : quelques prompts sont donc mal interprétés chaque semaine. L’un d’eux était une longue ligne d’approbation en anglais devant une commande dangereuse — survolée, puis validée avec la mauvaise touche. Un autre développeur a tenté de basculer l’interface dans sa propre langue avec hermes config set display.language pl et s’est vu répondre ✗ Unknown language 'pl'. Hermes embarque 17 langues d’interface, et le polonais, le coréen ou le portugais brésilien n’en font pas partie : aucune valeur de configuration ne peut les faire apparaître. Un pack de langue règle le problème : un plugin composé de fichiers YAML qui remplace le texte statique de l’interface — les prompts d’approbation du CLI, les réponses du gateway de messagerie, les verbes des outils, les astuces, l’interface hermes --tui et l’application Desktop — sans une seule ligne de code Python.
Hermes embarque 17 langues d’interface, mais la liste est extensible
L’ensemble fourni compte 17 langues, sélectionnables avec display.language. Leurs catalogues résident dans locales/ sous les identifiants af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh-hant et zh.
hermes config set display.language accepte tout identifiant qu’une des couches peut fournir. Un identifiant que personne ne reconnaît est refusé d’emblée, avec la liste des langues disponibles affichée en retour :
$ hermes config set display.language pl
✗ Unknown language 'pl' for display.language. Available: en, af, ar, de, es, ...
Install a language pack plugin (hermes plugins install <pack>) or drop <HERMES_HOME>/locales/<id>.yaml to add one.
Le message d’erreur nomme déjà les deux portes de sortie : installer un plugin de pack de langue, ou déposer votre propre fichier overlay. Un autre détail surprend ceux qui déboguent « je l’ai changé, pourquoi rien ne bouge » — HERMES_LANGUAGE dans .env prime toujours sur display.language.
Tout cela repose sur le travail de la v0.22.0 : la PR #126296 a fait passer chaque chaîne visible par l’utilisateur dans le CLI, le gateway de messagerie, le TUI et le Desktop par un seul catalogue de traduction — c’est ce qui donne à un pack un point d’accroche. La page de release v0.22.0 couvre la release elle-même.
Installer un pack en deux commandes
Un pack de langue s’installe comme n’importe quel autre plugin. Si Hermes n’est pas encore installé, commencez par le guide d’installation. Ensuite :
hermes plugins install hermes-lang-pt-br # un nom de catalogue, ou une URL de dépôt
hermes config set display.language pt-br
Deux packs ont rejoint le catalogue officiel le 14 octobre 2026 : hermes-lang-ko pour le coréen et hermes-lang-pt-br pour le portugais brésilien. La documentation détaille la commande hermes plugins install https://github.com/teknium1/hermes-lang-pl si vous voulez voir la forme d’un pack dans la nature. La découverte et l’installation fonctionnent exactement comme pour n’importe quel plugin, ce que le guide du catalogue de plugins explique de bout en bout.
Redémarrez tout gateway ou TUI en cours d’exécution après l’installation pour qu’il recharge le pack. Les sélecteurs de langue du TUI et du Desktop listent les langues fournies, vos propres langues overlay et chaque pack installé par leur nom natif — l’endonyme, comme Polski — plutôt que par leur code.
D’où vient réellement une chaîne d’interface
Quand Hermes cherche une chaîne, il parcourt ces couches, de haut en bas, et retient la première correspondance :
- Les packs de langue des plugins — tout plugin installé qui déclare
provides_locales(si deux packs couvrent la même clé, le dernier chargé l’emporte) - Votre overlay —
<HERMES_HOME>/locales/<lang>.yaml, par profile, donc un profile nommé utilise~/.hermes/profiles/<name>/locales/ - Les catalogues fournis — les fichiers
locales/<lang>.yamllivrés avec Hermes
Si aucune de ces trois couches ne contient la clé, les trois mêmes couches sont essayées pour l’anglais, et c’est seulement alors que la clé brute apparaît à l’écran. Chaque couche peut être partielle : un pack n’a besoin que des clés qu’il veut modifier, pas d’une copie complète du catalogue.
Écrire un pack sans écrire de Python
Rien de tout cela n’exige de code Python. Un pack minimal ressemble à ceci :
hermes-lang-pl/
plugin.yaml
locales/
pl.yaml # core: approval.*, gateway.*, cli.*, display.*, slash.*, tips.*, ...
pl.tui.yaml # optional: hermes --tui strings
pl.desktop.yaml # optional: Desktop app strings
Le manifeste déclare la langue que fournit le pack :
name: hermes-lang-pl
version: 1.0.0
description: Polish language pack for Hermes
provides_locales:
- id: pl # lowercase BCP-47-style tag: pl, pt-br, zh-hant
endonym: Polski # shown in the language switchers
rtl: false # true for right-to-left scripts; flips the Desktop layout
Les entrées provides_locales peuvent aussi être de simples identifiants (- pl), et l’endonyme prend alors la valeur de l’identifiant par défaut. Une fois ce bloc présent, le chargeur de plugins enregistre automatiquement chaque locales/<lang>[.tui|.desktop].yaml du pack : il ne reste plus rien à câbler.
Les plugins qui disposent déjà de code Python peuvent enregistrer leurs propres catalogues : ctx.register_locale("pl", path_or_mapping, endonym="Polski", rtl=False, surface="core"), où surface vaut core, tui ou desktop, ou bien ctx.register_locale_dir(dir) pour enregistrer tout un dossier d’un coup. L’enregistrement est annulé lorsque le plugin est déchargé, et il ne modifie jamais display.language.
Validez-le, et attention aux placeholders
Lancez le validateur avant de livrer :
hermes plugins validate ./hermes-lang-pl
Il vérifie que chaque identifiant déclaré possède un locales/<id>.yaml correspondant, que chaque fichier se parse, et que chaque valeur est du texte — un nombre, une liste, true/false ou une valeur vide constituent une erreur, pas un avertissement. Les clés qui n’existent pas dans le catalogue anglais pour cette surface ne produisent qu’un avertissement accompagné de la liste : elles sont inoffensives, mais elles ne font rien. Pendant la rédaction, évitez les mots réservés de YAML en guise de clés — on, off, yes et no.
Les placeholders sont le second piège. Les chaînes core (côté Python) utilisent des placeholders nommés : si la valeur anglaise contient {count}, la traduction doit conserver {count}. Omettez-le ou écrivez-le mal, et cette clé retombe silencieusement sur la chaîne non traduite. Les entrées TUI et Desktop dont la valeur anglaise prend des arguments utilisent en revanche des placeholders positionnels, {0} et {1}.
Remplacer une ligne sans créer de pack
Pour modifier une ou deux phrases, oubliez le plugin et déposez un fichier partiel dans votre home Hermes :
# ~/.hermes/locales/en.yaml — only the keys you want to change
approval:
denied: " ✗ Nope."
L’overlay ne s’applique qu’à ce profile (un profile nommé lit ~/.hermes/profiles/<name>/locales/). Les fichiers overlay d’une langue que Hermes ne fournit pas rendent aussi cette langue sélectionnable. Les modifications sont prises en compte au prochain démarrage, ou au prochain changement de display.language.
Ce qu’un pack de langue ne traduit pas
Tout ce qu’un pack touche est du texte d’interface statique : les prompts d’approbation du CLI, les réponses du gateway, les verbes des outils, les astuces, le TUI et l’application Desktop. Les réponses de l’agent, la sortie des outils, les logs et les noms des commandes slash ne sont pas traduits du tout. Si vous voulez que l’agent lui-même réponde dans une autre langue, dites-le dans votre prompt : c’est une chose distincte de la langue de l’interface.
Quand ça cloche malgré tout
Unknown language ... for display.languagesignifie que le pack n’est pas installé ou pas activé (hermes plugins listvous le dira), ou que l’identifiant deprovides_localesne correspond pas au nom de fichier — un id pl exigelocales/pl.yaml.- Une chaîne qui s’affiche encore en anglais signifie que cette clé n’est pas dans le catalogue anglais (le validateur les liste), ou que l’ensemble des placeholders diffère de la valeur anglaise.
- Une langue qui apparaît dans la liste alors que le TUI ou le Desktop reste en anglais signifie que le pack n’a pas de
.tui.yaml/.desktop.yaml; ces surfaces affichent l’anglais plus ce que fournit le pack.
D’autres articles sur la configuration et l’usage sont disponibles sur le blog.