This commit is contained in:
rang 2026-01-08 17:49:30 +08:00
parent edd5a01482
commit eef72c6aa6
13 changed files with 1341 additions and 1012 deletions

View file

@ -1,6 +1,5 @@
import 'dart:math'; import 'dart:math';
import 'package:animated_theme_switcher/animated_theme_switcher.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -8,9 +7,11 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:vaani/api/library_item_provider.dart'; import 'package:vaani/api/library_item_provider.dart';
import 'package:vaani/features/item_viewer/view/library_item_sliver_app_bar.dart'; import 'package:vaani/features/item_viewer/view/library_item_sliver_app_bar.dart';
import 'package:vaani/features/player/view/mini_player_bottom_padding.dart'; import 'package:vaani/features/player/view/mini_player_bottom_padding.dart';
import 'package:vaani/features/settings/app_settings_provider.dart';
import 'package:vaani/generated/l10n.dart'; import 'package:vaani/generated/l10n.dart';
import 'package:vaani/router/models/library_item_extras.dart'; import 'package:vaani/router/models/library_item_extras.dart';
import 'package:vaani/shared/widgets/expandable_description.dart'; import 'package:vaani/shared/widgets/expandable_description.dart';
import 'package:vaani/theme/providers/system_theme_provider.dart';
import 'library_item_actions.dart'; import 'library_item_actions.dart';
import 'library_item_hero_section.dart'; import 'library_item_hero_section.dart';
@ -32,6 +33,23 @@ class LibraryItemPage extends HookConsumerWidget {
extra is LibraryItemExtras ? extra as LibraryItemExtras : null; extra is LibraryItemExtras ? extra as LibraryItemExtras : null;
final scrollController = useScrollController(); final scrollController = useScrollController();
final showFab = useState(false); final showFab = useState(false);
final themeSettings =
ref.watch(appSettingsProvider.select((v) => v.themeSettings));
var currentTheme = Theme.of(context);
if (themeSettings.useMaterialThemeOnItemPage) {
final theme = ref.watch(
CurrentThemeProvider(
highContrast: MediaQuery.of(context).highContrast,
id: itemId,
),
);
if (currentTheme.brightness == Brightness.dark) {
currentTheme = theme.$2;
} else {
currentTheme = theme.$1;
}
}
// Effect to listen to scroll changes and update FAB visibility // Effect to listen to scroll changes and update FAB visibility
useEffect( useEffect(
@ -72,65 +90,62 @@ class LibraryItemPage extends HookConsumerWidget {
} }
} }
return ThemeProvider( return Theme(
initTheme: Theme.of(context), data: currentTheme,
duration: 200.ms, child: Scaffold(
child: ThemeSwitchingArea( floatingActionButton: AnimatedSwitcher(
child: Scaffold( duration: 250.ms,
floatingActionButton: AnimatedSwitcher( // A common transition for FABs (fade + scale)
duration: 250.ms, transitionBuilder: (Widget child, Animation<double> animation) {
// A common transition for FABs (fade + scale) return ScaleTransition(
transitionBuilder: (Widget child, Animation<double> animation) { scale: animation,
return ScaleTransition( child: FadeTransition(
scale: animation, opacity: animation,
child: FadeTransition( child: child,
opacity: animation, ),
child: child, );
},
child: showFab.value
? FloatingActionButton(
// Key is important for AnimatedSwitcher to differentiate
key: const ValueKey('fab-scroll-top'),
onPressed: scrollToTop,
tooltip: 'Scroll to top',
child: const Icon(Icons.arrow_upward),
)
: const SizedBox.shrink(
key: ValueKey('fab-empty'),
), ),
); ),
}, body: CustomScrollView(
child: showFab.value controller: scrollController,
? FloatingActionButton( slivers: [
// Key is important for AnimatedSwitcher to differentiate LibraryItemSliverAppBar(
key: const ValueKey('fab-scroll-top'), id: itemId,
onPressed: scrollToTop, scrollController: scrollController,
tooltip: 'Scroll to top', ),
child: const Icon(Icons.arrow_upward), SliverPadding(
) padding: const EdgeInsets.all(8),
: const SizedBox.shrink( sliver: LibraryItemHeroSection(
key: ValueKey('fab-empty'), itemId: itemId,
), extraMap: additionalItemData,
),
body: CustomScrollView(
controller: scrollController,
slivers: [
LibraryItemSliverAppBar(
id: itemId,
scrollController: scrollController,
), ),
SliverPadding( ),
padding: const EdgeInsets.all(8), // a horizontal display with dividers of metadata
sliver: LibraryItemHeroSection( SliverToBoxAdapter(
itemId: itemId, child: LibraryItemMetadata(id: itemId),
extraMap: additionalItemData, ),
), // a row of actions like play, download, share, etc
), SliverToBoxAdapter(
// a horizontal display with dividers of metadata child: LibraryItemActions(id: itemId),
SliverToBoxAdapter( ),
child: LibraryItemMetadata(id: itemId), // a expandable section for book description
), SliverToBoxAdapter(
// a row of actions like play, download, share, etc child: LibraryItemDescription(id: itemId),
SliverToBoxAdapter( ),
child: LibraryItemActions(id: itemId), // a padding at the bottom to make sure the last item is not hidden by mini player
), const SliverToBoxAdapter(child: MiniPlayerBottomPadding()),
// a expandable section for book description ],
SliverToBoxAdapter(
child: LibraryItemDescription(id: itemId),
),
// a padding at the bottom to make sure the last item is not hidden by mini player
const SliverToBoxAdapter(child: MiniPlayerBottomPadding()),
],
),
), ),
), ),
); );

View file

