Langues de l'interface
CapyCode est en anglais par défaut et se traduit dans d'autres langues, chargées à la demande. Aucun texte destiné à l'utilisateur n'est écrit en dur : composants, stores et services passent tous par t().
Langues disponibles
Anglais (référence), français, allemand, espagnol, italien, portugais (variante européenne), néerlandais, polonais, russe et ukrainien. Hors anglais et français, les dictionnaires sont des traductions automatiques : leur en-tête le signale, et ils sont à faire relire par des locuteurs natifs. Les commandes, options, noms de fichiers et termes techniques (commit, git, pip…) restent tels quels ; les sorties qui imitent un outil (git, shell) suivent la traduction usuelle de cet outil dans la langue.
Choix de la langue
Au démarrage (src/i18n/boot.ts, avant le premier rendu), dans cet ordre :
- le paramètre d'URL
?lang=fr(utile pour intégrer CapyCode dans une page ; il n'est pas retenu) ; - le choix enregistré de l'utilisateur (menu Affichage → Langue, palette de commandes) ;
- les langues du navigateur (
navigator.languages,fr-CA→fr) ; - l'anglais.
Changer de langue met à jour lang et dir sur <html> (lecteurs d'écran, langues écrites de droite à gauche).
Le module src/i18n/
| Fichier | Rôle |
|---|---|
index.ts | t(clé, paramètres), setLocale, formats (formatNumber, formatDate, formatList) ; sans dépendance à Vue |
locales.ts | Langues proposées (code, nom dans la langue, sens d'écriture) et détection |
messages/en.ts | Messages anglais : la référence, toujours chargée |
messages/<code>.ts | Une langue, de type Messages, chargée à la demande |
boot.ts | Langue au démarrage |
Le store i18n n'est qu'un adaptateur réactif. Il branche un traceur (setTranslationTracker) : chaque appel à t, même fait par un service, lit la langue réactive. Un template ou un computed qui traduit, directement ou par un service (getGitStatusTooltip…), est donc réévalué quand la langue change.
Un texte conservé dans un état (titre d'une console, ligne déjà affichée) a, lui, été traduit une fois pour toutes. Quand il doit suivre la langue, on garde un message différé (Message : { key, params }) et on le traduit à l'affichage (translate), comme les titres des consoles (consoleTitle). Les lignes déjà écrites dans un terminal restent dans leur langue, comme dans un vrai terminal.
Écrire un message
Les clés sont typées à partir de l'anglais : une clé inexistante est une erreur de compilation (
vue-tsc).Paramètres :
{name}dans le message,t('fileExplorer.deleteConfirm', { name }). Ne jamais assembler une phrase par concaténation : l'ordre des mots change selon les langues.Pluriels : un objet de formes, choisi selon le paramètre
count(règlesIntl.PluralRulesde la langue) :tsfilesImported: { one: '{count} file imported', other: '{count} files imported' },Une langue ajoute les formes dont elle a besoin (
zero,two,few,many).Dates et nombres :
formatDate,formatNumber,formatRelativeTime, jamaistoLocaleString('fr-FR').Les messages destinés aux développeurs (
console.error, erreurs internes) restent en anglais et ne passent pas part.
Ajouter une langue
- Créer
src/i18n/messages/<code>.ts(const xx: Messages = { … }), en partant deen.ts. - Ajouter la langue dans
LOCALES(src/i18n/locales.ts), avec son sens d'écriture.
tests/interface/i18n.spec.ts vérifie que chaque langue déclarée a son dictionnaire, avec toutes les clés de l'anglais, les mêmes paramètres, et les formes plurielles que sa langue utilise pour les nombres entiers (one, few, many, other en polonais, russe et ukrainien). Une nouvelle clé s'ajoute donc dans toutes les langues.