Localisation
Introduction
La localisation vous permet de fournir votre application en plusieurs langues. Nylo Website v7 facilite la localisation du texte en utilisant des fichiers de langue JSON.
Voici un exemple rapide :
lang/en.json
{
"welcome": "Welcome",
"greeting": "Hello {{name}}"
}
Dans votre widget :
Text("welcome".tr()) // "Welcome"
Text("greeting".tr(arguments: {"name": "Anthony"})) // "Hello Anthony"
Configuration
La localisation est configuree dans lib/config/localization.dart :
final class LocalizationConfig {
// Default language code (matches your JSON file, e.g., 'en' for lang/en.json)
static final String languageCode =
getEnv('DEFAULT_LOCALE', defaultValue: "en");
// LocaleType.device - Use device's language setting
// LocaleType.asDefined - Use languageCode above
static final LocaleType localeType =
getEnv('LOCALE_TYPE', defaultValue: 'asDefined') == 'device'
? LocaleType.device
: LocaleType.asDefined;
// Directory containing language JSON files
static const String assetsDirectory = 'lang/';
// List of supported locales
static const List<Locale> supportedLocales = [
Locale('en'),
Locale('es'),
// Add more locales as needed
];
// Fallback when a key is not found in the active locale
static const String fallbackLanguageCode = 'en';
// RTL language codes
static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];
// Log warnings for missing translation keys
static final bool debugMissingKeys =
getEnv('DEBUG_TRANSLATIONS', defaultValue: 'false') == 'true';
}
Ajouter des fichiers localises
Ajoutez vos fichiers JSON de langue dans le repertoire lang/ :
lang/
├── en.json # English
├── es.json # Spanish
├── fr.json # French
└── ...
lang/en.json
{
"welcome": "Welcome",
"settings": "Settings",
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
lang/es.json
{
"welcome": "Bienvenido",
"settings": "Configuración",
"navigation": {
"home": "Inicio",
"profile": "Perfil"
}
}
Enregistrer dans pubspec.yaml
Assurez-vous que vos fichiers de langue sont inclus dans votre pubspec.yaml :
flutter:
assets:
- lang/
Localiser du texte
Utilisez l'extension .tr() ou le helper trans() pour traduire des chaines :
// Using the .tr() extension
"welcome".tr()
// Using the trans() helper
trans("welcome")
Cles imbriquees
Accedez aux cles JSON imbriquees en utilisant la notation par points :
lang/en.json
{
"navigation": {
"home": "Home",
"profile": "Profile"
}
}
"navigation.home".tr() // "Home"
trans("navigation.profile") // "Profile"
Arguments
Passez des valeurs dynamiques dans vos traductions en utilisant la syntaxe {{key}} :
lang/en.json
{
"greeting": "Hello {{name}}",
"items_count": "You have {{count}} items"
}
"greeting".tr(arguments: {"name": "Anthony"})
// "Hello Anthony"
trans("items_count", arguments: {"count": "5"})
// "You have 5 items"
Mettre a jour la locale
Changez la langue de l'application au moment de l'execution :
// Using NyLocalization directly
await NyLocalization.instance.setLanguage(
context,
language: 'es' // Must match your JSON filename (es.json)
);
Si votre widget etend NyPage, utilisez le helper changeLanguage :
class _SettingsPageState extends NyPage<SettingsPage> {
@override
Widget view(BuildContext context) {
return ListView(
children: [
ListTile(
title: Text("English"),
onTap: () => changeLanguage('en'),
),
ListTile(
title: Text("Español"),
onTap: () => changeLanguage('es'),
),
],
);
}
}
Definir une locale par defaut
Definissez la langue par defaut dans votre fichier .env :
DEFAULT_LOCALE="en"
Ou utilisez la locale de l'appareil en definissant :
LOCALE_TYPE="device"
Apres avoir modifie .env, regenerez votre configuration d'environnement :
metro make:env --force
Locales prises en charge
Definissez quelles locales votre application prend en charge dans LocalizationConfig :
static const List<Locale> supportedLocales = [
Locale('en'),
Locale('es'),
Locale('fr'),
Locale('de'),
Locale('ar'),
];
Cette liste est utilisee par MaterialApp.supportedLocales de Flutter.
Langue de secours
Lorsqu'une cle de traduction n'est pas trouvee dans la locale active, Nylo Website se rabat sur la langue specifiee :
static const String fallbackLanguageCode = 'en';
Cela garantit que votre application n'affiche jamais de cles brutes si une traduction est manquante.
Support RTL
Nylo Website v7 inclut un support integre pour les langues de droite a gauche (RTL) :
static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];
// Check if current language is RTL
if (LocalizationConfig.isRtl(currentLanguageCode)) {
// Handle RTL layout
}
Debugger les cles manquantes
Activez les avertissements pour les cles de traduction manquantes pendant le developpement :
Dans votre fichier .env :
DEBUG_TRANSLATIONS="true"
Cela journalise les avertissements lorsque .tr() ne trouve pas une cle, vous aidant a reperer les chaines non traduites.
API NyLocalization
NyLocalization est un singleton qui gere toute la localisation. Au-dela de la methode de base translate(), il fournit plusieurs methodes supplementaires :
Verifier si une traduction existe
bool exists = NyLocalization.instance.hasTranslation('welcome');
// true if the key exists in the current language file
// Also works with nested keys
bool nestedExists = NyLocalization.instance.hasTranslation('navigation.home');
Obtenir toutes les cles de traduction
Utile pour le debogage pour voir quelles cles sont chargees :
List<String> keys = NyLocalization.instance.getAllKeys();
// ['welcome', 'settings', 'navigation', ...]
Changer la locale sans redemarrage
Si vous souhaitez changer la locale silencieusement (sans redemarrer l'application) :
await NyLocalization.instance.setLocale(locale: Locale('fr'));
Cela charge le nouveau fichier de langue mais ne redemarre pas l'application. Utile lorsque vous souhaitez gerer les mises a jour de l'interface manuellement.
Verifier la direction RTL
bool isRtl = NyLocalization.instance.isDirectionRTL(context);
Acceder a la locale actuelle
// Get the current language code
String code = NyLocalization.instance.languageCode; // e.g., 'en'
// Get the current Locale object
Locale currentLocale = NyLocalization.instance.locale;
// Get Flutter localization delegates (used in MaterialApp)
var delegates = NyLocalization.instance.delegates;
Reference API complete
| Methode / Propriete | Retour | Description |
|---|---|---|
instance |
NyLocalization |
Instance singleton |
translate(key, [arguments]) |
String |
Traduire une cle avec des arguments optionnels |
hasTranslation(key) |
bool |
Verifier si une cle de traduction existe |
getAllKeys() |
List<String> |
Obtenir toutes les cles de traduction chargees |
setLanguage(context, {language, restart}) |
Future<void> |
Changer la langue, optionnellement redemarrer |
setLocale({locale}) |
Future<void> |
Changer la locale sans redemarrage |
setDebugMissingKeys(enabled) |
void |
Activer/desactiver la journalisation des cles manquantes |
isDirectionRTL(context) |
bool |
Verifier si la direction actuelle est RTL |
restart(context) |
void |
Redemarrer l'application |
languageCode |
String |
Code de langue actuel |
locale |
Locale |
Objet Locale actuel |
delegates |
Iterable<LocalizationsDelegate> |
Delegues de localisation Flutter |
NyLocaleHelper
NyLocaleHelper est une classe utilitaire statique pour les operations de locale. Elle fournit des methodes pour detecter la locale actuelle, verifier le support RTL et creer des objets Locale.
// Get the current system locale
Locale locale = NyLocaleHelper.getCurrentLocale(context: context);
// Get language and country codes
String langCode = NyLocaleHelper.getLanguageCode(context: context); // 'en'
String? countryCode = NyLocaleHelper.getCountryCode(context: context); // 'US' or null
// Check if current locale matches
bool isEnglish = NyLocaleHelper.matchesLocale(context, 'en');
bool isUsEnglish = NyLocaleHelper.matchesLocale(context, 'en', 'US');
// RTL detection
bool isRtl = NyLocaleHelper.isRtlLanguage('ar'); // true
bool currentIsRtl = NyLocaleHelper.isCurrentLocaleRtl(context: context);
// Get text direction
TextDirection direction = NyLocaleHelper.getTextDirection('ar'); // TextDirection.rtl
TextDirection currentDir = NyLocaleHelper.getCurrentTextDirection(context: context);
// Create a Locale from strings
Locale newLocale = NyLocaleHelper.toLocale('en', 'US');
Reference API complete
| Methode | Retour | Description |
|---|---|---|
getCurrentLocale({context}) |
Locale |
Obtenir la locale systeme actuelle |
getLanguageCode({context}) |
String |
Obtenir le code de langue actuel |
getCountryCode({context}) |
String? |
Obtenir le code pays actuel |
matchesLocale(context, languageCode, [countryCode]) |
bool |
Verifier si la locale actuelle correspond |
isRtlLanguage(languageCode) |
bool |
Verifier si un code de langue est RTL |
isCurrentLocaleRtl({context}) |
bool |
Verifier si la locale actuelle est RTL |
getTextDirection(languageCode) |
TextDirection |
Obtenir la TextDirection pour une langue |
getCurrentTextDirection({context}) |
TextDirection |
Obtenir la TextDirection pour la locale actuelle |
toLocale(languageCode, [countryCode]) |
Locale |
Creer une Locale a partir de chaines |
La constante rtlLanguages contient : ar, he, fa, ur, yi, ps, ku, sd, dv.
Changer la langue depuis un controleur
Si vous utilisez des controleurs avec vos pages, vous pouvez changer la langue depuis NyController :
class SettingsController extends NyController {
void switchToSpanish() {
changeLanguage('es');
}
void switchToEnglishNoRestart() {
changeLanguage('en', restartState: false);
}
}
Le parametre restartState controle si l'application redemarre apres le changement de langue. Definissez-le a false si vous souhaitez gerer la mise a jour de l'interface vous-meme.