Basics

Localizzazione

Introduzione

La localizzazione ti permette di fornire la tua app in più lingue. Nylo Website v7 rende facile localizzare il testo utilizzando file JSON di lingua.

Ecco un esempio rapido:

lang/en.json

{
  "welcome": "Welcome",
  "greeting": "Hello {{name}}"
}

Nel tuo widget:

Text("welcome".tr())              // "Welcome"
Text("greeting".tr(arguments: {"name": "Anthony"}))  // "Hello Anthony"

Configurazione

La localizzazione è configurata in 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';
}

Aggiungere File Localizzati

Aggiungi i tuoi file JSON di lingua alla directory 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"
  }
}

Registrazione nel pubspec.yaml

Assicurati che i tuoi file di lingua siano inclusi nel tuo pubspec.yaml:

flutter:
  assets:
    - lang/

Localizzare il Testo

Usa l'estensione .tr() o l'helper trans() per tradurre le stringhe:

// Using the .tr() extension
"welcome".tr()

// Using the trans() helper
trans("welcome")

Chiavi Annidate

Accedi alle chiavi JSON annidate utilizzando la notazione a punto:

lang/en.json

{
  "navigation": {
    "home": "Home",
    "profile": "Profile"
  }
}
"navigation.home".tr()       // "Home"
trans("navigation.profile")  // "Profile"

Argomenti

Passa valori dinamici nelle tue traduzioni utilizzando la sintassi {{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"

Aggiornare la Lingua

Cambia la lingua dell'app in fase di esecuzione:

// Using NyLocalization directly
await NyLocalization.instance.setLanguage(
  context,
  language: 'es'  // Must match your JSON filename (es.json)
);

Se il tuo widget estende NyPage, usa l'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'),
        ),
      ],
    );
  }
}

Impostare una Lingua Predefinita

Imposta la lingua predefinita nel tuo file .env:

DEFAULT_LOCALE="en"

Oppure usa la lingua del dispositivo impostando:

LOCALE_TYPE="device"

Dopo aver modificato .env, rigenera la configurazione dell'ambiente:

metro make:env --force

Lingue Supportate

Definisci quali lingue supporta la tua app in LocalizationConfig:

static const List<Locale> supportedLocales = [
  Locale('en'),
  Locale('es'),
  Locale('fr'),
  Locale('de'),
  Locale('ar'),
];

Questa lista viene utilizzata da MaterialApp.supportedLocales di Flutter.

Lingua di Fallback

Quando una chiave di traduzione non viene trovata nella lingua attiva, Nylo Website ricorre alla lingua specificata:

static const String fallbackLanguageCode = 'en';

Questo assicura che la tua app non mostri mai chiavi grezze se una traduzione manca.

Supporto RTL

Nylo Website v7 include il supporto integrato per le lingue da destra a sinistra (RTL):

static const List<String> rtlLanguages = ['ar', 'he', 'fa', 'ur'];

// Check if current language is RTL
if (LocalizationConfig.isRtl(currentLanguageCode)) {
  // Handle RTL layout
}

Debug Chiavi Mancanti

Abilita gli avvisi per le chiavi di traduzione mancanti durante lo sviluppo:

Nel tuo file .env:

DEBUG_TRANSLATIONS="true"

Questo registra avvisi quando .tr() non riesce a trovare una chiave, aiutandoti a individuare stringhe non tradotte.

API NyLocalization

NyLocalization è un singleton che gestisce tutta la localizzazione. Oltre al metodo base translate(), fornisce diversi metodi aggiuntivi:

Verificare se una Traduzione Esiste

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');

Ottenere Tutte le Chiavi di Traduzione

Utile per il debug per vedere quali chiavi sono caricate:

List<String> keys = NyLocalization.instance.getAllKeys();
// ['welcome', 'settings', 'navigation', ...]

Cambiare Lingua Senza Riavvio

Se vuoi cambiare la lingua silenziosamente (senza riavviare l'app):

await NyLocalization.instance.setLocale(locale: Locale('fr'));

Questo carica il nuovo file di lingua ma non riavvia l'app. Utile quando vuoi gestire gli aggiornamenti dell'interfaccia manualmente.

Verificare la Direzione RTL

bool isRtl = NyLocalization.instance.isDirectionRTL(context);

Accedere alla Lingua Corrente

// 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;

Riferimento Completo dell'API

Metodo / Proprietà Restituisce Descrizione
instance NyLocalization Istanza singleton
translate(key, [arguments]) String Traduce una chiave con argomenti opzionali
hasTranslation(key) bool Verifica se una chiave di traduzione esiste
getAllKeys() List<String> Ottiene tutte le chiavi di traduzione caricate
setLanguage(context, {language, restart}) Future<void> Cambia lingua, opzionalmente riavvia
setLocale({locale}) Future<void> Cambia lingua senza riavvio
setDebugMissingKeys(enabled) void Abilita/disabilita il log delle chiavi mancanti
isDirectionRTL(context) bool Verifica se la direzione corrente è RTL
restart(context) void Riavvia l'app
languageCode String Codice lingua corrente
locale Locale Oggetto Locale corrente
delegates Iterable<LocalizationsDelegate> Delegati di localizzazione Flutter

NyLocaleHelper

NyLocaleHelper è una classe utility statica per le operazioni sulle lingue. Fornisce metodi per rilevare la lingua corrente, verificare il supporto RTL e creare oggetti 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');

Riferimento Completo dell'API

Metodo Restituisce Descrizione
getCurrentLocale({context}) Locale Ottiene la lingua di sistema corrente
getLanguageCode({context}) String Ottiene il codice lingua corrente
getCountryCode({context}) String? Ottiene il codice paese corrente
matchesLocale(context, languageCode, [countryCode]) bool Verifica se la lingua corrente corrisponde
isRtlLanguage(languageCode) bool Verifica se un codice lingua è RTL
isCurrentLocaleRtl({context}) bool Verifica se la lingua corrente è RTL
getTextDirection(languageCode) TextDirection Ottiene la TextDirection per una lingua
getCurrentTextDirection({context}) TextDirection Ottiene la TextDirection per la lingua corrente
toLocale(languageCode, [countryCode]) Locale Crea un Locale da stringhe

La costante rtlLanguages contiene: ar, he, fa, ur, yi, ps, ku, sd, dv.

Cambiare Lingua da un Controller

Se utilizzi controller con le tue pagine, puoi cambiare la lingua da NyController:

class SettingsController extends NyController {

  void switchToSpanish() {
    changeLanguage('es');
  }

  void switchToEnglishNoRestart() {
    changeLanguage('en', restartState: false);
  }
}

Il parametro restartState controlla se l'app si riavvia dopo aver cambiato la lingua. Impostalo su false se vuoi gestire l'aggiornamento dell'interfaccia da solo.