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.