diff --git a/assets/translations/de.json b/assets/translations/de.json index 01756a5..97576c4 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minute erneut", "other": "Zu viele Anfragen (Rate begrenzt) - versuchen Sie es in {} Minuten erneut" diff --git a/assets/translations/en.json b/assets/translations/en.json index 49914df..8231108 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "Too many requests (rate limited) - try again in {} minute", "other": "Too many requests (rate limited) - try again in {} minutes" diff --git a/assets/translations/hu.json b/assets/translations/hu.json index 84ff5e9..19fcf8c 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva", "other": "Túl sok kérés (korlátozott arány) – próbálja újra {} perc múlva" diff --git a/assets/translations/it.json b/assets/translations/it.json index 6c897a2..2499dfb 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "Troppe richieste (traffico limitato) - riprova tra {} minuto", "other": "Troppe richieste (traffico limitato) - riprova tra {} minuti" diff --git a/assets/translations/ja.json b/assets/translations/ja.json index 5cebd61..f84efab 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "カテゴリを追加", "label": "ラベル", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "リクエストが多すぎます(レート制限)- {}分後に再試行してください", "other": "リクエストが多すぎます(レート制限)- {}分後に再試行してください" diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 0f1286f..36cf8c2 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -208,6 +208,7 @@ "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", + "language": "Language", "tooManyRequestsTryAgainInMinutes": { "one": "请求过多 (API 限制) - 在 {} 分钟后重试", "other": "请求过多 (API 限制) - 在 {} 分钟后重试" diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index d4a4a3c..2e107ba 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -6,6 +6,7 @@ import 'package:obtainium/components/custom_app_bar.dart'; import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form_modal.dart'; import 'package:obtainium/custom_errors.dart'; +import 'package:obtainium/main.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/logs_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; @@ -129,6 +130,25 @@ class _SettingsPageState extends State { } }); + var localeDropdown = DropdownButtonFormField( + decoration: InputDecoration(labelText: tr('language')), + value: settingsProvider.forcedLocale, + items: [ + DropdownMenuItem( + value: null, + child: Text(tr('followSystem')), + ), + ...supportedLocales.map((e) => DropdownMenuItem( + value: e.toLanguageTag(), + child: Text(e.toLanguageTag().toUpperCase()), + )) + ], + onChanged: (value) { + settingsProvider.forcedLocale = value; + context.setLocale(Locale(settingsProvider.forcedLocale ?? + context.fallbackLocale!.languageCode)); + }); + var intervalDropdown = DropdownButtonFormField( decoration: InputDecoration(labelText: tr('bgUpdateCheckInterval')), value: settingsProvider.updateInterval, @@ -210,6 +230,8 @@ class _SettingsPageState extends State { ], ), height16, + localeDropdown, + height16, Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/providers/settings_provider.dart b/lib/providers/settings_provider.dart index ad73ad3..07fcbee 100644 --- a/lib/providers/settings_provider.dart +++ b/lib/providers/settings_provider.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:obtainium/app_sources/github.dart'; import 'package:obtainium/components/generated_form.dart'; +import 'package:obtainium/main.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -164,4 +165,24 @@ class SettingsProvider with ChangeNotifier { ...categories.entries.map((e) => MapEntry(e.key, e.key)).toList() ], defaultValue: initCategory); + + String? get forcedLocale { + var fl = prefs?.getString('forcedLocale'); + return supportedLocales + .where((element) => element.toLanguageTag() == fl) + .isNotEmpty + ? fl + : null; + } + + set forcedLocale(String? fl) { + if (fl == null) { + prefs?.remove('forcedLocale'); + } else if (supportedLocales + .where((element) => element.toLanguageTag() == fl) + .isNotEmpty) { + prefs?.setString('forcedLocale', fl); + } + notifyListeners(); + } }