mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-07 22:07:49 -06:00
feat: Add US/GB english discrimination, fix incorrect localizations
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user