ente/lib/ui/settings/language_picker.dart

173 lines
4.7 KiB
Dart
Raw Normal View History

2023-04-07 12:10:47 +00:00
import 'package:ente_auth/l10n/l10n.dart';
import 'package:ente_auth/theme/ente_theme.dart';
import 'package:ente_auth/ui/components/captioned_text_widget.dart';
import 'package:ente_auth/ui/components/divider_widget.dart';
import 'package:ente_auth/ui/components/menu_item_widget.dart';
import 'package:ente_auth/ui/components/separators.dart';
import 'package:ente_auth/ui/components/title_bar_title_widget.dart';
import 'package:ente_auth/ui/components/title_bar_widget.dart';
2023-04-08 04:53:55 +00:00
import 'package:flutter/foundation.dart';
2023-04-07 12:10:47 +00:00
import 'package:flutter/material.dart';
2023-04-08 04:53:55 +00:00
class LanguageSelectorPage extends StatelessWidget {
2023-04-07 12:10:47 +00:00
final List<Locale> supportedLocales;
final ValueChanged<Locale> onLocaleChanged;
final Locale currentLocale;
2023-04-08 04:53:55 +00:00
const LanguageSelectorPage(
2023-04-07 12:10:47 +00:00
this.supportedLocales,
this.onLocaleChanged,
this.currentLocale, {
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
final l10n = context.l10n;
return Scaffold(
body: CustomScrollView(
primary: false,
slivers: <Widget>[
TitleBarWidget(
flexibleSpaceTitle: TitleBarTitleWidget(
title: l10n.selectLanguage,
),
),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
return Padding(
padding: const EdgeInsets.symmetric(
horizontal: 16,
vertical: 20,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ClipRRect(
borderRadius:
const BorderRadius.all(Radius.circular(8)),
child: ItemsWidget(
supportedLocales,
onLocaleChanged,
currentLocale,
),
),
// MenuSectionDescriptionWidget(
// content: S.of(context).maxDeviceLimitSpikeHandling(50),
// )
],
),
);
},
childCount: 1,
),
),
const SliverPadding(padding: EdgeInsets.symmetric(vertical: 12)),
],
),
);
}
}
class ItemsWidget extends StatefulWidget {
final List<Locale> supportedLocales;
final ValueChanged<Locale> onLocaleChanged;
final Locale currentLocale;
const ItemsWidget(
this.supportedLocales,
this.onLocaleChanged,
this.currentLocale, {
Key? key,
}) : super(key: key);
@override
State<ItemsWidget> createState() => _ItemsWidgetState();
}
class _ItemsWidgetState extends State<ItemsWidget> {
2023-04-08 04:53:55 +00:00
late Locale currentLocale;
2023-04-07 12:10:47 +00:00
List<Widget> items = [];
@override
void initState() {
2023-04-08 04:53:55 +00:00
currentLocale = widget.currentLocale;
2023-04-07 12:10:47 +00:00
super.initState();
}
@override
Widget build(BuildContext context) {
items.clear();
2023-04-08 04:53:55 +00:00
for (Locale locale in widget.supportedLocales) {
2023-04-07 12:10:47 +00:00
items.add(
2023-04-08 04:53:55 +00:00
_menuItemForPicker(locale),
2023-04-07 12:10:47 +00:00
);
}
items = addSeparators(
items,
DividerWidget(
dividerType: DividerType.menuNoIcon,
bgColor: getEnteColorScheme(context).fillFaint,
),
);
return Column(
mainAxisSize: MainAxisSize.min,
children: items,
);
}
2023-04-08 04:53:55 +00:00
String _getLanguageName(Locale locale) {
switch (locale.languageCode) {
case 'en':
return 'English';
case 'es':
return 'Español';
case 'fr':
return 'Français';
case 'de':
return 'Deutsch';
case 'it':
return 'Italiano';
case 'pt':
return 'Português';
case 'ru':
return 'Русский';
case 'tr':
return 'Türkçe';
case 'fi':
return 'Suomi';
case 'zh':
return '中文';
case 'ja':
return '日本語';
case 'ko':
return '한국어';
case 'ar':
return 'العربية';
default:
return locale.languageCode;
}
}
2023-04-07 12:10:47 +00:00
Widget _menuItemForPicker(Locale locale) {
return MenuItemWidget(
key: ValueKey(locale.toString()),
menuItemColor: getEnteColorScheme(context).fillFaint,
captionedTextWidget: CaptionedTextWidget(
2023-04-08 04:53:55 +00:00
title: _getLanguageName(locale) + (kDebugMode ? ' ($locale)' : ''),
2023-04-07 12:10:47 +00:00
),
2023-04-08 04:53:55 +00:00
trailingIcon: currentLocale == locale ? Icons.check : null,
2023-04-07 12:10:47 +00:00
alignCaptionedTextToLeft: true,
isTopBorderRadiusRemoved: true,
isBottomBorderRadiusRemoved: true,
showOnlyLoadingState: true,
onTap: () async {
widget.onLocaleChanged(locale);
2023-04-08 04:53:55 +00:00
currentLocale = locale;
2023-04-07 12:10:47 +00:00
setState(() {});
},
);
}
}