DEVLOPN Audit

Ton utilisateur français ouvre ton app, elle est en japonais — locale en Flutter

PlatformDispatcher.locale vs Localizations.localeOf — deux façons de récupérer la locale en Flutter, et l'ordre de supportedLocales qui tranche en silence.

Ton utilisateur français ouvre ton app. Elle est en japonais. Il n'a rien demandé.

En Flutter, deux façons de récupérer la locale, et tout le monde mélange les deux.

Langue du device — le piège de la locale entre la préférence système et ce que l'app affiche vraiment : PlatformDispatcher → fr, localeOf → ja

Les deux locales

PlatformDispatcher.instance.locale, c'est la langue brute du téléphone. Les réglages système. Elle se fiche de ce que ton app sait afficher.

Localizations.localeOf(context), c'est la langue que ton app utilise vraiment, après la résolution Flutter.

Le scénario surprise

Ton app supporte le japonais et l'anglais, pas le français. Le platform renvoie à ton user fr, sa vraie préférence. localeOf lui renvoie ja. 😯

Pourquoi le japonais et pas l'anglais ? Parce que par défaut, quand aucune langue ne matche, Flutter prend le premier de ta liste supportedLocales. Et dans la tienne, ja est avant en.

Personne ne décide « cet utilisateur aura du japonais ». C'est juste l'ordre de ta liste qui tranche, en silence.

// Device en "fr", app qui ne supporte pas le français
supportedLocales: [Locale('ja'), Locale('en')],
// fr non supporté -> ja (premier de la liste)

supportedLocales: [Locale('en'), Locale('ja')],
// fr non supporté -> en (déjà plus raisonnable)

À retenir

  • PlatformDispatcher.instance.locale = préférence système, jamais garantie affichable.
  • Localizations.localeOf(context) = ce que l'app affiche réellement.
  • Le premier élément de supportedLocales est votre langue de repli : choisissez-le consciemment.