feat(i18n): add localization foundation
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m52s
Build & Deploy Pluriwave / Análisis de código (push) Successful in 24s

This commit is contained in:
2026-05-22 13:29:52 +02:00
parent d85dee6fa8
commit 3f548fd53e
13 changed files with 986 additions and 65 deletions
+68
View File
@@ -0,0 +1,68 @@
import 'dart:ui';
import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
class EstadoIdioma extends ChangeNotifier {
EstadoIdioma({SharedPreferences? sharedPreferences})
: _sharedPreferences = sharedPreferences {
_cargar();
}
static const String _keyLocale = 'idioma_manual_v1';
final SharedPreferences? _sharedPreferences;
Locale? _localeSeleccionado;
Locale? get localeSeleccionado => _localeSeleccionado;
bool get usaSistema => _localeSeleccionado == null;
Future<void> seleccionarSistema() async {
_localeSeleccionado = null;
notifyListeners();
final prefs = await _resolverPrefs();
await prefs.remove(_keyLocale);
}
Future<void> seleccionarLocale(Locale locale) async {
final tag = _serializarLocale(locale);
_localeSeleccionado = locale;
notifyListeners();
final prefs = await _resolverPrefs();
await prefs.setString(_keyLocale, tag);
}
Future<void> _cargar() async {
final prefs = await _resolverPrefs();
final localeGuardado = prefs.getString(_keyLocale);
_localeSeleccionado = _parsearLocale(localeGuardado);
notifyListeners();
}
Future<SharedPreferences> _resolverPrefs() async {
return _sharedPreferences ?? SharedPreferences.getInstance();
}
Locale? _parsearLocale(String? value) {
if (value == null || value.trim().isEmpty) return null;
final partes = value.split('_');
final languageCode = partes.first;
if (languageCode.isEmpty) return null;
final countryCode = partes.length > 1 && partes[1].isNotEmpty
? partes[1]
: null;
return Locale.fromSubtags(
languageCode: languageCode,
countryCode: countryCode,
);
}
String _serializarLocale(Locale locale) {
final countryCode = locale.countryCode;
if (countryCode == null || countryCode.isEmpty) {
return locale.languageCode;
}
return '${locale.languageCode}_$countryCode';
}
}