Internationalisation
Toutes les chaînes que l'éditeur met à l'écran passent par un dictionnaire. Les valeurs par défaut sont en anglais, et le français est un pack comme un autre : une bibliothèque dont les défauts sont la langue d'une équipe est une bibliothèque que tous les autres doivent traduire avant de pouvoir lire leur propre écran. Carnet demande fr.
Cinq langues livrées
en, fr, es, it et de, chacune un dictionnaire complet plutôt qu'un correctif par-dessus une autre — un dictionnaire partiel retombe en silence sur une langue que le lecteur ne parle peut-être pas. Rien n'est chargé qui ne soit importé.
import { fr, labelsFor, LOCALE_NAMES } from '@nbe/dom';
new EditorView(el, editor, { labels: fr });
// ou depuis un réglage système : 'fr-CA' et 'de-AT' donnent la langue
new EditorView(el, editor, { labels: labelsFor(navigator.language) });
// pour un sélecteur : { en: 'English', fr: 'Français', … }
Object.entries(LOCALE_NAMES);Surcharge partielle
Un sous-ensemble suffit : il est fusionné par-dessus les défauts.
import { EditorView } from '@nbe/dom';
new EditorView(el, editor, {
labels: {
bold: 'Bold',
italic: 'Italic',
delete: 'Delete',
emptyParagraph: 'Write something…',
},
});Dictionnaire complet
En typant votre dictionnaire EditorLabels, TypeScript signale toute clé oubliée — c'est ce qui rend une traduction vérifiable plutôt qu'approximative.
// en.ts — un dictionnaire complet
import type { EditorLabels } from '@nbe/dom';
export const en: EditorLabels = {
duplicate: 'Duplicate',
delete: 'Delete',
// … TypeScript signale toute clé manquante
};
new EditorView(el, editor, { labels: en });Interpolation
Deux libellés prennent une valeur : rowN etcolumnN. Ils utilisent des marqueurs nommés{n}, pas positionnels, pour qu'une traduction puisse les déplacer ou les retirer.
import { format } from '@nbe/dom';
format('Ligne {n}', { n: 2 }); // 'Ligne 2'
format('Row {n}', { n: 2 }); // 'Row 2'
format('Zeile', { n: 2 }); // 'Zeile' — un placeholder retiré ne casse rienCe n'est délibérément pas un formateur ICU. L'éditeur a exactement deux chaînes interpolées, toutes deux prenant un nombre nu. Une bibliothèque de formatage pour deux chaînes est une dépendance qui ne rapporte rien ; le jour où des pluriels ou des genres apparaissent, il faudra la remplacer en bloc plutôt que faire grossir celle-ci.
Ce qui empêche la régression
Un dictionnaire que personne ne consulte est du code mort, et une base de code qui recommence à écrire des chaînes en dur défait le travail un commit à la fois. Un test parcourt donc les sources de l'éditeur etéchoue sur tout littéral accentué dans un module qui affiche quelque chose. C'est ce test, plus que le dictionnaire, qui rend l'internationalisation durable.
Hors périmètre, et pourquoi
- Les mots-clés de recherche d'emoji du sélecteur d'icônes. Ce ne sont pas des libellés mais des synonymes de recherche : une autre nature de localisation, avec une autre forme de donnée. Les mettre dans le dictionnaire d'interface aurait été une erreur de modèle.
- La direction du texte. L'éditeur n'a pas encore été exercé en écriture droite-à-gauche ; la mise en page utilise déjà des propriétés logiques par endroits, mais ce n'est ni complet ni testé, et annoncer un support RTL serait malhonnête.
- Le formatage des dates et des nombres dans les bases de données, qui utilise aujourd'hui les entrées natives du navigateur et suit donc déjà la locale du système.
Toutes les clés
Rien de documenté ici pour l'instant.