import 'package:flutter/material.dart'; import 'package:intl/find_locale.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:pshared/provider/locale.dart'; String _localeVarStorageName() { return 'mcrm_last_locale'; } Locale _selectDefaultLocale(List appLocales, Locale defaultLocale) { return appLocales.contains(defaultLocale) ? defaultLocale : appLocales.isEmpty ? throw ArgumentError('empty application locales list', 'appLocales') : appLocales.first; } class LocaleManager { late SharedPreferences _prefs; final List appLocales; final Locale _defaultLocale; final LocaleProvider localeProvider; LocaleManager(this.localeProvider, this.appLocales, Locale defaultLocale) : _defaultLocale = _selectDefaultLocale(appLocales, defaultLocale) { SharedPreferences.getInstance().then((prefs) { _prefs = prefs; _initializeLocaleProvider(); }); } Future _initializeLocaleProvider() async { final initialLocale = await _getInitialLocale(); localeProvider.setLocale(initialLocale); localeProvider.addListener(_onLocaleChanged); } Future _getInitialLocale() async { final locale = await _pickLocale(); return appLocales.contains(locale) ? locale : _defaultLocale; } Future _pickLocale() async { String? savedLocaleCode = _prefs.getString(_localeVarStorageName()); if (savedLocaleCode != null) { return Locale(savedLocaleCode); } String systemLocaleString = await findSystemLocale(); final List localeParts = systemLocaleString.split('_'); final Locale systemLocale = Locale(localeParts[0]); final res = appLocales.contains(systemLocale); return res ? systemLocale : _defaultLocale; } Future saveLocale(Locale locale) async { return _prefs.setString(_localeVarStorageName(), locale.toString()); } Future _onLocaleChanged() async { return saveLocale(localeProvider.locale); } }