mirror of
https://github.com/gabehf/Fladder.git
synced 2026-03-08 23:18:16 -07:00
Merge branch 'develop' of https://github.com/bk-bf/fladder into pr/bk-bf/420
This commit is contained in:
commit
2f83f03442
2 changed files with 224 additions and 1 deletions
222
lib/localization_delegates.dart
Normal file
222
lib/localization_delegates.dart
Normal file
|
|
@ -0,0 +1,222 @@
|
||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/foundation.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
|
// ignore: implementation_imports
|
||||||
|
import 'package:flutter_localizations/src/utils/date_localizations.dart' as util;
|
||||||
|
import 'package:intl/intl.dart' as intl;
|
||||||
|
|
||||||
|
import 'package:fladder/l10n/generated/app_localizations.dart';
|
||||||
|
|
||||||
|
class FladderLocalizations {
|
||||||
|
static const List<LocalizationsDelegate<dynamic>> localizationsDelegates = <LocalizationsDelegate<dynamic>>[
|
||||||
|
AppLocalizations.delegate,
|
||||||
|
FladderMaterialLocalizationsDelegate(),
|
||||||
|
FladderCupertinoLocalizationsDelegate(),
|
||||||
|
FladderWidgetsLocalizationsDelegate(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class FladderMaterialLocalizationsDelegate extends LocalizationsDelegate<MaterialLocalizations> {
|
||||||
|
const FladderMaterialLocalizationsDelegate();
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isSupported(Locale locale) => true;
|
||||||
|
|
||||||
|
static final Map<Locale, Future<MaterialLocalizations>> _loadedTranslations =
|
||||||
|
<Locale, Future<MaterialLocalizations>>{};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<MaterialLocalizations> load(Locale locale) {
|
||||||
|
Locale correctedLocale = locale;
|
||||||
|
if (!kMaterialSupportedLanguages.contains(locale.languageCode)) {
|
||||||
|
correctedLocale = const Locale("en");
|
||||||
|
}
|
||||||
|
assert(isSupported(correctedLocale));
|
||||||
|
return _loadedTranslations.putIfAbsent(correctedLocale, () {
|
||||||
|
util.loadDateIntlDataIfNotLoaded();
|
||||||
|
|
||||||
|
final String localeName = intl.Intl.canonicalizedLocale(correctedLocale.toString());
|
||||||
|
assert(
|
||||||
|
correctedLocale.toString() == localeName,
|
||||||
|
'Flutter does not support the non-standard locale form $correctedLocale (which '
|
||||||
|
'might be $localeName',
|
||||||
|
);
|
||||||
|
|
||||||
|
intl.DateFormat fullYearFormat;
|
||||||
|
intl.DateFormat compactDateFormat;
|
||||||
|
intl.DateFormat shortDateFormat;
|
||||||
|
intl.DateFormat mediumDateFormat;
|
||||||
|
intl.DateFormat longDateFormat;
|
||||||
|
intl.DateFormat yearMonthFormat;
|
||||||
|
intl.DateFormat shortMonthDayFormat;
|
||||||
|
if (intl.DateFormat.localeExists(localeName)) {
|
||||||
|
fullYearFormat = intl.DateFormat.y(localeName);
|
||||||
|
compactDateFormat = intl.DateFormat.yMd(localeName);
|
||||||
|
shortDateFormat = intl.DateFormat.yMMMd(localeName);
|
||||||
|
mediumDateFormat = intl.DateFormat.MMMEd(localeName);
|
||||||
|
longDateFormat = intl.DateFormat.yMMMMEEEEd(localeName);
|
||||||
|
yearMonthFormat = intl.DateFormat.yMMMM(localeName);
|
||||||
|
shortMonthDayFormat = intl.DateFormat.MMMd(localeName);
|
||||||
|
} else if (intl.DateFormat.localeExists(correctedLocale.languageCode)) {
|
||||||
|
fullYearFormat = intl.DateFormat.y(correctedLocale.languageCode);
|
||||||
|
compactDateFormat = intl.DateFormat.yMd(correctedLocale.languageCode);
|
||||||
|
shortDateFormat = intl.DateFormat.yMMMd(correctedLocale.languageCode);
|
||||||
|
mediumDateFormat = intl.DateFormat.MMMEd(correctedLocale.languageCode);
|
||||||
|
longDateFormat = intl.DateFormat.yMMMMEEEEd(correctedLocale.languageCode);
|
||||||
|
yearMonthFormat = intl.DateFormat.yMMMM(correctedLocale.languageCode);
|
||||||
|
shortMonthDayFormat = intl.DateFormat.MMMd(correctedLocale.languageCode);
|
||||||
|
} else {
|
||||||
|
fullYearFormat = intl.DateFormat.y();
|
||||||
|
compactDateFormat = intl.DateFormat.yMd();
|
||||||
|
shortDateFormat = intl.DateFormat.yMMMd();
|
||||||
|
mediumDateFormat = intl.DateFormat.MMMEd();
|
||||||
|
longDateFormat = intl.DateFormat.yMMMMEEEEd();
|
||||||
|
yearMonthFormat = intl.DateFormat.yMMMM();
|
||||||
|
shortMonthDayFormat = intl.DateFormat.MMMd();
|
||||||
|
}
|
||||||
|
|
||||||
|
intl.NumberFormat decimalFormat;
|
||||||
|
intl.NumberFormat twoDigitZeroPaddedFormat;
|
||||||
|
if (intl.NumberFormat.localeExists(localeName)) {
|
||||||
|
decimalFormat = intl.NumberFormat.decimalPattern(localeName);
|
||||||
|
twoDigitZeroPaddedFormat = intl.NumberFormat('00', localeName);
|
||||||
|
} else if (intl.NumberFormat.localeExists(correctedLocale.languageCode)) {
|
||||||
|
decimalFormat = intl.NumberFormat.decimalPattern(correctedLocale.languageCode);
|
||||||
|
twoDigitZeroPaddedFormat = intl.NumberFormat('00', correctedLocale.languageCode);
|
||||||
|
} else {
|
||||||
|
decimalFormat = intl.NumberFormat.decimalPattern();
|
||||||
|
twoDigitZeroPaddedFormat = intl.NumberFormat('00');
|
||||||
|
}
|
||||||
|
|
||||||
|
return SynchronousFuture<MaterialLocalizations>(
|
||||||
|
getMaterialTranslation(
|
||||||
|
correctedLocale,
|
||||||
|
fullYearFormat,
|
||||||
|
compactDateFormat,
|
||||||
|
shortDateFormat,
|
||||||
|
mediumDateFormat,
|
||||||
|
longDateFormat,
|
||||||
|
yearMonthFormat,
|
||||||
|
shortMonthDayFormat,
|
||||||
|
decimalFormat,
|
||||||
|
twoDigitZeroPaddedFormat,
|
||||||
|
)!,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReload(FladderMaterialLocalizationsDelegate old) => false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'GlobalMaterialLocalizations.delegate(${kMaterialSupportedLanguages.length} locales)';
|
||||||
|
}
|
||||||
|
|
||||||
|
class FladderWidgetsLocalizationsDelegate extends LocalizationsDelegate<WidgetsLocalizations> {
|
||||||
|
const FladderWidgetsLocalizationsDelegate();
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isSupported(Locale locale) => true;
|
||||||
|
|
||||||
|
static final Map<Locale, Future<WidgetsLocalizations>> _loadedTranslations = <Locale, Future<WidgetsLocalizations>>{};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<WidgetsLocalizations> load(Locale locale) {
|
||||||
|
Locale correctedLocale = locale;
|
||||||
|
if (!kMaterialSupportedLanguages.contains(locale.languageCode)) {
|
||||||
|
correctedLocale = const Locale("en");
|
||||||
|
}
|
||||||
|
assert(isSupported(correctedLocale));
|
||||||
|
return _loadedTranslations.putIfAbsent(correctedLocale, () {
|
||||||
|
return SynchronousFuture<WidgetsLocalizations>(getWidgetsTranslation(correctedLocale)!);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReload(covariant LocalizationsDelegate<WidgetsLocalizations> old) => false;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FladderCupertinoLocalizationsDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
|
||||||
|
const FladderCupertinoLocalizationsDelegate();
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool isSupported(Locale locale) => true;
|
||||||
|
|
||||||
|
static final Map<Locale, Future<CupertinoLocalizations>> _loadedTranslations =
|
||||||
|
<Locale, Future<CupertinoLocalizations>>{};
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<CupertinoLocalizations> load(Locale locale) {
|
||||||
|
Locale correctedLocale = locale;
|
||||||
|
if (!kMaterialSupportedLanguages.contains(locale.languageCode)) {
|
||||||
|
correctedLocale = const Locale("en");
|
||||||
|
}
|
||||||
|
assert(isSupported(correctedLocale));
|
||||||
|
return _loadedTranslations.putIfAbsent(correctedLocale, () {
|
||||||
|
util.loadDateIntlDataIfNotLoaded();
|
||||||
|
|
||||||
|
final String localeName = intl.Intl.canonicalizedLocale(correctedLocale.toString());
|
||||||
|
assert(
|
||||||
|
correctedLocale.toString() == localeName,
|
||||||
|
'Flutter does not support the non-standard locale form $correctedLocale (which '
|
||||||
|
'might be $localeName',
|
||||||
|
);
|
||||||
|
|
||||||
|
late intl.DateFormat fullYearFormat;
|
||||||
|
late intl.DateFormat dayFormat;
|
||||||
|
late intl.DateFormat weekdayFormat;
|
||||||
|
late intl.DateFormat mediumDateFormat;
|
||||||
|
// We don't want any additional decoration here. The am/pm is handled in
|
||||||
|
// the date picker. We just want an hour number localized.
|
||||||
|
late intl.DateFormat singleDigitHourFormat;
|
||||||
|
late intl.DateFormat singleDigitMinuteFormat;
|
||||||
|
late intl.DateFormat doubleDigitMinuteFormat;
|
||||||
|
late intl.DateFormat singleDigitSecondFormat;
|
||||||
|
late intl.NumberFormat decimalFormat;
|
||||||
|
|
||||||
|
void loadFormats(String? correctedLocale) {
|
||||||
|
fullYearFormat = intl.DateFormat.y(correctedLocale);
|
||||||
|
dayFormat = intl.DateFormat.d(correctedLocale);
|
||||||
|
weekdayFormat = intl.DateFormat.E(correctedLocale);
|
||||||
|
mediumDateFormat = intl.DateFormat.MMMEd(correctedLocale);
|
||||||
|
// TODO(xster): fix when https://github.com/dart-lang/intl/issues/207 is resolved.
|
||||||
|
singleDigitHourFormat = intl.DateFormat('HH', correctedLocale);
|
||||||
|
singleDigitMinuteFormat = intl.DateFormat.m(correctedLocale);
|
||||||
|
doubleDigitMinuteFormat = intl.DateFormat('mm', correctedLocale);
|
||||||
|
singleDigitSecondFormat = intl.DateFormat.s(correctedLocale);
|
||||||
|
decimalFormat = intl.NumberFormat.decimalPattern(correctedLocale);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intl.DateFormat.localeExists(localeName)) {
|
||||||
|
loadFormats(localeName);
|
||||||
|
} else if (intl.DateFormat.localeExists(correctedLocale.languageCode)) {
|
||||||
|
loadFormats(correctedLocale.languageCode);
|
||||||
|
} else {
|
||||||
|
loadFormats(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return SynchronousFuture<CupertinoLocalizations>(
|
||||||
|
getCupertinoTranslation(
|
||||||
|
correctedLocale,
|
||||||
|
fullYearFormat,
|
||||||
|
dayFormat,
|
||||||
|
weekdayFormat,
|
||||||
|
mediumDateFormat,
|
||||||
|
singleDigitHourFormat,
|
||||||
|
singleDigitMinuteFormat,
|
||||||
|
doubleDigitMinuteFormat,
|
||||||
|
singleDigitSecondFormat,
|
||||||
|
decimalFormat,
|
||||||
|
)!,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
bool shouldReload(FladderCupertinoLocalizationsDelegate old) => false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => 'GlobalCupertinoLocalizations.delegate(${kCupertinoSupportedLanguages.length} locales)';
|
||||||
|
}
|
||||||
|
|
@ -16,6 +16,7 @@ import 'package:universal_html/html.dart' as html;
|
||||||
import 'package:window_manager/window_manager.dart';
|
import 'package:window_manager/window_manager.dart';
|
||||||
|
|
||||||
import 'package:fladder/l10n/generated/app_localizations.dart';
|
import 'package:fladder/l10n/generated/app_localizations.dart';
|
||||||
|
import 'package:fladder/localization_delegates.dart';
|
||||||
import 'package:fladder/models/account_model.dart';
|
import 'package:fladder/models/account_model.dart';
|
||||||
import 'package:fladder/models/settings/arguments_model.dart';
|
import 'package:fladder/models/settings/arguments_model.dart';
|
||||||
import 'package:fladder/providers/arguments_provider.dart';
|
import 'package:fladder/providers/arguments_provider.dart';
|
||||||
|
|
@ -271,7 +272,7 @@ class _MainState extends ConsumerState<Main> with WindowListener, WidgetsBinding
|
||||||
mouseDrag ? PointerDeviceKind.mouse : null,
|
mouseDrag ? PointerDeviceKind.mouse : null,
|
||||||
}.nonNulls.toSet(),
|
}.nonNulls.toSet(),
|
||||||
),
|
),
|
||||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
localizationsDelegates: FladderLocalizations.localizationsDelegates,
|
||||||
supportedLocales: AppLocalizations.supportedLocales,
|
supportedLocales: AppLocalizations.supportedLocales,
|
||||||
locale: language,
|
locale: language,
|
||||||
localeResolutionCallback: (locale, supportedLocales) {
|
localeResolutionCallback: (locale, supportedLocales) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue