Files
pluriwave/lib/estado/estado_idioma.dart
T
FreeTLab 3f548fd53e
Build & Deploy Pluriwave / Build APK + AAB release (push) Successful in 1m52s
Build & Deploy Pluriwave / Análisis de código (push) Successful in 24s
feat(i18n): add localization foundation
2026-05-22 13:30:17 +02:00

69 lines
1.9 KiB
Dart

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