@ -2,6 +2,7 @@ import 'dart:math';
import 'package:audio_video_progress_bar/audio_video_progress_bar.dart'; import 'package:audio_video_progress_bar/audio_video_progress_bar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shelfsdk/audiobookshelf_api.dart'; import 'package:shelfsdk/audiobookshelf_api.dart';
import 'package:vaani/constants/sizes.dart'; import 'package:vaani/constants/sizes.dart';
@ -29,6 +30,7 @@ class PlayerExpandedDesktop extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
// final textTheme = Theme.of(context).textTheme;
final book = ref.watch(currentBookProvider); final book = ref.watch(currentBookProvider);
if (book == null) { if (book == null) {
return SizedBox.shrink(); return SizedBox.shrink();
@ -116,7 +118,16 @@ class PlayerExpandedDesktop extends HookConsumerWidget {
timeLabelLocation: TimeLabelLocation.sides, timeLabelLocation: TimeLabelLocation.sides,
), ),
), ),
Container(child: _buildBottom()), MouseRegion(
cursor: SystemMouseCursors.click, //
child: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
context.pop();
},
child: _buildBottom(),
),
),
], ],
), ),
], ],
@ -125,11 +136,15 @@ class PlayerExpandedDesktop extends HookConsumerWidget {
Widget _buildBottom() { Widget _buildBottom() {
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.center, // mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Spacer(), Expanded(
flex: 1,
child: Row(),
),
Expanded( Expanded(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
const AudiobookPlayerSeekChapterButton(isForward: false), const AudiobookPlayerSeekChapterButton(isForward: false),
const AudiobookPlayerSeekButton(isForward: false), const AudiobookPlayerSeekButton(isForward: false),
@ -141,6 +156,7 @@ class PlayerExpandedDesktop extends HookConsumerWidget {
), ),
), ),
Expanded( Expanded(
flex: 1,
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [

View file

@ -6,12 +6,11 @@ import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart'; import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:vaani/generated/l10n.dart';
import 'package:vaani/features/settings/app_settings_provider.dart'; import 'package:vaani/features/settings/app_settings_provider.dart';
import 'package:vaani/features/settings/view/buttons.dart'; import 'package:vaani/features/settings/view/buttons.dart';
import 'package:vaani/features/settings/view/simple_settings_page.dart'; import 'package:vaani/features/settings/view/simple_settings_page.dart';
import 'package:vaani/generated/l10n.dart';
import 'package:vaani/globals.dart'; import 'package:vaani/globals.dart';
import 'package:vaani/shared/extensions/duration_format.dart';
class DownloadSettingsPage extends HookConsumerWidget { class DownloadSettingsPage extends HookConsumerWidget {
const DownloadSettingsPage({ const DownloadSettingsPage({
@ -22,7 +21,7 @@ class DownloadSettingsPage extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final appSettings = ref.watch(appSettingsProvider); final appSettings = ref.watch(appSettingsProvider);
final downloadSettings = appSettings.downloadSettings; final downloadSettings = appSettings.downloadSettings;
final primaryColor = Theme.of(context).colorScheme.primary; // final primaryColor = Theme.of(context).colorScheme.primary;
return SimpleSettingsPage( return SimpleSettingsPage(
title: Text(S.of(context).playerSettings), title: Text(S.of(context).playerSettings),

View file

@ -91,7 +91,7 @@ class PlayerSettingsPage extends HookConsumerWidget {
if (newSpeedOptions != null) { if (newSpeedOptions != null) {
ref.read(appSettingsProvider.notifier).update( ref.read(appSettingsProvider.notifier).update(
appSettings.copyWith.playerSettings( appSettings.copyWith.playerSettings(
speedOptions: newSpeedOptions..sort(), speedOptions: [...newSpeedOptions]..sort(),
), ),
); );
} }

View file

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_settings_ui/flutter_settings_ui.dart'; import 'package:flutter_settings_ui/flutter_settings_ui.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:vaani/features/player/view/mini_player_bottom_padding.dart';
class SimpleSettingsPage extends HookConsumerWidget { class SimpleSettingsPage extends HookConsumerWidget {
const SimpleSettingsPage({ const SimpleSettingsPage({
@ -15,30 +14,43 @@ class SimpleSettingsPage extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final colorScheme = Theme.of(context).colorScheme;
return Scaffold( return Scaffold(
// appBar: AppBar( appBar: AppBar(
// title: title, title: title,
// ), ),
// body: body, // body: body,
// an app bar which is bigger than the default app bar but on scroll shrinks to the default app bar with the title being animated // an app bar which is bigger than the default app bar but on scroll shrinks to the default app bar with the title being animated
body: CustomScrollView( body: CustomScrollView(
slivers: [ slivers: [
SliverAppBar( // SliverAppBar(
expandedHeight: 200.0, // expandedHeight: 100.0,
floating: false, // floating: false,
pinned: true, // pinned: true,
flexibleSpace: FlexibleSpaceBar( // flexibleSpace: FlexibleSpaceBar(
title: title, // title: title,
// background: Theme.of(context).primaryColor, // // background: Theme.of(context).primaryColor,
), // ),
), // ),
if (sections != null) if (sections != null)
SliverList( SliverList(
delegate: SliverChildListDelegate( delegate: SliverChildListDelegate(
[ [
ClipRRect( ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(20)), // borderRadius: const BorderRadius.all(Radius.circular(20)),
child: SettingsList( child: SettingsList(
lightTheme: SettingsThemeData(
settingsListBackground: colorScheme.surface,
settingsSectionBackground: colorScheme.surfaceContainer,
// inactiveTitleColor:
// trailingTextColor: colorScheme.primary,
// settingsTileTextColor:
),
darkTheme: SettingsThemeData(
settingsListBackground: colorScheme.surface,
settingsSectionBackground: colorScheme.surfaceContainer,
),
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
sections: sections!, sections: sections!,
@ -48,7 +60,7 @@ class SimpleSettingsPage extends HookConsumerWidget {
), ),
), ),
// some padding at the bottom // some padding at the bottom
const SliverPadding(padding: EdgeInsets.only(bottom: 20)), // const SliverPadding(padding: EdgeInsets.only(bottom: 20)),
// SliverToBoxAdapter(child: MiniPlayerBottomPadding()), // SliverToBoxAdapter(child: MiniPlayerBottomPadding()),
], ],
), ),

View file

@ -38,500 +38,476 @@ class MessageLookup extends MessageLookupByLibrary {
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{ static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"account": MessageLookupByLibrary.simpleMessage("Account"), "account": MessageLookupByLibrary.simpleMessage("Account"),
"accountAddNewServer": MessageLookupByLibrary.simpleMessage( "accountAddNewServer": MessageLookupByLibrary.simpleMessage(
"Add New Server", "Add New Server",
), ),
"accountAddUser": MessageLookupByLibrary.simpleMessage("Add User"), "accountAddUser": MessageLookupByLibrary.simpleMessage("Add User"),
"accountAddUserDialog": m0, "accountAddUserDialog": m0,
"accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage(
"User added successfully! Switch?", "User added successfully! Switch?",
), ),
"accountAddUserTooltip": MessageLookupByLibrary.simpleMessage( "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage(
"Add new server", "Add new server",
), ),
"accountAnonymous": MessageLookupByLibrary.simpleMessage("Anonymous"), "accountAnonymous": MessageLookupByLibrary.simpleMessage("Anonymous"),
"accountDeleteServer": MessageLookupByLibrary.simpleMessage( "accountDeleteServer": MessageLookupByLibrary.simpleMessage(
"Delete Server", "Delete Server",
), ),
"accountInvalidURL": "accountInvalidURL": MessageLookupByLibrary.simpleMessage("Invalid URL"),
MessageLookupByLibrary.simpleMessage("Invalid URL"), "accountManage": MessageLookupByLibrary.simpleMessage("Manage Accounts"),
"accountManage": "accountRegisteredServers": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("Manage Accounts"), "Registered Servers",
"accountRegisteredServers": MessageLookupByLibrary.simpleMessage( ),
"Registered Servers", "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage(
), "Remove Server and Users",
"accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( ),
"Remove Server and Users", "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage(
), "This will remove the server ",
"accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( ),
"This will remove the server ", "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage(
), " and all its users\' login info from this app.",
"accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( ),
" and all its users\' login info from this app.", "accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage(
), "Remove User Login",
"accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage( ),
"Remove User Login", "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage(
), "This will remove login details of the user ",
"accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( ),
"This will remove login details of the user ", "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage(
), " from this app.",
"accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( ),
" from this app.", "accountServerURI": MessageLookupByLibrary.simpleMessage("Server URI"),
), "accountSwitch": MessageLookupByLibrary.simpleMessage("Switch Account"),
"accountServerURI": MessageLookupByLibrary.simpleMessage("Server URI"), "accountUsersCount": m1,
"accountSwitch": MessageLookupByLibrary.simpleMessage("Switch Account"), "appSettings": MessageLookupByLibrary.simpleMessage("App Settings"),
"accountUsersCount": m1, "appearance": MessageLookupByLibrary.simpleMessage("Appearance"),
"appSettings": MessageLookupByLibrary.simpleMessage("App Settings"), "autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage(
"appearance": MessageLookupByLibrary.simpleMessage("Appearance"), "Auto Sleep Timer Settings",
"autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage( ),
"Auto Sleep Timer Settings", "autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage(
), "Auto Turn On Sleep Timer",
"autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage( ),
"Auto Turn On Sleep Timer", "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage(
), "Auto Turn On Timer",
"autoTurnOnTimer": MessageLookupByLibrary.simpleMessage( ),
"Auto Turn On Timer", "autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage(
), "Always Auto Turn On Timer",
"autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage( ),
"Always Auto Turn On Timer", "autoTurnOnTimerAlwaysDescription": MessageLookupByLibrary.simpleMessage(
), "Always turn on the sleep timer, no matter what",
"autoTurnOnTimerAlwaysDescription": ),
MessageLookupByLibrary.simpleMessage( "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage(
"Always turn on the sleep timer, no matter what", "Automatically turn on the sleep timer based on the time of day",
), ),
"autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("From"),
"Automatically turn on the sleep timer based on the time of day", "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage(
), "Turn on the sleep timer at the specified time",
"autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("From"), ),
"autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("Until"),
"Turn on the sleep timer at the specified time", "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage(
), "Turn off the sleep timer at the specified time",
"autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("Until"), ),
"autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( "automaticallyDescription": MessageLookupByLibrary.simpleMessage(
"Turn off the sleep timer at the specified time", "Automatically turn on the sleep timer based on the time of day",
), ),
"automaticallyDescription": MessageLookupByLibrary.simpleMessage( "backup": MessageLookupByLibrary.simpleMessage("Backup"),
"Automatically turn on the sleep timer based on the time of day", "backupAndRestore": MessageLookupByLibrary.simpleMessage(
), "Backup and Restore",
"backup": MessageLookupByLibrary.simpleMessage("Backup"), ),
"backupAndRestore": MessageLookupByLibrary.simpleMessage( "bookAbout": MessageLookupByLibrary.simpleMessage("About the Book"),
"Backup and Restore", "bookAboutDefault": MessageLookupByLibrary.simpleMessage(
), "Sorry, no description found",
"bookAbout": MessageLookupByLibrary.simpleMessage("About the Book"), ),
"bookAboutDefault": MessageLookupByLibrary.simpleMessage( "bookAuthors": MessageLookupByLibrary.simpleMessage("Authors"),
"Sorry, no description found", "bookDownloads": MessageLookupByLibrary.simpleMessage("Downloads"),
), "bookGenres": MessageLookupByLibrary.simpleMessage("Genres"),
"bookAuthors": MessageLookupByLibrary.simpleMessage("Authors"), "bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("Abridged"),
"bookDownloads": MessageLookupByLibrary.simpleMessage("Downloads"), "bookMetadataLength": MessageLookupByLibrary.simpleMessage("Length"),
"bookGenres": MessageLookupByLibrary.simpleMessage("Genres"), "bookMetadataPublished": MessageLookupByLibrary.simpleMessage("Published"),
"bookMetadataAbridged": "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("Abridged"), "Unabridged",
"bookMetadataLength": MessageLookupByLibrary.simpleMessage("Length"), ),
"bookMetadataPublished": "bookSeries": MessageLookupByLibrary.simpleMessage("Series"),
MessageLookupByLibrary.simpleMessage("Published"), "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("Try again"),
"bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage( "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage(
"Unabridged", "No shelves to display",
), ),
"bookSeries": MessageLookupByLibrary.simpleMessage("Series"), "cancel": MessageLookupByLibrary.simpleMessage("Cancel"),
"bookShelveEmpty": MessageLookupByLibrary.simpleMessage("Try again"), "chapterNotFound": MessageLookupByLibrary.simpleMessage("Chapters"),
"bookShelveEmptyText": MessageLookupByLibrary.simpleMessage( "chapterSelect": MessageLookupByLibrary.simpleMessage("Select Chapter"),
"No shelves to display", "chapterSkip": MessageLookupByLibrary.simpleMessage(
), "Skip chapter opening and ending",
"cancel": MessageLookupByLibrary.simpleMessage("Cancel"), ),
"chapterNotFound": MessageLookupByLibrary.simpleMessage("Chapters"), "chapterSkipEnd": MessageLookupByLibrary.simpleMessage(
"chapterSelect": MessageLookupByLibrary.simpleMessage("Select Chapter"), "Skip chapter opening for ",
"chapterSkip": MessageLookupByLibrary.simpleMessage( ),
"Skip chapter opening and ending", "chapterSkipOpen": MessageLookupByLibrary.simpleMessage(
), "Skip chapter opening for ",
"chapterSkipEnd": MessageLookupByLibrary.simpleMessage( ),
"Skip chapter opening for ", "chapters": MessageLookupByLibrary.simpleMessage("Chapters"),
), "copyToClipboard": MessageLookupByLibrary.simpleMessage(
"chapterSkipOpen": MessageLookupByLibrary.simpleMessage( "Copy to Clipboard",
"Skip chapter opening for ", ),
), "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage(
"chapters": MessageLookupByLibrary.simpleMessage("Chapters"), "Copy the app settings to the clipboard",
"copyToClipboard": MessageLookupByLibrary.simpleMessage( ),
"Copy to Clipboard", "copyToClipboardToast": MessageLookupByLibrary.simpleMessage(
), "Settings copied to clipboard",
"copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( ),
"Copy the app settings to the clipboard", "delete": MessageLookupByLibrary.simpleMessage("Delete"),
), "deleteDialog": m2,
"copyToClipboardToast": MessageLookupByLibrary.simpleMessage( "deleted": m3,
"Settings copied to clipboard", "downloadSettings": MessageLookupByLibrary.simpleMessage(
), "Download Settings",
"delete": MessageLookupByLibrary.simpleMessage("Delete"), ),
"deleteDialog": m2, "downloadSettingsDescription": MessageLookupByLibrary.simpleMessage(
"deleted": m3, "Customize download settings",
"downloadSettings": MessageLookupByLibrary.simpleMessage( ),
"Download Settings", "erArmedText": MessageLookupByLibrary.simpleMessage("Release ready"),
), "erDragText": MessageLookupByLibrary.simpleMessage("Pull to refresh"),
"downloadSettingsDescription": MessageLookupByLibrary.simpleMessage( "erDragTextUp": MessageLookupByLibrary.simpleMessage("Pull to refresh"),
"Customize download settings", "erFailedText": MessageLookupByLibrary.simpleMessage("Failed"),
), "erMessageText": MessageLookupByLibrary.simpleMessage("Last updated at %T"),
"erArmedText": MessageLookupByLibrary.simpleMessage("Release ready"), "erNoMoreText": MessageLookupByLibrary.simpleMessage("No more"),
"erDragText": MessageLookupByLibrary.simpleMessage("Pull to refresh"), "erProcessedText": MessageLookupByLibrary.simpleMessage("Succeeded"),
"erDragTextUp": MessageLookupByLibrary.simpleMessage("Pull to refresh"), "erProcessingText": MessageLookupByLibrary.simpleMessage("Refreshing..."),
"erFailedText": MessageLookupByLibrary.simpleMessage("Failed"), "erReadyText": MessageLookupByLibrary.simpleMessage("Refreshing..."),
"erMessageText": "explore": MessageLookupByLibrary.simpleMessage("explore"),
MessageLookupByLibrary.simpleMessage("Last updated at %T"), "exploreHint": MessageLookupByLibrary.simpleMessage(
"erNoMoreText": MessageLookupByLibrary.simpleMessage("No more"), "Seek and you shall discover...",
"erProcessedText": MessageLookupByLibrary.simpleMessage("Succeeded"), ),
"erProcessingText": "exploreTooltip": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("Refreshing..."), "Search and Explore",
"erReadyText": MessageLookupByLibrary.simpleMessage("Refreshing..."), ),
"explore": MessageLookupByLibrary.simpleMessage("explore"), "general": MessageLookupByLibrary.simpleMessage("General"),
"exploreHint": MessageLookupByLibrary.simpleMessage( "help": MessageLookupByLibrary.simpleMessage("Help"),
"Seek and you shall discover...", "home": MessageLookupByLibrary.simpleMessage("Home"),
), "homeBookContinueListening": MessageLookupByLibrary.simpleMessage(
"exploreTooltip": MessageLookupByLibrary.simpleMessage( "Continue Listening",
"Search and Explore", ),
), "homeBookContinueListeningDescription":
"general": MessageLookupByLibrary.simpleMessage("General"), MessageLookupByLibrary.simpleMessage(
"help": MessageLookupByLibrary.simpleMessage("Help"),
"home": MessageLookupByLibrary.simpleMessage("Home"),
"homeBookContinueListening": MessageLookupByLibrary.simpleMessage(
"Continue Listening",
),
"homeBookContinueListeningDescription":
MessageLookupByLibrary.simpleMessage(
"Show play button for books in currently listening shelf", "Show play button for books in currently listening shelf",
), ),
"homeBookContinueSeries": MessageLookupByLibrary.simpleMessage( "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage(
"Continue Series", "Continue Series",
), ),
"homeBookContinueSeriesDescription": "homeBookContinueSeriesDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Show play button for books in continue series shelf",
"Show play button for books in continue series shelf", ),
), "homeBookDiscover": MessageLookupByLibrary.simpleMessage("Discover"),
"homeBookDiscover": MessageLookupByLibrary.simpleMessage("Discover"), "homeBookListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"),
"homeBookListenAgain": "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("Listen Again"), "Show play button for all books in listen again shelf",
"homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( ),
"Show play button for all books in listen again shelf", "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage(
), "Newest Authors",
"homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage( ),
"Newest Authors", "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage(
), "Recently Added",
"homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage( ),
"Recently Added", "homeBookRecommended": MessageLookupByLibrary.simpleMessage("Recommended"),
), "homeContinueListening": MessageLookupByLibrary.simpleMessage(
"homeBookRecommended": "Continue Listening",
MessageLookupByLibrary.simpleMessage("Recommended"), ),
"homeContinueListening": MessageLookupByLibrary.simpleMessage( "homeListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"),
"Continue Listening", "homePageSettings": MessageLookupByLibrary.simpleMessage(
), "Home Page Settings",
"homeListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"), ),
"homePageSettings": MessageLookupByLibrary.simpleMessage( "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage(
"Home Page Settings", "Customize the home page",
), ),
"homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage(
"Customize the home page", "Other shelves",
), ),
"homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( "homePageSettingsOtherShelvesDescription":
"Other shelves", MessageLookupByLibrary.simpleMessage(
),
"homePageSettingsOtherShelvesDescription":
MessageLookupByLibrary.simpleMessage(
"Show play button for all books in all remaining shelves", "Show play button for all books in all remaining shelves",
), ),
"homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage( "homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage(
"Quick Play", "Quick Play",
), ),
"homeStartListening": MessageLookupByLibrary.simpleMessage( "homeStartListening": MessageLookupByLibrary.simpleMessage(
"Start Listening", "Start Listening",
), ),
"language": MessageLookupByLibrary.simpleMessage("Language"), "language": MessageLookupByLibrary.simpleMessage("Language"),
"languageDescription": MessageLookupByLibrary.simpleMessage( "languageDescription": MessageLookupByLibrary.simpleMessage(
"Language switch", "Language switch",
), ),
"library": MessageLookupByLibrary.simpleMessage("Library"), "library": MessageLookupByLibrary.simpleMessage("Library"),
"libraryChange": MessageLookupByLibrary.simpleMessage("Change Library"), "libraryChange": MessageLookupByLibrary.simpleMessage("Change Library"),
"libraryEmpty": MessageLookupByLibrary.simpleMessage( "libraryEmpty": MessageLookupByLibrary.simpleMessage(
"No libraries available.", "No libraries available.",
), ),
"libraryLoadError": m4, "libraryLoadError": m4,
"librarySelect": MessageLookupByLibrary.simpleMessage("Select Library"), "librarySelect": MessageLookupByLibrary.simpleMessage("Select Library"),
"librarySwitchTooltip": MessageLookupByLibrary.simpleMessage( "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage(
"Switch Library", "Switch Library",
), ),
"libraryTooltip": MessageLookupByLibrary.simpleMessage( "libraryTooltip": MessageLookupByLibrary.simpleMessage(
"Browse your library", "Browse your library",
), ),
"loading": MessageLookupByLibrary.simpleMessage("Loading..."), "loading": MessageLookupByLibrary.simpleMessage("Loading..."),
"loginLocal": MessageLookupByLibrary.simpleMessage("Local"), "loginLocal": MessageLookupByLibrary.simpleMessage("Local"),
"loginLogin": MessageLookupByLibrary.simpleMessage("Login"), "loginLogin": MessageLookupByLibrary.simpleMessage("Login"),
"loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"),
"loginPassword": MessageLookupByLibrary.simpleMessage("Password"), "loginPassword": MessageLookupByLibrary.simpleMessage("Password"),
"loginServerClick": MessageLookupByLibrary.simpleMessage("Click here"), "loginServerClick": MessageLookupByLibrary.simpleMessage("Click here"),
"loginServerConnected": MessageLookupByLibrary.simpleMessage( "loginServerConnected": MessageLookupByLibrary.simpleMessage(
"Server connected, please login", "Server connected, please login",
), ),
"loginServerNo": MessageLookupByLibrary.simpleMessage( "loginServerNo": MessageLookupByLibrary.simpleMessage(
"Do not have a server? ", "Do not have a server? ",
), ),
"loginServerNoConnected": MessageLookupByLibrary.simpleMessage( "loginServerNoConnected": MessageLookupByLibrary.simpleMessage(
"Please enter the URL of your AudiobookShelf Server", "Please enter the URL of your AudiobookShelf Server",
), ),
"loginServerNot": m5, "loginServerNot": m5,
"loginServerTo": MessageLookupByLibrary.simpleMessage( "loginServerTo": MessageLookupByLibrary.simpleMessage(
" to know how to setup a server.", " to know how to setup a server.",
), ),
"loginTitle": m6, "loginTitle": m6,
"loginToken": MessageLookupByLibrary.simpleMessage("Token"), "loginToken": MessageLookupByLibrary.simpleMessage("Token"),
"loginUsername": MessageLookupByLibrary.simpleMessage("Username"), "loginUsername": MessageLookupByLibrary.simpleMessage("Username"),
"logs": MessageLookupByLibrary.simpleMessage("Logs"), "logs": MessageLookupByLibrary.simpleMessage("Logs"),
"nmpSettingsBackward": MessageLookupByLibrary.simpleMessage( "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage(
"Backward Interval", "Backward Interval",
), ),
"nmpSettingsForward": MessageLookupByLibrary.simpleMessage( "nmpSettingsForward": MessageLookupByLibrary.simpleMessage(
"Forward Interval", "Forward Interval",
), ),
"nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage( "nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage(
"Media Controls", "Media Controls",
), ),
"nmpSettingsMediaControlsDescription": "nmpSettingsMediaControlsDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Select the media controls to display",
"Select the media controls to display", ),
), "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage(
"nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( "Select a field below to insert it",
"Select a field below to insert it", ),
), "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage(
"nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( "Show Chapter Progress",
"Show Chapter Progress", ),
), "nmpSettingsShowChapterProgressDescription":
"nmpSettingsShowChapterProgressDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage(
"Instead of the overall progress of the book", "Instead of the overall progress of the book",
), ),
"nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage( "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage(
"Secondary Title", "Secondary Title",
), ),
"nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage(
"The subtitle of the notification\n", "The subtitle of the notification\n",
), ),
"nmpSettingsTitle": "nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("Primary Title"),
MessageLookupByLibrary.simpleMessage("Primary Title"), "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage(
"nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( "The title of the notification\n",
"The title of the notification\n", ),
), "no": MessageLookupByLibrary.simpleMessage("No"),
"no": MessageLookupByLibrary.simpleMessage("No"), "notImplemented": MessageLookupByLibrary.simpleMessage("Not implemented"),
"notImplemented": "notificationMediaPlayer": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("Not implemented"), "Notification Media Player",
"notificationMediaPlayer": MessageLookupByLibrary.simpleMessage( ),
"Notification Media Player", "notificationMediaPlayerDescription": MessageLookupByLibrary.simpleMessage(
), "Customize the media player in notifications",
"notificationMediaPlayerDescription": ),
MessageLookupByLibrary.simpleMessage( "ok": MessageLookupByLibrary.simpleMessage("OK"),
"Customize the media player in notifications", "pause": MessageLookupByLibrary.simpleMessage("Pause"),
), "play": MessageLookupByLibrary.simpleMessage("Play"),
"ok": MessageLookupByLibrary.simpleMessage("OK"), "playerSettings": MessageLookupByLibrary.simpleMessage("Player Settings"),
"pause": MessageLookupByLibrary.simpleMessage("Pause"), "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage(
"play": MessageLookupByLibrary.simpleMessage("Play"), "Mark Complete When Time Left",
"playerSettings": ),
MessageLookupByLibrary.simpleMessage("Player Settings"), "playerSettingsCompleteTimeDescriptionHead":
"playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("Mark complete when less than "),
"Mark Complete When Time Left", "playerSettingsCompleteTimeDescriptionTail":
), MessageLookupByLibrary.simpleMessage(" left in the book"),
"playerSettingsCompleteTimeDescriptionHead": "playerSettingsDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Customize the player settings",
"Mark complete when less than "), ),
"playerSettingsCompleteTimeDescriptionTail": "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage(" left in the book"), "Display Settings",
"playerSettingsDescription": MessageLookupByLibrary.simpleMessage( ),
"Customize the player settings", "playerSettingsDisplayChapterProgress":
), MessageLookupByLibrary.simpleMessage("Show Chapter Progress"),
"playerSettingsDisplay": MessageLookupByLibrary.simpleMessage( "playerSettingsDisplayChapterProgressDescription":
"Display Settings", MessageLookupByLibrary.simpleMessage(
),
"playerSettingsDisplayChapterProgress":
MessageLookupByLibrary.simpleMessage("Show Chapter Progress"),
"playerSettingsDisplayChapterProgressDescription":
MessageLookupByLibrary.simpleMessage(
"Show the progress of the current chapter in the player", "Show the progress of the current chapter in the player",
), ),
"playerSettingsDisplayTotalProgress": "playerSettingsDisplayTotalProgress": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Show Total Progress",
"Show Total Progress", ),
), "playerSettingsDisplayTotalProgressDescription":
"playerSettingsDisplayTotalProgressDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage(
"Show the total progress of the book in the player", "Show the total progress of the book in the player",
), ),
"playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage(
"Playback Report Interval", "Playback Report Interval",
), ),
"playerSettingsPlaybackIntervalDescriptionHead": "playerSettingsPlaybackIntervalDescriptionHead":
MessageLookupByLibrary.simpleMessage("Report progress every "), MessageLookupByLibrary.simpleMessage("Report progress every "),
"playerSettingsPlaybackIntervalDescriptionTail": "playerSettingsPlaybackIntervalDescriptionTail":
MessageLookupByLibrary.simpleMessage(" to the server"), MessageLookupByLibrary.simpleMessage(" to the server"),
"playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage(
"Playback Reporting", "Playback Reporting",
), ),
"playerSettingsPlaybackReportingIgnore": "playerSettingsPlaybackReportingIgnore":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Ignore Playback Position Less Than", "Ignore Playback Position Less Than",
), ),
"playerSettingsPlaybackReportingMinimum": "playerSettingsPlaybackReportingMinimum":
MessageLookupByLibrary.simpleMessage("Minimum Position to Report"), MessageLookupByLibrary.simpleMessage("Minimum Position to Report"),
"playerSettingsPlaybackReportingMinimumDescriptionHead": "playerSettingsPlaybackReportingMinimumDescriptionHead":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Do not report playback for the first ", "Do not report playback for the first ",
), ),
"playerSettingsPlaybackReportingMinimumDescriptionTail": "playerSettingsPlaybackReportingMinimumDescriptionTail":
MessageLookupByLibrary.simpleMessage("of the book"), MessageLookupByLibrary.simpleMessage("of the book"),
"playerSettingsRememberForEveryBook": "playerSettingsRememberForEveryBook": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Remember Player Settings for Every Book",
"Remember Player Settings for Every Book", ),
), "playerSettingsRememberForEveryBookDescription":
"playerSettingsRememberForEveryBookDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage(
"Settings like speed, loudness, etc. will be remembered for every book", "Settings like speed, loudness, etc. will be remembered for every book",
), ),
"playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("Speed"), "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("Speed"),
"playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage(
"Default Speed", "Default Speed",
), ),
"playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage(
"Speed Options", "Speed Options",
), ),
"playerSettingsSpeedOptionsSelect": "playerSettingsSpeedOptionsSelect": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Select Speed Options",
"Select Speed Options", ),
), "playerSettingsSpeedOptionsSelectAdd": MessageLookupByLibrary.simpleMessage(
"playerSettingsSpeedOptionsSelectAdd": "Add Speed Option",
MessageLookupByLibrary.simpleMessage( ),
"Add Speed Option", "playerSettingsSpeedOptionsSelectAddHelper":
), MessageLookupByLibrary.simpleMessage("Enter a new speed option to add"),
"playerSettingsSpeedOptionsSelectAddHelper": "playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Select Speed",
"Enter a new speed option to add"), ),
"playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage( "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage(
"Select Speed", "Enter the speed you want to set when playing for the first time",
), ),
"playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( "playlistsMine": MessageLookupByLibrary.simpleMessage("My Playlists"),
"Enter the speed you want to set when playing for the first time", "readLess": MessageLookupByLibrary.simpleMessage("Read Less"),
), "readMore": MessageLookupByLibrary.simpleMessage("Read More"),
"playlistsMine": MessageLookupByLibrary.simpleMessage("My Playlists"), "refresh": MessageLookupByLibrary.simpleMessage("Refresh"),
"readLess": MessageLookupByLibrary.simpleMessage("Read Less"), "reset": MessageLookupByLibrary.simpleMessage("Reset"),
"readMore": MessageLookupByLibrary.simpleMessage("Read More"), "resetAppSettings": MessageLookupByLibrary.simpleMessage(
"refresh": MessageLookupByLibrary.simpleMessage("Refresh"), "Reset App Settings",
"reset": MessageLookupByLibrary.simpleMessage("Reset"), ),
"resetAppSettings": MessageLookupByLibrary.simpleMessage( "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage(
"Reset App Settings", "Reset the app settings to the default values",
), ),
"resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage(
"Reset the app settings to the default values", "Are you sure you want to reset the app settings?",
), ),
"resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( "restore": MessageLookupByLibrary.simpleMessage("Restore"),
"Are you sure you want to reset the app settings?", "restoreBackup": MessageLookupByLibrary.simpleMessage("Restore Backup"),
), "restoreBackupHint": MessageLookupByLibrary.simpleMessage(
"restore": MessageLookupByLibrary.simpleMessage("Restore"), "Paste the backup here",
"restoreBackup": MessageLookupByLibrary.simpleMessage("Restore Backup"), ),
"restoreBackupHint": MessageLookupByLibrary.simpleMessage( "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage(
"Paste the backup here", "Invalid backup",
), ),
"restoreBackupInvalid": MessageLookupByLibrary.simpleMessage( "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage(
"Invalid backup", "Settings restored",
), ),
"restoreBackupSuccess": MessageLookupByLibrary.simpleMessage( "restoreBackupValidator": MessageLookupByLibrary.simpleMessage(
"Settings restored", "Please paste the backup here",
), ),
"restoreBackupValidator": MessageLookupByLibrary.simpleMessage( "restoreDescription": MessageLookupByLibrary.simpleMessage(
"Please paste the backup here", "Restore the app settings from the backup",
), ),
"restoreDescription": MessageLookupByLibrary.simpleMessage( "resume": MessageLookupByLibrary.simpleMessage("Resume"),
"Restore the app settings from the backup", "retry": MessageLookupByLibrary.simpleMessage("Retry"),
), "settings": MessageLookupByLibrary.simpleMessage("Settings"),
"resume": MessageLookupByLibrary.simpleMessage("Resume"), "shakeAction": MessageLookupByLibrary.simpleMessage("Shake Action"),
"retry": MessageLookupByLibrary.simpleMessage("Retry"), "shakeActionDescription": MessageLookupByLibrary.simpleMessage(
"settings": MessageLookupByLibrary.simpleMessage("Settings"), "The action to perform when a shake is detected",
"shakeAction": MessageLookupByLibrary.simpleMessage("Shake Action"), ),
"shakeActionDescription": MessageLookupByLibrary.simpleMessage( "shakeActivationThreshold": MessageLookupByLibrary.simpleMessage(
"The action to perform when a shake is detected", "Shake Activation Threshold",
), ),
"shakeActivationThreshold": MessageLookupByLibrary.simpleMessage( "shakeActivationThresholdDescription": MessageLookupByLibrary.simpleMessage(
"Shake Activation Threshold", "The higher the threshold, the harder you need to shake",
), ),
"shakeActivationThresholdDescription": "shakeDetector": MessageLookupByLibrary.simpleMessage("Shake Detector"),
MessageLookupByLibrary.simpleMessage( "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage(
"The higher the threshold, the harder you need to shake", "Customize the shake detector settings",
), ),
"shakeDetector": MessageLookupByLibrary.simpleMessage("Shake Detector"), "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage(
"shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( "Enable Shake Detection",
"Customize the shake detector settings", ),
), "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage(
"shakeDetectorEnable": MessageLookupByLibrary.simpleMessage( "Enable shake detection to do various actions",
"Enable Shake Detection", ),
), "shakeDetectorSettings": MessageLookupByLibrary.simpleMessage(
"shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( "Shake Detector Settings",
"Enable shake detection to do various actions", ),
), "shakeFeedback": MessageLookupByLibrary.simpleMessage("Shake Feedback"),
"shakeDetectorSettings": MessageLookupByLibrary.simpleMessage( "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage(
"Shake Detector Settings", "The feedback to give when a shake is detected",
), ),
"shakeFeedback": MessageLookupByLibrary.simpleMessage("Shake Feedback"), "shakeSelectAction": MessageLookupByLibrary.simpleMessage(
"shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( "Select Shake Action",
"The feedback to give when a shake is detected", ),
), "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage(
"shakeSelectAction": MessageLookupByLibrary.simpleMessage( "Select Shake Activation Threshold",
"Select Shake Action", ),
), "shakeSelectActivationThresholdHelper":
"shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Select Shake Activation Threshold",
),
"shakeSelectActivationThresholdHelper":
MessageLookupByLibrary.simpleMessage(
"Enter a number to set the threshold in m/s²", "Enter a number to set the threshold in m/s²",
), ),
"shakeSelectFeedback": MessageLookupByLibrary.simpleMessage( "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage(
"Select Shake Feedback", "Select Shake Feedback",
), ),
"themeMode": MessageLookupByLibrary.simpleMessage("Theme Mode"), "themeMode": MessageLookupByLibrary.simpleMessage("Theme Mode"),
"themeModeDark": MessageLookupByLibrary.simpleMessage("Dark"), "themeModeDark": MessageLookupByLibrary.simpleMessage("Dark"),
"themeModeHighContrast": MessageLookupByLibrary.simpleMessage( "themeModeHighContrast": MessageLookupByLibrary.simpleMessage(
"High Contrast Mode", "High Contrast Mode",
), ),
"themeModeHighContrastDescription": "themeModeHighContrastDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "Increase the contrast between the background and the text",
"Increase the contrast between the background and the text", ),
), "themeModeLight": MessageLookupByLibrary.simpleMessage("Light"),
"themeModeLight": MessageLookupByLibrary.simpleMessage("Light"), "themeModeSystem": MessageLookupByLibrary.simpleMessage("System"),
"themeModeSystem": MessageLookupByLibrary.simpleMessage("System"), "themeSettings": MessageLookupByLibrary.simpleMessage("Theme Settings"),
"themeSettings": MessageLookupByLibrary.simpleMessage("Theme Settings"), "themeSettingsColors": MessageLookupByLibrary.simpleMessage(
"themeSettingsColors": MessageLookupByLibrary.simpleMessage( "Material Theme from System",
"Material Theme from System", ),
), "themeSettingsColorsAndroid": MessageLookupByLibrary.simpleMessage(
"themeSettingsColorsAndroid": MessageLookupByLibrary.simpleMessage( "Use Material You",
"Use Material You", ),
), "themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage(
"themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage( "Adaptive Theme on Item Page",
"Adaptive Theme on Item Page", ),
), "themeSettingsColorsBookDescription": MessageLookupByLibrary.simpleMessage(
"themeSettingsColorsBookDescription": "Get fancy with the colors on the item page at the cost of some performance",
MessageLookupByLibrary.simpleMessage( ),
"Get fancy with the colors on the item page at the cost of some performance", "themeSettingsColorsCurrent": MessageLookupByLibrary.simpleMessage(
), "Adapt theme from currently playing item",
"themeSettingsColorsCurrent": MessageLookupByLibrary.simpleMessage( ),
"Adapt theme from currently playing item", "themeSettingsColorsCurrentDescription":
), MessageLookupByLibrary.simpleMessage(
"themeSettingsColorsCurrentDescription":
MessageLookupByLibrary.simpleMessage(
"Use the theme colors from the currently playing item for the app", "Use the theme colors from the currently playing item for the app",
), ),
"themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage( "themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage(
"Use the system theme colors for the app", "Use the system theme colors for the app",
), ),
"themeSettingsDescription": MessageLookupByLibrary.simpleMessage( "themeSettingsDescription": MessageLookupByLibrary.simpleMessage(
"Customize the app theme", "Customize the app theme",
), ),
"timeSecond": m7, "timeSecond": m7,
"unknown": MessageLookupByLibrary.simpleMessage("Unknown"), "unknown": MessageLookupByLibrary.simpleMessage("Unknown"),
"webVersion": MessageLookupByLibrary.simpleMessage("Web Version"), "webVersion": MessageLookupByLibrary.simpleMessage("Web Version"),
"yes": MessageLookupByLibrary.simpleMessage("Yes"), "yes": MessageLookupByLibrary.simpleMessage("Yes"),
"you": MessageLookupByLibrary.simpleMessage("You"), "you": MessageLookupByLibrary.simpleMessage("You"),
"youTooltip": MessageLookupByLibrary.simpleMessage( "youTooltip": MessageLookupByLibrary.simpleMessage(
"Your Profile and Settings", "Your Profile and Settings",
), ),
}; };
} }

