Internationalisation (i18n)
L'application est internationalisée avec vue-i18n (mode Composition, legacy: false). Règle de base : aucun texte visible n'est en dur dans un composant — tout passe par t().
Langues
Français (par défaut et locale de référence), allemand, anglais. La liste SUPPORTED_LANGUAGES (src/i18n/index.ts) reprend celle du dépôt d'inspiration (.lovable-ref/src/i18n) sous la forme { code, label, short }.
Catalogues
Les traductions vivent dans src/i18n/locales/{fr,de,en}.ts. fr.ts est la forme de référence ; de.ts et en.ts sont typés Translations (typeof fr), donc toute clé manquante ou en trop échoue au vue-tsc. Les clés reprennent exactement celles de la référence pour que les futurs portages d'écrans s'alignent sans renommage.
index.ts augmente DefineLocaleMessage, ce qui type les clés passées à t().
Le catalogue validation.* regroupe les messages des règles de validation de formulaire (required, email, minLength avec interpolation {min}), consommés par Regle — voir Validation de formulaires.
Détection et persistance
resolveInitialLanguage() choisit la langue au démarrage : choix persisté d'abord (clé localStorage rdt_lang, partagée avec la référence), puis préférences du navigateur (sous-balise principale, ex. fr-CH → fr), enfin la langue par défaut. persistLanguage() enregistre le choix. L'ordre localStorage → navigateur reproduit celui de la référence.
Sur les pages invitées (routes guestPage : connexion, invitation, mots de passe), un paramètre ?lang valide prime sur tout le reste : la garde de langue du routeur l'applique puis le persiste avant le premier rendu (le montage attend router.isReady()), sans modifier resolveInitialLanguage(). Priorité effective sur ces pages : ?lang → localStorage → navigateur → défaut. Voir Routage & gardes pour la mécanique (application, injection, valeurs invalides).
Points d'entrée
i18n— l'instance branchée dansmain.ts.createAppI18n(locale?)— fabrique une instance neuve (utile pour isoler les tests).src/components/LocaleSwitcher.vue— sélecteur FR / DE / EN : change la locale globale et persiste le choix ; sur une routeguestPage, synchronise aussi?langdans l'URL viarouter.replace(URL partageable, langue préservée par les redirections du flux invité).
Le skill inspiration-to-vue détaille comment extraire la copie traduite depuis les catalogues de la référence lors d'un portage d'écran.

