/// Provider pour gérer la locale de l'application library locale_provider; import 'package:flutter/material.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../utils/logger.dart'; /// Provider pour la gestion de la locale class LocaleProvider extends ChangeNotifier { static const String _localeKey = 'app_locale'; Locale _locale = const Locale('fr'); /// Locale actuelle Locale get locale => _locale; /// Locales supportées static const List supportedLocales = [ Locale('fr'), Locale('en'), ]; /// Initialiser la locale depuis les préférences Future initialize() async { try { final prefs = await SharedPreferences.getInstance(); final localeCode = prefs.getString(_localeKey); if (localeCode != null) { _locale = Locale(localeCode); AppLogger.info('Locale chargée: $localeCode'); } else { AppLogger.info('Locale par défaut: fr'); } notifyListeners(); } catch (e, stackTrace) { AppLogger.error( 'Erreur lors du chargement de la locale', error: e, stackTrace: stackTrace, ); } } /// Changer la locale Future setLocale(Locale locale) async { if (!supportedLocales.contains(locale)) { AppLogger.warning('Locale non supportée: ${locale.languageCode}'); return; } if (_locale == locale) { return; } try { _locale = locale; notifyListeners(); final prefs = await SharedPreferences.getInstance(); await prefs.setString(_localeKey, locale.languageCode); AppLogger.info('Locale changée: ${locale.languageCode}'); AppLogger.userAction('Change language', data: {'locale': locale.languageCode}); } catch (e, stackTrace) { AppLogger.error( 'Erreur lors du changement de locale', error: e, stackTrace: stackTrace, ); } } /// Basculer entre FR et EN Future toggleLocale() async { final newLocale = _locale.languageCode == 'fr' ? const Locale('en') : const Locale('fr'); await setLocale(newLocale); } /// Obtenir le nom de la langue actuelle String get currentLanguageName { switch (_locale.languageCode) { case 'fr': return 'Français'; case 'en': return 'English'; default: return 'Français'; } } /// Vérifier si la locale est française bool get isFrench => _locale.languageCode == 'fr'; /// Vérifier si la locale est anglaise bool get isEnglish => _locale.languageCode == 'en'; }