mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-08 18:28:53 +01:00
Set display language
This commit is contained in:
parent
cf0824fa22
commit
24ee630d3a
6 changed files with 94 additions and 0 deletions
|
@ -70,6 +70,8 @@ class FileRemovedEvent {
|
||||||
|
|
||||||
class ThemeChangedEvent {}
|
class ThemeChangedEvent {}
|
||||||
|
|
||||||
|
class LanguageChangedEvent {}
|
||||||
|
|
||||||
extension FilePropertyUpdatedEventExtension on FilePropertyUpdatedEvent {
|
extension FilePropertyUpdatedEventExtension on FilePropertyUpdatedEvent {
|
||||||
bool hasAnyProperties(List<int> properties) =>
|
bool hasAnyProperties(List<int> properties) =>
|
||||||
properties.any((p) => this.properties & p != 0);
|
properties.any((p) => this.properties & p != 0);
|
||||||
|
|
|
@ -309,6 +309,10 @@
|
||||||
"@settingsWidgetTitle": {
|
"@settingsWidgetTitle": {
|
||||||
"description": "Title of the Settings widget"
|
"description": "Title of the Settings widget"
|
||||||
},
|
},
|
||||||
|
"settingsLanguageTitle": "Language",
|
||||||
|
"@settingsLanguageTitle": {
|
||||||
|
"description": "Set display language"
|
||||||
|
},
|
||||||
"settingsExifSupportTitle": "EXIF support",
|
"settingsExifSupportTitle": "EXIF support",
|
||||||
"@settingsExifSupportTitle": {
|
"@settingsExifSupportTitle": {
|
||||||
"description": "Title of the EXIF support setting"
|
"description": "Title of the EXIF support setting"
|
||||||
|
|
40
lib/language_util.dart
Normal file
40
lib/language_util.dart
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:nc_photos/pref.dart';
|
||||||
|
|
||||||
|
class AppLanguage {
|
||||||
|
const AppLanguage(this.langId, this.nativeName, this.locale);
|
||||||
|
|
||||||
|
final int langId;
|
||||||
|
final String nativeName;
|
||||||
|
final Locale locale;
|
||||||
|
}
|
||||||
|
|
||||||
|
String getSelectedLanguageName(BuildContext context) =>
|
||||||
|
_getSelectedLanguage(context).nativeName;
|
||||||
|
Locale getSelectedLocale(BuildContext context) =>
|
||||||
|
_getSelectedLanguage(context).locale;
|
||||||
|
|
||||||
|
final supportedLanguages = {
|
||||||
|
_AppLanguageEnum.systemDefault.index:
|
||||||
|
AppLanguage(_AppLanguageEnum.systemDefault.index, "System default", null),
|
||||||
|
_AppLanguageEnum.english.index: AppLanguage(
|
||||||
|
_AppLanguageEnum.english.index, "English", const Locale("en")),
|
||||||
|
_AppLanguageEnum.spanish.index: AppLanguage(
|
||||||
|
_AppLanguageEnum.spanish.index, "Español", const Locale("es")),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum _AppLanguageEnum {
|
||||||
|
// the order must not be changed
|
||||||
|
systemDefault,
|
||||||
|
english,
|
||||||
|
spanish,
|
||||||
|
}
|
||||||
|
|
||||||
|
AppLanguage _getSelectedLanguage(BuildContext context) {
|
||||||
|
try {
|
||||||
|
final lang = Pref.inst().getLanguage();
|
||||||
|
return supportedLanguages[lang];
|
||||||
|
} catch (_) {
|
||||||
|
return supportedLanguages[_AppLanguageEnum.systemDefault.index];
|
||||||
|
}
|
||||||
|
}
|
|
@ -60,6 +60,9 @@ class Pref {
|
||||||
|
|
||||||
Future<bool> setDarkTheme(bool value) => _pref.setBool("isDarkTheme", value);
|
Future<bool> setDarkTheme(bool value) => _pref.setBool("isDarkTheme", value);
|
||||||
|
|
||||||
|
int getLanguage([int def = 0]) => _pref.getInt("language") ?? def;
|
||||||
|
Future<bool> setLanguage(int value) => _pref.setInt("language", value);
|
||||||
|
|
||||||
Pref._();
|
Pref._();
|
||||||
|
|
||||||
static final _inst = Pref._();
|
static final _inst = Pref._();
|
||||||
|
|
|
@ -3,6 +3,7 @@ import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:nc_photos/event/event.dart';
|
import 'package:nc_photos/event/event.dart';
|
||||||
|
import 'package:nc_photos/language_util.dart' as language_util;
|
||||||
import 'package:nc_photos/pref.dart';
|
import 'package:nc_photos/pref.dart';
|
||||||
import 'package:nc_photos/snack_bar_manager.dart';
|
import 'package:nc_photos/snack_bar_manager.dart';
|
||||||
import 'package:nc_photos/theme.dart';
|
import 'package:nc_photos/theme.dart';
|
||||||
|
@ -29,6 +30,8 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
SnackBarManager().registerHandler(this);
|
SnackBarManager().registerHandler(this);
|
||||||
_themeChangedListener =
|
_themeChangedListener =
|
||||||
AppEventListener<ThemeChangedEvent>(_onThemeChangedEvent)..begin();
|
AppEventListener<ThemeChangedEvent>(_onThemeChangedEvent)..begin();
|
||||||
|
_langChangedListener =
|
||||||
|
AppEventListener<LanguageChangedEvent>(_onLangChangedEvent)..begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -41,6 +44,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
initialRoute: Splash.routeName,
|
initialRoute: Splash.routeName,
|
||||||
onGenerateRoute: _onGenerateRoute,
|
onGenerateRoute: _onGenerateRoute,
|
||||||
scaffoldMessengerKey: _scaffoldMessengerKey,
|
scaffoldMessengerKey: _scaffoldMessengerKey,
|
||||||
|
locale: language_util.getSelectedLocale(context),
|
||||||
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
localizationsDelegates: AppLocalizations.localizationsDelegates,
|
||||||
supportedLocales: AppLocalizations.supportedLocales,
|
supportedLocales: AppLocalizations.supportedLocales,
|
||||||
debugShowCheckedModeBanner: false,
|
debugShowCheckedModeBanner: false,
|
||||||
|
@ -52,6 +56,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
super.dispose();
|
super.dispose();
|
||||||
SnackBarManager().unregisterHandler(this);
|
SnackBarManager().unregisterHandler(this);
|
||||||
_themeChangedListener.end();
|
_themeChangedListener.end();
|
||||||
|
_langChangedListener.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -92,6 +97,10 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
setState(() {});
|
setState(() {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onLangChangedEvent(LanguageChangedEvent ev) {
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
Route<dynamic> _handleBasicRoute(RouteSettings settings) {
|
Route<dynamic> _handleBasicRoute(RouteSettings settings) {
|
||||||
for (final e in _getRouter().entries) {
|
for (final e in _getRouter().entries) {
|
||||||
if (e.key == settings.name) {
|
if (e.key == settings.name) {
|
||||||
|
@ -206,6 +215,7 @@ class _MyAppState extends State<MyApp> implements SnackBarHandler {
|
||||||
final _scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
|
final _scaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();
|
||||||
|
|
||||||
AppEventListener<ThemeChangedEvent> _themeChangedListener;
|
AppEventListener<ThemeChangedEvent> _themeChangedListener;
|
||||||
|
AppEventListener<LanguageChangedEvent> _langChangedListener;
|
||||||
|
|
||||||
static final _log = Logger("widget.my_app.MyAppState");
|
static final _log = Logger("widget.my_app.MyAppState");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
|
import 'package:event_bus/event_bus.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||||
import 'package:kiwi/kiwi.dart';
|
import 'package:kiwi/kiwi.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
import 'package:nc_photos/account.dart';
|
import 'package:nc_photos/account.dart';
|
||||||
|
import 'package:nc_photos/app_db.dart';
|
||||||
|
import 'package:nc_photos/event/event.dart';
|
||||||
import 'package:nc_photos/k.dart' as k;
|
import 'package:nc_photos/k.dart' as k;
|
||||||
|
import 'package:nc_photos/language_util.dart' as language_util;
|
||||||
import 'package:nc_photos/metadata_task_manager.dart';
|
import 'package:nc_photos/metadata_task_manager.dart';
|
||||||
import 'package:nc_photos/pref.dart';
|
import 'package:nc_photos/pref.dart';
|
||||||
import 'package:nc_photos/snack_bar_manager.dart';
|
import 'package:nc_photos/snack_bar_manager.dart';
|
||||||
|
@ -65,6 +69,11 @@ class _SettingsState extends State<Settings> {
|
||||||
SliverList(
|
SliverList(
|
||||||
delegate: SliverChildListDelegate(
|
delegate: SliverChildListDelegate(
|
||||||
[
|
[
|
||||||
|
ListTile(
|
||||||
|
title: Text(AppLocalizations.of(context).settingsLanguageTitle),
|
||||||
|
subtitle: Text(language_util.getSelectedLanguageName(context)),
|
||||||
|
onTap: () => _onLanguageTap(context),
|
||||||
|
),
|
||||||
SwitchListTile(
|
SwitchListTile(
|
||||||
title:
|
title:
|
||||||
Text(AppLocalizations.of(context).settingsExifSupportTitle),
|
Text(AppLocalizations.of(context).settingsExifSupportTitle),
|
||||||
|
@ -128,6 +137,32 @@ class _SettingsState extends State<Settings> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onLanguageTap(BuildContext context) {
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => SimpleDialog(
|
||||||
|
children: language_util.supportedLanguages.values
|
||||||
|
.map<Widget>((lang) => SimpleDialogOption(
|
||||||
|
onPressed: () {
|
||||||
|
_log.info(
|
||||||
|
"[_onLanguageTap] Set language: ${lang.nativeName}");
|
||||||
|
Navigator.of(context).pop(lang.langId);
|
||||||
|
},
|
||||||
|
child: ListTile(
|
||||||
|
title: Text(lang.nativeName),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
).then((value) {
|
||||||
|
if (value != null) {
|
||||||
|
Pref.inst().setLanguage(value).then((_) {
|
||||||
|
KiwiContainer().resolve<EventBus>().fire(LanguageChangedEvent());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void _onExifSupportChanged(BuildContext context, bool value) {
|
void _onExifSupportChanged(BuildContext context, bool value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
showDialog(
|
showDialog(
|
||||||
|
|
Loading…
Reference in a new issue