From 710d3357abbb522f75075df3556e1cc2563f19f2 Mon Sep 17 00:00:00 2001 From: Bruno D'Luka Date: Thu, 5 Sep 2024 10:34:24 -0300 Subject: [PATCH] fix: All `DateFormat`s use the current locale --- lib/main.dart | 9 +++++ lib/providers/settings_provider.dart | 35 +++++++++++++------ .../desktop/timeline_sidebar.dart | 8 +++-- lib/utils/date.dart | 5 +-- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index ec967be2..a2541fe0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,6 +58,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localized_locales/flutter_localized_locales.dart'; +import 'package:intl/date_symbol_data_local.dart'; +import 'package:intl/intl.dart'; import 'package:path/path.dart' as path; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; @@ -82,6 +84,8 @@ Future main(List args) async { runApp(const SplashScreen()); } + await initializeDateFormatting(); + DevHttpOverrides.configureCertificates(); API.initialize(); await UnityVideoPlayerInterface.instance.initialize(); @@ -426,6 +430,11 @@ class _UnityAppState extends State return null; }, + builder: (context, child) { + Intl.defaultLocale = Localizations.localeOf(context).languageCode; + + return child!; + }, ); }), ); diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index 320da672..5e80b316 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -58,11 +58,11 @@ class _SettingsOption { late final String Function(T value) saveAs; late final T Function(String value) loadFrom; final ValueChanged? onChanged; - final T Function()? valueOverrider; + final T Function(T value)? valueOverrider; late T _value; - T get value => valueOverrider?.call() ?? _value; + T get value => valueOverrider?.call(_value) ?? _value; set value(T newValue) { SettingsProvider.instance.updateProperty(() { _value = newValue; @@ -329,23 +329,38 @@ class SettingsProvider extends UnityProvider { key: 'application.language_code', ); - final kDateFormat = _SettingsOption( - def: DateFormat('EEEE, dd MMMM yyyy'), + late final kDateFormat = _SettingsOption( + def: DateFormat( + 'EEEE, dd MMMM yyyy', + kLanguageCode.value.toLanguageTag(), + ), key: 'application.date_format', + valueOverrider: (value) { + return DateFormat(value.pattern, kLanguageCode.value.toLanguageTag()); + }, ); static const availableTimeFormats = ['HH:mm', 'hh:mm a']; - final kTimeFormat = _SettingsOption( - def: DateFormat('hh:mm a'), + late final kTimeFormat = _SettingsOption( + def: DateFormat('hh:mm a', kLanguageCode.value.toLanguageTag()), key: 'application.time_format', + valueOverrider: (value) { + return DateFormat(value.pattern, kLanguageCode.value.toLanguageTag()); + }, ); /// The extended time format adds the second to the time format. DateFormat get extendedTimeFormat { return switch (kTimeFormat.value.pattern!) { - 'HH:mm' => DateFormat('HH:mm:ss'), - 'hh:mm a' => DateFormat('hh:mm:ss a'), - _ => DateFormat(kTimeFormat.value.pattern), + 'HH:mm' => DateFormat('HH:mm:ss', kLanguageCode.value.toLanguageTag()), + 'hh:mm a' => DateFormat( + 'hh:mm:ss a', + kLanguageCode.value.toLanguageTag(), + ), + _ => DateFormat( + kTimeFormat.value.pattern, + kLanguageCode.value.toLanguageTag(), + ), }; } @@ -445,7 +460,7 @@ class SettingsProvider extends UnityProvider { ..zoom.softwareZoom = value; } }, - valueOverrider: isHardwareZoomSupported ? () => true : null, + valueOverrider: isHardwareZoomSupported ? (_) => true : null, ); final kEventsMatrixedZoom = _SettingsOption( def: true, diff --git a/lib/screens/events_timeline/desktop/timeline_sidebar.dart b/lib/screens/events_timeline/desktop/timeline_sidebar.dart index 0e069da8..72959530 100644 --- a/lib/screens/events_timeline/desktop/timeline_sidebar.dart +++ b/lib/screens/events_timeline/desktop/timeline_sidebar.dart @@ -27,6 +27,7 @@ import 'package:bluecherry_client/widgets/misc.dart'; import 'package:bluecherry_client/widgets/search.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; class TimelineSidebar extends StatefulWidget { @@ -90,8 +91,11 @@ class _TimelineSidebarState extends State with Searchable { loc.dateFilter, style: const TextStyle(fontWeight: FontWeight.bold), ), - subtitle: AutoSizeText( - widget.date.formatDecoratedDate(context), + trailing: AutoSizeText( + widget.date.formatDecoratedDate( + context, + DateFormat('EEE, dd MMM yyyy'), + ), maxLines: 1, ), onTap: () async { diff --git a/lib/utils/date.dart b/lib/utils/date.dart index 122dd0dc..c6a426dd 100644 --- a/lib/utils/date.dart +++ b/lib/utils/date.dart @@ -161,9 +161,10 @@ extension DateTimeExtension on DateTime? { } /// Formats the date string. - String formatDecoratedDate(BuildContext context) { + String formatDecoratedDate(BuildContext context, [DateFormat? format]) { final loc = AppLocalizations.of(context); final settings = context.read(); + format ??= settings.kDateFormat.value; var date = this; if (settings.kConvertTimeToLocalTimezone.value) date = date?.toLocal(); @@ -178,7 +179,7 @@ extension DateTimeExtension on DateTime? { )) { return loc.yesterday; } else { - return settings.kDateFormat.value.format(date); + return format!.format(date); } }();