Feature: Add support for localization, introduce slang for translations, and integrate German and English locale support throughout the app
This commit is contained in:
@@ -1,44 +1,74 @@
|
||||
import 'package:app/core/i18n/translations.g.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:fluttery/fluttery.dart';
|
||||
import 'package:fluttery/preferences.dart';
|
||||
|
||||
class LocaleController extends ChangeNotifier {
|
||||
final Preferences _prefs;
|
||||
|
||||
LocaleController() : _prefs = App.service<Preferences>();
|
||||
final Preferences _prefs = App.service<Preferences>();
|
||||
|
||||
static const _key = 'language';
|
||||
LanguagePref _current = LanguagePref.system;
|
||||
|
||||
LanguagePref _current = LanguagePref.en; // Default = Englisch
|
||||
|
||||
/// Einmal beim App-Start aufrufen
|
||||
Future<void> init() async {
|
||||
final saved = await _prefs.getString(_key);
|
||||
_current = switch (saved) {
|
||||
'de' => LanguagePref.de,
|
||||
'system' => LanguagePref.system,
|
||||
'en' || _ => LanguagePref.en, // default fallback = en
|
||||
};
|
||||
_current = _fromString(saved) ?? LanguagePref.system;
|
||||
|
||||
_applyToSlang(_current);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setLanguage(LanguagePref pref) {
|
||||
if (_current == pref) return;
|
||||
_current = pref;
|
||||
/// Sprache ändern (persistieren + sofort anwenden)
|
||||
Future<void> setLanguage(LanguagePref lang) async {
|
||||
_current = lang;
|
||||
await _prefs.setString(_key, lang.name);
|
||||
|
||||
_applyToSlang(lang);
|
||||
notifyListeners();
|
||||
_prefs.setString(_key, pref.name); // fire-and-forget
|
||||
}
|
||||
|
||||
void _applyToSlang(LanguagePref pref) {
|
||||
if (pref == LanguagePref.system) {
|
||||
LocaleSettings.useDeviceLocale();
|
||||
return;
|
||||
}
|
||||
|
||||
final code = pref.code;
|
||||
if (code == null) {
|
||||
LocaleSettings.useDeviceLocale();
|
||||
return;
|
||||
}
|
||||
|
||||
if (AppLocaleUtils.supportedLocalesRaw.contains(code)) {
|
||||
LocaleSettings.setLocaleRaw(code);
|
||||
} else {
|
||||
LocaleSettings.setLocale(AppLocale.en);
|
||||
}
|
||||
}
|
||||
|
||||
LanguagePref? _fromString(String? value) {
|
||||
if (value == null || value.isEmpty) return null;
|
||||
return LanguagePref.values.firstWhere(
|
||||
(e) => e.name == value,
|
||||
orElse: () => LanguagePref.system,
|
||||
);
|
||||
}
|
||||
|
||||
LanguagePref get language => _current;
|
||||
|
||||
Locale? get locale => _current.locale;
|
||||
|
||||
bool get isSystem => _current == LanguagePref.system;
|
||||
}
|
||||
|
||||
enum LanguagePref {
|
||||
system(null), // folgt System
|
||||
de(Locale('de')), // Deutsch
|
||||
en(Locale('en')); // Englisch (default)
|
||||
system(null),
|
||||
de(Locale('de')),
|
||||
en(Locale('en'));
|
||||
|
||||
final Locale? locale;
|
||||
|
||||
const LanguagePref(this.locale);
|
||||
|
||||
String? get code => locale?.languageCode;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user