Chaque projet bilingue dont nous avons hérité présentait le même défaut : la seconde langue était en retard. Pas de façon catastrophique — un libellé de bouton ici, un message d’erreur non traduit là — mais systématiquement, car maintenir deux fichiers synchronisés est un problème de discipline, et la discipline cède sous la pression des délais.
La correction structurelle consiste à faire d’une langue la source du type, et de chaque autre langue une valeur qui doit le satisfaire.
// en.ts — the source of truth. Note: no `as const`.
export const en = {
nav: { home: 'Home', about: 'About' },
}
export type Dictionary = typeof en
// fr.ts — cannot compile until every key exists.
import type { Dictionary } from './en'
export const fr: Dictionary = {
nav: { home: 'Accueil', about: 'À propos' },
}Dès lors, une chaîne française manquante n’est plus un oubli de contenu découvert par un utilisateur : c’est un soulignement rouge dans l’éditeur et une compilation en échec dans l’intégration continue. La garantie passe de « nous pensons à traduire » à « il est impossible de livrer autrement ».