Organisation conforme au RGPD
Organisation certifiée ISO 27001
Organisation conforme SOC II
Localisation Flutter : fichiers ARB, intl et gen-l10n expliqués
La localisation Flutter adapte les messages et l’interface d’une application à différentes locales. Dans le processus intégré, flutter_localizations prend en charge les widgets localisés du framework, tandis que les ressources ARB et gen-l10n génèrent l’API AppLocalizations de l’application, intl gérant les messages et le formatage sensibles à la langue.

Plus de 80 des plus grandes entreprises mondiales ont choisi Smartcat
Configurer flutter_localizations et gen-l10n
Ce guide met en place un petit exemple en anglais et en espagnol, explique les métadonnées des messages et compare les approches courantes basées sur des packages. Il indique aussi ce qu’il faut valider avant de connecter une plateforme de traduction à un projet Flutter.
Utilisez un seul générateur de localisation et rendez explicites ses emplacements d’entrée et de sortie. L’exemple ci-dessous suppose une application Flutter existante avec ses propres contraintes de SDK et une configuration de projet standard.
Fusionnez les entrées pertinentes dans pubspec.yaml ; ne dupliquez pas les sections dependencies ou flutter :
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: trueRésolvez les dépendances avec flutter pub get. L’entrée intl: any suit le modèle de configuration officiel et laisse la résolution des dépendances choisir la version compatible avec le SDK Flutter ; conservez le fichier de verrouillage de l’application et votre processus habituel de revue des dépendances.
Créez l10n.yaml à la racine du projet :
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartSuivez le guide d’internationalisation Flutter à jour pour la configuration propre au SDK. Dans le processus moderne, les fichiers de localisation générés se trouvent dans l’arborescence source de l’application. L’exemple importe depuis lib/l10n ; évitez de copier un ancien import synthétique package:flutter_gen dans une nouvelle configuration. Consultez la note de migration sur les sources générées.
Rédigez des fichiers ARB avec du contexte et des placeholders typés
Un fichier ARB est un bundle de ressources au format JSON qui contient des messages et des métadonnées facultatives. Gardez des clés de message stables, rédigez des messages complets et utilisez les métadonnées pour expliquer l’usage du texte.
Créez lib/l10n/app_en.arb :
{
"@@locale": "en",
"appTitle": "Reading room",
"@appTitle": {
"description": "Title of the sample reading application"
},
"welcomeName": "Welcome, {name}",
"@welcomeName": {
"description": "Greeting on the home screen",
"placeholders": {
"name": {"type": "String", "example": "Sam"}
}
},
"savedBooks": "{count, plural, =0{No saved books} one{1 saved book} other{{count} saved books}}",
"@savedBooks": {
"description": "Number of books saved to the user's library",
"placeholders": {
"count": {"type": "int"}
}
},
"readingState": "{state, select, active{Reading now} paused{Reading paused} other{Ready to read}}",
"@readingState": {
"description": "Reading status; state is active, paused or another value",
"placeholders": {
"state": {"type": "String"}
}
}
}Créez lib/l10n/app_es.arb :
{
"@@locale": "es",
"appTitle": "Sala de lectura",
"welcomeName": "Te damos la bienvenida, {name}",
"savedBooks": "{count, plural, =0{No hay libros guardados} one{1 libro guardado} other{{count} libros guardados}}",
"readingState": "{state, select, active{Leyendo ahora} paused{Lectura en pausa} other{Todo listo para leer}}"
}Le modèle contient les métadonnées de placeholders utilisées par le générateur. Le fichier localisé conserve les clés de message, les noms de placeholders et les identifiants de sélection tout en modifiant la formulation visible par l’utilisateur. Ces exemples en espagnol illustrent la mécanique ; en production, la langue doit faire l’objet d’une relecture native dans le contexte réel du produit.
Exécutez flutter gen-l10n après avoir ajouté ou modifié des ressources. Traitez les erreurs du générateur comme des problèmes de ressources à corriger et résolvez-les avant d’intégrer les fichiers à une version.
Connecter les messages générés à MaterialApp
Enregistrez les délégués générés et les locales prises en charge, puis lisez les messages localisés depuis un contexte situé sous le widget de l’application.
L’exemple suivant se place dans lib/main.dart après la génération :
import 'package:flutter/material.dart';
import 'l10n/app_localizations.dart';
void main() => runApp(const ReadingApp());
class ReadingApp extends StatelessWidget {
const ReadingApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const ReadingHome(),
);
}
}
class ReadingHome extends StatelessWidget {
const ReadingHome({super.key});
@override
Widget build(BuildContext context) {
final messages = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(messages.appTitle)),
body: Padding(
padding: const EdgeInsetsDirectional.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(messages.welcomeName('Sam')),
Text(messages.savedBooks(3)),
Text(messages.readingState('active')),
],
),
),
);
}
}ReadingHome a accès aux localisations fournies par MaterialApp. Demander AppLocalizations depuis le contexte du widget externe reviendrait à chercher au-dessus du fournisseur créé par ce widget. La documentation de l’API Localizations explique comment les ressources localisées sont mises à disposition des descendants.L’API générée rend visible dans le code la distinction entre un message simple et un message avec arguments. appTitle est accessible en tant que valeur ; welcomeName, savedBooks et readingState reçoivent les valeurs nécessaires pour construire leurs messages.
Gérez les pluriels et les messages select avec soin
Les messages au pluriel choisissent leur formulation selon une quantité et la grammaire de la locale cible. Les messages select choisissent une branche à partir d’un identifiant fourni par l’application. Préservez la syntaxe et les identifiants tout en traduisant le texte affiché par chaque branche.
Pluriels
Dans l’exemple, =0 fournit une phrase explicite pour l’état vide. Les branches one et other couvrent les formes utilisées par les langues de l’exemple ; elles ne constituent pas un modèle universel pour toutes les locales cibles. Donnez au relecteur suffisamment de contexte pour fournir les formes requises par la langue et les valeurs que votre application peut produire.
Messages select
Des valeurs comme active et paused sont des identifiants de programme. Les traduire déconnecterait la ressource du code qui les fournit. La branche other offre au message une valeur de repli lorsqu’une valeur ne correspond à aucune branche nommée.
Messages complets
Évitez de concaténer des fragments comme un verbe traduit, un nombre et un nom traduit. Un message complet laisse à la langue cible le contrôle de l’ordre des mots. Expliquez dans le brief les valeurs, les plages attendues et le contexte de l’écran pour que les relecteurs puissent évaluer la phrase telle que les utilisateurs la verront.
Comparer les packages de localisation Flutter
Choisissez un package selon le format des ressources, l’architecture de l’application et les besoins de maintenance. Les packages ci-dessous reposent sur des conventions différentes ; adopter plusieurs générateurs pour les mêmes messages crée une ambiguïté inutile.
| Approche | Ressources typiques | Génération de code | Gestion des pluriels | Utile quand |
|---|---|---|---|---|
| gen-l10n intégré | ARB | Génère des accesseurs Dart typés | Syntaxe de messages de type ICU | Vous voulez le processus de ressources officiel de Flutter |
| easy_localization | JSON par défaut, avec d’autres chargeurs disponibles | Outils de génération facultatifs | API de pluriel du package et règles adaptées à la locale | Vous préférez ses conventions de chargement des assets et de gestion des locales |
| Traductions GetX | Maps indexées par locale dans son processus de base documenté | Non requise pour l’API de base par maps | trPlural utilise des clés singulier/pluriel ; évaluez séparément les grammaires plus riches | Votre application utilise déjà GetX et son modèle de traduction répond à vos besoins |
Consultez la documentation d’easy_localization et la documentation de GetX à jour avant de choisir. Testez le comportement de repli, les paramètres, les catégories de pluriel et les processus d’extraction avec vos vrais messages. Une API pratique pour les chaînes anglaises ne garantit pas la prise en charge de toutes les langues que vous prévoyez de livrer.
intl n’est pas une plateforme concurrente de gestion des traductions. Il fournit des utilitaires d’internationalisation utilisés par les processus de localisation. gen-l10n génère des accesseurs applicatifs à partir des ressources ARB. Le package intl_utils, distinct, génère aussi du code de localisation, mais sa page était marquée comme abandonnée lors de notre vérification du 30 octobre 2026. Vérifiez son état de maintenance avant de l’adopter pour un nouveau projet.
Tester le changement de locale, le RTL et l’expansion du texte
Testez à la fois l’exactitude des ressources et le comportement du texte traduit dans l’interface. Une analyse JSON ou une génération de code réussie ne prouve pas qu’un écran est compréhensible et utilisable.
Changement de locale
Pour une vérification ciblée en développement, définissez MaterialApp.locale sur une valeur prise en charge comme const Locale('es'). Pour un sélecteur de langue en production, conservez la locale choisie dans l’état de l’application, persistez la préférence selon les exigences de votre produit et proposez un moyen de suivre la langue du système. Validez toute préférence enregistrée par rapport aux locales réellement prises en charge par la version actuelle de l’application.
Mises en page de droite à gauche
Utilisez des API de mise en page directionnelles pour les éléments qui doivent suivre le sens de lecture. Vérifiez les marges intérieures, l’alignement, les repères de navigation et le contenu bidirectionnel dans une vraie locale de droite à gauche. Ne supposez pas que chaque icône doit être inversée : une flèche de navigation directionnelle et un symbole de marque n’ont pas la même sémantique.
Expansion du texte
Testez les traductions longues et les grandes tailles de texte. Inspectez les boutons, onglets, boîtes de dialogue, états vides, erreurs et mises en page étroites. Incluez des valeurs dynamiques comme des noms longs et des nombres pour vérifier la mise en page avec le message que les utilisateurs recevront réellement.
Utilisez une matrice de test pratique :
| Vérification | Exemple |
|---|---|
| Couverture des ressources | Chaque clé requise du modèle possède une valeur localisée ou un repli voulu |
| Arguments des messages | Les noms et types de placeholders restent compatibles avec les méthodes générées |
| Comportement des quantités | Zéro, un et des valeurs sollicitant les formes supplémentaires de la langue cible |
| Comportement des select | États connus et une valeur inattendue qui atteint other |
| Comportement des locales | Langue du système, sélection explicite, redémarrage et préférence non prise en charge |
| Mise en page | Texte allongé, grandes tailles de police et contenu de droite à gauche |
| Sens | Relecture native des parcours utilisateur importants |
Pour la partie linguistique du processus, utilisez le processus de test de localisation. Conservez l’approbation linguistique et les résultats des tests fonctionnels comme deux preuves distinctes pour la mise en production.
Planifiez séparément la localisation web Flutter et la visibilité
Flutter web peut utiliser des ressources applicatives localisées, mais localiser l’interface ne crée pas automatiquement un site multilingue optimisé pour le SEO. La sélection de la langue, le routage, les métadonnées et la visibilité du contenu restent des choix d’architecture.
La FAQ web de Flutter décrit son orientation vers les expériences applicatives et recommande une approche orientée document pour le contenu web statique riche en texte. Envisagez des pages marketing, d’aide et éditoriales distinctes en HTML lorsque ces pages doivent performer dans la recherche organique.
Gardez une terminologie alignée entre l’application et ces pages publiques. Un visiteur venu de la recherche doit reconnaître le nom de la fonctionnalité en passant de la page d’atterrissage localisée à l’application, même si les deux surfaces utilisent des systèmes de rendu différents.
Validez un processus de traduction ARB avant de le déployer à grande échelle
Traitez l’ARB comme une ressource applicative structurée, et non comme un simple fichier de valeurs textuelles. Une livraison de traduction doit préserver les clés, les métadonnées, les placeholders et la syntaxe des messages, puis renvoyer des fichiers qui passent la génération et les tests de l’application.
Les formats de projet logiciel documentés par Smartcat incluent les imports JSON, YAML, Android XML, iOS .strings et LocJSON. La documentation consultée pour ce guide n’établit ni une prise en charge native de l’ARB, ni un processus de conversion ARB vers JSON testé. Ne supposez pas qu’un simple changement d’extension prouve la compatibilité. Consultez la documentation des projets logiciels.
Utilisez ce qui suit comme procédure de validation à proposer à votre équipe d’implémentation, et non comme une recette de connecteur déjà testée :
Choisir un échantillon représentatif
Sélectionnez un petit échantillon ARB contenant des chaînes simples, des métadonnées, des placeholders typés, des pluriels et des select.
Confirmer l’import et l’export
Confirmez avec l’équipe produit la méthode d’import/export prise en charge, y compris le traitement des métadonnées
@et des messages ICU.Fournir les ressources linguistiques et le contexte
Fournissez un glossaire, une mémoire de traduction le cas échéant et un contexte clair pour chaque message.
Traduire en protégeant la structure
Traduisez et relisez le texte visible par l’utilisateur tout en protégeant les identifiants de programme et la structure.
Comparer et restaurer
Comparez les ressources renvoyées au contrat source et replacez-les dans les chemins attendus du projet.
Générer et tester
Exécutez
flutter gen-l10n, l’analyse statique et les tests pertinents dans l’environnement SDK figé du projet.Relire et consigner
Relisez l’interface localisée et consignez la version source approuvée.
N’automatisez la synchronisation du dépôt qu’après la réussite de cet aller-retour. Définissez qui gère les modifications de la source, comment le statut de relecture est invalidé et comment les artefacts générés sont gérés. Conservez les ressources ARB sous contrôle de version comme source de vérité du processus applicatif.
Passer en revue votre processus de traduction Flutter
Erreurs courantes et premières vérifications
| Symptôme | Première vérification |
|---|---|
| L’import généré est introuvable | La génération s’est bien déroulée et l’import correspond au chemin de sortie configuré |
AppLocalizations.of(context) n’est pas disponible | Le contexte se trouve sous le fournisseur de localisation de l’application |
| Une méthode de message reçoit des arguments inattendus | Métadonnées de placeholders du modèle et API générée |
| Un select affiche toujours la valeur de repli | L’identifiant de l’application correspond exactement à la branche de la ressource |
| Une locale est manquante | Fichiers de ressources, locales prises en charge et configuration de résolution des locales |
| La traduction est cassée après l’export | Les clés, la validité JSON, les métadonnées et la syntaxe ICU ont survécu à l’aller-retour |
Corrigez le premier contrat rompu plutôt que de modifier à la main le Dart généré. Le code généré peut être régénéré ; une réparation manuelle à cet endroit risque de disparaître au prochain changement de ressources.
Questions fréquentes
Qu’est-ce qu’un fichier ARB dans Flutter ?
Un Application Resource Bundle est un fichier au format JSON contenant des messages localisés et des métadonnées facultatives. Le processus gen-l10n de Flutter utilise les ressources ARB pour générer une API de localisation Dart. Les métadonnées peuvent décrire le message et ses placeholders, ce qui donne aux développeurs et aux traducteurs un contrat plus clair pour chaque clé.
Quelle est la différence entre gen-l10n et intl_utils ?
Tous deux génèrent du code de localisation à partir de ressources ARB, mais ce sont des outils distincts, avec des conventions de configuration et de sortie différentes. gen-l10n fait partie du processus intégré de Flutter. La page du package intl_utils était marquée comme abandonnée lors de la vérification pour ce guide : vérifiez son état de maintenance avant de le choisir pour une nouvelle implémentation.
Comment traduire des fichiers ARB ?
Traduisez les messages visibles par l’utilisateur en préservant les clés stables, les identifiants de placeholders, les métadonnées et la structure de message requise. Utilisez un processus qui respecte ces exigences, puis lancez la génération et les tests de l’application sur les fichiers renvoyés. La relecture native doit évaluer le sens et le contexte en plus de la validité structurelle.
Smartcat prend-il en charge les placeholders et les pluriels ARB ?
La documentation des projets logiciels consultée ici n’établit ni une prise en charge native de l’ARB, ni un chemin de conversion testé qui préserve toutes les fonctionnalités ARB. Confirmez la méthode d’import/export avec l’équipe produit et validez un aller-retour représentatif avant l’adoption. La seule prise en charge du JSON générique ne prouve pas la compatibilité ARB.
La localisation Flutter fonctionne-t-elle sur le web ?
Les applications Flutter web peuvent utiliser des ressources localisées et la sélection de la locale. La visibilité dans les moteurs de recherche est une question distincte : le contenu marketing et d’aide public peut tirer parti d’une architecture HTML. Testez le routage, la sélection de la langue et les métadonnées de votre expérience web plutôt que de supposer que la configuration de localisation mobile suffit au SEO web.
Vous n’avez pas trouvé votre réponse ? Parlez à un spécialiste de la localisation
Rendez votre livraison de traduction aussi fiable que votre contrat de ressources
Apportez un petit échantillon ARB et les contrôles requis par votre build. Passez en revue le processus avant de l’étendre à toutes les langues et versions.