feat(i18n): translate public pages, remaining hardcoded texts and API errors #177

Merged
asventi merged 7 commits from feature/public-pages-language into develop 2026-10-30 16:48:30 +00:00
Owner

Traduction de l'interface en en / fr / tc, pages publiques comprises, et des erreurs attendues renvoyées par l'API.

Pages publiques (connexion, inscription, confidentialité, CGU)

  • Langue mémorisée en local dans le localStorage, sans appel API, puisque l'utilisateur n'est pas connecté. À la première visite, elle est détectée depuis le navigateur (fr*, zh*, sinon anglais).
  • Sélecteur de langue (LanguageSwitcher) sur /login, /register, /privacy et /terms.
  • Après connexion, le dashboard applique toujours la langue du profil, qui devient la langue mémorisée.

Textes en dur

  • Toute la partie Messages privés / amis (src/friends) : onglets, listes, états vides, modales Ajouter un ami / Nouvelle conversation / Renommer, confirmations, widgets de l'accueil, avec les pluriels.
  • Infobulles Ajouter / Retirer un ami (liste des membres, carte de profil), « Paramètres », libellés de l'assistant, « Message d'origine supprimé », « Aucun rôle à afficher », « Jamais » / « Illimité » des invitations.
  • events.liveNow manquait en tc. Correction de « Messages privée » en « Messages privés ».

Dates

Les dates (calendrier, messages, événements, fichiers récents, invitations) suivent la langue de l'application et non plus celle du navigateur.

Erreurs attendues de l'API

  • Les erreurs métier sont traduites par leur errorCode (les 60 codes du backend), dans APIError : toasts, alertes et formulaires en profitent sans autre changement. Les valeurs utiles du détail (nom déjà pris, nombre de participants…) sont reprises dans le message traduit.
  • Les messages de validation .NET (requis, longueur, e-mail, regex, plage, pseudo, caractère NUL) sont traduits sous chaque champ.
  • Inscription : erreurs traduites (invitation invalide, champs). Connexion : « identifiant ou mot de passe invalide » seulement pour INVALID_AUTH, les autres échecs ne sont plus masqués.

Vérifications

Testé dans les devcontainers : pages publiques et messages privés en FR / 汉语, calendrier en français, erreurs réelles du backend (nom de canal pris, validation, invitation invalide, mauvais mot de passe, ressource introuvable) traduites, pluriels en/fr/tc. Toutes les clés existent dans les 3 langues et tous les errorCode ont une traduction. Lint et tsc OK.

Pas traduits volontairement : les noms de marque (Keep Grouped, Keepy), les noms des langues, les clés de champs de formulaire, et l'écran de chargement, pré-rendu en HTML avant le chargement du JS.

Partie de #160. Restent hors de cette PR : la description inexacte du modal d'invitation, la troncature du champ date et les libellés tronqués de l'accueil en FR.

Traduction de l'interface en en / fr / tc, pages publiques comprises, et des erreurs attendues renvoyées par l'API. ## Pages publiques (connexion, inscription, confidentialité, CGU) - **Langue mémorisée en local** dans le `localStorage`, sans appel API, puisque l'utilisateur n'est pas connecté. À la première visite, elle est détectée depuis le navigateur (`fr*`, `zh*`, sinon anglais). - **Sélecteur de langue** (`LanguageSwitcher`) sur `/login`, `/register`, `/privacy` et `/terms`. - Après connexion, le dashboard applique toujours la langue du profil, qui devient la langue mémorisée. ## Textes en dur - Toute la partie **Messages privés / amis** (`src/friends`) : onglets, listes, états vides, modales Ajouter un ami / Nouvelle conversation / Renommer, confirmations, widgets de l'accueil, avec les pluriels. - Infobulles Ajouter / Retirer un ami (liste des membres, carte de profil), « Paramètres », libellés de l'assistant, « Message d'origine supprimé », « Aucun rôle à afficher », « Jamais » / « Illimité » des invitations. - `events.liveNow` manquait en tc. Correction de « Messages privée » en « Messages privés ». ## Dates Les dates (calendrier, messages, événements, fichiers récents, invitations) suivent la langue de l'application et non plus celle du navigateur. ## Erreurs attendues de l'API - Les erreurs métier sont traduites par leur `errorCode` (les 60 codes du backend), dans `APIError` : toasts, alertes et formulaires en profitent sans autre changement. Les valeurs utiles du détail (nom déjà pris, nombre de participants…) sont reprises dans le message traduit. - Les messages de validation .NET (requis, longueur, e-mail, regex, plage, pseudo, caractère NUL) sont traduits sous chaque champ. - Inscription : erreurs traduites (invitation invalide, champs). Connexion : « identifiant ou mot de passe invalide » seulement pour `INVALID_AUTH`, les autres échecs ne sont plus masqués. ## Vérifications Testé dans les devcontainers : pages publiques et messages privés en FR / 汉语, calendrier en français, erreurs réelles du backend (nom de canal pris, validation, invitation invalide, mauvais mot de passe, ressource introuvable) traduites, pluriels en/fr/tc. Toutes les clés existent dans les 3 langues et tous les `errorCode` ont une traduction. Lint et `tsc` OK. Pas traduits volontairement : les noms de marque (Keep Grouped, Keepy), les noms des langues, les clés de champs de formulaire, et l'écran de chargement, pré-rendu en HTML avant le chargement du JS. Partie de #160. Restent hors de cette PR : la description inexacte du modal d'invitation, la troncature du champ date et les libellés tronqués de l'accueil en FR.
feat: add a language switcher to the login, register and legal pages
All checks were successful
VPS Deploy / build-and-push (pull_request) Successful in 17s
VPS Deploy / deploy (pull_request) Successful in 26s
9709c038c9
fix: remove comment
All checks were successful
VPS Deploy / build-and-push (pull_request) Successful in 17s
VPS Deploy / deploy (pull_request) Successful in 26s
f401ed88a4
asventi changed title from feat(i18n): translate the public pages with a locally saved language to feat(i18n): translate public pages, remaining hardcoded texts and API errors 2026-10-30 16:40:24 +00:00
asventi merged commit 772d115b2c into develop 2026-10-30 16:48:30 +00:00
asventi deleted branch feature/public-pages-language 2026-10-30 16:48:30 +00:00
Sign in to join this conversation.
No description provided.