feat: Add US/GB english discrimination, fix incorrect localizations

This commit is contained in:
Anton Stubenbord
2023-10-09 00:24:13 +02:00
parent d4951e1c82
commit 23b7560dda
24 changed files with 204 additions and 85 deletions

View File

@@ -41,19 +41,22 @@ import 'package:paperless_mobile/routes/typed/shells/authenticated_route.dart';
import 'package:paperless_mobile/routes/typed/top_level/add_account_route.dart';
import 'package:paperless_mobile/routes/typed/top_level/logging_out_route.dart';
import 'package:paperless_mobile/routes/typed/top_level/login_route.dart';
import 'package:paperless_mobile/routes/typed/top_level/settings_route.dart';
import 'package:paperless_mobile/theme.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
String get defaultPreferredLocaleSubtag {
String preferredLocale = Platform.localeName.split("_").first;
if (!S.supportedLocales
.any((locale) => locale.languageCode == preferredLocale)) {
preferredLocale = 'en';
Locale get defaultPreferredLocale {
final deviceLocale = _stringToLocale(Platform.localeName);
if (S.supportedLocales.contains(deviceLocale)) {
return deviceLocale;
} else if (S.supportedLocales
.map((e) => e.languageCode)
.contains(deviceLocale.languageCode)) {
return Locale(deviceLocale.languageCode);
} else {
return const Locale('en');
}
return preferredLocale;
}
Map<String, Future<void> Function()> _migrations = {
@@ -99,7 +102,7 @@ Future<void> _initHive() async {
if (!globalSettingsBox.hasValue) {
await globalSettingsBox.setValue(
GlobalSettings(preferredLocaleSubtag: defaultPreferredLocaleSubtag),
GlobalSettings(preferredLocaleSubtag: defaultPreferredLocale.toString()),
);
}
}
@@ -323,6 +326,7 @@ class _GoRouterShellState extends State<GoRouterShell> {
Widget build(BuildContext context) {
return GlobalSettingsBuilder(
builder: (context, settings) {
final locale = _stringToLocale(settings.preferredLocaleSubtag);
return DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) {
return MaterialApp.router(
@@ -340,10 +344,41 @@ class _GoRouterShellState extends State<GoRouterShell> {
preferredColorScheme: settings.preferredColorSchemeOption,
),
themeMode: settings.preferredThemeMode,
supportedLocales: S.supportedLocales,
locale: Locale.fromSubtags(
languageCode: settings.preferredLocaleSubtag,
),
supportedLocales: const [
Locale('en'),
Locale('de'),
Locale('en', 'GB'),
Locale('ca'),
Locale('cs'),
Locale('es'),
Locale('fr'),
Locale('pl'),
Locale('ru'),
Locale('tr'),
],
localeResolutionCallback: (locale, supportedLocales) {
if (locale == null) {
return supportedLocales.first;
}
final exactMatch = supportedLocales
.where((element) =>
element.languageCode == locale.languageCode &&
element.countryCode == locale.countryCode)
.toList();
if (exactMatch.isNotEmpty) {
return exactMatch.first;
}
final superLanguageMatch = supportedLocales
.where((element) =>
element.languageCode == locale.languageCode)
.toList();
if (superLanguageMatch.isNotEmpty) {
return superLanguageMatch.first;
}
return supportedLocales.first;
},
locale: locale,
localizationsDelegates: S.localizationsDelegates,
);
},
@@ -352,3 +387,10 @@ class _GoRouterShellState extends State<GoRouterShell> {
);
}
}
Locale _stringToLocale(String code) {
final codes = code.split("_");
final languageCode = codes[0];
final countryCode = codes.length > 1 ? codes[1] : null;
return Locale(languageCode, countryCode);
}