diff --git a/lib/features/composer/presentation/extensions/create_email_request_extension.dart b/lib/features/composer/presentation/extensions/create_email_request_extension.dart index efc35c688..129ef9cc6 100644 --- a/lib/features/composer/presentation/extensions/create_email_request_extension.dart +++ b/lib/features/composer/presentation/extensions/create_email_request_extension.dart @@ -158,7 +158,7 @@ extension CreateEmailRequestExtension on CreateEmailRequest { IndividualHeaderIdentifier.acceptLanguageHeader: LocalizationService.supportedLocalesToLanguageTags() }, contentLanguageHeader: { - IndividualHeaderIdentifier.contentLanguageHeader: LocalizationService.getLocaleFromLanguage().toLanguageTag() + IndividualHeaderIdentifier.contentLanguageHeader: LocalizationService.getInitialLocale().toLanguageTag() }, ) }, diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index a581f738b..ec59e1a8e 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -2156,7 +2156,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { {_displayingEventBlobId!}, emailId, session!.getLanguageForCalendarEvent( - LocalizationService.getLocaleFromLanguage(), + LocalizationService.getInitialLocale(), accountId!, ), )); @@ -2177,7 +2177,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { {_displayingEventBlobId!}, emailId, session!.getLanguageForCalendarEvent( - LocalizationService.getLocaleFromLanguage(), + LocalizationService.getInitialLocale(), accountId!, ), )); @@ -2198,7 +2198,7 @@ class SingleEmailController extends BaseController with AppLoaderMixin { {_displayingEventBlobId!}, emailId, session!.getLanguageForCalendarEvent( - LocalizationService.getLocaleFromLanguage(), + LocalizationService.getInitialLocale(), accountId!, ), )); diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart index a98f8c905..b5e0e2952 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart @@ -38,9 +38,10 @@ class LanguageAndRegionController extends BaseController { @override void handleSuccessViewState(Success success) { - super.handleSuccessViewState(success); if (success is SaveLanguageSuccess) { - LocalizationService.changeLocale(success.localeStored.languageCode); + LocalizationService.changeLocale(success.localeStored); + } else { + super.handleSuccessViewState(success); } } diff --git a/lib/main.dart b/lib/main.dart index 5b389a68d..dcdb4d04a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -87,7 +87,7 @@ class _TMailAppState extends State { } return supportedLocales.first; }, - locale: LocalizationService.getLocaleFromLanguage(), + locale: LocalizationService.getInitialLocale(), fallbackLocale: LocalizationService.fallbackLocale, translations: LocalizationService(), onGenerateTitle: (context) { diff --git a/lib/main/localizations/localization_service.dart b/lib/main/localizations/localization_service.dart index b500d20a9..9db498ba8 100644 --- a/lib/main/localizations/localization_service.dart +++ b/lib/main/localizations/localization_service.dart @@ -1,6 +1,3 @@ - -import 'dart:ui'; - import 'package:core/utils/app_logger.dart'; import 'package:flutter/widgets.dart'; import 'package:get/get.dart'; @@ -8,6 +5,8 @@ import 'package:tmail_ui_user/features/manage_account/data/local/language_cache_ import 'package:tmail_ui_user/main/localizations/language_code_constants.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +typedef OnServerLanguageApplied = Function(Locale locale); + class LocalizationService extends Translations { static const defaultLocale = Locale(LanguageCodeConstants.english, 'US'); @@ -33,29 +32,27 @@ class LocalizationService extends Translations { Locale(LanguageCodeConstants.german, 'DE') ]; - static void changeLocale(String langCode) { - log('LocalizationService::changeLocale():langCode: $langCode'); - final newLocale = getLocaleFromLanguage(langCode: langCode); - log('LocalizationService::changeLocale():newLocale: $newLocale'); + static void changeLocale(Locale newLocale) { + log('LocalizationService::changeLocale(): New locale is $newLocale'); Get.updateLocale(newLocale); } - static Locale getLocaleFromLanguage({String? langCode}) { + static Locale getInitialLocale() { try { - final languageCacheManager = getBinding(); - final localeStored = languageCacheManager?.getStoredLanguage(); - log('LocalizationService::_getLocaleFromLanguage():localeStored: $localeStored'); - final localeSelected = supportedLocales.firstWhereOrNull( - (locale) => locale.languageCode == langCode, - ); - return localeSelected ?? localeStored ?? Get.deviceLocale ?? defaultLocale; + final cachedLocale = _getCachedLocale(); + if (cachedLocale != null) return cachedLocale; + + final deviceLocale = _getDeviceLocale(); + if (_isSupportedLocale(deviceLocale)) return deviceLocale; + + return defaultLocale; } catch (e) { - logError('LocalizationService::getLocaleFromLanguage: Exception: $e'); - return Get.deviceLocale ?? defaultLocale; + logError('LocalizationService::getInitialLocale:Exception is $e'); + return defaultLocale; } } - static Locale? getCachedLocale() { + static Locale? _getCachedLocale() { try { final languageCacheManager = getBinding(); return languageCacheManager?.getStoredLanguage(); @@ -65,6 +62,9 @@ class LocalizationService extends Translations { } } + static Locale _getDeviceLocale() => + WidgetsBinding.instance.platformDispatcher.locale; + static String supportedLocalesToLanguageTags() { final listLanguageTags = supportedLocales.map((locale) => locale.toLanguageTag()).join(', '); log('LocalizationService::supportedLocalesToLanguageTags:listLanguageTags: $listLanguageTags'); @@ -73,49 +73,81 @@ class LocalizationService extends Translations { static void initializeAppLanguage({ String? serverLanguage, - void Function(Locale locale)? onServerLanguageApplied, + OnServerLanguageApplied? onServerLanguageApplied, }) { - final currentLocale = Get.locale; + log('LocalizationService::initializeAppLanguage:Server language: $serverLanguage'); try { - final serverLocale = supportedLocales - .firstWhereOrNull((locale) => locale.languageCode == serverLanguage); - final cachedLocale = getCachedLocale(); - // From server - if (serverLocale != null && supportedLocales.contains(serverLocale)) { - changeLocale(serverLocale.languageCode); - onServerLanguageApplied?.call(serverLocale); - return; - } - - // From cache - if (cachedLocale != null && supportedLocales.contains(cachedLocale)) { - changeLocale(cachedLocale.languageCode); - return; - } - - // From device - final deviceLocale = WidgetsBinding.instance.platformDispatcher.locale; - if (supportedLocales.contains(deviceLocale)) { - changeLocale(deviceLocale.languageCode); - return; - } - - // Default - if (currentLocale == null || !supportedLocales.contains(currentLocale)) { - changeLocale(defaultLocale.languageCode); + if (serverLanguage != null && + _useServerLocale( + languageCode: serverLanguage, + onServerLanguageApplied: onServerLanguageApplied, + )) { return; } + + if (_useCachedLocale()) return; + + if (_useDeviceLocale()) return; + + _useDefaultLocale(); } catch (e) { logError('LocalizationService::initializeAppLanguage: Exception: $e'); - // Default - if (currentLocale == null || !supportedLocales.contains(currentLocale)) { - changeLocale(defaultLocale.languageCode); - return; - } + _useDefaultLocale(); } } + static void _useDefaultLocale() { + final currentLocale = Get.locale; + if (currentLocale == null || !_isSupportedLocale(currentLocale)) { + changeLocale(defaultLocale); + } + } + + static bool _useDeviceLocale() { + final deviceLocale = _getDeviceLocale(); + log('LocalizationService::_useDeviceLocale: Device locale is $deviceLocale'); + if (_isSupportedLocale(deviceLocale)) { + changeLocale(deviceLocale); + return true; + } + return false; + } + + static bool _useCachedLocale() { + final cachedLocale = _getCachedLocale(); + log('LocalizationService::_useCachedLocale: Cached locale is $cachedLocale'); + if (cachedLocale != null && _isSupportedLocale(cachedLocale)) { + changeLocale(cachedLocale); + return true; + } + return false; + } + + static bool _useServerLocale({ + required String languageCode, + required OnServerLanguageApplied? onServerLanguageApplied, + }) { + final serverLocale = _findSupportedLocale(languageCode); + log('LocalizationService::_useServerLocale: Server locale is $serverLocale'); + if (serverLocale != null && _isSupportedLocale(serverLocale)) { + changeLocale(serverLocale); + onServerLanguageApplied?.call(serverLocale); + return true; + } + return false; + } + + static bool _isSupportedLocale(Locale locale) { + return supportedLocales + .any((supported) => supported.languageCode == locale.languageCode); + } + + static Locale? _findSupportedLocale(String languageCode) { + return supportedLocales.firstWhereOrNull( + (supported) => supported.languageCode == languageCode); + } + @override Map> get keys => {}; }