From f8d00caae08c31fd98ba91fdea69b10b1edb0e92 Mon Sep 17 00:00:00 2001 From: Serge Tarkovski Date: Sat, 25 Apr 2026 01:03:11 +0300 Subject: [PATCH] Validate locale override and use preferred locale list for fallback --- lib/screens/channel_chat_screen.dart | 13 +++++++++++-- lib/services/background_service.dart | 17 ++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index 6bd89c2c..330e3f03 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -57,6 +57,10 @@ class _ChannelChatScreenState extends State { DateTime? _lastChannelSendAt; bool _channelSkipNextBottomSnap = false; + String? _cachedFormatLocale; + late DateFormat _hmFormat; + late DateFormat _mdFormat; + @override void initState() { super.initState(); @@ -1232,10 +1236,15 @@ class _ChannelChatScreenState extends State { final now = DateTime.now(); final diff = now.difference(time); final locale = Localizations.localeOf(context).toString(); - final hm = DateFormat.Hm(locale).format(time); + if (locale != _cachedFormatLocale) { + _cachedFormatLocale = locale; + _hmFormat = DateFormat.Hm(locale); + _mdFormat = DateFormat.Md(locale); + } + final hm = _hmFormat.format(time); if (diff.inDays > 0) { - return '${DateFormat.Md(locale).format(time)} $hm'; + return '${_mdFormat.format(time)} $hm'; } else { return hm; } diff --git a/lib/services/background_service.dart b/lib/services/background_service.dart index 45be09b8..336ecdd4 100644 --- a/lib/services/background_service.dart +++ b/lib/services/background_service.dart @@ -57,14 +57,17 @@ class BackgroundService { final supported = AppLocalizations.supportedLocales; final override = _languageOverrideProvider?.call(); if (override != null && override.isNotEmpty) { - return AppLocalizations.delegate.load(Locale(override)); + final overrideLocale = Locale(override); + final isSupported = supported.any( + (l) => l.languageCode == overrideLocale.languageCode, + ); + if (isSupported) { + return AppLocalizations.delegate.load(overrideLocale); + } } - final system = - WidgetsBinding.instance.platformDispatcher.locale; - final match = basicLocaleListResolution( - [system], - supported, - ); + final preferred = + WidgetsBinding.instance.platformDispatcher.locales; + final match = basicLocaleListResolution(preferred, supported); return AppLocalizations.delegate.load(match); }