View file

@ -38,367 +38,338 @@ class MessageLookup extends MessageLookupByLibrary {
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{ static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"account": MessageLookupByLibrary.simpleMessage("账户"), "account": MessageLookupByLibrary.simpleMessage("账户"),
"accountAddNewServer": MessageLookupByLibrary.simpleMessage("添加新服务器"), "accountAddNewServer": MessageLookupByLibrary.simpleMessage("添加新服务器"),
"accountAddUser": MessageLookupByLibrary.simpleMessage("添加用户"), "accountAddUser": MessageLookupByLibrary.simpleMessage("添加用户"),
"accountAddUserDialog": m0, "accountAddUserDialog": m0,
"accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage(
"用户添加成功!切换?", "用户添加成功!切换?",
), ),
"accountAddUserTooltip": MessageLookupByLibrary.simpleMessage("添加新服务器"), "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage("添加新服务器"),
"accountAnonymous": MessageLookupByLibrary.simpleMessage("匿名"), "accountAnonymous": MessageLookupByLibrary.simpleMessage("匿名"),
"accountDeleteServer": MessageLookupByLibrary.simpleMessage("删除服务器"), "accountDeleteServer": MessageLookupByLibrary.simpleMessage("删除服务器"),
"accountInvalidURL": MessageLookupByLibrary.simpleMessage("无效网址"), "accountInvalidURL": MessageLookupByLibrary.simpleMessage("无效网址"),
"accountManage": MessageLookupByLibrary.simpleMessage("帐户管理"), "accountManage": MessageLookupByLibrary.simpleMessage("帐户管理"),
"accountRegisteredServers": "accountRegisteredServers": MessageLookupByLibrary.simpleMessage("已注册服务器"),
MessageLookupByLibrary.simpleMessage("已注册服务器"), "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage(
"accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( "删除服务器和用户",
"删除服务器和用户", ),
), "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage(
"accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( "这将删除服务器 ",
"这将删除服务器 ", ),
), "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage(
"accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( " 以及该应用程序中所有用户的登录信息。",
" 以及该应用程序中所有用户的登录信息。", ),
), "accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage("删除用户登录"),
"accountRemoveUserLogin": "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("删除用户登录"), "这将删除用户 ",
"accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( ),
"这将删除用户 ", "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage(
), " 的登录详细信息。",
"accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( ),
" 的登录详细信息。", "accountServerURI": MessageLookupByLibrary.simpleMessage("服务器地址"),
), "accountSwitch": MessageLookupByLibrary.simpleMessage("切换账户"),
"accountServerURI": MessageLookupByLibrary.simpleMessage("服务器地址"), "accountUsersCount": m1,
"accountSwitch": MessageLookupByLibrary.simpleMessage("切换账户"), "appSettings": MessageLookupByLibrary.simpleMessage("应用设置"),
"accountUsersCount": m1, "appearance": MessageLookupByLibrary.simpleMessage("外观"),
"appSettings": MessageLookupByLibrary.simpleMessage("应用设置"), "autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage("自动睡眠定时器设置"),
"appearance": MessageLookupByLibrary.simpleMessage("外观"), "autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage("自动开启睡眠定时器"),
"autoSleepTimerSettings": "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage("自动开启定时器"),
MessageLookupByLibrary.simpleMessage("自动睡眠定时器设置"), "autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage("始终自动开启定时器"),
"autoTurnOnSleepTimer": "autoTurnOnTimerAlwaysDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("自动开启睡眠定时器"), "总是打开睡眠定时器",
"autoTurnOnTimer": MessageLookupByLibrary.simpleMessage("自动开启定时器"), ),
"autoTurnOnTimerAlways": "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("始终自动开启定时器"), "根据一天中的时间自动打开睡眠定时器",
"autoTurnOnTimerAlwaysDescription": ),
MessageLookupByLibrary.simpleMessage( "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage(""),
"总是打开睡眠定时器", "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage(
), "在指定时间打开睡眠定时器",
"autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( ),
"根据一天中的时间自动打开睡眠定时器", "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("直到"),
), "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage(
"autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage(""), "在指定时间关闭睡眠定时器",
"autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( ),
"在指定时间打开睡眠定时器", "automaticallyDescription": MessageLookupByLibrary.simpleMessage(
), "根据一天中的时间自动打开睡眠定时器",
"autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("直到"), ),
"autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( "backup": MessageLookupByLibrary.simpleMessage("备份"),
"在指定时间关闭睡眠定时器", "backupAndRestore": MessageLookupByLibrary.simpleMessage("备份与恢复"),
), "bookAbout": MessageLookupByLibrary.simpleMessage("关于本书"),
"automaticallyDescription": MessageLookupByLibrary.simpleMessage( "bookAboutDefault": MessageLookupByLibrary.simpleMessage("抱歉,找不到描述"),
"根据一天中的时间自动打开睡眠定时器", "bookAuthors": MessageLookupByLibrary.simpleMessage("作者"),
), "bookDownloads": MessageLookupByLibrary.simpleMessage("下载"),
"backup": MessageLookupByLibrary.simpleMessage("备份"), "bookGenres": MessageLookupByLibrary.simpleMessage("风格"),
"backupAndRestore": MessageLookupByLibrary.simpleMessage("备份与恢复"), "bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("删节版"),
"bookAbout": MessageLookupByLibrary.simpleMessage("关于本书"), "bookMetadataLength": MessageLookupByLibrary.simpleMessage("持续时间"),
"bookAboutDefault": MessageLookupByLibrary.simpleMessage("抱歉,找不到描述"), "bookMetadataPublished": MessageLookupByLibrary.simpleMessage("发布年份"),
"bookAuthors": MessageLookupByLibrary.simpleMessage("作者"), "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage("未删节版"),
"bookDownloads": MessageLookupByLibrary.simpleMessage("下载"), "bookSeries": MessageLookupByLibrary.simpleMessage("系列"),
"bookGenres": MessageLookupByLibrary.simpleMessage("风格"), "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("重试"),
"bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("删节版"), "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage("未查询到书架"),
"bookMetadataLength": MessageLookupByLibrary.simpleMessage("持续时间"), "cancel": MessageLookupByLibrary.simpleMessage("取消"),
"bookMetadataPublished": MessageLookupByLibrary.simpleMessage("发布年份"), "chapterNotFound": MessageLookupByLibrary.simpleMessage("未找到章节"),
"bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage("未删节版"), "chapterSelect": MessageLookupByLibrary.simpleMessage("选择章节"),
"bookSeries": MessageLookupByLibrary.simpleMessage("系列"), "chapterSkip": MessageLookupByLibrary.simpleMessage("跳过章节片头片尾"),
"bookShelveEmpty": MessageLookupByLibrary.simpleMessage("重试"), "chapterSkipEnd": MessageLookupByLibrary.simpleMessage("跳过章节片尾 "),
"bookShelveEmptyText": MessageLookupByLibrary.simpleMessage("未查询到书架"), "chapterSkipOpen": MessageLookupByLibrary.simpleMessage("跳过章节片头 "),
"cancel": MessageLookupByLibrary.simpleMessage("取消"), "chapters": MessageLookupByLibrary.simpleMessage("章节列表"),
"chapterNotFound": MessageLookupByLibrary.simpleMessage("未找到章节"), "copyToClipboard": MessageLookupByLibrary.simpleMessage("复制到剪贴板"),
"chapterSelect": MessageLookupByLibrary.simpleMessage("选择章节"), "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage(
"chapterSkip": MessageLookupByLibrary.simpleMessage("跳过章节片头片尾"), "将应用程序设置复制到剪贴板",
"chapterSkipEnd": MessageLookupByLibrary.simpleMessage("跳过章节片尾 "), ),
"chapterSkipOpen": MessageLookupByLibrary.simpleMessage("跳过章节片头 "), "copyToClipboardToast": MessageLookupByLibrary.simpleMessage("设置已复制到剪贴板"),
"chapters": MessageLookupByLibrary.simpleMessage("章节列表"), "delete": MessageLookupByLibrary.simpleMessage("删除"),
"copyToClipboard": MessageLookupByLibrary.simpleMessage("复制到剪贴板"), "deleteDialog": m2,
"copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( "deleted": m3,
"将应用程序设置复制到剪贴板", "downloadSettings": MessageLookupByLibrary.simpleMessage("下载设置"),
), "downloadSettingsDescription": MessageLookupByLibrary.simpleMessage(
"copyToClipboardToast": "自定义下载设置",
MessageLookupByLibrary.simpleMessage("设置已复制到剪贴板"), ),
"delete": MessageLookupByLibrary.simpleMessage("删除"), "erArmedText": MessageLookupByLibrary.simpleMessage("准备就绪"),
"deleteDialog": m2, "erDragText": MessageLookupByLibrary.simpleMessage("下拉刷新"),
"deleted": m3, "erDragTextUp": MessageLookupByLibrary.simpleMessage("上拉加载"),
"downloadSettings": MessageLookupByLibrary.simpleMessage("下载设置"), "erFailedText": MessageLookupByLibrary.simpleMessage("失败"),
"downloadSettingsDescription": MessageLookupByLibrary.simpleMessage( "erMessageText": MessageLookupByLibrary.simpleMessage("最后更新于 %T"),
"自定义下载设置", "erNoMoreText": MessageLookupByLibrary.simpleMessage("没有更多"),
), "erProcessedText": MessageLookupByLibrary.simpleMessage("成功"),
"erArmedText": MessageLookupByLibrary.simpleMessage("准备就绪"), "erProcessingText": MessageLookupByLibrary.simpleMessage("刷新..."),
"erDragText": MessageLookupByLibrary.simpleMessage("下拉刷新"), "erReadyText": MessageLookupByLibrary.simpleMessage("刷新..."),
"erDragTextUp": MessageLookupByLibrary.simpleMessage("上拉加载"), "explore": MessageLookupByLibrary.simpleMessage("探索"),
"erFailedText": MessageLookupByLibrary.simpleMessage("失败"), "exploreHint": MessageLookupByLibrary.simpleMessage("搜索与探索..."),
"erMessageText": MessageLookupByLibrary.simpleMessage("最后更新于 %T"), "exploreTooltip": MessageLookupByLibrary.simpleMessage("搜索和探索"),
"erNoMoreText": MessageLookupByLibrary.simpleMessage("没有更多"), "general": MessageLookupByLibrary.simpleMessage("通用"),
"erProcessedText": MessageLookupByLibrary.simpleMessage("成功"), "help": MessageLookupByLibrary.simpleMessage("Help"),
"erProcessingText": MessageLookupByLibrary.simpleMessage("刷新..."), "home": MessageLookupByLibrary.simpleMessage("首页"),
"erReadyText": MessageLookupByLibrary.simpleMessage("刷新..."), "homeBookContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"),
"explore": MessageLookupByLibrary.simpleMessage("探索"), "homeBookContinueListeningDescription":
"exploreHint": MessageLookupByLibrary.simpleMessage("搜索与探索..."), MessageLookupByLibrary.simpleMessage("继续收听书架上显示播放按钮"),
"exploreTooltip": MessageLookupByLibrary.simpleMessage("搜索和探索"), "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage("继续系列"),
"general": MessageLookupByLibrary.simpleMessage("通用"), "homeBookContinueSeriesDescription": MessageLookupByLibrary.simpleMessage(
"help": MessageLookupByLibrary.simpleMessage("Help"), "继续系列书架上显示播放按钮",
"home": MessageLookupByLibrary.simpleMessage("首页"), ),
"homeBookContinueListening": "homeBookDiscover": MessageLookupByLibrary.simpleMessage("发现"),
MessageLookupByLibrary.simpleMessage("继续收听"), "homeBookListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"),
"homeBookContinueListeningDescription": "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("继续收听书架上显示播放按钮"), "再听一遍书架上显示播放按钮",
"homeBookContinueSeries": MessageLookupByLibrary.simpleMessage("继续系列"), ),
"homeBookContinueSeriesDescription": "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage("最新作者"),
MessageLookupByLibrary.simpleMessage( "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage("最近添加"),
"继续系列书架上显示播放按钮", "homeBookRecommended": MessageLookupByLibrary.simpleMessage("推荐"),
), "homeContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"),
"homeBookDiscover": MessageLookupByLibrary.simpleMessage("发现"), "homeListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"),
"homeBookListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), "homePageSettings": MessageLookupByLibrary.simpleMessage("主页设置"),
"homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage(
"再听一遍书架上显示播放按钮", "自定义主页",
), ),
"homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage("最新作者"), "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage(
"homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage("最近添加"), "其他书架",
"homeBookRecommended": MessageLookupByLibrary.simpleMessage("推荐"), ),
"homeContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"), "homePageSettingsOtherShelvesDescription":
"homeListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), MessageLookupByLibrary.simpleMessage("显示所有剩余书架上所有书籍的播放按钮"),
"homePageSettings": MessageLookupByLibrary.simpleMessage("主页设置"), "homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage("继续播放"),
"homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( "homeStartListening": MessageLookupByLibrary.simpleMessage("开始收听"),
"自定义主页", "language": MessageLookupByLibrary.simpleMessage("语言"),
), "languageDescription": MessageLookupByLibrary.simpleMessage("语言切换"),
"homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( "library": MessageLookupByLibrary.simpleMessage("媒体库"),
"其他书架", "libraryChange": MessageLookupByLibrary.simpleMessage("更改媒体库"),
), "libraryEmpty": MessageLookupByLibrary.simpleMessage("没有可用的库。"),
"homePageSettingsOtherShelvesDescription": "libraryLoadError": m4,
MessageLookupByLibrary.simpleMessage("显示所有剩余书架上所有书籍的播放按钮"), "librarySelect": MessageLookupByLibrary.simpleMessage("选择媒体库"),
"homePageSettingsQuickPlay": "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage("切换媒体库"),
MessageLookupByLibrary.simpleMessage("继续播放"), "libraryTooltip": MessageLookupByLibrary.simpleMessage("浏览您的媒体库"),
"homeStartListening": MessageLookupByLibrary.simpleMessage("开始收听"), "loading": MessageLookupByLibrary.simpleMessage("加载中..."),
"language": MessageLookupByLibrary.simpleMessage("语言"), "loginLocal": MessageLookupByLibrary.simpleMessage("Local"),
"languageDescription": MessageLookupByLibrary.simpleMessage("语言切换"), "loginLogin": MessageLookupByLibrary.simpleMessage("登录"),
"library": MessageLookupByLibrary.simpleMessage("媒体库"), "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"),
"libraryChange": MessageLookupByLibrary.simpleMessage("更改媒体库"), "loginPassword": MessageLookupByLibrary.simpleMessage("密码"),
"libraryEmpty": MessageLookupByLibrary.simpleMessage("没有可用的库。"), "loginServerClick": MessageLookupByLibrary.simpleMessage("单击此处"),
"libraryLoadError": m4, "loginServerConnected": MessageLookupByLibrary.simpleMessage("服务器已连接,请登录"),
"librarySelect": MessageLookupByLibrary.simpleMessage("选择媒体库"), "loginServerNo": MessageLookupByLibrary.simpleMessage("没有服务器? "),
"librarySwitchTooltip": MessageLookupByLibrary.simpleMessage("切换媒体库"), "loginServerNoConnected": MessageLookupByLibrary.simpleMessage(
"libraryTooltip": MessageLookupByLibrary.simpleMessage("浏览您的媒体库"), "请输入您的AudiobookShelf服务器的URL",
"loading": MessageLookupByLibrary.simpleMessage("加载中..."), ),
"loginLocal": MessageLookupByLibrary.simpleMessage("Local"), "loginServerNot": m5,
"loginLogin": MessageLookupByLibrary.simpleMessage("登录"), "loginServerTo": MessageLookupByLibrary.simpleMessage(" 了解如何设置服务器。"),
"loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), "loginTitle": m6,
"loginPassword": MessageLookupByLibrary.simpleMessage("密码"), "loginToken": MessageLookupByLibrary.simpleMessage("Token"),
"loginServerClick": MessageLookupByLibrary.simpleMessage("单击此处"), "loginUsername": MessageLookupByLibrary.simpleMessage("用户名"),
"loginServerConnected": "logs": MessageLookupByLibrary.simpleMessage("日志"),
MessageLookupByLibrary.simpleMessage("服务器已连接,请登录"), "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage("快退间隔"),
"loginServerNo": MessageLookupByLibrary.simpleMessage("没有服务器? "), "nmpSettingsForward": MessageLookupByLibrary.simpleMessage("快进间隔"),
"loginServerNoConnected": MessageLookupByLibrary.simpleMessage( "nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage("媒体控制"),
"请输入您的AudiobookShelf服务器的URL", "nmpSettingsMediaControlsDescription": MessageLookupByLibrary.simpleMessage(
), "选择要显示的媒体控件",
"loginServerNot": m5, ),
"loginServerTo": MessageLookupByLibrary.simpleMessage(" 了解如何设置服务器。"), "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage(
"loginTitle": m6, "在下面选择一个字段进行插入",
"loginToken": MessageLookupByLibrary.simpleMessage("Token"), ),
"loginUsername": MessageLookupByLibrary.simpleMessage("用户名"), "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage(
"logs": MessageLookupByLibrary.simpleMessage("日志"), "显示章节进度",
"nmpSettingsBackward": MessageLookupByLibrary.simpleMessage("快退间隔"), ),
"nmpSettingsForward": MessageLookupByLibrary.simpleMessage("快进间隔"), "nmpSettingsShowChapterProgressDescription":
"nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage("而不是本书的整体进展"),
MessageLookupByLibrary.simpleMessage("媒体控制"), "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage("副标题"),
"nmpSettingsMediaControlsDescription": "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "通知的副标题\n",
"选择要显示的媒体控件", ),
), "nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("主标题"),
"nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage(
"在下面选择一个字段进行插入", "通知的标题\n",
), ),
"nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( "no": MessageLookupByLibrary.simpleMessage(""),
"显示章节进度", "notImplemented": MessageLookupByLibrary.simpleMessage("未实现"),
), "notificationMediaPlayer": MessageLookupByLibrary.simpleMessage("通知媒体播放器"),
"nmpSettingsShowChapterProgressDescription": "notificationMediaPlayerDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("而不是本书的整体进展"), "在通知中自定义媒体播放器",
"nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage("副标题"), ),
"nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( "ok": MessageLookupByLibrary.simpleMessage("确定"),
"通知的副标题\n", "pause": MessageLookupByLibrary.simpleMessage("暂停"),
), "play": MessageLookupByLibrary.simpleMessage("播放"),
"nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("主标题"), "playerSettings": MessageLookupByLibrary.simpleMessage("播放器设置"),
"nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage(
"通知的标题\n", "剩余时间标记完成",
), ),
"no": MessageLookupByLibrary.simpleMessage(""), "playerSettingsCompleteTimeDescriptionHead":
"notImplemented": MessageLookupByLibrary.simpleMessage("未实现"), MessageLookupByLibrary.simpleMessage("当书中剩余时间少于 "),
"notificationMediaPlayer": "playerSettingsCompleteTimeDescriptionTail":
MessageLookupByLibrary.simpleMessage("通知媒体播放器"), MessageLookupByLibrary.simpleMessage(" 时,标记完成"),
"notificationMediaPlayerDescription": "playerSettingsDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "自定义播放器设置",
"在通知中自定义媒体播放器", ),
), "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage("显示设置"),
"ok": MessageLookupByLibrary.simpleMessage("确定"), "playerSettingsDisplayChapterProgress":
"pause": MessageLookupByLibrary.simpleMessage("暂停"), MessageLookupByLibrary.simpleMessage("显示章节进度"),
"play": MessageLookupByLibrary.simpleMessage("播放"), "playerSettingsDisplayChapterProgressDescription":
"playerSettings": MessageLookupByLibrary.simpleMessage("播放器设置"), MessageLookupByLibrary.simpleMessage("在播放器中显示当前章节的进度"),
"playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( "playerSettingsDisplayTotalProgress": MessageLookupByLibrary.simpleMessage(
"剩余时间标记完成", "显示总进度",
), ),
"playerSettingsCompleteTimeDescriptionHead": "playerSettingsDisplayTotalProgressDescription":
MessageLookupByLibrary.simpleMessage("当书中剩余时间少于 "), MessageLookupByLibrary.simpleMessage("在播放器中显示当前书籍的总进度"),
"playerSettingsCompleteTimeDescriptionTail": "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage(" 时,标记完成"), "播放报告间隔",
"playerSettingsDescription": MessageLookupByLibrary.simpleMessage( ),
"自定义播放器设置", "playerSettingsPlaybackIntervalDescriptionHead":
), MessageLookupByLibrary.simpleMessage(""),
"playerSettingsDisplay": MessageLookupByLibrary.simpleMessage("显示设置"), "playerSettingsPlaybackIntervalDescriptionTail":
"playerSettingsDisplayChapterProgress": MessageLookupByLibrary.simpleMessage(" 向服务器报告一次进度"),
MessageLookupByLibrary.simpleMessage("显示章节进度"), "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage(
"playerSettingsDisplayChapterProgressDescription": "回放报告",
MessageLookupByLibrary.simpleMessage("在播放器中显示当前章节的进度"), ),
"playerSettingsDisplayTotalProgress": "playerSettingsPlaybackReportingIgnore":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("忽略播放位置小于"),
"显示总进度", "playerSettingsPlaybackReportingMinimum":
), MessageLookupByLibrary.simpleMessage("回放报告最小位置"),
"playerSettingsDisplayTotalProgressDescription": "playerSettingsPlaybackReportingMinimumDescriptionHead":
MessageLookupByLibrary.simpleMessage("在播放器中显示当前书籍的总进度"), MessageLookupByLibrary.simpleMessage("不要报告本书前 "),
"playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( "playerSettingsPlaybackReportingMinimumDescriptionTail":
"播放报告间隔", MessageLookupByLibrary.simpleMessage(" 的播放"),
), "playerSettingsRememberForEveryBook": MessageLookupByLibrary.simpleMessage(
"playerSettingsPlaybackIntervalDescriptionHead": "记住每本书的播放器设置",
MessageLookupByLibrary.simpleMessage(""), ),
"playerSettingsPlaybackIntervalDescriptionTail": "playerSettingsRememberForEveryBookDescription":
MessageLookupByLibrary.simpleMessage(" 向服务器报告一次进度"), MessageLookupByLibrary.simpleMessage("每本书都会记住播放速度、音量等设置"),
"playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("播放速度"),
"回放报告", "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage(
), "默认播放速度",
"playerSettingsPlaybackReportingIgnore": ),
MessageLookupByLibrary.simpleMessage("忽略播放位置小于"), "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage(
"playerSettingsPlaybackReportingMinimum": "播放速度选项",
MessageLookupByLibrary.simpleMessage("回放报告最小位置"), ),
"playerSettingsPlaybackReportingMinimumDescriptionHead": "playerSettingsSpeedOptionsSelect": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("不要报告本书前 "), "播放速度选项",
"playerSettingsPlaybackReportingMinimumDescriptionTail": ),
MessageLookupByLibrary.simpleMessage(" 的播放"), "playerSettingsSpeedOptionsSelectAdd": MessageLookupByLibrary.simpleMessage(
"playerSettingsRememberForEveryBook": "添加一个速度选项",
MessageLookupByLibrary.simpleMessage( ),
"记住每本书的播放器设置", "playerSettingsSpeedOptionsSelectAddHelper":
), MessageLookupByLibrary.simpleMessage("输入一个新的速度选项"),
"playerSettingsRememberForEveryBookDescription": "playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage("选择播放速度"),
MessageLookupByLibrary.simpleMessage("每本书都会记住播放速度、音量等设置"), "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage(
"playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("播放速度"), "输入默认的播放速度",
"playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( ),
"默认播放速度", "playlistsMine": MessageLookupByLibrary.simpleMessage("播放列表"),
), "readLess": MessageLookupByLibrary.simpleMessage("折叠"),
"playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( "readMore": MessageLookupByLibrary.simpleMessage("展开"),
"播放速度选项", "refresh": MessageLookupByLibrary.simpleMessage("刷新"),
), "reset": MessageLookupByLibrary.simpleMessage("重置"),
"playerSettingsSpeedOptionsSelect": "resetAppSettings": MessageLookupByLibrary.simpleMessage("重置应用程序设置"),
MessageLookupByLibrary.simpleMessage( "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage(
"播放速度选项", "将应用程序设置重置为默认值",
), ),
"playerSettingsSpeedOptionsSelectAdd": "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage( "您确定要重置应用程序设置吗?",
"添加一个速度选项", ),
), "restore": MessageLookupByLibrary.simpleMessage("恢复"),
"playerSettingsSpeedOptionsSelectAddHelper": "restoreBackup": MessageLookupByLibrary.simpleMessage("恢复备份"),
MessageLookupByLibrary.simpleMessage("输入一个新的速度选项"), "restoreBackupHint": MessageLookupByLibrary.simpleMessage("将备份粘贴到此处"),
"playerSettingsSpeedSelect": "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage("无效备份"),
MessageLookupByLibrary.simpleMessage("选择播放速度"), "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage("设置已恢复"),
"playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( "restoreBackupValidator": MessageLookupByLibrary.simpleMessage("请将备份粘贴到此处"),
"输入默认的播放速度", "restoreDescription": MessageLookupByLibrary.simpleMessage("从备份中还原应用程序设置"),
), "resume": MessageLookupByLibrary.simpleMessage("继续"),
"playlistsMine": MessageLookupByLibrary.simpleMessage("播放列表"), "retry": MessageLookupByLibrary.simpleMessage("重试"),
"readLess": MessageLookupByLibrary.simpleMessage("折叠"), "settings": MessageLookupByLibrary.simpleMessage("设置"),
"readMore": MessageLookupByLibrary.simpleMessage("展开"), "shakeAction": MessageLookupByLibrary.simpleMessage("抖动操作"),
"refresh": MessageLookupByLibrary.simpleMessage("刷新"), "shakeActionDescription": MessageLookupByLibrary.simpleMessage(
"reset": MessageLookupByLibrary.simpleMessage("重置"), "检测到抖动时要执行的操作",
"resetAppSettings": MessageLookupByLibrary.simpleMessage("重置应用程序设置"), ),
"resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( "shakeActivationThreshold": MessageLookupByLibrary.simpleMessage("抖动激活阈值"),
"将应用程序设置重置为默认值", "shakeActivationThresholdDescription": MessageLookupByLibrary.simpleMessage(
), "门槛越高,你就越难摇晃",
"resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( ),
"您确定要重置应用程序设置吗?", "shakeDetector": MessageLookupByLibrary.simpleMessage("抖动检测器"),
), "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage(
"restore": MessageLookupByLibrary.simpleMessage("恢复"), "自定义抖动检测器设置",
"restoreBackup": MessageLookupByLibrary.simpleMessage("恢复备份"), ),
"restoreBackupHint": MessageLookupByLibrary.simpleMessage("将备份粘贴到此处"), "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage("启用抖动检测"),
"restoreBackupInvalid": MessageLookupByLibrary.simpleMessage("无效备份"), "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage(
"restoreBackupSuccess": MessageLookupByLibrary.simpleMessage("设置已恢复"), "启用抖动检测以执行各种操作",
"restoreBackupValidator": ),
MessageLookupByLibrary.simpleMessage("请将备份粘贴到此处"), "shakeDetectorSettings": MessageLookupByLibrary.simpleMessage("抖动检测器设置"),
"restoreDescription": "shakeFeedback": MessageLookupByLibrary.simpleMessage("抖动反馈"),
MessageLookupByLibrary.simpleMessage("从备份中还原应用程序设置"), "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage(
"resume": MessageLookupByLibrary.simpleMessage("继续"), "检测到抖动时给出的反馈",
"retry": MessageLookupByLibrary.simpleMessage("重试"), ),
"settings": MessageLookupByLibrary.simpleMessage("设置"), "shakeSelectAction": MessageLookupByLibrary.simpleMessage("选择抖动动作"),
"shakeAction": MessageLookupByLibrary.simpleMessage("抖动操作"), "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage(
"shakeActionDescription": MessageLookupByLibrary.simpleMessage( "选择抖动激活阈值",
"检测到抖动时要执行的操作", ),
), "shakeSelectActivationThresholdHelper":
"shakeActivationThreshold": MessageLookupByLibrary.simpleMessage("输入一个数字以m/s²为单位设置阈值"),
MessageLookupByLibrary.simpleMessage("抖动激活阈值"), "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage("选择抖动反馈"),
"shakeActivationThresholdDescription": "themeMode": MessageLookupByLibrary.simpleMessage("主题模式"),
MessageLookupByLibrary.simpleMessage( "themeModeDark": MessageLookupByLibrary.simpleMessage("深色"),
"门槛越高,你就越难摇晃", "themeModeHighContrast": MessageLookupByLibrary.simpleMessage("高对比度模式"),
), "themeModeHighContrastDescription": MessageLookupByLibrary.simpleMessage(
"shakeDetector": MessageLookupByLibrary.simpleMessage("抖动检测器"), "增加背景和文本之间的对比度",
"shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( ),
"自定义抖动检测器设置", "themeModeLight": MessageLookupByLibrary.simpleMessage("浅色"),
), "themeModeSystem": MessageLookupByLibrary.simpleMessage("跟随系统"),
"shakeDetectorEnable": MessageLookupByLibrary.simpleMessage("启用抖动检测"), "themeSettings": MessageLookupByLibrary.simpleMessage("主题设置"),
"shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( "themeSettingsColors": MessageLookupByLibrary.simpleMessage("主题色"),
"启用抖动检测以执行各种操作", "themeSettingsColorsAndroid": MessageLookupByLibrary.simpleMessage("主题色"),
), "themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage(
"shakeDetectorSettings": "书籍详情页自适应主题",
MessageLookupByLibrary.simpleMessage("抖动检测器设置"), ),
"shakeFeedback": MessageLookupByLibrary.simpleMessage("抖动反馈"), "themeSettingsColorsBookDescription": MessageLookupByLibrary.simpleMessage(
"shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( "以牺牲一些性能为代价,对书籍详情页的颜色进行美化",
"检测到抖动时给出的反馈", ),
), "themeSettingsColorsCurrent": MessageLookupByLibrary.simpleMessage(
"shakeSelectAction": MessageLookupByLibrary.simpleMessage("选择抖动动作"), "根据当前播放的书籍调整主题",
"shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( ),
"选择抖动激活阈值", "themeSettingsColorsCurrentDescription":
), MessageLookupByLibrary.simpleMessage("使用当前播放书籍的主题颜色"),
"shakeSelectActivationThresholdHelper": "themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage(
MessageLookupByLibrary.simpleMessage("输入一个数字以m/s²为单位设置阈值"), "使用应用程序的系统主题色",
"shakeSelectFeedback": MessageLookupByLibrary.simpleMessage("选择抖动反馈"), ),
"themeMode": MessageLookupByLibrary.simpleMessage("主题模式"), "themeSettingsDescription": MessageLookupByLibrary.simpleMessage("自定义应用主题"),
"themeModeDark": MessageLookupByLibrary.simpleMessage("深色"), "timeSecond": m7,
"themeModeHighContrast": MessageLookupByLibrary.simpleMessage("高对比度模式"), "unknown": MessageLookupByLibrary.simpleMessage("未知"),
"themeModeHighContrastDescription": "webVersion": MessageLookupByLibrary.simpleMessage("Web版本"),
MessageLookupByLibrary.simpleMessage( "yes": MessageLookupByLibrary.simpleMessage(""),
"增加背景和文本之间的对比度", "you": MessageLookupByLibrary.simpleMessage("我的"),
), "youTooltip": MessageLookupByLibrary.simpleMessage("您的个人资料和设置"),
"themeModeLight": MessageLookupByLibrary.simpleMessage("浅色"), };
"themeModeSystem": MessageLookupByLibrary.simpleMessage("跟随系统"),
"themeSettings": MessageLookupByLibrary.simpleMessage("主题设置"),
"themeSettingsColors": MessageLookupByLibrary.simpleMessage("主题色"),
"themeSettingsColorsAndroid":
MessageLookupByLibrary.simpleMessage("主题色"),
"themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage(
"书籍详情页自适应主题",
),
"themeSettingsColorsBookDescription":
MessageLookupByLibrary.simpleMessage(
"以牺牲一些性能为代价,对书籍详情页的颜色进行美化",
),
"themeSettingsColorsCurrent": MessageLookupByLibrary.simpleMessage(
"根据当前播放的书籍调整主题",
),
"themeSettingsColorsCurrentDescription":
MessageLookupByLibrary.simpleMessage("使用当前播放书籍的主题颜色"),
"themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage(
"使用应用程序的系统主题色",
),
"themeSettingsDescription":
MessageLookupByLibrary.simpleMessage("自定义应用主题"),
"timeSecond": m7,
"unknown": MessageLookupByLibrary.simpleMessage("未知"),
"webVersion": MessageLookupByLibrary.simpleMessage("Web版本"),
"yes": MessageLookupByLibrary.simpleMessage(""),
"you": MessageLookupByLibrary.simpleMessage("我的"),
"youTooltip": MessageLookupByLibrary.simpleMessage("您的个人资料和设置"),
};
} }

