From 3c3c381f8a3f03703f030cc90446da5d7604b60f Mon Sep 17 00:00:00 2001 From: rang <378694192@qq.com> Date: Sun, 4 Jan 2026 17:49:05 +0800 Subject: [PATCH] aaa --- lib/features/player/core/abs_audio.dart | 3 + .../player/core/abs_audio_handler.dart | 4 - lib/features/player/core/init.dart | 74 +- .../player/providers/abs_provider.dart | 137 ++- .../player/providers/abs_provider.g.dart | 39 +- .../settings/models/app_settings.dart | 2 +- .../settings/models/app_settings.freezed.dart | 10 +- .../settings/models/app_settings.g.dart | 2 +- .../settings/view/app_settings_page.dart | 48 +- .../settings/view/player_settings_page.dart | 43 +- lib/generated/intl/messages_en.dart | 922 +++++++++--------- lib/generated/intl/messages_zh.dart | 693 +++++++------ lib/generated/l10n.dart | 20 + lib/l10n/intl_en.arb | 3 + lib/l10n/intl_zh.arb | 3 + lib/shared/widgets/custom_dropdown.dart | 65 ++ pubspec.lock | 26 +- pubspec.yaml | 172 ++-- 18 files changed, 1266 insertions(+), 1000 deletions(-) create mode 100644 lib/features/player/core/abs_audio.dart create mode 100644 lib/shared/widgets/custom_dropdown.dart diff --git a/lib/features/player/core/abs_audio.dart b/lib/features/player/core/abs_audio.dart new file mode 100644 index 0000000..82b0f5a --- /dev/null +++ b/lib/features/player/core/abs_audio.dart @@ -0,0 +1,3 @@ +import 'package:just_audio/just_audio.dart'; + +class AudiobookPlayer extends AudioPlayer {} diff --git a/lib/features/player/core/abs_audio_handler.dart b/lib/features/player/core/abs_audio_handler.dart index a177a76..dfb52c9 100644 --- a/lib/features/player/core/abs_audio_handler.dart +++ b/lib/features/player/core/abs_audio_handler.dart @@ -1,8 +1,4 @@ -import 'dart:io'; - import 'package:audio_service/audio_service.dart'; -import 'package:flutter/foundation.dart'; -import 'package:just_audio/just_audio.dart'; import 'package:vaani/features/player/core/abs_audio_player.dart'; // 对接audio_service diff --git a/lib/features/player/core/init.dart b/lib/features/player/core/init.dart index 121a80e..a2e3ec4 100644 --- a/lib/features/player/core/init.dart +++ b/lib/features/player/core/init.dart @@ -1,34 +1,62 @@ // import 'package:audio_service/audio_service.dart'; // import 'package:audio_session/audio_session.dart'; -// import 'package:riverpod_annotation/riverpod_annotation.dart'; -// import 'package:vaani/features/player/core/abs_audio_handler.dart' as core; -// import 'package:vaani/features/player/core/abs_audio_player.dart'; -// import 'package:vaani/globals.dart'; +// import 'package:just_audio_background/just_audio_background.dart' +// show JustAudioBackground, NotificationConfig; +// import 'package:just_audio_media_kit/just_audio_media_kit.dart' +// show JustAudioMediaKit; +// import 'package:vaani/features/settings/app_settings_provider.dart'; +// import 'package:vaani/features/settings/models/app_settings.dart'; -// /// 音频播放器 配置 -// @Riverpod(keepAlive: true) -// Future configurePlayer(AbsAudioPlayer player) async { +// Future configurePlayer() async { // // for playing audio on windows, linux +// JustAudioMediaKit.ensureInitialized(); // // for configuring how this app will interact with other audio apps // final session = await AudioSession.instance; // await session.configure(const AudioSessionConfiguration.speech()); -// await AudioService.init( -// builder: () => core.AbsAudioHandler(player), -// config: const AudioServiceConfig( -// androidNotificationChannelId: 'dr.blank.vaani.channel.audio', -// androidNotificationChannelName: 'ABSPlayback', -// androidNotificationChannelDescription: -// 'Needed to control audio from lock screen', -// androidNotificationOngoing: false, -// androidStopForegroundOnPause: false, -// androidNotificationIcon: 'drawable/ic_stat_logo', -// preloadArtwork: true, -// // fastForwardInterval: Duration(seconds: 20), -// // rewindInterval: Duration(seconds: 20), -// ), -// ); +// final appSettings = loadOrCreateAppSettings(); -// appLogger.finer('created simple player'); +// // for playing audio in the background +// await JustAudioBackground.init( +// androidNotificationChannelId: 'dr.blank.vaani.channel.audio', +// androidNotificationChannelName: 'Audio playback', +// androidNotificationOngoing: false, +// androidStopForegroundOnPause: false, +// androidNotificationChannelDescription: 'Audio playback in the background', +// androidNotificationIcon: 'drawable/ic_stat_logo', +// rewindInterval: appSettings.notificationSettings.rewindInterval, +// fastForwardInterval: appSettings.notificationSettings.fastForwardInterval, +// androidShowNotificationBadge: false, +// notificationConfigBuilder: (state) { +// final controls = [ +// if (appSettings.notificationSettings.mediaControls +// .contains(NotificationMediaControl.skipToPreviousChapter) && +// state.hasPrevious) +// MediaControl.skipToPrevious, +// if (appSettings.notificationSettings.mediaControls +// .contains(NotificationMediaControl.rewind)) +// MediaControl.rewind, +// if (state.playing) MediaControl.pause else MediaControl.play, +// if (appSettings.notificationSettings.mediaControls +// .contains(NotificationMediaControl.fastForward)) +// MediaControl.fastForward, +// if (appSettings.notificationSettings.mediaControls +// .contains(NotificationMediaControl.skipToNextChapter) && +// state.hasNext) +// MediaControl.skipToNext, +// if (appSettings.notificationSettings.mediaControls +// .contains(NotificationMediaControl.stop)) +// MediaControl.stop, +// ]; +// return NotificationConfig( +// controls: controls, +// systemActions: const { +// MediaAction.seek, +// MediaAction.seekForward, +// MediaAction.seekBackward, +// }, +// ); +// }, +// ); // } diff --git a/lib/features/player/providers/abs_provider.dart b/lib/features/player/providers/abs_provider.dart index 3dccffd..42e8272 100644 --- a/lib/features/player/providers/abs_provider.dart +++ b/lib/features/player/providers/abs_provider.dart @@ -2,6 +2,7 @@ import 'package:audio_service/audio_service.dart'; import 'package:audio_session/audio_session.dart'; import 'package:collection/collection.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:just_audio/just_audio.dart'; import 'package:logging/logging.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:shelfsdk/audiobookshelf_api.dart' as api; @@ -67,6 +68,123 @@ bool playerActive(Ref ref) { return false; } +@Riverpod(keepAlive: true) +AudioPlayer simpleAudioPlayer(Ref ref) { + final player = AudioPlayer(); + ref.onDispose(player.dispose); + return player; +} + +@Riverpod(keepAlive: true) +class AbsAudioPlayer extends _$AbsAudioPlayer { + @override + AudioPlayer build() { + final audioPlayer = ref.watch(simpleAudioPlayerProvider); + return audioPlayer; + } + + Future load( + api.BookExpanded book, { + Duration? initialPosition, + bool play = true, + }) async { + final currentTrack = book.findTrackAtTime(initialPosition ?? Duration.zero); + final indexTrack = book.tracks.indexOf(currentTrack); + final positionInTrack = initialPosition != null + ? initialPosition - currentTrack.startOffset + : null; + final api = ref.read(authenticatedApiProvider); + + final downloadManager = ref.read(simpleDownloadManagerProvider); + print(downloadManager.basePath); + + final libItem = + await ref.read(libraryItemProvider(book.libraryItemId).future); + final downloadedUris = await downloadManager.getDownloadedFilesUri(libItem); + + final bookSettings = ref.read(bookSettingsProvider(book.libraryItemId)); + var bookPlayerSettings = bookSettings.playerSettings; + final start = bookSettings.playerSettings.skipChapterStart; + final end = bookSettings.playerSettings.skipChapterEnd; + final appPlayerSettings = ref.read(appSettingsProvider).playerSettings; + final configurePlayerForEveryBook = + appPlayerSettings.configurePlayerForEveryBook; + List audioSources = + start > Duration.zero || end > Duration.zero + ? book.tracks + .map( + (track) => ClippingAudioSource( + child: AudioSource.uri( + _getUri( + track, + downloadedUris, + baseUrl: api.baseUrl, + token: api.token!, + ), + ), + start: start, + end: end > Duration.zero ? null : track.duration - end, + ), + ) + .toList() + : book.tracks + .map( + (track) => AudioSource.uri( + _getUri( + track, + downloadedUris, + baseUrl: api.baseUrl, + token: api.token!, + ), + ), + ) + .toList(); + await state + .setAudioSources( + audioSources, + preload: true, + initialIndex: indexTrack, + initialPosition: positionInTrack, + ) + .catchError((error) { + _logger.shout('Error in setting audio source: $error'); + return null; + }); + // set the volume + await state.setVolume( + configurePlayerForEveryBook + ? bookPlayerSettings.preferredDefaultVolume ?? + appPlayerSettings.preferredDefaultVolume + : appPlayerSettings.preferredDefaultVolume, + ); + // set the speed + await state.setSpeed( + configurePlayerForEveryBook + ? bookPlayerSettings.preferredDefaultSpeed ?? + appPlayerSettings.preferredDefaultSpeed + : appPlayerSettings.preferredDefaultSpeed, + ); + if (play) await state.play(); + } + + Uri _getUri( + api.AudioTrack track, + List? downloadedUris, { + required Uri baseUrl, + required String token, + }) { + // check if the track is in the downloadedUris + final uri = downloadedUris?.firstWhereOrNull( + (element) { + return element.pathSegments.last == track.metadata?.filename; + }, + ); + + return uri ?? + Uri.parse('${baseUrl.toString()}${track.contentUrl}?token=$token'); + } +} + /// 音频播放器 riverpod状态 @Riverpod(keepAlive: true) class AbsPlayer extends _$AbsPlayer { @@ -166,7 +284,7 @@ class CurrentBook extends _$CurrentBook { @override api.BookExpanded? build() { listenSelf((previous, next) { - if (next == null) { + if (previous == null && next == null) { final activeLibraryItemId = AvailableHiveBoxes.basicBox .getAs(CacheKey.activeLibraryItemId); if (activeLibraryItemId != null) { @@ -226,20 +344,3 @@ class CurrentChapter extends _$CurrentChapter { Stream positionChapter(Ref ref) { return ref.read(absPlayerProvider).positionInChapterStream; } - -@riverpod -List currentChapters(Ref ref) { - final book = ref.watch(currentBookProvider); - if (book == null) { - return []; - } - final currentChapter = ref.watch(currentChapterProvider); - if (currentChapter == null) { - return []; - } - final index = book.chapters.indexOf(currentChapter); - final total = book.chapters.length; - final start = index - 3 >= 0 ? index - 3 : 0; - final end = start + 20 <= total ? start + 20 : total; - return book.chapters.sublist(start, end); -} diff --git a/lib/features/player/providers/abs_provider.g.dart b/lib/features/player/providers/abs_provider.g.dart index f32f703..fbb2c90 100644 --- a/lib/features/player/providers/abs_provider.g.dart +++ b/lib/features/player/providers/abs_provider.g.dart @@ -57,6 +57,23 @@ final playerActiveProvider = AutoDisposeProvider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef PlayerActiveRef = AutoDisposeProviderRef; +String _$simpleAudioPlayerHash() => r'4da667e3b7047003edd594f8a76700afb963aceb'; + +/// See also [simpleAudioPlayer]. +@ProviderFor(simpleAudioPlayer) +final simpleAudioPlayerProvider = Provider.internal( + simpleAudioPlayer, + name: r'simpleAudioPlayerProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$simpleAudioPlayerHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef SimpleAudioPlayerRef = ProviderRef; String _$currentTimeHash() => r'3e7f99dbf48242a5fa0a4239a0f696535d0b4ac9'; /// Copied from Dart SDK @@ -225,24 +242,22 @@ final positionChapterProvider = AutoDisposeStreamProvider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef PositionChapterRef = AutoDisposeStreamProviderRef; -String _$currentChaptersHash() => r'2d694aaa17f7eed8f97859d83e5b61f22966c35a'; +String _$absAudioPlayerHash() => r'f595b5033eed9f4a4aa07c297c4a176955e6aab1'; -/// See also [currentChapters]. -@ProviderFor(currentChapters) -final currentChaptersProvider = - AutoDisposeProvider>.internal( - currentChapters, - name: r'currentChaptersProvider', +/// See also [AbsAudioPlayer]. +@ProviderFor(AbsAudioPlayer) +final absAudioPlayerProvider = + NotifierProvider.internal( + AbsAudioPlayer.new, + name: r'absAudioPlayerProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$currentChaptersHash, + : _$absAudioPlayerHash, dependencies: null, allTransitiveDependencies: null, ); -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -typedef CurrentChaptersRef = AutoDisposeProviderRef>; +typedef _$AbsAudioPlayer = Notifier; String _$absPlayerHash() => r'e682fea03793a0370cb143602980d5c1e37396c7'; /// 音频播放器 riverpod状态 @@ -275,7 +290,7 @@ final playerStateProvider = ); typedef _$PlayerState = AutoDisposeNotifier; -String _$currentBookHash() => r'790af1f9502b12879fc22c900ed5e3572381ab1e'; +String _$currentBookHash() => r'714d7701508b6186598e13bc38c57c3fe644ae90'; /// See also [CurrentBook]. @ProviderFor(CurrentBook) diff --git a/lib/features/settings/models/app_settings.dart b/lib/features/settings/models/app_settings.dart index 04c10e3..0424948 100644 --- a/lib/features/settings/models/app_settings.dart +++ b/lib/features/settings/models/app_settings.dart @@ -51,7 +51,7 @@ class PlayerSettings with _$PlayerSettings { ExpandedPlayerSettings expandedPlayerSettings, @Default(1) double preferredDefaultVolume, @Default(1) double preferredDefaultSpeed, - @Default([1, 1.25, 1.5, 1.75, 2]) List speedOptions, + @Default([0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]) List speedOptions, @Default(0.05) double speedIncrement, @Default(0.1) double minSpeed, @Default(4) double maxSpeed, diff --git a/lib/features/settings/models/app_settings.freezed.dart b/lib/features/settings/models/app_settings.freezed.dart index f84e13a..3ad2b7c 100644 --- a/lib/features/settings/models/app_settings.freezed.dart +++ b/lib/features/settings/models/app_settings.freezed.dart @@ -986,7 +986,15 @@ class _$PlayerSettingsImpl implements _PlayerSettings { this.expandedPlayerSettings = const ExpandedPlayerSettings(), this.preferredDefaultVolume = 1, this.preferredDefaultSpeed = 1, - final List speedOptions = const [1, 1.25, 1.5, 1.75, 2], + final List speedOptions = const [ + 0.5, + 0.75, + 1, + 1.25, + 1.5, + 1.75, + 2 + ], this.speedIncrement = 0.05, this.minSpeed = 0.1, this.maxSpeed = 4, diff --git a/lib/features/settings/models/app_settings.g.dart b/lib/features/settings/models/app_settings.g.dart index a868347..88c9f95 100644 --- a/lib/features/settings/models/app_settings.g.dart +++ b/lib/features/settings/models/app_settings.g.dart @@ -99,7 +99,7 @@ _$PlayerSettingsImpl _$$PlayerSettingsImplFromJson(Map json) => speedOptions: (json['speedOptions'] as List?) ?.map((e) => (e as num).toDouble()) .toList() ?? - const [1, 1.25, 1.5, 1.75, 2], + const [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2], speedIncrement: (json['speedIncrement'] as num?)?.toDouble() ?? 0.05, minSpeed: (json['minSpeed'] as num?)?.toDouble() ?? 0.1, maxSpeed: (json['maxSpeed'] as num?)?.toDouble() ?? 4, diff --git a/lib/features/settings/view/app_settings_page.dart b/lib/features/settings/view/app_settings_page.dart index 64e5efd..7bab6fe 100644 --- a/lib/features/settings/view/app_settings_page.dart +++ b/lib/features/settings/view/app_settings_page.dart @@ -6,13 +6,14 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_settings_ui/flutter_settings_ui.dart'; import 'package:go_router/go_router.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:vaani/generated/l10n.dart'; -import 'package:vaani/router/router.dart'; import 'package:vaani/features/settings/app_settings_provider.dart'; import 'package:vaani/features/settings/models/app_settings.dart' as model; import 'package:vaani/features/settings/view/buttons.dart'; import 'package:vaani/features/settings/view/simple_settings_page.dart'; import 'package:vaani/features/settings/view/widgets/navigation_with_switch_tile.dart'; +import 'package:vaani/generated/l10n.dart'; +import 'package:vaani/router/router.dart'; +import 'package:vaani/shared/widgets/custom_dropdown.dart'; class AppSettingsPage extends HookConsumerWidget { const AppSettingsPage({ @@ -40,22 +41,35 @@ class AppSettingsPage extends HookConsumerWidget { SettingsTile( title: Text(S.of(context).language), leading: const Icon(Icons.language), - trailing: DropdownButton( - value: appSettings.language, - items: S.delegate.supportedLocales.map((locale) { - return DropdownMenuItem( - value: locale.languageCode, - child: Text(locales[locale.languageCode] ?? 'unknown'), - ); + trailing: CustomDropdown( + selected: appSettings.language, + items: (f, cs) => S.delegate.supportedLocales.map((locale) { + return locale.languageCode; }).toList(), - onChanged: (value) { - ref.read(appSettingsProvider.notifier).update( - appSettings.copyWith( - language: value!, + itemAsString: (item) => locales[item] ?? 'unknown', + onChanged: (value) async => + ref.read(appSettingsProvider.notifier).update( + appSettings.copyWith( + language: value!, + ), ), - ); - }, ), + // trailing: DropdownButton( + // value: appSettings.language, + // items: S.delegate.supportedLocales.map((locale) { + // return DropdownMenuItem( + // value: locale.languageCode, + // child: Text(locales[locale.languageCode] ?? 'unknown'), + // ); + // }).toList(), + // onChanged: (value) { + // ref.read(appSettingsProvider.notifier).update( + // appSettings.copyWith( + // language: value!, + // ), + // ); + // }, + // ), description: Text(S.of(context).languageDescription), ), SettingsTile( @@ -67,9 +81,9 @@ class AppSettingsPage extends HookConsumerWidget { }, ), SettingsTile( - title: Text('下载设置'), + title: Text(S.of(context).downloadSettings), leading: const Icon(Icons.download), - description: Text('自定义下载设置'), + description: Text(S.of(context).downloadSettingsDescription), onPressed: (context) { context.pushNamed(Routes.downloadSettings.name); }, diff --git a/lib/features/settings/view/player_settings_page.dart b/lib/features/settings/view/player_settings_page.dart index ed6709a..7268446 100644 --- a/lib/features/settings/view/player_settings_page.dart +++ b/lib/features/settings/view/player_settings_page.dart @@ -3,11 +3,13 @@ import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_settings_ui/flutter_settings_ui.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:vaani/constants/sizes.dart'; import 'package:vaani/generated/l10n.dart'; import 'package:vaani/features/settings/app_settings_provider.dart'; import 'package:vaani/features/settings/view/buttons.dart'; import 'package:vaani/features/settings/view/simple_settings_page.dart'; import 'package:vaani/shared/extensions/duration_format.dart'; +import 'package:vaani/shared/widgets/custom_dropdown.dart'; class PlayerSettingsPage extends HookConsumerWidget { const PlayerSettingsPage({ @@ -25,8 +27,8 @@ class PlayerSettingsPage extends HookConsumerWidget { sections: [ SettingsSection( margin: const EdgeInsetsDirectional.symmetric( - horizontal: 16.0, - vertical: 8.0, + horizontal: AppElementSizes.paddingLarge, + vertical: AppElementSizes.paddingRegular, ), tiles: [ // preferred settings for every book @@ -49,27 +51,26 @@ class PlayerSettingsPage extends HookConsumerWidget { // preferred default speed SettingsTile( title: Text(S.of(context).playerSettingsSpeedDefault), - trailing: Text( - '${playerSettings.preferredDefaultSpeed}x', - style: - TextStyle(color: primaryColor, fontWeight: FontWeight.bold), + // trailing: Text( + // '${playerSettings.preferredDefaultSpeed}x', + // style: + // TextStyle(color: primaryColor, fontWeight: FontWeight.bold), + // ), + trailing: CustomDropdown( + selected: playerSettings.preferredDefaultSpeed, + items: (f, cs) => playerSettings.speedOptions, + itemAsString: (item) => '${item}x', + onChanged: (value) { + if (value != null) { + ref.read(appSettingsProvider.notifier).update( + appSettings.copyWith.playerSettings( + preferredDefaultSpeed: value, + ), + ); + } + }, ), leading: const Icon(Icons.speed), - onPressed: (context) async { - final newSpeed = await showDialog( - context: context, - builder: (context) => SpeedPicker( - initialValue: playerSettings.preferredDefaultSpeed, - ), - ); - if (newSpeed != null) { - ref.read(appSettingsProvider.notifier).update( - appSettings.copyWith.playerSettings( - preferredDefaultSpeed: newSpeed, - ), - ); - } - }, ), // preferred speed options SettingsTile( diff --git a/lib/generated/intl/messages_en.dart b/lib/generated/intl/messages_en.dart index e457dc8..a643ef8 100644 --- a/lib/generated/intl/messages_en.dart +++ b/lib/generated/intl/messages_en.dart @@ -38,494 +38,476 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "account": MessageLookupByLibrary.simpleMessage("Account"), - "accountAddNewServer": MessageLookupByLibrary.simpleMessage( - "Add New Server", - ), - "accountAddUser": MessageLookupByLibrary.simpleMessage("Add User"), - "accountAddUserDialog": m0, - "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( - "User added successfully! Switch?", - ), - "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage( - "Add new server", - ), - "accountAnonymous": MessageLookupByLibrary.simpleMessage("Anonymous"), - "accountDeleteServer": MessageLookupByLibrary.simpleMessage( - "Delete Server", - ), - "accountInvalidURL": - MessageLookupByLibrary.simpleMessage("Invalid URL"), - "accountManage": - MessageLookupByLibrary.simpleMessage("Manage Accounts"), - "accountRegisteredServers": MessageLookupByLibrary.simpleMessage( - "Registered Servers", - ), - "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( - "Remove Server and Users", - ), - "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( - "This will remove the server ", - ), - "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( - " and all its users\' login info from this app.", - ), - "accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage( - "Remove User Login", - ), - "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( - "This will remove login details of the user ", - ), - "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( - " from this app.", - ), - "accountServerURI": MessageLookupByLibrary.simpleMessage("Server URI"), - "accountSwitch": MessageLookupByLibrary.simpleMessage("Switch Account"), - "accountUsersCount": m1, - "appSettings": MessageLookupByLibrary.simpleMessage("App Settings"), - "appearance": MessageLookupByLibrary.simpleMessage("Appearance"), - "autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage( - "Auto Sleep Timer Settings", - ), - "autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage( - "Auto Turn On Sleep Timer", - ), - "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage( - "Auto Turn On Timer", - ), - "autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage( - "Always Auto Turn On Timer", - ), - "autoTurnOnTimerAlwaysDescription": - MessageLookupByLibrary.simpleMessage( - "Always turn on the sleep timer, no matter what", - ), - "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( - "Automatically turn on the sleep timer based on the time of day", - ), - "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("From"), - "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( - "Turn on the sleep timer at the specified time", - ), - "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("Until"), - "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( - "Turn off the sleep timer at the specified time", - ), - "automaticallyDescription": MessageLookupByLibrary.simpleMessage( - "Automatically turn on the sleep timer based on the time of day", - ), - "backup": MessageLookupByLibrary.simpleMessage("Backup"), - "backupAndRestore": MessageLookupByLibrary.simpleMessage( - "Backup and Restore", - ), - "bookAbout": MessageLookupByLibrary.simpleMessage("About the Book"), - "bookAboutDefault": MessageLookupByLibrary.simpleMessage( - "Sorry, no description found", - ), - "bookAuthors": MessageLookupByLibrary.simpleMessage("Authors"), - "bookDownloads": MessageLookupByLibrary.simpleMessage("Downloads"), - "bookGenres": MessageLookupByLibrary.simpleMessage("Genres"), - "bookMetadataAbridged": - MessageLookupByLibrary.simpleMessage("Abridged"), - "bookMetadataLength": MessageLookupByLibrary.simpleMessage("Length"), - "bookMetadataPublished": - MessageLookupByLibrary.simpleMessage("Published"), - "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage( - "Unabridged", - ), - "bookSeries": MessageLookupByLibrary.simpleMessage("Series"), - "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("Try again"), - "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage( - "No shelves to display", - ), - "cancel": MessageLookupByLibrary.simpleMessage("Cancel"), - "chapterNotFound": MessageLookupByLibrary.simpleMessage("Chapters"), - "chapterSelect": MessageLookupByLibrary.simpleMessage("Select Chapter"), - "chapterSkip": MessageLookupByLibrary.simpleMessage( - "Skip chapter opening and ending", - ), - "chapterSkipEnd": MessageLookupByLibrary.simpleMessage( - "Skip chapter opening for ", - ), - "chapterSkipOpen": MessageLookupByLibrary.simpleMessage( - "Skip chapter opening for ", - ), - "chapters": MessageLookupByLibrary.simpleMessage("Chapters"), - "copyToClipboard": MessageLookupByLibrary.simpleMessage( - "Copy to Clipboard", - ), - "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( - "Copy the app settings to the clipboard", - ), - "copyToClipboardToast": MessageLookupByLibrary.simpleMessage( - "Settings copied to clipboard", - ), - "delete": MessageLookupByLibrary.simpleMessage("Delete"), - "deleteDialog": m2, - "deleted": m3, - "erArmedText": MessageLookupByLibrary.simpleMessage("Release ready"), - "erDragText": MessageLookupByLibrary.simpleMessage("Pull to refresh"), - "erDragTextUp": MessageLookupByLibrary.simpleMessage("Pull to refresh"), - "erFailedText": MessageLookupByLibrary.simpleMessage("Failed"), - "erMessageText": - MessageLookupByLibrary.simpleMessage("Last updated at %T"), - "erNoMoreText": MessageLookupByLibrary.simpleMessage("No more"), - "erProcessedText": MessageLookupByLibrary.simpleMessage("Succeeded"), - "erProcessingText": - MessageLookupByLibrary.simpleMessage("Refreshing..."), - "erReadyText": MessageLookupByLibrary.simpleMessage("Refreshing..."), - "explore": MessageLookupByLibrary.simpleMessage("explore"), - "exploreHint": MessageLookupByLibrary.simpleMessage( - "Seek and you shall discover...", - ), - "exploreTooltip": MessageLookupByLibrary.simpleMessage( - "Search and Explore", - ), - "general": MessageLookupByLibrary.simpleMessage("General"), - "help": MessageLookupByLibrary.simpleMessage("Help"), - "home": MessageLookupByLibrary.simpleMessage("Home"), - "homeBookContinueListening": MessageLookupByLibrary.simpleMessage( - "Continue Listening", - ), - "homeBookContinueListeningDescription": - MessageLookupByLibrary.simpleMessage( + "account": MessageLookupByLibrary.simpleMessage("Account"), + "accountAddNewServer": MessageLookupByLibrary.simpleMessage( + "Add New Server", + ), + "accountAddUser": MessageLookupByLibrary.simpleMessage("Add User"), + "accountAddUserDialog": m0, + "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( + "User added successfully! Switch?", + ), + "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage( + "Add new server", + ), + "accountAnonymous": MessageLookupByLibrary.simpleMessage("Anonymous"), + "accountDeleteServer": MessageLookupByLibrary.simpleMessage( + "Delete Server", + ), + "accountInvalidURL": MessageLookupByLibrary.simpleMessage("Invalid URL"), + "accountManage": MessageLookupByLibrary.simpleMessage("Manage Accounts"), + "accountRegisteredServers": MessageLookupByLibrary.simpleMessage( + "Registered Servers", + ), + "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( + "Remove Server and Users", + ), + "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( + "This will remove the server ", + ), + "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( + " and all its users\' login info from this app.", + ), + "accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage( + "Remove User Login", + ), + "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( + "This will remove login details of the user ", + ), + "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( + " from this app.", + ), + "accountServerURI": MessageLookupByLibrary.simpleMessage("Server URI"), + "accountSwitch": MessageLookupByLibrary.simpleMessage("Switch Account"), + "accountUsersCount": m1, + "appSettings": MessageLookupByLibrary.simpleMessage("App Settings"), + "appearance": MessageLookupByLibrary.simpleMessage("Appearance"), + "autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage( + "Auto Sleep Timer Settings", + ), + "autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage( + "Auto Turn On Sleep Timer", + ), + "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage( + "Auto Turn On Timer", + ), + "autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage( + "Always Auto Turn On Timer", + ), + "autoTurnOnTimerAlwaysDescription": MessageLookupByLibrary.simpleMessage( + "Always turn on the sleep timer, no matter what", + ), + "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( + "Automatically turn on the sleep timer based on the time of day", + ), + "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("From"), + "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( + "Turn on the sleep timer at the specified time", + ), + "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("Until"), + "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( + "Turn off the sleep timer at the specified time", + ), + "automaticallyDescription": MessageLookupByLibrary.simpleMessage( + "Automatically turn on the sleep timer based on the time of day", + ), + "backup": MessageLookupByLibrary.simpleMessage("Backup"), + "backupAndRestore": MessageLookupByLibrary.simpleMessage( + "Backup and Restore", + ), + "bookAbout": MessageLookupByLibrary.simpleMessage("About the Book"), + "bookAboutDefault": MessageLookupByLibrary.simpleMessage( + "Sorry, no description found", + ), + "bookAuthors": MessageLookupByLibrary.simpleMessage("Authors"), + "bookDownloads": MessageLookupByLibrary.simpleMessage("Downloads"), + "bookGenres": MessageLookupByLibrary.simpleMessage("Genres"), + "bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("Abridged"), + "bookMetadataLength": MessageLookupByLibrary.simpleMessage("Length"), + "bookMetadataPublished": MessageLookupByLibrary.simpleMessage("Published"), + "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage( + "Unabridged", + ), + "bookSeries": MessageLookupByLibrary.simpleMessage("Series"), + "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("Try again"), + "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage( + "No shelves to display", + ), + "cancel": MessageLookupByLibrary.simpleMessage("Cancel"), + "chapterNotFound": MessageLookupByLibrary.simpleMessage("Chapters"), + "chapterSelect": MessageLookupByLibrary.simpleMessage("Select Chapter"), + "chapterSkip": MessageLookupByLibrary.simpleMessage( + "Skip chapter opening and ending", + ), + "chapterSkipEnd": MessageLookupByLibrary.simpleMessage( + "Skip chapter opening for ", + ), + "chapterSkipOpen": MessageLookupByLibrary.simpleMessage( + "Skip chapter opening for ", + ), + "chapters": MessageLookupByLibrary.simpleMessage("Chapters"), + "copyToClipboard": MessageLookupByLibrary.simpleMessage( + "Copy to Clipboard", + ), + "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( + "Copy the app settings to the clipboard", + ), + "copyToClipboardToast": MessageLookupByLibrary.simpleMessage( + "Settings copied to clipboard", + ), + "delete": MessageLookupByLibrary.simpleMessage("Delete"), + "deleteDialog": m2, + "deleted": m3, + "downloadSettings": MessageLookupByLibrary.simpleMessage( + "Download Settings", + ), + "downloadSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Customize download settings", + ), + "erArmedText": MessageLookupByLibrary.simpleMessage("Release ready"), + "erDragText": MessageLookupByLibrary.simpleMessage("Pull to refresh"), + "erDragTextUp": MessageLookupByLibrary.simpleMessage("Pull to refresh"), + "erFailedText": MessageLookupByLibrary.simpleMessage("Failed"), + "erMessageText": MessageLookupByLibrary.simpleMessage("Last updated at %T"), + "erNoMoreText": MessageLookupByLibrary.simpleMessage("No more"), + "erProcessedText": MessageLookupByLibrary.simpleMessage("Succeeded"), + "erProcessingText": MessageLookupByLibrary.simpleMessage("Refreshing..."), + "erReadyText": MessageLookupByLibrary.simpleMessage("Refreshing..."), + "explore": MessageLookupByLibrary.simpleMessage("explore"), + "exploreHint": MessageLookupByLibrary.simpleMessage( + "Seek and you shall discover...", + ), + "exploreTooltip": MessageLookupByLibrary.simpleMessage( + "Search and Explore", + ), + "general": MessageLookupByLibrary.simpleMessage("General"), + "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", ), - "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage( - "Continue Series", - ), - "homeBookContinueSeriesDescription": - MessageLookupByLibrary.simpleMessage( - "Show play button for books in continue series shelf", - ), - "homeBookDiscover": MessageLookupByLibrary.simpleMessage("Discover"), - "homeBookListenAgain": - MessageLookupByLibrary.simpleMessage("Listen Again"), - "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( - "Show play button for all books in listen again shelf", - ), - "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage( - "Newest Authors", - ), - "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage( - "Recently Added", - ), - "homeBookRecommended": - MessageLookupByLibrary.simpleMessage("Recommended"), - "homeContinueListening": MessageLookupByLibrary.simpleMessage( - "Continue Listening", - ), - "homeListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"), - "homePageSettings": MessageLookupByLibrary.simpleMessage( - "Home Page Settings", - ), - "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( - "Customize the home page", - ), - "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( - "Other shelves", - ), - "homePageSettingsOtherShelvesDescription": - MessageLookupByLibrary.simpleMessage( + "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage( + "Continue Series", + ), + "homeBookContinueSeriesDescription": MessageLookupByLibrary.simpleMessage( + "Show play button for books in continue series shelf", + ), + "homeBookDiscover": MessageLookupByLibrary.simpleMessage("Discover"), + "homeBookListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"), + "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( + "Show play button for all books in listen again shelf", + ), + "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage( + "Newest Authors", + ), + "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage( + "Recently Added", + ), + "homeBookRecommended": MessageLookupByLibrary.simpleMessage("Recommended"), + "homeContinueListening": MessageLookupByLibrary.simpleMessage( + "Continue Listening", + ), + "homeListenAgain": MessageLookupByLibrary.simpleMessage("Listen Again"), + "homePageSettings": MessageLookupByLibrary.simpleMessage( + "Home Page Settings", + ), + "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Customize the home page", + ), + "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( + "Other shelves", + ), + "homePageSettingsOtherShelvesDescription": + MessageLookupByLibrary.simpleMessage( "Show play button for all books in all remaining shelves", ), - "homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage( - "Quick Play", - ), - "homeStartListening": MessageLookupByLibrary.simpleMessage( - "Start Listening", - ), - "language": MessageLookupByLibrary.simpleMessage("Language"), - "languageDescription": MessageLookupByLibrary.simpleMessage( - "Language switch", - ), - "library": MessageLookupByLibrary.simpleMessage("Library"), - "libraryChange": MessageLookupByLibrary.simpleMessage("Change Library"), - "libraryEmpty": MessageLookupByLibrary.simpleMessage( - "No libraries available.", - ), - "libraryLoadError": m4, - "librarySelect": MessageLookupByLibrary.simpleMessage("Select Library"), - "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage( - "Switch Library", - ), - "libraryTooltip": MessageLookupByLibrary.simpleMessage( - "Browse your library", - ), - "loading": MessageLookupByLibrary.simpleMessage("Loading..."), - "loginLocal": MessageLookupByLibrary.simpleMessage("Local"), - "loginLogin": MessageLookupByLibrary.simpleMessage("Login"), - "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), - "loginPassword": MessageLookupByLibrary.simpleMessage("Password"), - "loginServerClick": MessageLookupByLibrary.simpleMessage("Click here"), - "loginServerConnected": MessageLookupByLibrary.simpleMessage( - "Server connected, please login", - ), - "loginServerNo": MessageLookupByLibrary.simpleMessage( - "Do not have a server? ", - ), - "loginServerNoConnected": MessageLookupByLibrary.simpleMessage( - "Please enter the URL of your AudiobookShelf Server", - ), - "loginServerNot": m5, - "loginServerTo": MessageLookupByLibrary.simpleMessage( - " to know how to setup a server.", - ), - "loginTitle": m6, - "loginToken": MessageLookupByLibrary.simpleMessage("Token"), - "loginUsername": MessageLookupByLibrary.simpleMessage("Username"), - "logs": MessageLookupByLibrary.simpleMessage("Logs"), - "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage( - "Backward Interval", - ), - "nmpSettingsForward": MessageLookupByLibrary.simpleMessage( - "Forward Interval", - ), - "nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage( - "Media Controls", - ), - "nmpSettingsMediaControlsDescription": - MessageLookupByLibrary.simpleMessage( - "Select the media controls to display", - ), - "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( - "Select a field below to insert it", - ), - "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( - "Show Chapter Progress", - ), - "nmpSettingsShowChapterProgressDescription": - MessageLookupByLibrary.simpleMessage( + "homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage( + "Quick Play", + ), + "homeStartListening": MessageLookupByLibrary.simpleMessage( + "Start Listening", + ), + "language": MessageLookupByLibrary.simpleMessage("Language"), + "languageDescription": MessageLookupByLibrary.simpleMessage( + "Language switch", + ), + "library": MessageLookupByLibrary.simpleMessage("Library"), + "libraryChange": MessageLookupByLibrary.simpleMessage("Change Library"), + "libraryEmpty": MessageLookupByLibrary.simpleMessage( + "No libraries available.", + ), + "libraryLoadError": m4, + "librarySelect": MessageLookupByLibrary.simpleMessage("Select Library"), + "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage( + "Switch Library", + ), + "libraryTooltip": MessageLookupByLibrary.simpleMessage( + "Browse your library", + ), + "loading": MessageLookupByLibrary.simpleMessage("Loading..."), + "loginLocal": MessageLookupByLibrary.simpleMessage("Local"), + "loginLogin": MessageLookupByLibrary.simpleMessage("Login"), + "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), + "loginPassword": MessageLookupByLibrary.simpleMessage("Password"), + "loginServerClick": MessageLookupByLibrary.simpleMessage("Click here"), + "loginServerConnected": MessageLookupByLibrary.simpleMessage( + "Server connected, please login", + ), + "loginServerNo": MessageLookupByLibrary.simpleMessage( + "Do not have a server? ", + ), + "loginServerNoConnected": MessageLookupByLibrary.simpleMessage( + "Please enter the URL of your AudiobookShelf Server", + ), + "loginServerNot": m5, + "loginServerTo": MessageLookupByLibrary.simpleMessage( + " to know how to setup a server.", + ), + "loginTitle": m6, + "loginToken": MessageLookupByLibrary.simpleMessage("Token"), + "loginUsername": MessageLookupByLibrary.simpleMessage("Username"), + "logs": MessageLookupByLibrary.simpleMessage("Logs"), + "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage( + "Backward Interval", + ), + "nmpSettingsForward": MessageLookupByLibrary.simpleMessage( + "Forward Interval", + ), + "nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage( + "Media Controls", + ), + "nmpSettingsMediaControlsDescription": MessageLookupByLibrary.simpleMessage( + "Select the media controls to display", + ), + "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( + "Select a field below to insert it", + ), + "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( + "Show Chapter Progress", + ), + "nmpSettingsShowChapterProgressDescription": + MessageLookupByLibrary.simpleMessage( "Instead of the overall progress of the book", ), - "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage( - "Secondary Title", - ), - "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( - "The subtitle of the notification\n", - ), - "nmpSettingsTitle": - MessageLookupByLibrary.simpleMessage("Primary Title"), - "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( - "The title of the notification\n", - ), - "no": MessageLookupByLibrary.simpleMessage("No"), - "notImplemented": - MessageLookupByLibrary.simpleMessage("Not implemented"), - "notificationMediaPlayer": MessageLookupByLibrary.simpleMessage( - "Notification Media Player", - ), - "notificationMediaPlayerDescription": - MessageLookupByLibrary.simpleMessage( - "Customize the media player in notifications", - ), - "ok": MessageLookupByLibrary.simpleMessage("OK"), - "pause": MessageLookupByLibrary.simpleMessage("Pause"), - "play": MessageLookupByLibrary.simpleMessage("Play"), - "playerSettings": - MessageLookupByLibrary.simpleMessage("Player Settings"), - "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( - "Mark Complete When Time Left", - ), - "playerSettingsCompleteTimeDescriptionHead": - MessageLookupByLibrary.simpleMessage( - "Mark complete when less than "), - "playerSettingsCompleteTimeDescriptionTail": - MessageLookupByLibrary.simpleMessage(" left in the book"), - "playerSettingsDescription": MessageLookupByLibrary.simpleMessage( - "Customize the player settings", - ), - "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage( - "Display Settings", - ), - "playerSettingsDisplayChapterProgress": - MessageLookupByLibrary.simpleMessage("Show Chapter Progress"), - "playerSettingsDisplayChapterProgressDescription": - MessageLookupByLibrary.simpleMessage( + "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage( + "Secondary Title", + ), + "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( + "The subtitle of the notification\n", + ), + "nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("Primary Title"), + "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( + "The title of the notification\n", + ), + "no": MessageLookupByLibrary.simpleMessage("No"), + "notImplemented": MessageLookupByLibrary.simpleMessage("Not implemented"), + "notificationMediaPlayer": MessageLookupByLibrary.simpleMessage( + "Notification Media Player", + ), + "notificationMediaPlayerDescription": MessageLookupByLibrary.simpleMessage( + "Customize the media player in notifications", + ), + "ok": MessageLookupByLibrary.simpleMessage("OK"), + "pause": MessageLookupByLibrary.simpleMessage("Pause"), + "play": MessageLookupByLibrary.simpleMessage("Play"), + "playerSettings": MessageLookupByLibrary.simpleMessage("Player Settings"), + "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( + "Mark Complete When Time Left", + ), + "playerSettingsCompleteTimeDescriptionHead": + MessageLookupByLibrary.simpleMessage("Mark complete when less than "), + "playerSettingsCompleteTimeDescriptionTail": + MessageLookupByLibrary.simpleMessage(" left in the book"), + "playerSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Customize the player settings", + ), + "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage( + "Display Settings", + ), + "playerSettingsDisplayChapterProgress": + MessageLookupByLibrary.simpleMessage("Show Chapter Progress"), + "playerSettingsDisplayChapterProgressDescription": + MessageLookupByLibrary.simpleMessage( "Show the progress of the current chapter in the player", ), - "playerSettingsDisplayTotalProgress": - MessageLookupByLibrary.simpleMessage( - "Show Total Progress", - ), - "playerSettingsDisplayTotalProgressDescription": - MessageLookupByLibrary.simpleMessage( + "playerSettingsDisplayTotalProgress": MessageLookupByLibrary.simpleMessage( + "Show Total Progress", + ), + "playerSettingsDisplayTotalProgressDescription": + MessageLookupByLibrary.simpleMessage( "Show the total progress of the book in the player", ), - "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( - "Playback Report Interval", - ), - "playerSettingsPlaybackIntervalDescriptionHead": - MessageLookupByLibrary.simpleMessage("Report progress every "), - "playerSettingsPlaybackIntervalDescriptionTail": - MessageLookupByLibrary.simpleMessage(" to the server"), - "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( - "Playback Reporting", - ), - "playerSettingsPlaybackReportingIgnore": - MessageLookupByLibrary.simpleMessage( + "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( + "Playback Report Interval", + ), + "playerSettingsPlaybackIntervalDescriptionHead": + MessageLookupByLibrary.simpleMessage("Report progress every "), + "playerSettingsPlaybackIntervalDescriptionTail": + MessageLookupByLibrary.simpleMessage(" to the server"), + "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( + "Playback Reporting", + ), + "playerSettingsPlaybackReportingIgnore": + MessageLookupByLibrary.simpleMessage( "Ignore Playback Position Less Than", ), - "playerSettingsPlaybackReportingMinimum": - MessageLookupByLibrary.simpleMessage("Minimum Position to Report"), - "playerSettingsPlaybackReportingMinimumDescriptionHead": - MessageLookupByLibrary.simpleMessage( + "playerSettingsPlaybackReportingMinimum": + MessageLookupByLibrary.simpleMessage("Minimum Position to Report"), + "playerSettingsPlaybackReportingMinimumDescriptionHead": + MessageLookupByLibrary.simpleMessage( "Do not report playback for the first ", ), - "playerSettingsPlaybackReportingMinimumDescriptionTail": - MessageLookupByLibrary.simpleMessage("of the book"), - "playerSettingsRememberForEveryBook": - MessageLookupByLibrary.simpleMessage( - "Remember Player Settings for Every Book", - ), - "playerSettingsRememberForEveryBookDescription": - MessageLookupByLibrary.simpleMessage( + "playerSettingsPlaybackReportingMinimumDescriptionTail": + MessageLookupByLibrary.simpleMessage("of the book"), + "playerSettingsRememberForEveryBook": MessageLookupByLibrary.simpleMessage( + "Remember Player Settings for Every Book", + ), + "playerSettingsRememberForEveryBookDescription": + MessageLookupByLibrary.simpleMessage( "Settings like speed, loudness, etc. will be remembered for every book", ), - "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("Speed"), - "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( - "Default Speed", - ), - "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( - "Speed Options", - ), - "playerSettingsSpeedOptionsSelect": - MessageLookupByLibrary.simpleMessage( - "Select Speed Options", - ), - "playerSettingsSpeedOptionsSelectAdd": - MessageLookupByLibrary.simpleMessage( - "Add Speed Option", - ), - "playerSettingsSpeedOptionsSelectAddHelper": - MessageLookupByLibrary.simpleMessage( - "Enter a new speed option to add"), - "playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage( - "Select Speed", - ), - "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( - "Enter the speed you want to set when playing for the first time", - ), - "playlistsMine": MessageLookupByLibrary.simpleMessage("My Playlists"), - "readLess": MessageLookupByLibrary.simpleMessage("Read Less"), - "readMore": MessageLookupByLibrary.simpleMessage("Read More"), - "refresh": MessageLookupByLibrary.simpleMessage("Refresh"), - "reset": MessageLookupByLibrary.simpleMessage("Reset"), - "resetAppSettings": MessageLookupByLibrary.simpleMessage( - "Reset App Settings", - ), - "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( - "Reset the app settings to the default values", - ), - "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( - "Are you sure you want to reset the app settings?", - ), - "restore": MessageLookupByLibrary.simpleMessage("Restore"), - "restoreBackup": MessageLookupByLibrary.simpleMessage("Restore Backup"), - "restoreBackupHint": MessageLookupByLibrary.simpleMessage( - "Paste the backup here", - ), - "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage( - "Invalid backup", - ), - "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage( - "Settings restored", - ), - "restoreBackupValidator": MessageLookupByLibrary.simpleMessage( - "Please paste the backup here", - ), - "restoreDescription": MessageLookupByLibrary.simpleMessage( - "Restore the app settings from the backup", - ), - "resume": MessageLookupByLibrary.simpleMessage("Resume"), - "retry": MessageLookupByLibrary.simpleMessage("Retry"), - "settings": MessageLookupByLibrary.simpleMessage("Settings"), - "shakeAction": MessageLookupByLibrary.simpleMessage("Shake Action"), - "shakeActionDescription": MessageLookupByLibrary.simpleMessage( - "The action to perform when a shake is detected", - ), - "shakeActivationThreshold": MessageLookupByLibrary.simpleMessage( - "Shake Activation Threshold", - ), - "shakeActivationThresholdDescription": - MessageLookupByLibrary.simpleMessage( - "The higher the threshold, the harder you need to shake", - ), - "shakeDetector": MessageLookupByLibrary.simpleMessage("Shake Detector"), - "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( - "Customize the shake detector settings", - ), - "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage( - "Enable Shake Detection", - ), - "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( - "Enable shake detection to do various actions", - ), - "shakeDetectorSettings": MessageLookupByLibrary.simpleMessage( - "Shake Detector Settings", - ), - "shakeFeedback": MessageLookupByLibrary.simpleMessage("Shake Feedback"), - "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( - "The feedback to give when a shake is detected", - ), - "shakeSelectAction": MessageLookupByLibrary.simpleMessage( - "Select Shake Action", - ), - "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( - "Select Shake Activation Threshold", - ), - "shakeSelectActivationThresholdHelper": - MessageLookupByLibrary.simpleMessage( + "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("Speed"), + "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( + "Default Speed", + ), + "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( + "Speed Options", + ), + "playerSettingsSpeedOptionsSelect": MessageLookupByLibrary.simpleMessage( + "Select Speed Options", + ), + "playerSettingsSpeedOptionsSelectAdd": MessageLookupByLibrary.simpleMessage( + "Add Speed Option", + ), + "playerSettingsSpeedOptionsSelectAddHelper": + MessageLookupByLibrary.simpleMessage("Enter a new speed option to add"), + "playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage( + "Select Speed", + ), + "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( + "Enter the speed you want to set when playing for the first time", + ), + "playlistsMine": MessageLookupByLibrary.simpleMessage("My Playlists"), + "readLess": MessageLookupByLibrary.simpleMessage("Read Less"), + "readMore": MessageLookupByLibrary.simpleMessage("Read More"), + "refresh": MessageLookupByLibrary.simpleMessage("Refresh"), + "reset": MessageLookupByLibrary.simpleMessage("Reset"), + "resetAppSettings": MessageLookupByLibrary.simpleMessage( + "Reset App Settings", + ), + "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Reset the app settings to the default values", + ), + "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( + "Are you sure you want to reset the app settings?", + ), + "restore": MessageLookupByLibrary.simpleMessage("Restore"), + "restoreBackup": MessageLookupByLibrary.simpleMessage("Restore Backup"), + "restoreBackupHint": MessageLookupByLibrary.simpleMessage( + "Paste the backup here", + ), + "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage( + "Invalid backup", + ), + "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage( + "Settings restored", + ), + "restoreBackupValidator": MessageLookupByLibrary.simpleMessage( + "Please paste the backup here", + ), + "restoreDescription": MessageLookupByLibrary.simpleMessage( + "Restore the app settings from the backup", + ), + "resume": MessageLookupByLibrary.simpleMessage("Resume"), + "retry": MessageLookupByLibrary.simpleMessage("Retry"), + "settings": MessageLookupByLibrary.simpleMessage("Settings"), + "shakeAction": MessageLookupByLibrary.simpleMessage("Shake Action"), + "shakeActionDescription": MessageLookupByLibrary.simpleMessage( + "The action to perform when a shake is detected", + ), + "shakeActivationThreshold": MessageLookupByLibrary.simpleMessage( + "Shake Activation Threshold", + ), + "shakeActivationThresholdDescription": MessageLookupByLibrary.simpleMessage( + "The higher the threshold, the harder you need to shake", + ), + "shakeDetector": MessageLookupByLibrary.simpleMessage("Shake Detector"), + "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( + "Customize the shake detector settings", + ), + "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage( + "Enable Shake Detection", + ), + "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( + "Enable shake detection to do various actions", + ), + "shakeDetectorSettings": MessageLookupByLibrary.simpleMessage( + "Shake Detector Settings", + ), + "shakeFeedback": MessageLookupByLibrary.simpleMessage("Shake Feedback"), + "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( + "The feedback to give when a shake is detected", + ), + "shakeSelectAction": MessageLookupByLibrary.simpleMessage( + "Select Shake Action", + ), + "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( + "Select Shake Activation Threshold", + ), + "shakeSelectActivationThresholdHelper": + MessageLookupByLibrary.simpleMessage( "Enter a number to set the threshold in m/s²", ), - "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage( - "Select Shake Feedback", - ), - "themeMode": MessageLookupByLibrary.simpleMessage("Theme Mode"), - "themeModeDark": MessageLookupByLibrary.simpleMessage("Dark"), - "themeModeHighContrast": MessageLookupByLibrary.simpleMessage( - "High Contrast Mode", - ), - "themeModeHighContrastDescription": - MessageLookupByLibrary.simpleMessage( - "Increase the contrast between the background and the text", - ), - "themeModeLight": MessageLookupByLibrary.simpleMessage("Light"), - "themeModeSystem": MessageLookupByLibrary.simpleMessage("System"), - "themeSettings": MessageLookupByLibrary.simpleMessage("Theme Settings"), - "themeSettingsColors": MessageLookupByLibrary.simpleMessage( - "Material Theme from System", - ), - "themeSettingsColorsAndroid": MessageLookupByLibrary.simpleMessage( - "Use Material You", - ), - "themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage( - "Adaptive Theme on Item Page", - ), - "themeSettingsColorsBookDescription": - 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", - ), - "themeSettingsColorsCurrentDescription": - MessageLookupByLibrary.simpleMessage( + "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage( + "Select Shake Feedback", + ), + "themeMode": MessageLookupByLibrary.simpleMessage("Theme Mode"), + "themeModeDark": MessageLookupByLibrary.simpleMessage("Dark"), + "themeModeHighContrast": MessageLookupByLibrary.simpleMessage( + "High Contrast Mode", + ), + "themeModeHighContrastDescription": MessageLookupByLibrary.simpleMessage( + "Increase the contrast between the background and the text", + ), + "themeModeLight": MessageLookupByLibrary.simpleMessage("Light"), + "themeModeSystem": MessageLookupByLibrary.simpleMessage("System"), + "themeSettings": MessageLookupByLibrary.simpleMessage("Theme Settings"), + "themeSettingsColors": MessageLookupByLibrary.simpleMessage( + "Material Theme from System", + ), + "themeSettingsColorsAndroid": MessageLookupByLibrary.simpleMessage( + "Use Material You", + ), + "themeSettingsColorsBook": MessageLookupByLibrary.simpleMessage( + "Adaptive Theme on Item Page", + ), + "themeSettingsColorsBookDescription": 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", + ), + "themeSettingsColorsCurrentDescription": + MessageLookupByLibrary.simpleMessage( "Use the theme colors from the currently playing item for the app", ), - "themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage( - "Use the system theme colors for the app", - ), - "themeSettingsDescription": MessageLookupByLibrary.simpleMessage( - "Customize the app theme", - ), - "timeSecond": m7, - "unknown": MessageLookupByLibrary.simpleMessage("Unknown"), - "webVersion": MessageLookupByLibrary.simpleMessage("Web Version"), - "yes": MessageLookupByLibrary.simpleMessage("Yes"), - "you": MessageLookupByLibrary.simpleMessage("You"), - "youTooltip": MessageLookupByLibrary.simpleMessage( - "Your Profile and Settings", - ), - }; + "themeSettingsColorsDescription": MessageLookupByLibrary.simpleMessage( + "Use the system theme colors for the app", + ), + "themeSettingsDescription": MessageLookupByLibrary.simpleMessage( + "Customize the app theme", + ), + "timeSecond": m7, + "unknown": MessageLookupByLibrary.simpleMessage("Unknown"), + "webVersion": MessageLookupByLibrary.simpleMessage("Web Version"), + "yes": MessageLookupByLibrary.simpleMessage("Yes"), + "you": MessageLookupByLibrary.simpleMessage("You"), + "youTooltip": MessageLookupByLibrary.simpleMessage( + "Your Profile and Settings", + ), + }; } diff --git a/lib/generated/intl/messages_zh.dart b/lib/generated/intl/messages_zh.dart index 99eaa2d..a3a79d2 100644 --- a/lib/generated/intl/messages_zh.dart +++ b/lib/generated/intl/messages_zh.dart @@ -38,363 +38,338 @@ class MessageLookup extends MessageLookupByLibrary { final messages = _notInlinedMessages(_notInlinedMessages); static Map _notInlinedMessages(_) => { - "account": MessageLookupByLibrary.simpleMessage("账户"), - "accountAddNewServer": MessageLookupByLibrary.simpleMessage("添加新服务器"), - "accountAddUser": MessageLookupByLibrary.simpleMessage("添加用户"), - "accountAddUserDialog": m0, - "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( - "用户添加成功!切换?", - ), - "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage("添加新服务器"), - "accountAnonymous": MessageLookupByLibrary.simpleMessage("匿名"), - "accountDeleteServer": MessageLookupByLibrary.simpleMessage("删除服务器"), - "accountInvalidURL": MessageLookupByLibrary.simpleMessage("无效网址"), - "accountManage": MessageLookupByLibrary.simpleMessage("帐户管理"), - "accountRegisteredServers": - MessageLookupByLibrary.simpleMessage("已注册服务器"), - "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( - "删除服务器和用户", - ), - "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( - "这将删除服务器 ", - ), - "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( - " 以及该应用程序中所有用户的登录信息。", - ), - "accountRemoveUserLogin": - MessageLookupByLibrary.simpleMessage("删除用户登录"), - "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( - "这将删除用户 ", - ), - "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( - " 的登录详细信息。", - ), - "accountServerURI": MessageLookupByLibrary.simpleMessage("服务器地址"), - "accountSwitch": MessageLookupByLibrary.simpleMessage("切换账户"), - "accountUsersCount": m1, - "appSettings": MessageLookupByLibrary.simpleMessage("应用设置"), - "appearance": MessageLookupByLibrary.simpleMessage("外观"), - "autoSleepTimerSettings": - MessageLookupByLibrary.simpleMessage("自动睡眠定时器设置"), - "autoTurnOnSleepTimer": - MessageLookupByLibrary.simpleMessage("自动开启睡眠定时器"), - "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage("自动开启定时器"), - "autoTurnOnTimerAlways": - MessageLookupByLibrary.simpleMessage("始终自动开启定时器"), - "autoTurnOnTimerAlwaysDescription": - MessageLookupByLibrary.simpleMessage( - "总是打开睡眠定时器", - ), - "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( - "根据一天中的时间自动打开睡眠定时器", - ), - "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("从"), - "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( - "在指定时间打开睡眠定时器", - ), - "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("直到"), - "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( - "在指定时间关闭睡眠定时器", - ), - "automaticallyDescription": MessageLookupByLibrary.simpleMessage( - "根据一天中的时间自动打开睡眠定时器", - ), - "backup": MessageLookupByLibrary.simpleMessage("备份"), - "backupAndRestore": MessageLookupByLibrary.simpleMessage("备份与恢复"), - "bookAbout": MessageLookupByLibrary.simpleMessage("关于本书"), - "bookAboutDefault": MessageLookupByLibrary.simpleMessage("抱歉,找不到描述"), - "bookAuthors": MessageLookupByLibrary.simpleMessage("作者"), - "bookDownloads": MessageLookupByLibrary.simpleMessage("下载"), - "bookGenres": MessageLookupByLibrary.simpleMessage("风格"), - "bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("删节版"), - "bookMetadataLength": MessageLookupByLibrary.simpleMessage("持续时间"), - "bookMetadataPublished": MessageLookupByLibrary.simpleMessage("发布年份"), - "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage("未删节版"), - "bookSeries": MessageLookupByLibrary.simpleMessage("系列"), - "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("重试"), - "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage("未查询到书架"), - "cancel": MessageLookupByLibrary.simpleMessage("取消"), - "chapterNotFound": MessageLookupByLibrary.simpleMessage("未找到章节"), - "chapterSelect": MessageLookupByLibrary.simpleMessage("选择章节"), - "chapterSkip": MessageLookupByLibrary.simpleMessage("跳过章节片头片尾"), - "chapterSkipEnd": MessageLookupByLibrary.simpleMessage("跳过章节片尾 "), - "chapterSkipOpen": MessageLookupByLibrary.simpleMessage("跳过章节片头 "), - "chapters": MessageLookupByLibrary.simpleMessage("章节列表"), - "copyToClipboard": MessageLookupByLibrary.simpleMessage("复制到剪贴板"), - "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( - "将应用程序设置复制到剪贴板", - ), - "copyToClipboardToast": - MessageLookupByLibrary.simpleMessage("设置已复制到剪贴板"), - "delete": MessageLookupByLibrary.simpleMessage("删除"), - "deleteDialog": m2, - "deleted": m3, - "erArmedText": MessageLookupByLibrary.simpleMessage("准备就绪"), - "erDragText": MessageLookupByLibrary.simpleMessage("下拉刷新"), - "erDragTextUp": MessageLookupByLibrary.simpleMessage("上拉加载"), - "erFailedText": MessageLookupByLibrary.simpleMessage("失败"), - "erMessageText": MessageLookupByLibrary.simpleMessage("最后更新于 %T"), - "erNoMoreText": MessageLookupByLibrary.simpleMessage("没有更多"), - "erProcessedText": MessageLookupByLibrary.simpleMessage("成功"), - "erProcessingText": MessageLookupByLibrary.simpleMessage("刷新..."), - "erReadyText": MessageLookupByLibrary.simpleMessage("刷新..."), - "explore": MessageLookupByLibrary.simpleMessage("探索"), - "exploreHint": MessageLookupByLibrary.simpleMessage("搜索与探索..."), - "exploreTooltip": MessageLookupByLibrary.simpleMessage("搜索和探索"), - "general": MessageLookupByLibrary.simpleMessage("通用"), - "help": MessageLookupByLibrary.simpleMessage("Help"), - "home": MessageLookupByLibrary.simpleMessage("首页"), - "homeBookContinueListening": - MessageLookupByLibrary.simpleMessage("继续收听"), - "homeBookContinueListeningDescription": - MessageLookupByLibrary.simpleMessage("继续收听书架上显示播放按钮"), - "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage("继续系列"), - "homeBookContinueSeriesDescription": - MessageLookupByLibrary.simpleMessage( - "继续系列书架上显示播放按钮", - ), - "homeBookDiscover": MessageLookupByLibrary.simpleMessage("发现"), - "homeBookListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), - "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( - "再听一遍书架上显示播放按钮", - ), - "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage("最新作者"), - "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage("最近添加"), - "homeBookRecommended": MessageLookupByLibrary.simpleMessage("推荐"), - "homeContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"), - "homeListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), - "homePageSettings": MessageLookupByLibrary.simpleMessage("主页设置"), - "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( - "自定义主页", - ), - "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( - "其他书架", - ), - "homePageSettingsOtherShelvesDescription": - MessageLookupByLibrary.simpleMessage("显示所有剩余书架上所有书籍的播放按钮"), - "homePageSettingsQuickPlay": - MessageLookupByLibrary.simpleMessage("继续播放"), - "homeStartListening": MessageLookupByLibrary.simpleMessage("开始收听"), - "language": MessageLookupByLibrary.simpleMessage("语言"), - "languageDescription": MessageLookupByLibrary.simpleMessage("语言切换"), - "library": MessageLookupByLibrary.simpleMessage("媒体库"), - "libraryChange": MessageLookupByLibrary.simpleMessage("更改媒体库"), - "libraryEmpty": MessageLookupByLibrary.simpleMessage("没有可用的库。"), - "libraryLoadError": m4, - "librarySelect": MessageLookupByLibrary.simpleMessage("选择媒体库"), - "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage("切换媒体库"), - "libraryTooltip": MessageLookupByLibrary.simpleMessage("浏览您的媒体库"), - "loading": MessageLookupByLibrary.simpleMessage("加载中..."), - "loginLocal": MessageLookupByLibrary.simpleMessage("Local"), - "loginLogin": MessageLookupByLibrary.simpleMessage("登录"), - "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), - "loginPassword": MessageLookupByLibrary.simpleMessage("密码"), - "loginServerClick": MessageLookupByLibrary.simpleMessage("单击此处"), - "loginServerConnected": - MessageLookupByLibrary.simpleMessage("服务器已连接,请登录"), - "loginServerNo": MessageLookupByLibrary.simpleMessage("没有服务器? "), - "loginServerNoConnected": MessageLookupByLibrary.simpleMessage( - "请输入您的AudiobookShelf服务器的URL", - ), - "loginServerNot": m5, - "loginServerTo": MessageLookupByLibrary.simpleMessage(" 了解如何设置服务器。"), - "loginTitle": m6, - "loginToken": MessageLookupByLibrary.simpleMessage("Token"), - "loginUsername": MessageLookupByLibrary.simpleMessage("用户名"), - "logs": MessageLookupByLibrary.simpleMessage("日志"), - "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage("快退间隔"), - "nmpSettingsForward": MessageLookupByLibrary.simpleMessage("快进间隔"), - "nmpSettingsMediaControls": - MessageLookupByLibrary.simpleMessage("媒体控制"), - "nmpSettingsMediaControlsDescription": - MessageLookupByLibrary.simpleMessage( - "选择要显示的媒体控件", - ), - "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( - "在下面选择一个字段进行插入", - ), - "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( - "显示章节进度", - ), - "nmpSettingsShowChapterProgressDescription": - MessageLookupByLibrary.simpleMessage("而不是本书的整体进展"), - "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage("副标题"), - "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( - "通知的副标题\n", - ), - "nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("主标题"), - "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( - "通知的标题\n", - ), - "no": MessageLookupByLibrary.simpleMessage("否"), - "notImplemented": MessageLookupByLibrary.simpleMessage("未实现"), - "notificationMediaPlayer": - MessageLookupByLibrary.simpleMessage("通知媒体播放器"), - "notificationMediaPlayerDescription": - MessageLookupByLibrary.simpleMessage( - "在通知中自定义媒体播放器", - ), - "ok": MessageLookupByLibrary.simpleMessage("确定"), - "pause": MessageLookupByLibrary.simpleMessage("暂停"), - "play": MessageLookupByLibrary.simpleMessage("播放"), - "playerSettings": MessageLookupByLibrary.simpleMessage("播放器设置"), - "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( - "剩余时间标记完成", - ), - "playerSettingsCompleteTimeDescriptionHead": - MessageLookupByLibrary.simpleMessage("当书中剩余时间少于 "), - "playerSettingsCompleteTimeDescriptionTail": - MessageLookupByLibrary.simpleMessage(" 时,标记完成"), - "playerSettingsDescription": MessageLookupByLibrary.simpleMessage( - "自定义播放器设置", - ), - "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage("显示设置"), - "playerSettingsDisplayChapterProgress": - MessageLookupByLibrary.simpleMessage("显示章节进度"), - "playerSettingsDisplayChapterProgressDescription": - MessageLookupByLibrary.simpleMessage("在播放器中显示当前章节的进度"), - "playerSettingsDisplayTotalProgress": - MessageLookupByLibrary.simpleMessage( - "显示总进度", - ), - "playerSettingsDisplayTotalProgressDescription": - MessageLookupByLibrary.simpleMessage("在播放器中显示当前书籍的总进度"), - "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( - "播放报告间隔", - ), - "playerSettingsPlaybackIntervalDescriptionHead": - MessageLookupByLibrary.simpleMessage("每 "), - "playerSettingsPlaybackIntervalDescriptionTail": - MessageLookupByLibrary.simpleMessage(" 向服务器报告一次进度"), - "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( - "回放报告", - ), - "playerSettingsPlaybackReportingIgnore": - MessageLookupByLibrary.simpleMessage("忽略播放位置小于"), - "playerSettingsPlaybackReportingMinimum": - MessageLookupByLibrary.simpleMessage("回放报告最小位置"), - "playerSettingsPlaybackReportingMinimumDescriptionHead": - MessageLookupByLibrary.simpleMessage("不要报告本书前 "), - "playerSettingsPlaybackReportingMinimumDescriptionTail": - MessageLookupByLibrary.simpleMessage(" 的播放"), - "playerSettingsRememberForEveryBook": - MessageLookupByLibrary.simpleMessage( - "记住每本书的播放器设置", - ), - "playerSettingsRememberForEveryBookDescription": - MessageLookupByLibrary.simpleMessage("每本书都会记住播放速度、音量等设置"), - "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("播放速度"), - "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( - "默认播放速度", - ), - "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( - "播放速度选项", - ), - "playerSettingsSpeedOptionsSelect": - MessageLookupByLibrary.simpleMessage( - "播放速度选项", - ), - "playerSettingsSpeedOptionsSelectAdd": - MessageLookupByLibrary.simpleMessage( - "添加一个速度选项", - ), - "playerSettingsSpeedOptionsSelectAddHelper": - MessageLookupByLibrary.simpleMessage("输入一个新的速度选项"), - "playerSettingsSpeedSelect": - MessageLookupByLibrary.simpleMessage("选择播放速度"), - "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( - "输入默认的播放速度", - ), - "playlistsMine": MessageLookupByLibrary.simpleMessage("播放列表"), - "readLess": MessageLookupByLibrary.simpleMessage("折叠"), - "readMore": MessageLookupByLibrary.simpleMessage("展开"), - "refresh": MessageLookupByLibrary.simpleMessage("刷新"), - "reset": MessageLookupByLibrary.simpleMessage("重置"), - "resetAppSettings": MessageLookupByLibrary.simpleMessage("重置应用程序设置"), - "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( - "将应用程序设置重置为默认值", - ), - "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( - "您确定要重置应用程序设置吗?", - ), - "restore": MessageLookupByLibrary.simpleMessage("恢复"), - "restoreBackup": MessageLookupByLibrary.simpleMessage("恢复备份"), - "restoreBackupHint": MessageLookupByLibrary.simpleMessage("将备份粘贴到此处"), - "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage("无效备份"), - "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage("设置已恢复"), - "restoreBackupValidator": - MessageLookupByLibrary.simpleMessage("请将备份粘贴到此处"), - "restoreDescription": - MessageLookupByLibrary.simpleMessage("从备份中还原应用程序设置"), - "resume": MessageLookupByLibrary.simpleMessage("继续"), - "retry": MessageLookupByLibrary.simpleMessage("重试"), - "settings": MessageLookupByLibrary.simpleMessage("设置"), - "shakeAction": MessageLookupByLibrary.simpleMessage("抖动操作"), - "shakeActionDescription": MessageLookupByLibrary.simpleMessage( - "检测到抖动时要执行的操作", - ), - "shakeActivationThreshold": - MessageLookupByLibrary.simpleMessage("抖动激活阈值"), - "shakeActivationThresholdDescription": - MessageLookupByLibrary.simpleMessage( - "门槛越高,你就越难摇晃", - ), - "shakeDetector": MessageLookupByLibrary.simpleMessage("抖动检测器"), - "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( - "自定义抖动检测器设置", - ), - "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage("启用抖动检测"), - "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( - "启用抖动检测以执行各种操作", - ), - "shakeDetectorSettings": - MessageLookupByLibrary.simpleMessage("抖动检测器设置"), - "shakeFeedback": MessageLookupByLibrary.simpleMessage("抖动反馈"), - "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( - "检测到抖动时给出的反馈", - ), - "shakeSelectAction": MessageLookupByLibrary.simpleMessage("选择抖动动作"), - "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( - "选择抖动激活阈值", - ), - "shakeSelectActivationThresholdHelper": - MessageLookupByLibrary.simpleMessage("输入一个数字以m/s²为单位设置阈值"), - "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage("选择抖动反馈"), - "themeMode": MessageLookupByLibrary.simpleMessage("主题模式"), - "themeModeDark": MessageLookupByLibrary.simpleMessage("深色"), - "themeModeHighContrast": MessageLookupByLibrary.simpleMessage("高对比度模式"), - "themeModeHighContrastDescription": - 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("您的个人资料和设置"), - }; + "account": MessageLookupByLibrary.simpleMessage("账户"), + "accountAddNewServer": MessageLookupByLibrary.simpleMessage("添加新服务器"), + "accountAddUser": MessageLookupByLibrary.simpleMessage("添加用户"), + "accountAddUserDialog": m0, + "accountAddUserSuccessDialog": MessageLookupByLibrary.simpleMessage( + "用户添加成功!切换?", + ), + "accountAddUserTooltip": MessageLookupByLibrary.simpleMessage("添加新服务器"), + "accountAnonymous": MessageLookupByLibrary.simpleMessage("匿名"), + "accountDeleteServer": MessageLookupByLibrary.simpleMessage("删除服务器"), + "accountInvalidURL": MessageLookupByLibrary.simpleMessage("无效网址"), + "accountManage": MessageLookupByLibrary.simpleMessage("帐户管理"), + "accountRegisteredServers": MessageLookupByLibrary.simpleMessage("已注册服务器"), + "accountRemoveServerAndUsers": MessageLookupByLibrary.simpleMessage( + "删除服务器和用户", + ), + "accountRemoveServerAndUsersHead": MessageLookupByLibrary.simpleMessage( + "这将删除服务器 ", + ), + "accountRemoveServerAndUsersTail": MessageLookupByLibrary.simpleMessage( + " 以及该应用程序中所有用户的登录信息。", + ), + "accountRemoveUserLogin": MessageLookupByLibrary.simpleMessage("删除用户登录"), + "accountRemoveUserLoginHead": MessageLookupByLibrary.simpleMessage( + "这将删除用户 ", + ), + "accountRemoveUserLoginTail": MessageLookupByLibrary.simpleMessage( + " 的登录详细信息。", + ), + "accountServerURI": MessageLookupByLibrary.simpleMessage("服务器地址"), + "accountSwitch": MessageLookupByLibrary.simpleMessage("切换账户"), + "accountUsersCount": m1, + "appSettings": MessageLookupByLibrary.simpleMessage("应用设置"), + "appearance": MessageLookupByLibrary.simpleMessage("外观"), + "autoSleepTimerSettings": MessageLookupByLibrary.simpleMessage("自动睡眠定时器设置"), + "autoTurnOnSleepTimer": MessageLookupByLibrary.simpleMessage("自动开启睡眠定时器"), + "autoTurnOnTimer": MessageLookupByLibrary.simpleMessage("自动开启定时器"), + "autoTurnOnTimerAlways": MessageLookupByLibrary.simpleMessage("始终自动开启定时器"), + "autoTurnOnTimerAlwaysDescription": MessageLookupByLibrary.simpleMessage( + "总是打开睡眠定时器", + ), + "autoTurnOnTimerDescription": MessageLookupByLibrary.simpleMessage( + "根据一天中的时间自动打开睡眠定时器", + ), + "autoTurnOnTimerFrom": MessageLookupByLibrary.simpleMessage("从"), + "autoTurnOnTimerFromDescription": MessageLookupByLibrary.simpleMessage( + "在指定时间打开睡眠定时器", + ), + "autoTurnOnTimerUntil": MessageLookupByLibrary.simpleMessage("直到"), + "autoTurnOnTimerUntilDescription": MessageLookupByLibrary.simpleMessage( + "在指定时间关闭睡眠定时器", + ), + "automaticallyDescription": MessageLookupByLibrary.simpleMessage( + "根据一天中的时间自动打开睡眠定时器", + ), + "backup": MessageLookupByLibrary.simpleMessage("备份"), + "backupAndRestore": MessageLookupByLibrary.simpleMessage("备份与恢复"), + "bookAbout": MessageLookupByLibrary.simpleMessage("关于本书"), + "bookAboutDefault": MessageLookupByLibrary.simpleMessage("抱歉,找不到描述"), + "bookAuthors": MessageLookupByLibrary.simpleMessage("作者"), + "bookDownloads": MessageLookupByLibrary.simpleMessage("下载"), + "bookGenres": MessageLookupByLibrary.simpleMessage("风格"), + "bookMetadataAbridged": MessageLookupByLibrary.simpleMessage("删节版"), + "bookMetadataLength": MessageLookupByLibrary.simpleMessage("持续时间"), + "bookMetadataPublished": MessageLookupByLibrary.simpleMessage("发布年份"), + "bookMetadataUnabridged": MessageLookupByLibrary.simpleMessage("未删节版"), + "bookSeries": MessageLookupByLibrary.simpleMessage("系列"), + "bookShelveEmpty": MessageLookupByLibrary.simpleMessage("重试"), + "bookShelveEmptyText": MessageLookupByLibrary.simpleMessage("未查询到书架"), + "cancel": MessageLookupByLibrary.simpleMessage("取消"), + "chapterNotFound": MessageLookupByLibrary.simpleMessage("未找到章节"), + "chapterSelect": MessageLookupByLibrary.simpleMessage("选择章节"), + "chapterSkip": MessageLookupByLibrary.simpleMessage("跳过章节片头片尾"), + "chapterSkipEnd": MessageLookupByLibrary.simpleMessage("跳过章节片尾 "), + "chapterSkipOpen": MessageLookupByLibrary.simpleMessage("跳过章节片头 "), + "chapters": MessageLookupByLibrary.simpleMessage("章节列表"), + "copyToClipboard": MessageLookupByLibrary.simpleMessage("复制到剪贴板"), + "copyToClipboardDescription": MessageLookupByLibrary.simpleMessage( + "将应用程序设置复制到剪贴板", + ), + "copyToClipboardToast": MessageLookupByLibrary.simpleMessage("设置已复制到剪贴板"), + "delete": MessageLookupByLibrary.simpleMessage("删除"), + "deleteDialog": m2, + "deleted": m3, + "downloadSettings": MessageLookupByLibrary.simpleMessage("下载设置"), + "downloadSettingsDescription": MessageLookupByLibrary.simpleMessage( + "自定义下载设置", + ), + "erArmedText": MessageLookupByLibrary.simpleMessage("准备就绪"), + "erDragText": MessageLookupByLibrary.simpleMessage("下拉刷新"), + "erDragTextUp": MessageLookupByLibrary.simpleMessage("上拉加载"), + "erFailedText": MessageLookupByLibrary.simpleMessage("失败"), + "erMessageText": MessageLookupByLibrary.simpleMessage("最后更新于 %T"), + "erNoMoreText": MessageLookupByLibrary.simpleMessage("没有更多"), + "erProcessedText": MessageLookupByLibrary.simpleMessage("成功"), + "erProcessingText": MessageLookupByLibrary.simpleMessage("刷新..."), + "erReadyText": MessageLookupByLibrary.simpleMessage("刷新..."), + "explore": MessageLookupByLibrary.simpleMessage("探索"), + "exploreHint": MessageLookupByLibrary.simpleMessage("搜索与探索..."), + "exploreTooltip": MessageLookupByLibrary.simpleMessage("搜索和探索"), + "general": MessageLookupByLibrary.simpleMessage("通用"), + "help": MessageLookupByLibrary.simpleMessage("Help"), + "home": MessageLookupByLibrary.simpleMessage("首页"), + "homeBookContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"), + "homeBookContinueListeningDescription": + MessageLookupByLibrary.simpleMessage("继续收听书架上显示播放按钮"), + "homeBookContinueSeries": MessageLookupByLibrary.simpleMessage("继续系列"), + "homeBookContinueSeriesDescription": MessageLookupByLibrary.simpleMessage( + "继续系列书架上显示播放按钮", + ), + "homeBookDiscover": MessageLookupByLibrary.simpleMessage("发现"), + "homeBookListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), + "homeBookListenAgainDescription": MessageLookupByLibrary.simpleMessage( + "再听一遍书架上显示播放按钮", + ), + "homeBookNewestAuthors": MessageLookupByLibrary.simpleMessage("最新作者"), + "homeBookRecentlyAdded": MessageLookupByLibrary.simpleMessage("最近添加"), + "homeBookRecommended": MessageLookupByLibrary.simpleMessage("推荐"), + "homeContinueListening": MessageLookupByLibrary.simpleMessage("继续收听"), + "homeListenAgain": MessageLookupByLibrary.simpleMessage("再听一遍"), + "homePageSettings": MessageLookupByLibrary.simpleMessage("主页设置"), + "homePageSettingsDescription": MessageLookupByLibrary.simpleMessage( + "自定义主页", + ), + "homePageSettingsOtherShelves": MessageLookupByLibrary.simpleMessage( + "其他书架", + ), + "homePageSettingsOtherShelvesDescription": + MessageLookupByLibrary.simpleMessage("显示所有剩余书架上所有书籍的播放按钮"), + "homePageSettingsQuickPlay": MessageLookupByLibrary.simpleMessage("继续播放"), + "homeStartListening": MessageLookupByLibrary.simpleMessage("开始收听"), + "language": MessageLookupByLibrary.simpleMessage("语言"), + "languageDescription": MessageLookupByLibrary.simpleMessage("语言切换"), + "library": MessageLookupByLibrary.simpleMessage("媒体库"), + "libraryChange": MessageLookupByLibrary.simpleMessage("更改媒体库"), + "libraryEmpty": MessageLookupByLibrary.simpleMessage("没有可用的库。"), + "libraryLoadError": m4, + "librarySelect": MessageLookupByLibrary.simpleMessage("选择媒体库"), + "librarySwitchTooltip": MessageLookupByLibrary.simpleMessage("切换媒体库"), + "libraryTooltip": MessageLookupByLibrary.simpleMessage("浏览您的媒体库"), + "loading": MessageLookupByLibrary.simpleMessage("加载中..."), + "loginLocal": MessageLookupByLibrary.simpleMessage("Local"), + "loginLogin": MessageLookupByLibrary.simpleMessage("登录"), + "loginOpenID": MessageLookupByLibrary.simpleMessage("OpenID"), + "loginPassword": MessageLookupByLibrary.simpleMessage("密码"), + "loginServerClick": MessageLookupByLibrary.simpleMessage("单击此处"), + "loginServerConnected": MessageLookupByLibrary.simpleMessage("服务器已连接,请登录"), + "loginServerNo": MessageLookupByLibrary.simpleMessage("没有服务器? "), + "loginServerNoConnected": MessageLookupByLibrary.simpleMessage( + "请输入您的AudiobookShelf服务器的URL", + ), + "loginServerNot": m5, + "loginServerTo": MessageLookupByLibrary.simpleMessage(" 了解如何设置服务器。"), + "loginTitle": m6, + "loginToken": MessageLookupByLibrary.simpleMessage("Token"), + "loginUsername": MessageLookupByLibrary.simpleMessage("用户名"), + "logs": MessageLookupByLibrary.simpleMessage("日志"), + "nmpSettingsBackward": MessageLookupByLibrary.simpleMessage("快退间隔"), + "nmpSettingsForward": MessageLookupByLibrary.simpleMessage("快进间隔"), + "nmpSettingsMediaControls": MessageLookupByLibrary.simpleMessage("媒体控制"), + "nmpSettingsMediaControlsDescription": MessageLookupByLibrary.simpleMessage( + "选择要显示的媒体控件", + ), + "nmpSettingsSelectOne": MessageLookupByLibrary.simpleMessage( + "在下面选择一个字段进行插入", + ), + "nmpSettingsShowChapterProgress": MessageLookupByLibrary.simpleMessage( + "显示章节进度", + ), + "nmpSettingsShowChapterProgressDescription": + MessageLookupByLibrary.simpleMessage("而不是本书的整体进展"), + "nmpSettingsSubTitle": MessageLookupByLibrary.simpleMessage("副标题"), + "nmpSettingsSubTitleDescription": MessageLookupByLibrary.simpleMessage( + "通知的副标题\n", + ), + "nmpSettingsTitle": MessageLookupByLibrary.simpleMessage("主标题"), + "nmpSettingsTitleDescription": MessageLookupByLibrary.simpleMessage( + "通知的标题\n", + ), + "no": MessageLookupByLibrary.simpleMessage("否"), + "notImplemented": MessageLookupByLibrary.simpleMessage("未实现"), + "notificationMediaPlayer": MessageLookupByLibrary.simpleMessage("通知媒体播放器"), + "notificationMediaPlayerDescription": MessageLookupByLibrary.simpleMessage( + "在通知中自定义媒体播放器", + ), + "ok": MessageLookupByLibrary.simpleMessage("确定"), + "pause": MessageLookupByLibrary.simpleMessage("暂停"), + "play": MessageLookupByLibrary.simpleMessage("播放"), + "playerSettings": MessageLookupByLibrary.simpleMessage("播放器设置"), + "playerSettingsCompleteTime": MessageLookupByLibrary.simpleMessage( + "剩余时间标记完成", + ), + "playerSettingsCompleteTimeDescriptionHead": + MessageLookupByLibrary.simpleMessage("当书中剩余时间少于 "), + "playerSettingsCompleteTimeDescriptionTail": + MessageLookupByLibrary.simpleMessage(" 时,标记完成"), + "playerSettingsDescription": MessageLookupByLibrary.simpleMessage( + "自定义播放器设置", + ), + "playerSettingsDisplay": MessageLookupByLibrary.simpleMessage("显示设置"), + "playerSettingsDisplayChapterProgress": + MessageLookupByLibrary.simpleMessage("显示章节进度"), + "playerSettingsDisplayChapterProgressDescription": + MessageLookupByLibrary.simpleMessage("在播放器中显示当前章节的进度"), + "playerSettingsDisplayTotalProgress": MessageLookupByLibrary.simpleMessage( + "显示总进度", + ), + "playerSettingsDisplayTotalProgressDescription": + MessageLookupByLibrary.simpleMessage("在播放器中显示当前书籍的总进度"), + "playerSettingsPlaybackInterval": MessageLookupByLibrary.simpleMessage( + "播放报告间隔", + ), + "playerSettingsPlaybackIntervalDescriptionHead": + MessageLookupByLibrary.simpleMessage("每 "), + "playerSettingsPlaybackIntervalDescriptionTail": + MessageLookupByLibrary.simpleMessage(" 向服务器报告一次进度"), + "playerSettingsPlaybackReporting": MessageLookupByLibrary.simpleMessage( + "回放报告", + ), + "playerSettingsPlaybackReportingIgnore": + MessageLookupByLibrary.simpleMessage("忽略播放位置小于"), + "playerSettingsPlaybackReportingMinimum": + MessageLookupByLibrary.simpleMessage("回放报告最小位置"), + "playerSettingsPlaybackReportingMinimumDescriptionHead": + MessageLookupByLibrary.simpleMessage("不要报告本书前 "), + "playerSettingsPlaybackReportingMinimumDescriptionTail": + MessageLookupByLibrary.simpleMessage(" 的播放"), + "playerSettingsRememberForEveryBook": MessageLookupByLibrary.simpleMessage( + "记住每本书的播放器设置", + ), + "playerSettingsRememberForEveryBookDescription": + MessageLookupByLibrary.simpleMessage("每本书都会记住播放速度、音量等设置"), + "playerSettingsSpeed": MessageLookupByLibrary.simpleMessage("播放速度"), + "playerSettingsSpeedDefault": MessageLookupByLibrary.simpleMessage( + "默认播放速度", + ), + "playerSettingsSpeedOptions": MessageLookupByLibrary.simpleMessage( + "播放速度选项", + ), + "playerSettingsSpeedOptionsSelect": MessageLookupByLibrary.simpleMessage( + "播放速度选项", + ), + "playerSettingsSpeedOptionsSelectAdd": MessageLookupByLibrary.simpleMessage( + "添加一个速度选项", + ), + "playerSettingsSpeedOptionsSelectAddHelper": + MessageLookupByLibrary.simpleMessage("输入一个新的速度选项"), + "playerSettingsSpeedSelect": MessageLookupByLibrary.simpleMessage("选择播放速度"), + "playerSettingsSpeedSelectHelper": MessageLookupByLibrary.simpleMessage( + "输入默认的播放速度", + ), + "playlistsMine": MessageLookupByLibrary.simpleMessage("播放列表"), + "readLess": MessageLookupByLibrary.simpleMessage("折叠"), + "readMore": MessageLookupByLibrary.simpleMessage("展开"), + "refresh": MessageLookupByLibrary.simpleMessage("刷新"), + "reset": MessageLookupByLibrary.simpleMessage("重置"), + "resetAppSettings": MessageLookupByLibrary.simpleMessage("重置应用程序设置"), + "resetAppSettingsDescription": MessageLookupByLibrary.simpleMessage( + "将应用程序设置重置为默认值", + ), + "resetAppSettingsDialog": MessageLookupByLibrary.simpleMessage( + "您确定要重置应用程序设置吗?", + ), + "restore": MessageLookupByLibrary.simpleMessage("恢复"), + "restoreBackup": MessageLookupByLibrary.simpleMessage("恢复备份"), + "restoreBackupHint": MessageLookupByLibrary.simpleMessage("将备份粘贴到此处"), + "restoreBackupInvalid": MessageLookupByLibrary.simpleMessage("无效备份"), + "restoreBackupSuccess": MessageLookupByLibrary.simpleMessage("设置已恢复"), + "restoreBackupValidator": MessageLookupByLibrary.simpleMessage("请将备份粘贴到此处"), + "restoreDescription": MessageLookupByLibrary.simpleMessage("从备份中还原应用程序设置"), + "resume": MessageLookupByLibrary.simpleMessage("继续"), + "retry": MessageLookupByLibrary.simpleMessage("重试"), + "settings": MessageLookupByLibrary.simpleMessage("设置"), + "shakeAction": MessageLookupByLibrary.simpleMessage("抖动操作"), + "shakeActionDescription": MessageLookupByLibrary.simpleMessage( + "检测到抖动时要执行的操作", + ), + "shakeActivationThreshold": MessageLookupByLibrary.simpleMessage("抖动激活阈值"), + "shakeActivationThresholdDescription": MessageLookupByLibrary.simpleMessage( + "门槛越高,你就越难摇晃", + ), + "shakeDetector": MessageLookupByLibrary.simpleMessage("抖动检测器"), + "shakeDetectorDescription": MessageLookupByLibrary.simpleMessage( + "自定义抖动检测器设置", + ), + "shakeDetectorEnable": MessageLookupByLibrary.simpleMessage("启用抖动检测"), + "shakeDetectorEnableDescription": MessageLookupByLibrary.simpleMessage( + "启用抖动检测以执行各种操作", + ), + "shakeDetectorSettings": MessageLookupByLibrary.simpleMessage("抖动检测器设置"), + "shakeFeedback": MessageLookupByLibrary.simpleMessage("抖动反馈"), + "shakeFeedbackDescription": MessageLookupByLibrary.simpleMessage( + "检测到抖动时给出的反馈", + ), + "shakeSelectAction": MessageLookupByLibrary.simpleMessage("选择抖动动作"), + "shakeSelectActivationThreshold": MessageLookupByLibrary.simpleMessage( + "选择抖动激活阈值", + ), + "shakeSelectActivationThresholdHelper": + MessageLookupByLibrary.simpleMessage("输入一个数字以m/s²为单位设置阈值"), + "shakeSelectFeedback": MessageLookupByLibrary.simpleMessage("选择抖动反馈"), + "themeMode": MessageLookupByLibrary.simpleMessage("主题模式"), + "themeModeDark": MessageLookupByLibrary.simpleMessage("深色"), + "themeModeHighContrast": MessageLookupByLibrary.simpleMessage("高对比度模式"), + "themeModeHighContrastDescription": 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("您的个人资料和设置"), + }; } diff --git a/lib/generated/l10n.dart b/lib/generated/l10n.dart index 7dd03d3..39b1f6a 100644 --- a/lib/generated/l10n.dart +++ b/lib/generated/l10n.dart @@ -1894,6 +1894,26 @@ class S { ); } + /// `Download Settings` + String get downloadSettings { + return Intl.message( + 'Download Settings', + name: 'downloadSettings', + desc: '', + args: [], + ); + } + + /// `Customize download settings` + String get downloadSettingsDescription { + return Intl.message( + 'Customize download settings', + name: 'downloadSettingsDescription', + desc: '', + args: [], + ); + } + /// `Pull to refresh` String get erDragText { return Intl.message( diff --git a/lib/l10n/intl_en.arb b/lib/l10n/intl_en.arb index ba8f0ae..a5f4c5a 100644 --- a/lib/l10n/intl_en.arb +++ b/lib/l10n/intl_en.arb @@ -271,6 +271,9 @@ "resetAppSettings": "Reset App Settings", "resetAppSettingsDescription": "Reset the app settings to the default values", "resetAppSettingsDialog": "Are you sure you want to reset the app settings?", + + "downloadSettings": "Download Settings", + "downloadSettingsDescription": "Customize download settings", "erDragText": "Pull to refresh", "erDragTextUp": "Pull to refresh", diff --git a/lib/l10n/intl_zh.arb b/lib/l10n/intl_zh.arb index 0685fa4..4ce4571 100644 --- a/lib/l10n/intl_zh.arb +++ b/lib/l10n/intl_zh.arb @@ -272,6 +272,9 @@ "resetAppSettingsDescription": "将应用程序设置重置为默认值", "resetAppSettingsDialog": "您确定要重置应用程序设置吗?", + "downloadSettings": "下载设置", + "downloadSettingsDescription": "自定义下载设置", + "erDragText": "下拉刷新", "erDragTextUp": "上拉加载", "erArmedText": "准备就绪", diff --git a/lib/shared/widgets/custom_dropdown.dart b/lib/shared/widgets/custom_dropdown.dart new file mode 100644 index 0000000..e3d7e5c --- /dev/null +++ b/lib/shared/widgets/custom_dropdown.dart @@ -0,0 +1,65 @@ +// ignore_for_file: public_member_api_docs, sort_constructors_first +import 'dart:async'; + +import 'package:dropdown_search/dropdown_search.dart'; +import 'package:flutter/material.dart'; +import 'package:vaani/constants/sizes.dart'; + +// 自定义下拉选择 +class CustomDropdown extends StatelessWidget { + final T? selected; + + final FutureOr> Function(String, LoadProps?)? items; + final String Function(T)? itemAsString; + final void Function(T?)? onChanged; + const CustomDropdown({ + super.key, + this.selected, + this.items, + this.onChanged, + this.itemAsString, + }); + + @override + Widget build(BuildContext context) { + return DropdownSearch( + selectedItem: selected, + mode: Mode.custom, + items: items, + dropdownBuilder: (ctx, selectedItem) { + return Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text(_itemAsString(selectedItem)), + const Icon(Icons.keyboard_arrow_down), + ], + ); + }, + popupProps: PopupProps.menu( + menuProps: MenuProps( + borderRadius: const BorderRadius.all( + Radius.circular(AppElementSizes.borderRadiusRegular), + ), + popUpAnimationStyle: AnimationStyle(duration: Duration.zero), + ), + constraints: const BoxConstraints(minWidth: 180), + itemBuilder: (context, item, isDisabled, isSelected) => ListTile( + title: Text(_itemAsString(item)), + trailing: selected == item ? Icon(Icons.check) : null, + ), + fit: FlexFit.loose, + ), + onChanged: onChanged, + ); + } + + String _itemAsString(T? data) { + if (data == null) { + return ""; + } else if (itemAsString != null) { + return itemAsString!(data); + } + + return data.toString(); + } +} diff --git a/pubspec.lock b/pubspec.lock index 4770efd..2f0a775 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -302,6 +302,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" custom_lint: dependency: "direct dev" description: @@ -382,6 +390,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + dropdown_search: + dependency: "direct main" + description: + name: dropdown_search + sha256: c29b3e5147a82a06a4a08b3b574c51cb48cc17ad89893d53ee72a6f86643622e + url: "https://pub.dev" + source: hosted + version: "6.0.2" duration_picker: dependency: "direct main" description: @@ -460,7 +476,7 @@ packages: source: hosted version: "4.5.2" flutter_cache_manager: - dependency: "direct main" + dependency: transitive description: name: flutter_cache_manager sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" @@ -1226,14 +1242,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" - scroll_loop_auto_scroll: - dependency: "direct main" - description: - name: scroll_loop_auto_scroll - sha256: "83645b380c58c9dac2a9948b11a6b09149a2aebd18a7ca25bbf3be3c89dbbbff" - url: "https://pub.dev" - source: hosted - version: "0.0.5" sensors_plus: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f2bf55d..649d95a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,40 +34,58 @@ dependencies: collection: ^1.18.0 flutter: sdk: flutter - - animated_list_plus: ^0.5.2 - animated_theme_switcher: ^2.0.10 - archive: ^4.0.5 # 用于编码和解码各种归档和压缩格式的Dart库 - audio_video_progress_bar: ^2.0.2 # 播放进度条 + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.6 + + # 图标 + icons_plus: ^5.0.0 + + # hooks + flutter_hooks: ^0.21.2 + + # 路由 + go_router: ^14.0.2 + + # 状态管理 hooks hooks_riverpod: ^2.5.1 # riverpod hooks riverpod_annotation: ^2.3.5 - # auto_scroll_text: ^0.0.7 - background_downloader: ^9.2.0 - cached_network_image: ^3.3.1 - # coast: ^2.0.2 - # cupertino_icons: ^1.0.6 - # flutter_platform_widgets: ^9.0.0 - flutter_staggered_grid_view: ^0.7.0 - super_sliver_list: ^0.4.1 - easy_refresh: ^3.4.0 - duration_picker: ^1.2.0 - dynamic_color: ^1.7.0 - # easy_stepper: ^0.8.4 - file_picker: ^10.0.0 - - flutter_animate: ^4.5.0 - flutter_cache_manager: ^3.3.2 - flutter_hooks: ^0.21.2 - flutter_settings_ui: ^3.0.1 - # font_awesome_flutter: ^10.7.0 + + # json + json_annotation: ^4.9.0 freezed_annotation: ^2.4.1 - go_router: ^14.0.2 + + # 设备信息 + device_info_plus: ^11.3.3 + # 包信息 + package_info_plus: ^8.0.0 + + # 存储 + path: ^1.9.0 + path_provider: ^2.1.0 hive_ce: ^2.16.0 # 轻量级且极快的键值数据库 hive_ce_flutter: 2.3.3 - # hive: ^4.0.0-dev.2 - # isar: ^4.0.0-dev.14 - # isar_flutter_libs: ^4.0.0-dev.14 - json_annotation: ^4.9.0 + file_picker: ^10.0.0 # 文件选择器 + archive: ^4.0.5 # 用于编码和解码各种归档和压缩格式的Dart库 + + # 图片缓存 + cached_network_image: ^3.3.1 + # flutter_cache_manager: ^3.3.2 + + # 日志 + logging: ^1.2.0 + logging_appenders: ^1.3.1 + + # 骨架屏 + shimmer: ^3.0.0 + + # 滚动列表 + super_sliver_list: ^0.4.1 + # 上拉刷新 下拉加载 + easy_refresh: ^3.4.0 + + # 音频播放 audio_service: ^0.18.15 audio_session: ^0.1.23 just_audio: ^0.10.5 @@ -79,58 +97,84 @@ dependencies: # path: just_audio_background # just_audio_windows: ^0.2.2 just_audio_media_kit: ^2.0.4 - # just_audio_media_kit: - # path: ./just_audio_media_kit media_kit_libs_linux: any media_kit_libs_windows_audio: any - # media_kit: ^1.2.3 # Primary package. - # media_kit_libs_audio: any # Native audio dependencies. + + # 下载 + background_downloader: ^9.2.0 - list_wheel_scroll_view_nls: ^0.0.3 - logging: ^1.2.0 - logging_appenders: ^1.3.1 - lottie: ^3.1.0 - material_color_utilities: ^0.11.1 - # material_symbols_icons: ^4.2785.1 - # miniplayer: - # git: - # url: https://github.com/Dr-Blank/miniplayer.git - # ref: feat-notifier-for-percent-dismissed - # numberpicker: ^2.1.2 - device_info_plus: ^11.3.3 - package_info_plus: ^8.0.0 - path: ^1.9.0 - path_provider: ^2.1.0 + # 设置UI + flutter_settings_ui: ^3.0.1 + + # 权限申请 permission_handler: ^11.3.1 + + # html显示 + flutter_html: ^3.0.0 - scroll_loop_auto_scroll: ^0.0.5 - sensors_plus: ^6.0.1 + # 启动URL + url_launcher: ^6.2.6 + + # 播放进度条 + audio_video_progress_bar: ^2.0.2 + # 网格布局 + flutter_staggered_grid_view: ^0.7.0 + # 横向滚动 + list_wheel_scroll_view_nls: ^0.0.3 + # 滚动 + # scroll_loop_auto_scroll: ^0.0.5 + # 时长选择器 + duration_picker: ^1.2.0 + # 下拉选择框 + dropdown_search: ^6.0.2 + + # 动画 + flutter_animate: ^4.5.0 + lottie: ^3.1.0 + animated_list_plus: ^0.5.2 + animated_theme_switcher: ^2.0.10 + + # Material Design 3色彩系统的算法和工具 + material_color_utilities: ^0.11.1 + # 动态色彩方案 + dynamic_color: ^1.7.0 + + # 分享插件 share_plus: ^10.0.2 + + # AudiobookShelf SDK shelfsdk: path: ./shelfsdk - shimmer: ^3.0.0 - url_launcher: ^6.2.6 - vibration: ^3.1.3 - flutter_html: ^3.0.0 + + # 移动端 Android IOS + vibration: ^3.1.3 # 震动 + sensors_plus: ^6.0.1 # 访问加速度计、陀螺仪、磁力计和 气压计传感器 + + # 桌面 + window_manager: ^0.5.1 # 窗口管理 + tray_manager: ^0.5.2 # 系统托盘 + flutter_localizations: sdk: flutter - window_manager: ^0.5.1 - tray_manager: ^0.5.2 - icons_plus: ^5.0.0 - # http_cache_client: ^1.0.4 - # http_cache_hive_store: ^5.0.1 dev_dependencies: - build_runner: ^2.4.9 - custom_lint: ^0.7.0 - flutter_lints: ^5.0.0 flutter_test: sdk: flutter + flutter_lints: ^5.0.0 + custom_lint: ^0.7.0 + riverpod_lint: ^2.3.10 + + # dart代码生成 + build_runner: ^2.4.9 + #Riverpod代码生成 + riverpod_generator: ^2.4.2 + freezed: ^2.5.2 json_serializable: ^6.8.0 - riverpod_generator: ^2.4.2 - riverpod_lint: ^2.3.10 + hive_ce_generator: ^1.8.1 + + # 启动图标 flutter_launcher_icons: "^0.14.4" # For information on the generic Dart part of this file, see the