Skip to content

Commit d1ce5fa

Browse files
committed
select language
1 parent f52d5f3 commit d1ce5fa

7 files changed

Lines changed: 111 additions & 8 deletions

File tree

lib/app.dart

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:piwigo_ng/views/image/edit_image_page.dart';
1414
import 'package:piwigo_ng/views/image/image_search_view_page.dart';
1515
import 'package:piwigo_ng/views/image/image_view_page.dart';
1616
import 'package:piwigo_ng/views/settings/privacy_policy_view_page.dart';
17+
import 'package:piwigo_ng/views/settings/select_language_view_page.dart';
1718
import 'package:piwigo_ng/views/settings/settings_view_page.dart';
1819
import 'package:piwigo_ng/views/unknown_route_page.dart';
1920
import 'package:piwigo_ng/views/upload/upload_view_page.dart';
@@ -28,7 +29,7 @@ class App extends StatelessWidget {
2829
@override
2930
Widget build(BuildContext context) {
3031
return AppProviders(
31-
builder: (themeNotifier) {
32+
builder: (localNotifier, themeNotifier) {
3233
return MaterialApp(
3334
title: 'Piwigo NG',
3435
key: appKey,
@@ -44,7 +45,9 @@ class App extends StatelessWidget {
4445
Locale('en'),
4546
Locale('de'),
4647
Locale('fr'),
48+
Locale('zh'),
4749
],
50+
locale: localNotifier.locale,
4851
themeMode: themeNotifier.isDark ? ThemeMode.dark : ThemeMode.light,
4952
darkTheme: darkTheme,
5053
theme: lightTheme,
@@ -148,6 +151,11 @@ Route<dynamic> generateRoute(RouteSettings settings) {
148151
builder: (_) => const PrivacyPolicyViewPage(),
149152
settings: settings,
150153
);
154+
case SelectLanguageViewPage.routeName:
155+
return MaterialPageRoute(
156+
builder: (_) => const SelectLanguageViewPage(),
157+
settings: settings,
158+
);
151159
default:
152160
return MaterialPageRoute(
153161
builder: (_) => UnknownRoutePage(route: settings),

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ void main() async {
1818
statusBarColor: Colors.black.withOpacity(0.1),
1919
));
2020
HttpOverrides.global = SSLHttpOverrides();
21+
appPreferences = await SharedPreferences.getInstance();
2122
runApp(const App());
2223
_clearUnusedStorage();
2324
initLocalNotifications();
2425
initializeWorkManager();
25-
appPreferences = await SharedPreferences.getInstance();
2626
}
2727

2828
void _clearUnusedStorage() async {

lib/services/app_providers.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
import 'package:flutter/material.dart';
22
import 'package:piwigo_ng/services/theme_provider.dart';
3+
import 'package:piwigo_ng/utils/LocaleProvider.dart';
34
import 'package:provider/provider.dart';
45

56
class AppProviders extends StatelessWidget {
67
const AppProviders({Key? key, required this.builder}) : super(key: key);
78

8-
final Widget Function(ThemeNotifier) builder;
9+
final Widget Function(LocaleNotifier, ThemeNotifier) builder;
910

1011
@override
1112
Widget build(BuildContext context) {
1213
return ChangeNotifierProvider(
13-
create: (_) => ThemeNotifier(),
14-
child: Consumer<ThemeNotifier>(
15-
builder: (context, themeNotifier, child) {
16-
return builder(themeNotifier);
17-
},
14+
create: (_) => LocaleNotifier(),
15+
child: ChangeNotifierProvider(
16+
create: (_) => ThemeNotifier(),
17+
child: Consumer<LocaleNotifier>(builder: (context, localNotifier, child) {
18+
return Consumer<ThemeNotifier>(
19+
builder: (context, themeNotifier, child) {
20+
return builder(localNotifier, themeNotifier);
21+
},
22+
);
23+
}),
1824
),
1925
);
2026
}

lib/utils/LocaleProvider.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import 'dart:io';
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:piwigo_ng/services/preferences_service.dart';
5+
6+
class LocaleNotifier extends ChangeNotifier {
7+
final String key = 'LOCALE';
8+
late Locale _locale;
9+
10+
LocaleNotifier() {
11+
_locale = Locale('en');
12+
_loadFromPrefs();
13+
}
14+
15+
Locale get locale => _locale;
16+
17+
changeLocale(locale) {
18+
_locale = locale;
19+
_saveToPrefs();
20+
notifyListeners();
21+
}
22+
23+
_loadFromPrefs() {
24+
_locale = Locale(appPreferences.getString(key) ?? Platform.localeName.substring(0, 1));
25+
notifyListeners();
26+
}
27+
28+
_saveToPrefs() {
29+
appPreferences.setString(key, _locale.languageCode);
30+
}
31+
}

lib/utils/themes.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ final ThemeData lightTheme = ThemeData.light().copyWith(
2525
),
2626
appBarTheme: const AppBarTheme(
2727
backgroundColor: AppColors.backgroundLight,
28+
elevation: 0.0,
29+
scrolledUnderElevation: 5.0,
2830
iconTheme: IconThemeData(
2931
color: AppColors.accent,
3032
),
@@ -167,6 +169,8 @@ final ThemeData darkTheme = ThemeData.dark().copyWith(
167169
),
168170
appBarTheme: const AppBarTheme(
169171
backgroundColor: AppColors.backgroundDark,
172+
elevation: 0.0,
173+
scrolledUnderElevation: 5.0,
170174
iconTheme: IconThemeData(
171175
color: AppColors.accent,
172176
),
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
3+
import 'package:piwigo_ng/utils/LocaleProvider.dart';
4+
import 'package:piwigo_ng/utils/localizations.dart';
5+
import 'package:provider/provider.dart';
6+
7+
class SelectLanguageViewPage extends StatefulWidget {
8+
const SelectLanguageViewPage({Key? key}) : super(key: key);
9+
10+
static const String routeName = '';
11+
12+
@override
13+
State<SelectLanguageViewPage> createState() => _SelectLanguageViewPageState();
14+
}
15+
16+
class _SelectLanguageViewPageState extends State<SelectLanguageViewPage> {
17+
late final List<Locale> _locales;
18+
19+
@override
20+
void initState() {
21+
_locales = AppLocalizations.supportedLocales;
22+
super.initState();
23+
}
24+
25+
@override
26+
Widget build(BuildContext context) {
27+
return Scaffold(
28+
appBar: AppBar(
29+
automaticallyImplyLeading: true,
30+
title: Text(appStrings.settings_language),
31+
),
32+
body: ListView.builder(
33+
itemCount: _locales.length,
34+
itemBuilder: (context, index) {
35+
Locale locale = _locales[index];
36+
return ListTile(
37+
title: Text(getLanguageFromCode(locale.languageCode)),
38+
onTap: () {
39+
final localeProvider = Provider.of<LocaleNotifier>(context, listen: false);
40+
localeProvider.changeLocale(locale);
41+
Navigator.of(context).pop();
42+
},
43+
);
44+
},
45+
),
46+
);
47+
}
48+
}

lib/views/settings/settings_view_page.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import 'package:piwigo_ng/utils/localizations.dart';
1919
import 'package:piwigo_ng/utils/settings.dart';
2020
import 'package:piwigo_ng/views/authentication/login_view_page.dart';
2121
import 'package:piwigo_ng/views/settings/privacy_policy_view_page.dart';
22+
import 'package:piwigo_ng/views/settings/select_language_view_page.dart';
2223
import 'package:provider/provider.dart';
2324
import 'package:url_launcher/url_launcher.dart';
2425

@@ -522,6 +523,11 @@ class _SettingsViewPageState extends State<SettingsViewPage> {
522523
);
523524
},
524525
),
526+
SettingsSectionItemButton(
527+
title: appStrings.settings_language,
528+
icon: const Icon(Icons.language),
529+
onPressed: () => Navigator.of(context).pushNamed(SelectLanguageViewPage.routeName),
530+
),
525531
SettingsSectionItemButton(
526532
title: appStrings.settings_translateWithCrowdin,
527533
icon: const Icon(Icons.translate),

0 commit comments

Comments
 (0)