View file

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:dynamic_color/dynamic_color.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_localizations/flutter_localizations.dart';
@ -17,8 +16,6 @@ import 'package:vaani/generated/l10n.dart';
import 'package:vaani/globals.dart'; import 'package:vaani/globals.dart';
import 'package:vaani/router/router.dart'; import 'package:vaani/router/router.dart';
import 'package:vaani/theme/providers/system_theme_provider.dart'; import 'package:vaani/theme/providers/system_theme_provider.dart';
import 'package:vaani/theme/providers/theme_from_cover_provider.dart';
import 'package:vaani/theme/theme.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
void main() async { void main() async {
@ -90,80 +87,19 @@ class AbsApp extends ConsumerWidget {
if (needOnboarding) { if (needOnboarding) {
routerConfig.goNamed(Routes.onboarding.name); routerConfig.goNamed(Routes.onboarding.name);
} }
final appSettings = ref.watch(appSettingsProvider); final language = ref.watch(appSettingsProvider.select((v) => v.language));
final themeSettings = appSettings.themeSettings; final themeSettings =
ref.watch(appSettingsProvider.select((v) => v.themeSettings));
ColorScheme lightColorScheme = brandLightColorScheme; final currentBook = ref.watch(currentBookProvider);
ColorScheme darkColorScheme = brandDarkColorScheme; final currentTheme = ref.watch(
CurrentThemeProvider(
final shouldUseHighContrast = highContrast: MediaQuery.of(context).highContrast,
themeSettings.highContrast || MediaQuery.of(context).highContrast; id: currentBook?.libraryItemId,
if (shouldUseHighContrast) {
lightColorScheme = lightColorScheme.copyWith(
surface: Colors.white,
);
darkColorScheme = darkColorScheme.copyWith(
surface: Colors.black,
);
}
if (themeSettings.useMaterialThemeFromSystem) {
var themes =
ref.watch(systemThemeProvider(highContrast: shouldUseHighContrast));
if (themes.valueOrNull != null) {
lightColorScheme = themes.valueOrNull!.$1;
darkColorScheme = themes.valueOrNull!.$2;
}
}
if (themeSettings.useCurrentPlayerThemeThroughoutApp) {
try {
final currentBook = ref.watch(currentBookProvider);
if (currentBook != null) {
final themeLight = ref.watch(
themeOfLibraryItemProvider(
currentBook.libraryItemId,
highContrast: shouldUseHighContrast,
brightness: Brightness.light,
),
);
final themeDark = ref.watch(
themeOfLibraryItemProvider(
currentBook.libraryItemId,
highContrast: shouldUseHighContrast,
brightness: Brightness.dark,
),
);
if (themeLight.valueOrNull != null && themeDark.valueOrNull != null) {
lightColorScheme = themeLight.valueOrNull!;
darkColorScheme = themeDark.valueOrNull!;
}
}
} catch (e) {
debugPrintStack(stackTrace: StackTrace.current, label: e.toString());
appLogger.severe('not building with player theme');
appLogger.severe(e.toString());
}
}
final appThemeLight = ThemeData(
useMaterial3: true,
colorScheme: lightColorScheme.harmonized(),
fontFamily: fontFamilyPlatform,
);
final appThemeDark = ThemeData(
useMaterial3: true,
colorScheme: darkColorScheme.harmonized(),
fontFamily: fontFamilyPlatform,
brightness: Brightness.dark,
// TODO bottom sheet theme is not working
bottomSheetTheme: BottomSheetThemeData(
backgroundColor: darkColorScheme.surface,
), ),
); );
try { try {
return MaterialApp.router( return MaterialApp.router(
locale: Locale(appSettings.language), locale: Locale(language),
localizationsDelegates: [ localizationsDelegates: [
// //
S.delegate, //String S.delegate, //String
@ -172,8 +108,8 @@ class AbsApp extends ConsumerWidget {
GlobalCupertinoLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
], ],
supportedLocales: S.delegate.supportedLocales, supportedLocales: S.delegate.supportedLocales,
theme: appThemeLight, theme: currentTheme.$1,
darkTheme: appThemeDark, darkTheme: currentTheme.$2,
themeMode: themeSettings.themeMode, themeMode: themeSettings.themeMode,
routerConfig: routerConfig, routerConfig: routerConfig,
themeAnimationCurve: Curves.easeInOut, themeAnimationCurve: Curves.easeInOut,

View file

@ -5,6 +5,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:material_color_utilities/material_color_utilities.dart'; import 'package:material_color_utilities/material_color_utilities.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:vaani/features/settings/app_settings_provider.dart';
import 'package:vaani/theme/providers/theme_from_cover_provider.dart';
import 'package:vaani/theme/theme.dart';
part 'system_theme_provider.g.dart'; part 'system_theme_provider.g.dart';
@ -72,3 +75,82 @@ FutureOr<(ColorScheme light, ColorScheme dark)?> systemTheme(
} }
return (schemeLight, schemeDark); return (schemeLight, schemeDark);
} }
@riverpod
(ThemeData light, ThemeData dark) currentTheme(
Ref ref, {
bool highContrast = false,
String? id,
}) {
final themeSettings =
ref.watch(appSettingsProvider.select((v) => v.themeSettings));
ColorScheme lightColorScheme = brandLightColorScheme;
ColorScheme darkColorScheme = brandDarkColorScheme;
final shouldUseHighContrast = themeSettings.highContrast || highContrast;
if (shouldUseHighContrast) {
lightColorScheme = lightColorScheme.copyWith(
surface: Colors.white,
);
darkColorScheme = darkColorScheme.copyWith(
surface: Colors.black,
);
}
if (themeSettings.useMaterialThemeFromSystem) {
var themes =
ref.watch(systemThemeProvider(highContrast: shouldUseHighContrast));
if (themes.valueOrNull != null) {
lightColorScheme = themes.valueOrNull!.$1;
darkColorScheme = themes.valueOrNull!.$2;
}
}
if (themeSettings.useCurrentPlayerThemeThroughoutApp) {
try {
if (id != null) {
final themeLight = ref.watch(
themeOfLibraryItemProvider(
id,
highContrast: shouldUseHighContrast,
brightness: Brightness.light,
),
);
final themeDark = ref.watch(
themeOfLibraryItemProvider(
id,
highContrast: shouldUseHighContrast,
brightness: Brightness.dark,
),
);
if (themeLight.valueOrNull != null && themeDark.valueOrNull != null) {
lightColorScheme = themeLight.valueOrNull!;
darkColorScheme = themeDark.valueOrNull!;
}
}
} catch (e) {
debugPrintStack(stackTrace: StackTrace.current, label: e.toString());
_logger.severe('not building with player theme');
_logger.severe(e.toString());
}
}
final appThemeLight = ThemeData(
useMaterial3: true,
colorScheme: lightColorScheme.harmonized(),
fontFamily: fontFamilyPlatform,
textTheme: textTheme,
);
final appThemeDark = ThemeData(
useMaterial3: true,
colorScheme: darkColorScheme.harmonized(),
fontFamily: fontFamilyPlatform,
textTheme: textTheme,
brightness: Brightness.dark,
// TODO bottom sheet theme is not working
bottomSheetTheme: BottomSheetThemeData(
backgroundColor: darkColorScheme.surface,
),
);
return (appThemeLight, appThemeDark);
}

View file

@ -175,5 +175,156 @@ class _SystemThemeProviderElement
@override @override
bool get highContrast => (origin as SystemThemeProvider).highContrast; bool get highContrast => (origin as SystemThemeProvider).highContrast;
} }
String _$currentThemeHash() => r'0e62a7f1b62c6ad73a3769909607407d41eb0338';
/// See also [currentTheme].
@ProviderFor(currentTheme)
const currentThemeProvider = CurrentThemeFamily();
/// See also [currentTheme].
class CurrentThemeFamily extends Family<(ThemeData light, ThemeData dark)> {
/// See also [currentTheme].
const CurrentThemeFamily();
/// See also [currentTheme].
CurrentThemeProvider call({
bool highContrast = false,
String? id,
}) {
return CurrentThemeProvider(
highContrast: highContrast,
id: id,
);
}
@override
CurrentThemeProvider getProviderOverride(
covariant CurrentThemeProvider provider,
) {
return call(
highContrast: provider.highContrast,
id: provider.id,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'currentThemeProvider';
}
/// See also [currentTheme].
class CurrentThemeProvider
extends AutoDisposeProvider<(ThemeData light, ThemeData dark)> {
/// See also [currentTheme].
CurrentThemeProvider({
bool highContrast = false,
String? id,
}) : this._internal(
(ref) => currentTheme(
ref as CurrentThemeRef,
highContrast: highContrast,
id: id,
),
from: currentThemeProvider,
name: r'currentThemeProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$currentThemeHash,
dependencies: CurrentThemeFamily._dependencies,
allTransitiveDependencies:
CurrentThemeFamily._allTransitiveDependencies,
highContrast: highContrast,
id: id,
);
CurrentThemeProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.highContrast,
required this.id,
}) : super.internal();
final bool highContrast;
final String? id;
@override
Override overrideWith(
(ThemeData light, ThemeData dark) Function(CurrentThemeRef provider) create,
) {
return ProviderOverride(
origin: this,
override: CurrentThemeProvider._internal(
(ref) => create(ref as CurrentThemeRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
highContrast: highContrast,
id: id,
),
);
}
@override
AutoDisposeProviderElement<(ThemeData light, ThemeData dark)>
createElement() {
return _CurrentThemeProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is CurrentThemeProvider &&
other.highContrast == highContrast &&
other.id == id;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, highContrast.hashCode);
hash = _SystemHash.combine(hash, id.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin CurrentThemeRef
on AutoDisposeProviderRef<(ThemeData light, ThemeData dark)> {
/// The parameter `highContrast` of this provider.
bool get highContrast;
/// The parameter `id` of this provider.
String? get id;
}
class _CurrentThemeProviderElement
extends AutoDisposeProviderElement<(ThemeData light, ThemeData dark)>
with CurrentThemeRef {
_CurrentThemeProviderElement(super.provider);
@override
bool get highContrast => (origin as CurrentThemeProvider).highContrast;
@override
String? get id => (origin as CurrentThemeProvider).id;
}
// ignore_for_file: type=lint // ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package

View file

@ -30,3 +30,190 @@ String get fontFamilyPlatform {
return 'Arial'; // 退 return 'Arial'; // 退
} }
} }
// letterSpacing
const defaultTextTheme = TextTheme(
displayLarge: TextStyle(
fontSize: 57.0,
fontWeight: FontWeight.w400,
height: 1.12,
letterSpacing: -0.25,
),
displayMedium: TextStyle(
fontSize: 45.0,
fontWeight: FontWeight.w400,
height: 1.16,
letterSpacing: 0.0,
),
displaySmall: TextStyle(
fontSize: 36.0,
fontWeight: FontWeight.w400,
height: 1.22,
letterSpacing: 0.0,
),
headlineLarge: TextStyle(
fontSize: 32.0,
fontWeight: FontWeight.w400,
height: 1.25,
letterSpacing: 0.0,
),
headlineMedium: TextStyle(
fontSize: 28.0,
fontWeight: FontWeight.w400,
height: 1.29,
letterSpacing: 0.0,
),
headlineSmall: TextStyle(
fontSize: 24.0,
fontWeight: FontWeight.w400,
height: 1.33,
letterSpacing: 0.0,
),
titleLarge: TextStyle(
fontSize: 22.0,
fontWeight: FontWeight.w400,
height: 1.27,
letterSpacing: 0.0,
),
titleMedium: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.w500,
height: 1.5,
letterSpacing: 0.15,
),
titleSmall: TextStyle(
fontSize: 14.0,
fontWeight: FontWeight.w500,
height: 1.43,
letterSpacing: 0.1,
),
bodyLarge: TextStyle(
fontSize: 16.0,
fontWeight: FontWeight.w400,
height: 1.5,
letterSpacing: 0.5,
),
bodyMedium: TextStyle(
fontSize: 14.0,
fontWeight: FontWeight.w400,
height: 1.43,
letterSpacing: 0.25,
),
bodySmall: TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.w400,
height: 1.33,
letterSpacing: 0.4,
),
labelLarge: TextStyle(
fontSize: 14.0,
fontWeight: FontWeight.w500,
height: 1.43,
letterSpacing: 0.1,
),
labelMedium: TextStyle(
fontSize: 12.0,
fontWeight: FontWeight.w500,
height: 1.33,
letterSpacing: 0.5,
),
labelSmall: TextStyle(
fontSize: 11.0,
fontWeight: FontWeight.w500,
height: 1.45,
letterSpacing: 0.5,
),
);
const textTheme = TextTheme(
displayLarge: TextStyle(
fontSize: 44, //
fontWeight: FontWeight.w400,
height: 1.12,
letterSpacing: -0.25,
),
displayMedium: TextStyle(
fontSize: 36,
fontWeight: FontWeight.w400,
height: 1.16,
letterSpacing: 0.0,
),
displaySmall: TextStyle(
fontSize: 32,
fontWeight: FontWeight.w400,
height: 1.22,
letterSpacing: 0.0,
),
headlineLarge: TextStyle(
fontSize: 28,
fontWeight: FontWeight.w400,
height: 1.25,
letterSpacing: 0.0,
),
headlineMedium: TextStyle(
fontSize: 24,
fontWeight: FontWeight.w400,
height: 1.29,
letterSpacing: 0.0,
),
headlineSmall: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w400,
height: 1.33,
letterSpacing: 0.0,
),
titleLarge: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w400,
height: 1.27,
letterSpacing: 0.0,
),
titleMedium: TextStyle(
fontSize: 15, //
fontWeight: FontWeight.w500,
height: 1.5,
letterSpacing: 0.15,
),
titleSmall: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500,
height: 1.43,
letterSpacing: 0.1,
),
bodyLarge: TextStyle(
fontSize: 15,
fontWeight: FontWeight.w400,
height: 1.5,
letterSpacing: 0.5,
),
bodyMedium: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w400,
height: 1.43,
letterSpacing: 0.25,
),
bodySmall: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w400,
height: 1.33,
letterSpacing: 0.4,
),
labelLarge: TextStyle(
fontSize: 13,
fontWeight: FontWeight.w500,
height: 1.43,
letterSpacing: 0.1,
),
labelMedium: TextStyle(
fontSize: 11,
fontWeight: FontWeight.w500,
height: 1.33,
letterSpacing: 0.5,
),
labelSmall: TextStyle(
fontSize: 10,
fontWeight: FontWeight.w500,
height: 1.45,
letterSpacing: 0.5,
),
);

View file

@ -30,22 +30,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.11.3" version: "0.11.3"
animated_list_plus:
dependency: "direct main"
description:
name: animated_list_plus
sha256: fb3d7f1fbaf5af84907f3c739236bacda8bf32cbe1f118dd51510752883ff50c
url: "https://pub.dev"
source: hosted
version: "0.5.2"
animated_theme_switcher:
dependency: "direct main"
description:
name: animated_theme_switcher
sha256: "24ccd74437b8db78f6d1ec701804702817bced5f925b1b3419c7a93071e3d3e9"
url: "https://pub.dev"
source: hosted
version: "2.0.10"
archive: archive:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -133,8 +133,8 @@ dependencies:
# 动画 # 动画
flutter_animate: ^4.5.0 flutter_animate: ^4.5.0
lottie: ^3.1.0 lottie: ^3.1.0
animated_list_plus: ^0.5.2 # animated_list_plus: ^0.5.2
animated_theme_switcher: ^2.0.10 # animated_theme_switcher: ^2.0.10
# Material Design 3色彩系统的算法和工具 # Material Design 3色彩系统的算法和工具
material_color_utilities: ^0.11.1 material_color_utilities: ^0.11.1