Feature: Add support for localization, introduce slang for translations, and integrate German and English locale support throughout the app

This commit is contained in:
2025-09-27 11:58:25 +02:00
parent 3e04b9cbe3
commit 0a0e421158
11 changed files with 627 additions and 44 deletions

View File

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