7. Internationalisation
7.1. Exemple 21 : une application en deux langues
Une application en deux langues a trois sortes de textes à traduire :
- les textes de l'application : ses libellés, ses messages. On les range dans des dictionnaires, un par langue ;
- les dates et les montants : le paquet [intl] (cf. exemple 09), dans la langue courante ;
- les textes de [Flutter] lui-même : les boutons de ses fenêtres, les jours et les mois de son calendrier. Le paquet [flutter_localizations] les fournit.
7.1.1. Les dictionnaires
Chaque texte a une clé (« ACCUEIL.BONJOUR »). Les paramètres s'écrivent [{{nom}}] ; un texte au pluriel a plusieurs clés, [_zero], [_one], [_other]. Ce sont les conventions de la bibliothèque [JavaScript] [i18next], utilisée par les clients [React] et [Vue.js] de [RdvMedecins] : l'étude de cas reprendra leurs dictionnaires tels quels. Le dictionnaire anglais a les mêmes clés :
7.1.2. Les traductions
- lignes 30-34 : les traductions : un [ChangeNotifier] (les écrans seront reconstruits quand la langue change), qui garde la langue courante et son dictionnaire ;
- lignes 42-45 : la langue de départ : celle mémorisée sur l'appareil, sinon celle du téléphone (si elle est connue), sinon le français ;
- lignes 48-54 : changer de langue : charger le dictionnaire, un fichier JSON livré avec l'application ([rootBundle.loadString] lit un fichier de la section [assets] du [pubspec.yaml]), le décoder ([jsonDecode]), mémoriser le choix, prévenir les écrans ;
- lignes 58-63 : chercher une clé « ACCUEIL.BONJOUR » dans le dictionnaire : on descend, partie par partie, dans les objets JSON imbriqués. [noeud is Map<String, Object?> ? ... : null] : un test de type, qui « promeut » la variable dans la branche où il est vrai ;
- lignes 66-83 : la traduction. Pour un pluriel (un paramètre [count] entier), [Intl.pluralLogic] choisit la forme selon les règles de la langue : en français, 0 et 1 sont au singulier ; en anglais, seulement 1. Une clé inconnue s'affiche telle quelle : on voit tout de suite ce qui manque. Enfin, chaque [{{nom}}] est remplacé par la valeur du paramètre.
Pourquoi pas l'outil officiel de [Flutter] ? [Flutter] propose un générateur ([flutter gen-l10n]) qui fabrique, à partir de fichiers [.arb], une classe avec une méthode par texte ([AppLocalizations.of(context).bonjour('Marie')]) : les clés sont vérifiées à la compilation. C'est la meilleure solution pour une application dont tous les textes sont connus d'avance. Mais notre serveur renvoie des clés (« ERRORS.LOGIN_TAKEN ») qu'il faut traduire à l'exécution : un dictionnaire, qu'on interroge par la clé, s'y prête beaucoup mieux, et nous permet de partager les dictionnaires des autres clients.
7.1.3. La page traduite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | |
- lignes 30-31 : une extension de [BuildContext] (cf. exemple 09) : [context.t('CLE')] lit les traductions fournies plus haut, s'abonne à leurs changements, et traduit ;
- lignes 36-38 : le démarrage : les noms des jours et des mois de toutes les langues, puis les traductions ;
- ligne 39 : [ChangeNotifierProvider.value] fournit un objet DÉJÀ créé (par [main]) ;
- ligne 50 : le titre de l'application, traduit ;
- lignes 52-54 : la langue de [Flutter] lui-même suit celle de l'application ;
- lignes 76-77 : la date et le prix, mis en forme dans la langue courante, puis passés en paramètres aux textes ;
- lignes 86-90 : le choix de la langue, dans la barre du haut ;
- ligne 110 : [count] choisit la forme du pluriel, et remplace [{{count}}] ;
- lignes 124-128 : le calendrier de [Flutter] : ses textes suivent la langue de [MaterialApp] ;
- lignes 144-146 : ce que renverrait le serveur [RdvMedecins] : une clé, et ses paramètres. La clé du serveur EST une clé du dictionnaire.
En français (à gauche) ; en anglais, après un ajout (au milieu) ; le calendrier, en anglais (à droite) :
![]() | ![]() | ![]() |
Changer de langue retraduit tout l'écran, sans redémarrer ni rien demander au serveur. La langue choisie est mémorisée sur l'appareil.


