Rename everything filcnaplo-related to refilc

This commit is contained in:
Pearoo
2023-09-19 18:16:03 +02:00
parent 151e97b243
commit d1a9625d93
669 changed files with 39799 additions and 39481 deletions

View File

@@ -0,0 +1,955 @@
import 'package:refilc/api/providers/update_provider.dart';
import 'package:refilc_kreta_api/providers/absence_provider.dart';
import 'package:refilc_kreta_api/providers/event_provider.dart';
import 'package:refilc_kreta_api/providers/exam_provider.dart';
import 'package:refilc_kreta_api/providers/grade_provider.dart';
import 'package:refilc_kreta_api/providers/homework_provider.dart';
import 'package:refilc_kreta_api/providers/message_provider.dart';
import 'package:refilc_kreta_api/providers/note_provider.dart';
import 'package:refilc_kreta_api/providers/timetable_provider.dart';
import 'package:refilc/api/providers/user_provider.dart';
import 'package:refilc/utils/format.dart';
import 'package:refilc/models/settings.dart';
import 'package:refilc/models/user.dart';
import 'package:refilc/theme/colors/colors.dart';
import 'package:refilc_kreta_api/client/client.dart';
import 'package:refilc_mobile_ui/common/action_button.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu.dart';
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart';
import 'package:refilc_mobile_ui/common/panel/panel.dart';
import 'package:refilc_mobile_ui/common/panel/panel_button.dart';
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
import 'package:refilc_mobile_ui/common/widgets/update/updates_view.dart';
import 'package:refilc_mobile_ui/premium/premium_button.dart';
import 'package:refilc_mobile_ui/screens/news/news_screen.dart';
import 'package:refilc_mobile_ui/screens/settings/accounts/account_tile.dart';
import 'package:refilc_mobile_ui/screens/settings/accounts/account_view.dart';
import 'package:refilc_mobile_ui/screens/settings/debug/subject_icon_gallery.dart';
import 'package:refilc_mobile_ui/screens/settings/privacy_view.dart';
import 'package:refilc_mobile_ui/screens/settings/settings_helper.dart';
import 'package:refilc_premium/providers/premium_provider.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_custom_tabs/flutter_custom_tabs.dart' as tabs;
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
import 'settings_screen.i18n.dart';
import 'package:flutter/services.dart';
import 'package:refilc_premium/ui/mobile/settings/nickname.dart';
import 'package:refilc_premium/ui/mobile/settings/icon_pack.dart';
class SettingsScreen extends StatefulWidget {
const SettingsScreen({Key? key}) : super(key: key);
@override
_SettingsScreenState createState() => _SettingsScreenState();
}
class _SettingsScreenState extends State<SettingsScreen>
with SingleTickerProviderStateMixin {
int devmodeCountdown = 3;
final bool __ss = false; // secret settings
late UserProvider user;
late UpdateProvider updateProvider;
late SettingsProvider settings;
late KretaClient kretaClient;
late String firstName;
List<Widget> accountTiles = [];
late AnimationController _hideContainersController;
Future<void> restore() => Future.wait([
Provider.of<GradeProvider>(context, listen: false).restore(),
Provider.of<TimetableProvider>(context, listen: false).restoreUser(),
Provider.of<ExamProvider>(context, listen: false).restore(),
Provider.of<HomeworkProvider>(context, listen: false).restore(),
Provider.of<MessageProvider>(context, listen: false).restore(),
Provider.of<NoteProvider>(context, listen: false).restore(),
Provider.of<EventProvider>(context, listen: false).restore(),
Provider.of<AbsenceProvider>(context, listen: false).restore(),
Provider.of<KretaClient>(context, listen: false).refreshLogin(),
]);
void buildAccountTiles() {
accountTiles = [];
user.getUsers().forEach((account) {
if (account.id == user.id) return;
String _firstName;
List<String> _nameParts = user.displayName?.split(" ") ?? ["?"];
if (!settings.presentationMode) {
_firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0];
} else {
_firstName = "János";
}
accountTiles.add(AccountTile(
name: Text(!settings.presentationMode ? account.name : "János",
style: const TextStyle(fontWeight: FontWeight.w500)),
username:
Text(!settings.presentationMode ? account.username : "72469696969"),
profileImage: ProfileImage(
name: _firstName,
backgroundColor: Theme.of(context)
.colorScheme
.primary, //!settings.presentationMode
//? ColorUtils.stringToColor(account.name)
//: Theme.of(context).colorScheme.secondary,
role: account.role,
),
onTap: () {
user.setUser(account.id);
restore().then((_) => user.setUser(account.id));
Navigator.of(context).pop();
},
onTapMenu: () => _showBottomSheet(account),
));
});
}
void _showBottomSheet(User u) {
showBottomSheetMenu(context, items: [
BottomSheetMenuItem(
onPressed: () => AccountView.show(u, context: context),
icon: const Icon(FeatherIcons.user),
title: Text("personal_details".i18n),
),
BottomSheetMenuItem(
onPressed: () => _openDKT(u),
icon: Icon(FeatherIcons.grid, color: AppColors.of(context).teal),
title: Text("open_dkt".i18n),
),
UserMenuNickname(u),
// BottomSheetMenuItem(
// onPressed: () {},
// icon: Icon(FeatherIcons.camera),
// title: Text("edit_profile_picture".i18n),
// ),
// BottomSheetMenuItem(
// onPressed: () {},
// icon: Icon(FeatherIcons.trash2, color: AppColors.of(context).red),
// title: Text("remove_profile_picture".i18n),
// ),
]);
}
void _openDKT(User u) => tabs.launch(
"https://dkttanulo.e-kreta.hu/sso?id_token=${kretaClient.idToken}",
customTabsOption: tabs.CustomTabsOption(
toolbarColor: Theme.of(context).scaffoldBackgroundColor,
showPageTitle: true,
));
@override
void initState() {
super.initState();
_hideContainersController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200));
}
@override
Widget build(BuildContext context) {
user = Provider.of<UserProvider>(context);
settings = Provider.of<SettingsProvider>(context);
updateProvider = Provider.of<UpdateProvider>(context);
kretaClient = Provider.of<KretaClient>(context);
List<String> nameParts = user.displayName?.split(" ") ?? ["?"];
if (!settings.presentationMode) {
firstName = nameParts.length > 1 ? nameParts[1] : nameParts[0];
} else {
firstName = "János";
}
String startPageTitle =
SettingsHelper.localizedPageTitles()[settings.startPage] ?? "?";
String themeModeText = {
ThemeMode.light: "light".i18n,
ThemeMode.dark: "dark".i18n,
ThemeMode.system: "system".i18n
}[settings.theme] ??
"?";
String languageText = SettingsHelper.langMap[settings.language] ?? "?";
String vibrateTitle = {
VibrationStrength.off: "voff".i18n,
VibrationStrength.light: "vlight".i18n,
VibrationStrength.medium: "vmedium".i18n,
VibrationStrength.strong: "vstrong".i18n,
}[settings.vibrate] ??
"?";
buildAccountTiles();
if (settings.developerMode) devmodeCountdown = -1;
return Scaffold(
body: Padding(
padding: const EdgeInsets.only(top: 11.5),
child: CustomScrollView(
slivers: [
SliverAppBar(
pinned: true,
floating: true,
snap: false,
centerTitle: false,
title: const Text("Settings"),
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
),
SliverToBoxAdapter(
child: AnimatedBuilder(
animation: _hideContainersController,
builder: (context, child) => Opacity(
opacity: 1 - _hideContainersController.value,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
StaggeredGrid.extent(
// direction: Axis.horizontal,
// crossAxisCount: 3,
maxCrossAxisExtent: 600,
children: [
const SizedBox(height: 32.0),
// Updates
if (updateProvider.available)
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
child: PanelButton(
onPressed: () => _openUpdates(context),
title: Text("update_available".i18n),
leading: const Icon(FeatherIcons.download),
trailing: Text(
updateProvider.releases.first.tag,
style: TextStyle(
fontWeight: FontWeight.w500,
color: Theme.of(context)
.colorScheme
.secondary,
),
),
),
),
),
),
// const Padding(
// padding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
// child: PremiumBannerButton(),
// ),
if (!Provider.of<PremiumProvider>(context).hasPremium)
const ClipRect(
child: Padding(
padding: EdgeInsets.symmetric(vertical: 12.0),
child: PremiumButton(),
),
),
// General Settings
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("general".i18n),
child: Column(
children: [
PanelButton(
onPressed: () {
SettingsHelper.language(context);
setState(() {});
},
title: Text("language".i18n),
leading: const Icon(FeatherIcons.globe),
trailing: Text(languageText),
),
PanelButton(
onPressed: () {
SettingsHelper.startPage(context);
setState(() {});
},
title: Text("startpage".i18n),
leading: const Icon(FeatherIcons.play),
trailing: Text(startPageTitle.capital()),
),
PanelButton(
onPressed: () {
SettingsHelper.rounding(context);
setState(() {});
},
title: Text("rounding".i18n),
leading:
const Icon(FeatherIcons.gitCommit),
trailing: Text((settings.rounding / 10)
.toStringAsFixed(1)),
),
PanelButton(
onPressed: () {
SettingsHelper.vibrate(context);
setState(() {});
},
title: Text("vibrate".i18n),
leading: const Icon(FeatherIcons.radio),
trailing: Text(vibrateTitle),
),
PanelButton(
padding:
const EdgeInsets.only(left: 14.0),
onPressed: () {
SettingsHelper.bellDelay(context);
setState(() {});
},
title: Text(
"bell_delay".i18n,
style: TextStyle(
color: AppColors.of(context)
.text
.withOpacity(
settings.bellDelayEnabled
? 1.0
: .5)),
),
leading: settings.bellDelayEnabled
? const Icon(FeatherIcons.bell)
: Icon(FeatherIcons.bellOff,
color: AppColors.of(context)
.text
.withOpacity(.25)),
trailingDivider: true,
trailing: Switch(
onChanged: (v) => settings.update(
bellDelayEnabled: v),
value: settings.bellDelayEnabled,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
],
),
),
),
),
if (kDebugMode)
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Debug"),
child: Column(
children: [
PanelButton(
title:
const Text("Subject Icon Gallery"),
leading: const Icon(CupertinoIcons
.rectangle_3_offgrid_fill),
trailing:
const Icon(Icons.arrow_forward),
onPressed: () {
Navigator.of(context,
rootNavigator: true)
.push(
CupertinoPageRoute(
builder: (context) =>
const SubjectIconGallery()),
);
},
)
],
),
),
),
),
// Secret Settings
if (__ss)
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("secret".i18n),
child: Column(
children: [
// Good student mode
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Text("goodstudent".i18n,
style: const TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) {
if (v) {
showDialog(
context: context,
builder: (context) =>
WillPopScope(
onWillPop: () async => false,
child: AlertDialog(
shape:
RoundedRectangleBorder(
borderRadius:
BorderRadius
.circular(
12.0)),
title:
Text("attention".i18n),
content: Text(
"goodstudent_disclaimer"
.i18n),
actions: [
ActionButton(
label:
"understand".i18n,
onTap: () {
Navigator.of(
context)
.pop();
settings.update(
goodStudent: v);
Provider.of<GradeProvider>(
context,
listen:
false)
.fetch();
})
],
),
),
);
} else {
settings.update(goodStudent: v);
Provider.of<GradeProvider>(
context,
listen: false)
.fetch();
}
},
value: settings.goodStudent,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
// Presentation mode
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Presentation Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(
presentationMode: v),
value: settings.presentationMode,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
],
),
),
),
),
// Theme Settings
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("appearance".i18n),
child: Column(
children: [
PanelButton(
onPressed: () {
SettingsHelper.theme(context);
setState(() {});
},
title: Text("theme".i18n),
leading: const Icon(FeatherIcons.sun),
trailing: Text(themeModeText),
),
PanelButton(
onPressed: () async {
await _hideContainersController
.forward();
SettingsHelper.accentColor(context);
setState(() {});
_hideContainersController.reset();
},
title: Text("color".i18n),
leading: const Icon(FeatherIcons.droplet),
trailing: Container(
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.secondary,
shape: BoxShape.circle,
),
),
),
PanelButton(
onPressed: () {
SettingsHelper.gradeColors(context);
setState(() {});
},
title: Text("grade_colors".i18n),
leading: const Icon(FeatherIcons.star),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: List.generate(
5,
(i) => Container(
margin: const EdgeInsets.only(
left: 2.0),
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: settings.gradeColors[i],
),
),
),
),
),
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
FeatherIcons.barChart,
color: settings.graphClassAvg
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
child: Text(
"graph_class_avg".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16.0,
color: AppColors.of(context)
.text
.withOpacity(
settings.graphClassAvg
? 1.0
: .5),
),
),
),
],
),
onChanged: (v) =>
settings.update(graphClassAvg: v),
value: settings.graphClassAvg,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
const PremiumIconPackSelector(),
],
),
),
),
),
// Notifications
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("notifications".i18n),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
Icons.newspaper_outlined,
color: settings.newsEnabled
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
child: Text(
"news".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16.0,
color: AppColors.of(context)
.text
.withOpacity(
settings.newsEnabled
? 1.0
: .5),
),
),
),
],
),
onChanged: (v) =>
settings.update(newsEnabled: v),
value: settings.newsEnabled,
activeColor:
Theme.of(context).colorScheme.secondary,
),
),
),
),
),
// Extras
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("extras".i18n),
child: Column(children: [
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: Row(
children: [
Icon(
FeatherIcons.gift,
color: settings.gradeOpeningFun
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
const SizedBox(width: 24.0),
Expanded(
child: Text(
"surprise_grades".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16.0,
color: AppColors.of(context)
.text
.withOpacity(
settings.gradeOpeningFun
? 1.0
: .5),
),
),
),
],
),
onChanged: (v) =>
settings.update(gradeOpeningFun: v),
value: settings.gradeOpeningFun,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
]),
),
),
),
// About
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: Text("about".i18n),
child: Column(children: [
PanelButton(
leading: const Icon(FeatherIcons.atSign),
title: const Text("Discord"),
onPressed: () => launchUrl(
Uri.parse("https://refilc.hu/discord"),
mode: LaunchMode.externalApplication),
),
PanelButton(
leading: const Icon(FeatherIcons.globe),
title: const Text("www.refilc.hu"),
onPressed: () => launchUrl(
Uri.parse("https://refilc.hu"),
mode: LaunchMode.externalApplication),
),
PanelButton(
leading: const Icon(FeatherIcons.github),
title: const Text("Github"),
onPressed: () => launchUrl(
Uri.parse("https://github.com/filc"),
mode: LaunchMode.externalApplication),
),
PanelButton(
leading: const Icon(FeatherIcons.mail),
title: Text("news".i18n),
onPressed: () => _openNews(context),
),
PanelButton(
leading: const Icon(FeatherIcons.lock),
title: Text("privacy".i18n),
onPressed: () => _openPrivacy(context),
),
PanelButton(
leading: const Icon(FeatherIcons.award),
title: Text("licenses".i18n),
onPressed: () =>
showLicensePage(context: context),
),
Tooltip(
message: "data_collected".i18n,
padding: const EdgeInsets.all(4.0),
textStyle: TextStyle(
fontWeight: FontWeight.w500,
color: AppColors.of(context).text),
decoration: BoxDecoration(
color: Theme.of(context)
.colorScheme
.background),
child: Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
secondary: Icon(
FeatherIcons.barChart2,
color: settings.xFilcId != "none"
? Theme.of(context)
.colorScheme
.secondary
: AppColors.of(context)
.text
.withOpacity(.25),
),
title: Text(
"Analytics".i18n,
style: TextStyle(
fontWeight: FontWeight.w600,
fontSize: 16.0,
color: AppColors.of(context)
.text
.withOpacity(
settings.xFilcId != "none"
? 1.0
: .5),
),
),
subtitle: Text(
"Anonymous Usage Analytics".i18n,
style: TextStyle(
color: AppColors.of(context)
.text
.withOpacity(
settings.xFilcId != "none"
? .5
: .2),
),
),
onChanged: (v) {
String newId;
if (v == false) {
newId = "none";
} else if (settings.xFilcId ==
"none") {
newId = SettingsProvider
.defaultSettings()
.xFilcId;
} else {
newId = settings.xFilcId;
}
settings.update(xFilcId: newId);
},
value: settings.xFilcId != "none",
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
),
]),
),
),
),
if (settings.developerMode)
Container(
constraints: const BoxConstraints(maxWidth: 500),
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 12.0, horizontal: 24.0),
child: Panel(
title: const Text("Developer Settings"),
child: Column(
children: [
Material(
type: MaterialType.transparency,
child: SwitchListTile(
contentPadding:
const EdgeInsets.only(left: 12.0),
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(12.0)),
title: const Text("Developer Mode",
style: TextStyle(
fontWeight: FontWeight.w500)),
onChanged: (v) => settings.update(
developerMode: false),
value: settings.developerMode,
activeColor: Theme.of(context)
.colorScheme
.secondary,
),
),
PanelButton(
leading: const Icon(FeatherIcons.copy),
title: const Text("Copy JWT"),
onPressed: () => Clipboard.setData(
ClipboardData(
text: Provider.of<KretaClient>(
context,
listen: false)
.accessToken!)),
),
// if (Provider.of<PremiumProvider>(context,
// listen: false)
// .hasPremium)
// PanelButton(
// leading: const Icon(FeatherIcons.key),
// title: const Text("Remove Premium"),
// onPressed: () {
// Provider.of<PremiumProvider>(
// context,
// listen: false)
// .activate(removePremium: true);
// settings.update(
// accentColor: AccentColor.filc,
// store: true);
// Provider.of<ThemeModeObserver>(
// context,
// listen: false)
// .changeTheme(settings.theme);
// },
// ),
],
),
),
),
),
],
),
const SizedBox(
height: 40,
),
SafeArea(
top: false,
child: Center(
child: GestureDetector(
child: const Panel(
title: Text("v" +
String.fromEnvironment("APPVER",
defaultValue: "?"))),
onTap: () {
if (devmodeCountdown > 0) {
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(
duration: const Duration(milliseconds: 200),
content: Text(
"You are $devmodeCountdown taps away from Developer Mode."),
));
setState(() => devmodeCountdown--);
} else if (devmodeCountdown == 0) {
ScaffoldMessenger.of(context)
.showSnackBar(const SnackBar(
content: Text(
"Developer Mode successfully activated."),
));
settings.update(developerMode: true);
setState(() => devmodeCountdown--);
}
},
),
),
),
],
),
),
),
),
],
),
),
);
}
void _openNews(BuildContext context) =>
Navigator.of(context, rootNavigator: true)
.push(CupertinoPageRoute(builder: (context) => const NewsScreen()));
void _openUpdates(BuildContext context) =>
UpdateView.show(updateProvider.releases.first, context: context);
void _openPrivacy(BuildContext context) => PrivacyView.show(context);
}

