Basics

Lokalisierung

Einleitung

Lokalisierung ermöglicht es Ihnen, Ihre App in mehreren Sprachen bereitzustellen. Nylo Website v7 macht es einfach, Text mithilfe von JSON-Sprachdateien zu lokalisieren.

Hier ist ein kurzes Beispiel:

lang/en.json

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

In Ihrem Widget:

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

Konfiguration

Die Lokalisierung wird in lib/config/localization.dart konfiguriert:

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

Lokalisierte Dateien hinzufügen

Fügen Sie Ihre Sprach-JSON-Dateien zum Verzeichnis lang/ hinzu:

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"
  }
}

In pubspec.yaml registrieren

Stellen Sie sicher, dass Ihre Sprachdateien in Ihrer pubspec.yaml enthalten sind:

flutter:
  assets:
    - lang/

Text lokalisieren

Verwenden Sie die .tr()-Extension oder den trans()-Helfer, um Strings zu übersetzen:

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

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

Verschachtelte Schlüssel

Greifen Sie auf verschachtelte JSON-Schlüssel mit Punkt-Notation zu:

lang/en.json

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

Argumente

Übergeben Sie dynamische Werte in Ihre Übersetzungen mit der {{key}}-Syntax:

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"

Locale aktualisieren

Ändern Sie die Sprache der App zur Laufzeit:

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

Wenn Ihr Widget NyPage erweitert, verwenden Sie den changeLanguage-Helfer:

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'),
        ),
      ],
    );
  }
}

Standard-Locale festlegen

Legen Sie die Standardsprache in Ihrer .env-Datei fest:

DEFAULT_LOCALE="en"

Oder verwenden Sie die Geräte-Locale, indem Sie Folgendes einstellen:

LOCALE_TYPE="device"

Nach dem Ändern der .env generieren Sie Ihre Umgebungskonfiguration neu:

metro make:env --force

Unterstützte Locales

Definieren Sie, welche Locales Ihre App in LocalizationConfig unterstützt:

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

Diese Liste wird von Flutters MaterialApp.supportedLocales verwendet.

Fallback-Sprache

Wenn ein Übersetzungsschlüssel in der aktiven Locale nicht gefunden wird, fällt Nylo Website auf die angegebene Sprache zurück:

static const String fallbackLanguageCode = 'en';

Dies stellt sicher, dass Ihre App niemals rohe Schlüssel anzeigt, wenn eine Übersetzung fehlt.

RTL-Unterstützung

Nylo Website v7 enthält integrierte Unterstützung für Rechts-nach-Links-Sprachen (RTL):

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

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

Fehlende Schlüssel debuggen

Aktivieren Sie Warnungen für fehlende Übersetzungsschlüssel während der Entwicklung:

In Ihrer .env-Datei:

DEBUG_TRANSLATIONS="true"

Dies protokolliert Warnungen, wenn .tr() einen Schlüssel nicht finden kann, und hilft Ihnen, nicht übersetzte Strings zu erkennen.

NyLocalization-API

NyLocalization ist ein Singleton, das die gesamte Lokalisierung verwaltet. Neben der grundlegenden translate()-Methode bietet es mehrere zusätzliche Methoden:

Prüfen, ob eine Übersetzung existiert

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

Alle Übersetzungsschlüssel abrufen

Nützlich zum Debuggen, um zu sehen, welche Schlüssel geladen sind:

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

Locale ohne Neustart ändern

Wenn Sie die Locale stillschweigend ändern möchten (ohne die App neu zu starten):

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

Dies lädt die neue Sprachdatei, startet die App aber nicht neu. Nützlich, wenn Sie UI-Updates manuell handhaben möchten.

RTL-Richtung prüfen

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

Aktuelle Locale abrufen

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

Vollständige API-Referenz

Methode / Eigenschaft Rückgabewert Beschreibung
instance NyLocalization Singleton-Instanz
translate(key, [arguments]) String Einen Schlüssel mit optionalen Argumenten übersetzen
hasTranslation(key) bool Prüfen, ob ein Übersetzungsschlüssel existiert
getAllKeys() List<String> Alle geladenen Übersetzungsschlüssel abrufen
setLanguage(context, {language, restart}) Future<void> Sprache ändern, optional neu starten
setLocale({locale}) Future<void> Locale ohne Neustart ändern
setDebugMissingKeys(enabled) void Protokollierung fehlender Schlüssel aktivieren/deaktivieren
isDirectionRTL(context) bool Prüfen, ob die aktuelle Richtung RTL ist
restart(context) void Die App neu starten
languageCode String Aktueller Sprachcode
locale Locale Aktuelles Locale-Objekt
delegates Iterable<LocalizationsDelegate> Flutter-Lokalisierungs-Delegates

NyLocaleHelper

NyLocaleHelper ist eine statische Hilfsklasse für Locale-Operationen. Sie bietet Methoden zur Erkennung der aktuellen Locale, zur Prüfung der RTL-Unterstützung und zur Erstellung von Locale-Objekten.

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

Vollständige API-Referenz

Methode Rückgabewert Beschreibung
getCurrentLocale({context}) Locale Aktuelle System-Locale abrufen
getLanguageCode({context}) String Aktuellen Sprachcode abrufen
getCountryCode({context}) String? Aktuellen Ländercode abrufen
matchesLocale(context, languageCode, [countryCode]) bool Prüfen, ob aktuelle Locale übereinstimmt
isRtlLanguage(languageCode) bool Prüfen, ob ein Sprachcode RTL ist
isCurrentLocaleRtl({context}) bool Prüfen, ob aktuelle Locale RTL ist
getTextDirection(languageCode) TextDirection TextDirection für eine Sprache abrufen
getCurrentTextDirection({context}) TextDirection TextDirection für aktuelle Locale abrufen
toLocale(languageCode, [countryCode]) Locale Locale aus Strings erstellen

Die Konstante rtlLanguages enthält: ar, he, fa, ur, yi, ps, ku, sd, dv.

Sprache über einen Controller ändern

Wenn Sie Controller mit Ihren Seiten verwenden, können Sie die Sprache über NyController ändern:

class SettingsController extends NyController {

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

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

Der Parameter restartState steuert, ob die App nach dem Sprachwechsel neu gestartet wird. Setzen Sie ihn auf false, wenn Sie das UI-Update selbst handhaben möchten.