View File

@@ -0,0 +1,188 @@
import 'package:i18n_extension/i18n_extension.dart';
extension SettingsLocalization on String {
static final _t = Translations.byLocale("hu_hu") +
{
"en_en": {
"personal_details": "Personal Details",
"open_dkt": "Open DKT",
"edit_nickname": "Edit Nickname",
"edit_profile_picture": "Edit Profile Picture",
"remove_profile_picture": "Remove Profile Picture",
"light": "Light",
"dark": "Dark",
"system": "System",
"add_user": "Add User",
"log_out": "Log Out",
"update_available": "Update Available",
"general": "General",
"language": "Language",
"startpage": "Startpage",
"rounding": "Rounding",
"appearance": "Appearance",
"theme": "Theme",
"color": "Color",
"grade_colors": "Grade Colors",
"notifications": "Notifications",
"news": "News",
"extras": "Extras",
"about": "About",
"supporters": "Supporters",
"privacy": "Privacy Policy",
"licenses": "Licenses",
"vibrate": "Vibration",
"voff": "Off",
"vlight": "Light",
"vmedium": "Medium",
"vstrong": "Strong",
"cancel": "Cancel",
"done": "Done",
"reset": "Reset",
"open": "Open",
"data_collected": "Data collected: Platform (eg. Android), App version (eg. 3.0.0), Unique Install Identifier",
"Analytics": "Analytics",
"Anonymous Usage Analytics": "Anonymous Usage Analytics",
"graph_class_avg": "Class average on graph",
"goodstudent": "Good student mode",
"attention": "Attention!",
"goodstudent_disclaimer":
"reFilc can not be held liable for the usage of this feature.\n\n(if your mother beats you up because you showed her fake grades, you can only blame yourself for it)",
"understand": "I understand",
"secret": "Secret Settings",
"bell_delay": "Bell Delay",
"delay": "Delay",
"hurry": "Hurry",
"sync": "Synchronize",
"sync_help": "Press the Synchronize button when the bell rings.",
"surprise_grades": "Surprise Grades",
"icon_pack": "Icon Pack",
"change_username": "Set a nickname",
"Accent Color": "Accent Color",
"Background Color": "Background Color",
"Highlight Color": "Highlight Color",
"Adaptive Theme": "Adaptive Theme",
},
"hu_hu": {
"personal_details": "Személyes információk",
"open_dkt": "DKT megnyitása",
"edit_nickname": "Becenév szerkesztése",
"edit_profile_picture": "Profil-kép szerkesztése",
"remove_profile_picture": "Profil-kép törlése",
"light": "Világos",
"dark": "Sötét",
"system": "Rendszer",
"add_user": "Felhasználó hozzáadása",
"log_out": "Kijelentkezés",
"update_available": "Frissítés elérhető",
"general": "Általános",
"language": "Nyelv",
"startpage": "Kezdőlap",
"rounding": "Kerekítés",
"appearance": "Kinézet",
"theme": "Téma",
"color": "Színek",
"grade_colors": "Jegyek színei",
"notifications": "Értesítések",
"news": "Hírek",
"extras": "Extrák",
"about": "Névjegy",
"supporters": "Támogatók",
"privacy": "Adatvédelmi irányelvek",
"licenses": "Licenszek",
"vibrate": "Rezgés",
"voff": "Kikapcsolás",
"vlight": "Alacsony",
"vmedium": "Közepes",
"vstrong": "Erős",
"cancel": "Mégsem",
"done": "Kész",
"reset": "Visszaállítás",
"open": "Megnyitás",
"data_collected": "Gyűjtött adat: Platform (pl. Android), App verzió (pl. 3.0.0), Egyedi telepítési azonosító",
"Analytics": "Analitika",
"Anonymous Usage Analytics": "Névtelen használati analitika",
"graph_class_avg": "Osztályátlag a grafikonon",
"goodstudent": "Jó tanuló mód",
"attention": "Figyelem!",
"goodstudent_disclaimer":
"A reFilc minden felelősséget elhárít a funkció használatával kapcsolatban.\n\n(Értsd: ha az anyád megver, mert megtévesztő ábrákat mutattál neki, azért csakis magadadat hibáztathatod.)",
"understand": "Értem",
"secret": "Titkos Beállítások",
"bell_delay": "Csengő eltolódása",
"delay": "Késleltetés",
"hurry": "Siettetés",
"sync": "Szinkronizálás",
"sync_help": "Csengetéskor nyomd meg a Szinkronizálás gombot.",
"surprise_grades": "Meglepetés jegyek",
"icon_pack": "Ikon séma",
"change_username": "Becenév beállítása",
"Accent Color": "Egyedi szín",
"Background Color": "Háttér színe",
"Highlight Color": "Panelek színe",
"Adaptive Theme": "Adaptív téma",
},
"de_de": {
"personal_details": "Persönliche Angaben",
"open_dkt": "Öffnen DKT",
"edit_nickname": "Spitznamen bearbeiten",
"edit_profile_picture": "Profilbild bearbeiten",
"remove_profile_picture": "Profilbild entfernen",
"light": "Licht",
"dark": "Dunkel",
"system": "System",
"add_user": "Benutzer hinzufügen",
"log_out": "Abmelden",
"update_available": "Update verfügbar",
"general": "Allgemein",
"language": "Sprache",
"startpage": "Startseite",
"rounding": "Rundung",
"appearance": "Erscheinungsbild",
"theme": "Thema",
"color": "Farbe",
"grade_colors": "Grad Farben",
"notifications": "Benachrichtigungen",
"news": "Nachrichten",
"extras": "Extras",
"about": "Informationen",
"supporters": "Unterstützer",
"privacy": "Datenschutzbestimmungen",
"licenses": "Lizenzen",
"vibrate": "Vibration",
"voff": "Aus",
"vlight": "Leicht",
"vmedium": "Mittel",
"vstrong": "Stark",
"cancel": "Abbrechen",
"done": "Fertig",
"reset": "Zurücksetzen",
"open": "Öffnen",
"data_collected": "Erhobene Daten: Plattform (z.B. Android), App version (z.B. 3.0.0), Eindeutige Installationskennung",
"Analytics": "Analytik",
"Anonymous Usage Analytics": "Anonyme Nutzungsanalyse",
"graph_class_avg": "Klassendurchschnitt in der Grafik",
"goodstudent": "Guter Student Modus",
"attention": "Achtung!",
"goodstudent_disclaimer": "Same in English.",
"understand": "Ich verstehe",
"secret": "Geheime Einstellungen",
"bell_delay": "Klingelverzögerung",
"delay": "Verzögern",
"hurry": "Eile",
"sync": "Synchronisieren",
"sync_help": "Drücken Sie die Sync-Taste, wenn die Glocke läutet.",
"surprise_grades": "Überraschungsnoten",
"icon_pack": "Icon-Pack",
"change_username": "Einen Spitznamen festlegen",
"Accent Color": "Accent Color",
"Background Color": "Background Color",
"Highlight Color": "Highlight Color",
"Adaptive Theme": "Adaptive Theme",
},
};
String get i18n => localize(this, _t);
String fill(List<Object> params) => localizeFill(this, params);
String plural(int value) => localizePlural(value, this, _t);
String version(Object modifier) => localizeVersion(modifier, this, _t);
}