mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-07-31 16:27:24 +02:00
The Dart queue loop was already built around an activeDownloads map and per-item progress tracking but was gated to one download at a time. Add a concurrentDownloads setting (1-3, default 1) exposed in Download Settings > Performance, and let the scheduler keep up to that many items in flight. The experimental Android native worker is still strictly sequential, so it is skipped in favor of the Dart queue while concurrency is enabled.
4814 lines
117 KiB
Dart
4814 lines
117 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for Arabic (`ar`).
|
|
class AppLocalizationsAr extends AppLocalizations {
|
|
AppLocalizationsAr([String locale = 'ar']) : super(locale);
|
|
|
|
@override
|
|
String get appName => 'SpotiFLAC Mobile';
|
|
|
|
@override
|
|
String get navHome => 'Home';
|
|
|
|
@override
|
|
String get navLibrary => 'Library';
|
|
|
|
@override
|
|
String get navSettings => 'Settings';
|
|
|
|
@override
|
|
String get navStore => 'Repo';
|
|
|
|
@override
|
|
String get homeTitle => 'Home';
|
|
|
|
@override
|
|
String get homeSubtitle => 'Paste a supported URL or search by name';
|
|
|
|
@override
|
|
String get homeEmptyTitle => 'No search providers yet';
|
|
|
|
@override
|
|
String get homeEmptySubtitle => 'Install an extension to continue.';
|
|
|
|
@override
|
|
String get homeSupports => 'Supports: Track, Album, Playlist, Artist URLs';
|
|
|
|
@override
|
|
String get homeRecent => 'Recent';
|
|
|
|
@override
|
|
String get historyFilterAll => 'All';
|
|
|
|
@override
|
|
String get historyFilterAlbums => 'Albums';
|
|
|
|
@override
|
|
String get historyFilterSingles => 'Singles';
|
|
|
|
@override
|
|
String get historySearchHint => 'Search history...';
|
|
|
|
@override
|
|
String get settingsTitle => 'Settings';
|
|
|
|
@override
|
|
String get settingsDownload => 'Download';
|
|
|
|
@override
|
|
String get settingsAppearance => 'Appearance';
|
|
|
|
@override
|
|
String get settingsOptions => 'Options';
|
|
|
|
@override
|
|
String get settingsExtensions => 'Extensions';
|
|
|
|
@override
|
|
String get settingsAbout => 'About';
|
|
|
|
@override
|
|
String get downloadTitle => 'Download';
|
|
|
|
@override
|
|
String get downloadAskQualitySubtitle =>
|
|
'Show quality picker for each download';
|
|
|
|
@override
|
|
String get downloadFilenameFormat => 'Filename Format';
|
|
|
|
@override
|
|
String get downloadSingleFilenameFormat => 'Single Filename Format';
|
|
|
|
@override
|
|
String get downloadSingleFilenameFormatDescription =>
|
|
'Filename pattern for singles and EPs. Uses the same tags as the album format.';
|
|
|
|
@override
|
|
String get downloadFolderOrganization => 'Folder Organization';
|
|
|
|
@override
|
|
String get appearanceTitle => 'Appearance';
|
|
|
|
@override
|
|
String get appearanceThemeSystem => 'System';
|
|
|
|
@override
|
|
String get appearanceThemeLight => 'Light';
|
|
|
|
@override
|
|
String get appearanceThemeDark => 'Dark';
|
|
|
|
@override
|
|
String get appearanceDynamicColor => 'Dynamic Color';
|
|
|
|
@override
|
|
String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper';
|
|
|
|
@override
|
|
String get appearanceHistoryView => 'History View';
|
|
|
|
@override
|
|
String get appearanceHistoryViewList => 'List';
|
|
|
|
@override
|
|
String get appearanceHistoryViewGrid => 'Grid';
|
|
|
|
@override
|
|
String get optionsTitle => 'Options';
|
|
|
|
@override
|
|
String get optionsPrimaryProvider => 'Primary Provider';
|
|
|
|
@override
|
|
String get optionsPrimaryProviderSubtitle =>
|
|
'Service used for searching by track or album name';
|
|
|
|
@override
|
|
String optionsUsingExtension(String extensionName) {
|
|
return 'Using extension: $extensionName';
|
|
}
|
|
|
|
@override
|
|
String get optionsDefaultSearchTab => 'Default Search Tab';
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabSubtitle =>
|
|
'Choose which tab opens first for new search results.';
|
|
|
|
@override
|
|
String get optionsSwitchBack =>
|
|
'Choose the default search provider to switch back from an extension';
|
|
|
|
@override
|
|
String get optionsAutoFallback => 'Auto Fallback';
|
|
|
|
@override
|
|
String get optionsAutoFallbackSubtitle =>
|
|
'Try other services if download fails';
|
|
|
|
@override
|
|
String get optionsUseExtensionProviders => 'Use Extension Providers';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOn =>
|
|
'Extension providers are enabled';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOff =>
|
|
'Extension providers are required';
|
|
|
|
@override
|
|
String get optionsEmbedLyrics => 'Embed Lyrics';
|
|
|
|
@override
|
|
String get optionsEmbedLyricsSubtitle =>
|
|
'حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها';
|
|
|
|
@override
|
|
String get optionsMaxQualityCover => 'اختيار اعلى جودة للغلاف';
|
|
|
|
@override
|
|
String get optionsMaxQualityCoverSubtitle =>
|
|
'Download highest resolution cover art';
|
|
|
|
@override
|
|
String get optionsReplayGain => 'ReplayGain';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOn =>
|
|
'Scan loudness and embed ReplayGain tags (EBU R128)';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOff =>
|
|
'Disabled: no loudness normalization tags';
|
|
|
|
@override
|
|
String get trackReplayGain => 'Rescan ReplayGain';
|
|
|
|
@override
|
|
String get trackReplayGainSubtitle =>
|
|
'Analyze loudness and write ReplayGain tags';
|
|
|
|
@override
|
|
String get trackReplayGainScanning => 'Analyzing loudness...';
|
|
|
|
@override
|
|
String get trackReplayGainSuccess => 'ReplayGain tags added';
|
|
|
|
@override
|
|
String get trackReplayGainFailed => 'Failed to add ReplayGain tags';
|
|
|
|
@override
|
|
String selectionReplayGainCount(int count) {
|
|
return 'ReplayGain ($count)';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchConfirmTitle => 'Add ReplayGain';
|
|
|
|
@override
|
|
String replayGainBatchConfirmMessage(int count) {
|
|
return 'Analyze loudness and write ReplayGain tags to $count track(s)?';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchAnalyzing => 'Analyzing ReplayGain...';
|
|
|
|
@override
|
|
String replayGainBatchSuccess(int success, int total) {
|
|
return 'ReplayGain added to $success of $total tracks';
|
|
}
|
|
|
|
@override
|
|
String get optionsArtistTagMode => 'Artist Tag Mode';
|
|
|
|
@override
|
|
String get optionsArtistTagModeDescription =>
|
|
'Choose how multiple artists are written into embedded tags.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoined => 'Single joined value';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoinedSubtitle =>
|
|
'Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbis => 'Split tags for FLAC/Opus';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbisSubtitle =>
|
|
'Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.';
|
|
|
|
@override
|
|
String get optionsExtensionStore => 'Extension Repo';
|
|
|
|
@override
|
|
String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation';
|
|
|
|
@override
|
|
String get optionsCheckUpdates => 'Check for Updates';
|
|
|
|
@override
|
|
String get optionsCheckUpdatesSubtitle =>
|
|
'Notify when new version is available';
|
|
|
|
@override
|
|
String get optionsUpdateChannel => 'Update Channel';
|
|
|
|
@override
|
|
String get optionsUpdateChannelStable => 'Stable releases only';
|
|
|
|
@override
|
|
String get optionsUpdateChannelPreview => 'Get preview releases';
|
|
|
|
@override
|
|
String get optionsUpdateChannelWarning =>
|
|
'Preview may contain bugs or incomplete features';
|
|
|
|
@override
|
|
String get optionsClearHistory => 'Clear Download History';
|
|
|
|
@override
|
|
String get optionsClearHistorySubtitle =>
|
|
'Remove all downloaded tracks from history';
|
|
|
|
@override
|
|
String get optionsDetailedLogging => 'Detailed Logging';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOn => 'Detailed logs are being recorded';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOff => 'Enable for bug reports';
|
|
|
|
@override
|
|
String get optionsSpotifyCredentials => 'Spotify Credentials';
|
|
|
|
@override
|
|
String optionsSpotifyCredentialsConfigured(String clientId) {
|
|
return 'Client ID: $clientId...';
|
|
}
|
|
|
|
@override
|
|
String get optionsSpotifyCredentialsRequired => 'Required - tap to configure';
|
|
|
|
@override
|
|
String get optionsSpotifyWarning =>
|
|
'Spotify requires your own API credentials. Get them free from developer.spotify.com';
|
|
|
|
@override
|
|
String get optionsSpotifyDeprecationWarning =>
|
|
'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.';
|
|
|
|
@override
|
|
String get extensionsTitle => 'Extensions';
|
|
|
|
@override
|
|
String get extensionsDisabled => 'Disabled';
|
|
|
|
@override
|
|
String extensionsVersion(String version) {
|
|
return 'Version $version';
|
|
}
|
|
|
|
@override
|
|
String extensionsAuthor(String author) {
|
|
return 'by $author';
|
|
}
|
|
|
|
@override
|
|
String get extensionsUninstall => 'Uninstall';
|
|
|
|
@override
|
|
String get storeTitle => 'Extension Repo';
|
|
|
|
@override
|
|
String get storeSearch => 'Search extensions...';
|
|
|
|
@override
|
|
String get storeInstall => 'Install';
|
|
|
|
@override
|
|
String get storeInstalled => 'Installed';
|
|
|
|
@override
|
|
String get storeUpdate => 'Update';
|
|
|
|
@override
|
|
String get aboutTitle => 'About';
|
|
|
|
@override
|
|
String get aboutContributors => 'Contributors';
|
|
|
|
@override
|
|
String get aboutMobileDeveloper => 'Mobile version developer';
|
|
|
|
@override
|
|
String get aboutOriginalCreator => 'Creator of the original SpotiFLAC';
|
|
|
|
@override
|
|
String get aboutLogoArtist =>
|
|
'The talented artist who created our beautiful app logo!';
|
|
|
|
@override
|
|
String get aboutTranslators => 'Translators';
|
|
|
|
@override
|
|
String get aboutSpecialThanks => 'Special Thanks';
|
|
|
|
@override
|
|
String get aboutLinks => 'Links';
|
|
|
|
@override
|
|
String get aboutMobileSource => 'Mobile source code';
|
|
|
|
@override
|
|
String get aboutPCSource => 'PC source code';
|
|
|
|
@override
|
|
String get aboutKeepAndroidOpen => 'Keep Android Open';
|
|
|
|
@override
|
|
String get aboutReportIssue => 'Report an issue';
|
|
|
|
@override
|
|
String get aboutReportIssueSubtitle => 'Report any problems you encounter';
|
|
|
|
@override
|
|
String get aboutFeatureRequest => 'Feature request';
|
|
|
|
@override
|
|
String get aboutFeatureRequestSubtitle => 'Suggest new features for the app';
|
|
|
|
@override
|
|
String get aboutTelegramChannel => 'Telegram Channel';
|
|
|
|
@override
|
|
String get aboutTelegramChannelSubtitle => 'Announcements and updates';
|
|
|
|
@override
|
|
String get aboutTelegramChat => 'Telegram Community';
|
|
|
|
@override
|
|
String get aboutTelegramChatSubtitle => 'Chat with other users';
|
|
|
|
@override
|
|
String get aboutSocial => 'Social';
|
|
|
|
@override
|
|
String get aboutApp => 'App';
|
|
|
|
@override
|
|
String get aboutVersion => 'Version';
|
|
|
|
@override
|
|
String get aboutBinimumDesc =>
|
|
'The creator of QQDL & HiFi API. This project helped shape lossless download support.';
|
|
|
|
@override
|
|
String get aboutSachinsenalDesc =>
|
|
'The original HiFi project creator. A foundation for lossless-source integration.';
|
|
|
|
@override
|
|
String get aboutSjdonadoDesc =>
|
|
'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!';
|
|
|
|
@override
|
|
String get aboutAppDescription =>
|
|
'Search music metadata, manage extensions, and organize your library.';
|
|
|
|
@override
|
|
String get artistAlbums => 'Albums';
|
|
|
|
@override
|
|
String get artistSingles => 'Singles & EPs';
|
|
|
|
@override
|
|
String get artistCompilations => 'Compilations';
|
|
|
|
@override
|
|
String get artistPopular => 'Popular';
|
|
|
|
@override
|
|
String artistMonthlyListeners(String count) {
|
|
return '$count monthly listeners';
|
|
}
|
|
|
|
@override
|
|
String get trackMetadataService => 'Service';
|
|
|
|
@override
|
|
String get trackMetadataPlay => 'Play';
|
|
|
|
@override
|
|
String get trackMetadataShare => 'Share';
|
|
|
|
@override
|
|
String get trackMetadataDelete => 'Delete';
|
|
|
|
@override
|
|
String get setupGrantPermission => 'Grant Permission';
|
|
|
|
@override
|
|
String get setupSkip => 'Skip for now';
|
|
|
|
@override
|
|
String get setupStorageAccessRequired => 'Storage Access Required';
|
|
|
|
@override
|
|
String get setupStorageAccessMessageAndroid11 =>
|
|
'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.';
|
|
|
|
@override
|
|
String get setupOpenSettings => 'Open Settings';
|
|
|
|
@override
|
|
String get setupPermissionDeniedMessage =>
|
|
'Permission denied. Please grant all permissions to continue.';
|
|
|
|
@override
|
|
String setupPermissionRequired(String permissionType) {
|
|
return '$permissionType Permission Required';
|
|
}
|
|
|
|
@override
|
|
String setupPermissionRequiredMessage(String permissionType) {
|
|
return '$permissionType permission is required for the best experience. You can change this later in Settings.';
|
|
}
|
|
|
|
@override
|
|
String get setupUseDefaultFolder => 'Use Default Folder?';
|
|
|
|
@override
|
|
String get setupNoFolderSelected =>
|
|
'No folder selected. Would you like to use the default Music folder?';
|
|
|
|
@override
|
|
String get setupUseDefault => 'Use Default';
|
|
|
|
@override
|
|
String get setupDownloadLocationTitle => 'Download Location';
|
|
|
|
@override
|
|
String get setupDownloadLocationIosMessage =>
|
|
'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolder => 'App Documents Folder';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolderSubtitle =>
|
|
'Recommended - accessible via Files app';
|
|
|
|
@override
|
|
String get setupChooseFromFiles => 'Choose from Files';
|
|
|
|
@override
|
|
String get setupChooseFromFilesSubtitle => 'Select iCloud or other location';
|
|
|
|
@override
|
|
String get setupIosEmptyFolderWarning =>
|
|
'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.';
|
|
|
|
@override
|
|
String get setupIcloudNotSupported =>
|
|
'iCloud Drive is not supported. Please use the app Documents folder.';
|
|
|
|
@override
|
|
String get setupDownloadInFlac => 'Download Spotify tracks in FLAC';
|
|
|
|
@override
|
|
String get setupStorageGranted => 'Storage Permission Granted!';
|
|
|
|
@override
|
|
String get setupStorageRequired => 'Storage Permission Required';
|
|
|
|
@override
|
|
String get setupStorageDescription =>
|
|
'SpotiFLAC needs storage permission to save your downloaded music files.';
|
|
|
|
@override
|
|
String get setupNotificationGranted => 'تم منح إذن الإشعارات!';
|
|
|
|
@override
|
|
String get setupNotificationEnable => 'Enable Notifications';
|
|
|
|
@override
|
|
String get setupFolderChoose => 'Choose Download Folder';
|
|
|
|
@override
|
|
String get setupFolderDescription =>
|
|
'Select a folder where your downloaded music will be saved.';
|
|
|
|
@override
|
|
String get setupSelectFolder => 'Select Folder';
|
|
|
|
@override
|
|
String get setupEnableNotifications => 'Enable Notifications';
|
|
|
|
@override
|
|
String get setupNotificationBackgroundDescription =>
|
|
'Get notified about download progress and completion. This helps you track downloads when the app is in background.';
|
|
|
|
@override
|
|
String get setupSkipForNow => 'Skip for now';
|
|
|
|
@override
|
|
String get setupNext => 'Next';
|
|
|
|
@override
|
|
String get setupGetStarted => 'Get Started';
|
|
|
|
@override
|
|
String get setupAllowAccessToManageFiles =>
|
|
'Please enable \"Allow access to manage all files\" in the next screen.';
|
|
|
|
@override
|
|
String get setupLanguageTitle => 'Choose Language';
|
|
|
|
@override
|
|
String get setupLanguageDescription =>
|
|
'Select your preferred language for the app. You can change this later in Settings.';
|
|
|
|
@override
|
|
String get setupLanguageSystemDefault => 'System Default';
|
|
|
|
@override
|
|
String get dialogCancel => 'Cancel';
|
|
|
|
@override
|
|
String get dialogSave => 'Save';
|
|
|
|
@override
|
|
String get dialogDelete => 'Delete';
|
|
|
|
@override
|
|
String get dialogRetry => 'Retry';
|
|
|
|
@override
|
|
String get dialogClear => 'Clear';
|
|
|
|
@override
|
|
String get dialogDone => 'Done';
|
|
|
|
@override
|
|
String get dialogImport => 'Import';
|
|
|
|
@override
|
|
String get dialogDownload => 'Download';
|
|
|
|
@override
|
|
String get previewPlay => 'Play preview';
|
|
|
|
@override
|
|
String get previewStop => 'Stop preview';
|
|
|
|
@override
|
|
String get previewUnavailable => 'Preview unavailable';
|
|
|
|
@override
|
|
String get dialogDiscard => 'Discard';
|
|
|
|
@override
|
|
String get dialogRemove => 'Remove';
|
|
|
|
@override
|
|
String get dialogUninstall => 'Uninstall';
|
|
|
|
@override
|
|
String get dialogDiscardChanges => 'Discard Changes?';
|
|
|
|
@override
|
|
String get dialogUnsavedChanges =>
|
|
'You have unsaved changes. Do you want to discard them?';
|
|
|
|
@override
|
|
String get dialogClearAll => 'Clear All';
|
|
|
|
@override
|
|
String get dialogRemoveExtension => 'Remove Extension';
|
|
|
|
@override
|
|
String get dialogRemoveExtensionMessage =>
|
|
'Are you sure you want to remove this extension? This cannot be undone.';
|
|
|
|
@override
|
|
String get dialogUninstallExtension => 'Uninstall Extension?';
|
|
|
|
@override
|
|
String dialogUninstallExtensionMessage(String extensionName) {
|
|
return 'Are you sure you want to remove $extensionName?';
|
|
}
|
|
|
|
@override
|
|
String get dialogClearHistoryTitle => 'Clear History';
|
|
|
|
@override
|
|
String get dialogClearHistoryMessage =>
|
|
'Are you sure you want to clear all download history? This cannot be undone.';
|
|
|
|
@override
|
|
String get dialogDeleteSelectedTitle => 'Delete Selected';
|
|
|
|
@override
|
|
String dialogDeleteSelectedMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.';
|
|
}
|
|
|
|
@override
|
|
String get dialogImportPlaylistTitle => 'Import Playlist';
|
|
|
|
@override
|
|
String dialogImportPlaylistMessage(int count) {
|
|
return 'Found $count tracks in CSV. Add them to download queue?';
|
|
}
|
|
|
|
@override
|
|
String csvImportTracks(int count) {
|
|
return '$count tracks from CSV';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedToQueue(String trackName) {
|
|
return 'Added \"$trackName\" to queue';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToQueue(int count) {
|
|
return 'Added $count tracks to queue';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyDownloaded(String trackName) {
|
|
return '\"$trackName\" already downloaded';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyInLibrary(String trackName) {
|
|
return '\"$trackName\" already exists in your library';
|
|
}
|
|
|
|
@override
|
|
String get snackbarHistoryCleared => 'History cleared';
|
|
|
|
@override
|
|
String get snackbarCredentialsSaved => 'Credentials saved';
|
|
|
|
@override
|
|
String get snackbarCredentialsCleared => 'Credentials cleared';
|
|
|
|
@override
|
|
String snackbarDeletedTracks(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Deleted $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String snackbarCannotOpenFile(String error) {
|
|
return 'Cannot open file: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFillAllFields => 'Please fill all fields';
|
|
|
|
@override
|
|
String get snackbarViewQueue => 'View Queue';
|
|
|
|
@override
|
|
String snackbarUrlCopied(String platform) {
|
|
return '$platform URL copied to clipboard';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFileNotFound => 'File not found';
|
|
|
|
@override
|
|
String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file';
|
|
|
|
@override
|
|
String get snackbarProviderPrioritySaved => 'Provider priority saved';
|
|
|
|
@override
|
|
String get snackbarMetadataProviderSaved =>
|
|
'Metadata provider priority saved';
|
|
|
|
@override
|
|
String snackbarExtensionInstalled(String extensionName) {
|
|
return '$extensionName installed.';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdated(String extensionName) {
|
|
return '$extensionName updated.';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFailedToInstall => 'Failed to install extension';
|
|
|
|
@override
|
|
String get snackbarFailedToUpdate => 'Failed to update extension';
|
|
|
|
@override
|
|
String get errorRateLimited => 'Rate Limited';
|
|
|
|
@override
|
|
String get errorRateLimitedMessage =>
|
|
'Too many requests. Please wait a moment before searching again.';
|
|
|
|
@override
|
|
String get errorNoTracksFound => 'No tracks found';
|
|
|
|
@override
|
|
String get searchEmptyResultSubtitle => 'Try another keyword';
|
|
|
|
@override
|
|
String get errorUrlNotRecognized => 'Link not recognized';
|
|
|
|
@override
|
|
String get errorUrlNotRecognizedMessage =>
|
|
'This link is not supported. Make sure the URL is correct and a compatible extension is installed.';
|
|
|
|
@override
|
|
String get errorUrlFetchFailed =>
|
|
'Failed to load content from this link. Please try again.';
|
|
|
|
@override
|
|
String errorMissingExtensionSource(String item) {
|
|
return 'Cannot load $item: missing extension source';
|
|
}
|
|
|
|
@override
|
|
String get actionPause => 'Pause';
|
|
|
|
@override
|
|
String get actionResume => 'Resume';
|
|
|
|
@override
|
|
String get actionCancel => 'Cancel';
|
|
|
|
@override
|
|
String get actionSelectAll => 'Select All';
|
|
|
|
@override
|
|
String get actionDeselect => 'Deselect';
|
|
|
|
@override
|
|
String get actionRemoveCredentials => 'Remove Credentials';
|
|
|
|
@override
|
|
String get actionSaveCredentials => 'Save Credentials';
|
|
|
|
@override
|
|
String selectionSelected(int count) {
|
|
return '$count selected';
|
|
}
|
|
|
|
@override
|
|
String get selectionAllSelected => 'All tracks selected';
|
|
|
|
@override
|
|
String get selectionSelectToDelete => 'Select tracks to delete';
|
|
|
|
@override
|
|
String progressFetchingMetadata(int current, int total) {
|
|
return 'Fetching metadata... $current/$total';
|
|
}
|
|
|
|
@override
|
|
String get progressReadingCsv => 'Reading CSV...';
|
|
|
|
@override
|
|
String get searchSongs => 'Songs';
|
|
|
|
@override
|
|
String get searchArtists => 'Artists';
|
|
|
|
@override
|
|
String get searchAlbums => 'Albums';
|
|
|
|
@override
|
|
String get searchPlaylists => 'Playlists';
|
|
|
|
@override
|
|
String get searchSortTitle => 'Sort Results';
|
|
|
|
@override
|
|
String get searchSortDefault => 'Default';
|
|
|
|
@override
|
|
String get searchSortTitleAZ => 'Title (A-Z)';
|
|
|
|
@override
|
|
String get searchSortTitleZA => 'Title (Z-A)';
|
|
|
|
@override
|
|
String get searchSortArtistAZ => 'Artist (A-Z)';
|
|
|
|
@override
|
|
String get searchSortArtistZA => 'Artist (Z-A)';
|
|
|
|
@override
|
|
String get searchSortDurationShort => 'Duration (Shortest)';
|
|
|
|
@override
|
|
String get searchSortDurationLong => 'Duration (Longest)';
|
|
|
|
@override
|
|
String get searchSortDateOldest => 'Release Date (Oldest)';
|
|
|
|
@override
|
|
String get searchSortDateNewest => 'Release Date (Newest)';
|
|
|
|
@override
|
|
String get tooltipPlay => 'Play';
|
|
|
|
@override
|
|
String get filenameFormat => 'Filename Format';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTags => 'Show advanced tags';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTagsDescription =>
|
|
'Enable formatted tags for track padding and date patterns';
|
|
|
|
@override
|
|
String get folderOrganizationNone => 'No organization';
|
|
|
|
@override
|
|
String get folderOrganizationByPlaylist => 'By Playlist';
|
|
|
|
@override
|
|
String get folderOrganizationByPlaylistSubtitle =>
|
|
'Separate folder for each playlist';
|
|
|
|
@override
|
|
String get folderOrganizationByArtist => 'By Artist';
|
|
|
|
@override
|
|
String get folderOrganizationByAlbum => 'By Album';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistAlbum => 'Artist/Album';
|
|
|
|
@override
|
|
String get folderOrganizationDescription =>
|
|
'Organize downloaded files into folders';
|
|
|
|
@override
|
|
String get folderOrganizationNoneSubtitle => 'All files in download folder';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistSubtitle =>
|
|
'Separate folder for each artist';
|
|
|
|
@override
|
|
String get folderOrganizationByAlbumSubtitle =>
|
|
'Separate folder for each album';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistAlbumSubtitle =>
|
|
'Nested folders for artist and album';
|
|
|
|
@override
|
|
String get updateAvailable => 'Update Available';
|
|
|
|
@override
|
|
String get updateLater => 'Later';
|
|
|
|
@override
|
|
String get updateStartingDownload => 'Starting download...';
|
|
|
|
@override
|
|
String get updateDownloadFailed => 'Download failed';
|
|
|
|
@override
|
|
String get updateFailedMessage => 'Failed to download update';
|
|
|
|
@override
|
|
String get updateNewVersionReady => 'A new version is ready';
|
|
|
|
@override
|
|
String get updateCurrent => 'Current';
|
|
|
|
@override
|
|
String get updateNew => 'New';
|
|
|
|
@override
|
|
String get updateDownloading => 'Downloading...';
|
|
|
|
@override
|
|
String get updateWhatsNew => 'What\'s New';
|
|
|
|
@override
|
|
String get updateDownloadInstall => 'Download & Install';
|
|
|
|
@override
|
|
String get updateDontRemind => 'Don\'t remind';
|
|
|
|
@override
|
|
String get providerPriorityTitle => 'Provider Priority';
|
|
|
|
@override
|
|
String get providerPriorityDescription =>
|
|
'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.';
|
|
|
|
@override
|
|
String get providerPriorityInfo =>
|
|
'If a track is not available on the first provider, the app will automatically try the next one.';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsDescription =>
|
|
'Choose which installed download extensions can be used during automatic fallback.';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsHint =>
|
|
'Only enabled extensions with download-provider capability are listed here.';
|
|
|
|
@override
|
|
String get providerBuiltIn => 'Legacy';
|
|
|
|
@override
|
|
String get providerExtension => 'Extension';
|
|
|
|
@override
|
|
String get metadataProviderPriorityTitle => 'Metadata Priority';
|
|
|
|
@override
|
|
String get metadataProviderPriorityDescription =>
|
|
'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.';
|
|
|
|
@override
|
|
String get metadataProviderPriorityInfo =>
|
|
'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.';
|
|
|
|
@override
|
|
String get metadataNoRateLimits => 'No rate limits';
|
|
|
|
@override
|
|
String get metadataMayRateLimit => 'May rate limit';
|
|
|
|
@override
|
|
String get logTitle => 'Logs';
|
|
|
|
@override
|
|
String get logCopied => 'Logs copied to clipboard';
|
|
|
|
@override
|
|
String get logSearchHint => 'Search logs...';
|
|
|
|
@override
|
|
String get logFilterLevel => 'Level';
|
|
|
|
@override
|
|
String get logFilterSection => 'Filter';
|
|
|
|
@override
|
|
String get logShareLogs => 'Share logs';
|
|
|
|
@override
|
|
String get logClearLogs => 'Clear logs';
|
|
|
|
@override
|
|
String get logClearLogsTitle => 'Clear Logs';
|
|
|
|
@override
|
|
String get logClearLogsMessage => 'Are you sure you want to clear all logs?';
|
|
|
|
@override
|
|
String get logFilterBySeverity => 'Filter logs by severity';
|
|
|
|
@override
|
|
String get logNoLogsYet => 'No logs yet';
|
|
|
|
@override
|
|
String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app';
|
|
|
|
@override
|
|
String logEntriesFiltered(int count) {
|
|
return 'Entries ($count filtered)';
|
|
}
|
|
|
|
@override
|
|
String logEntries(int count) {
|
|
return 'Entries ($count)';
|
|
}
|
|
|
|
@override
|
|
String get credentialsTitle => 'Spotify Credentials';
|
|
|
|
@override
|
|
String get credentialsDescription =>
|
|
'Enter your Client ID and Secret to use your own Spotify application quota.';
|
|
|
|
@override
|
|
String get credentialsClientId => 'Client ID';
|
|
|
|
@override
|
|
String get credentialsClientIdHint => 'Paste Client ID';
|
|
|
|
@override
|
|
String get credentialsClientSecret => 'Client Secret';
|
|
|
|
@override
|
|
String get credentialsClientSecretHint => 'Paste Client Secret';
|
|
|
|
@override
|
|
String get channelStable => 'Stable';
|
|
|
|
@override
|
|
String get channelPreview => 'Preview';
|
|
|
|
@override
|
|
String get sectionSearchSource => 'Search Source';
|
|
|
|
@override
|
|
String get sectionDownload => 'Download';
|
|
|
|
@override
|
|
String get sectionPerformance => 'Performance';
|
|
|
|
@override
|
|
String get sectionApp => 'App';
|
|
|
|
@override
|
|
String get sectionData => 'Data';
|
|
|
|
@override
|
|
String get sectionDebug => 'Debug';
|
|
|
|
@override
|
|
String get sectionService => 'Service';
|
|
|
|
@override
|
|
String get sectionAudioQuality => 'Audio Quality';
|
|
|
|
@override
|
|
String get sectionFileSettings => 'File Settings';
|
|
|
|
@override
|
|
String get sectionLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get lyricsMode => 'Lyrics Mode';
|
|
|
|
@override
|
|
String get lyricsModeDescription =>
|
|
'Choose how lyrics are saved with your downloads';
|
|
|
|
@override
|
|
String get lyricsModeEmbed => 'Embed in file';
|
|
|
|
@override
|
|
String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata';
|
|
|
|
@override
|
|
String get lyricsModeExternal => 'External .lrc file';
|
|
|
|
@override
|
|
String get lyricsModeExternalSubtitle =>
|
|
'Separate .lrc file for players like Samsung Music';
|
|
|
|
@override
|
|
String get lyricsModeBoth => 'Both';
|
|
|
|
@override
|
|
String get lyricsModeBothSubtitle => 'Embed and save .lrc file';
|
|
|
|
@override
|
|
String get sectionColor => 'Color';
|
|
|
|
@override
|
|
String get sectionTheme => 'Theme';
|
|
|
|
@override
|
|
String get sectionLayout => 'Layout';
|
|
|
|
@override
|
|
String get sectionLanguage => 'Language';
|
|
|
|
@override
|
|
String get appearanceLanguage => 'App Language';
|
|
|
|
@override
|
|
String get settingsAppearanceSubtitle => 'Theme, colors, display';
|
|
|
|
@override
|
|
String get settingsDownloadSubtitle => 'Service, quality, fallback';
|
|
|
|
@override
|
|
String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art';
|
|
|
|
@override
|
|
String get settingsExtensionsSubtitle => 'Manage download providers';
|
|
|
|
@override
|
|
String get settingsLogsSubtitle => 'View app logs for debugging';
|
|
|
|
@override
|
|
String get loadingSharedLink => 'Loading shared link...';
|
|
|
|
@override
|
|
String get pressBackAgainToExit => 'Press back again to exit';
|
|
|
|
@override
|
|
String downloadAllCount(int count) {
|
|
return 'Download All ($count)';
|
|
}
|
|
|
|
@override
|
|
String tracksCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks',
|
|
one: '1 track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get trackCopyFilePath => 'Copy file path';
|
|
|
|
@override
|
|
String get trackRemoveFromDevice => 'Remove from device';
|
|
|
|
@override
|
|
String get trackLoadLyrics => 'Load Lyrics';
|
|
|
|
@override
|
|
String get trackMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get trackFileInfo => 'File Info';
|
|
|
|
@override
|
|
String get trackLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get trackFileNotFound => 'File not found';
|
|
|
|
@override
|
|
String get trackOpenInDeezer => 'Open in Deezer';
|
|
|
|
@override
|
|
String get trackOpenInSpotify => 'Open in Spotify';
|
|
|
|
@override
|
|
String get trackTrackName => 'Track name';
|
|
|
|
@override
|
|
String get trackArtist => 'Artist';
|
|
|
|
@override
|
|
String get trackAlbumArtist => 'Album artist';
|
|
|
|
@override
|
|
String get trackAlbum => 'Album';
|
|
|
|
@override
|
|
String get trackTrackNumber => 'Track number';
|
|
|
|
@override
|
|
String get trackDiscNumber => 'Disc number';
|
|
|
|
@override
|
|
String get trackDuration => 'Duration';
|
|
|
|
@override
|
|
String get trackAudioQuality => 'Audio quality';
|
|
|
|
@override
|
|
String get trackReleaseDate => 'Release date';
|
|
|
|
@override
|
|
String get trackGenre => 'Genre';
|
|
|
|
@override
|
|
String get trackLabel => 'Label';
|
|
|
|
@override
|
|
String get trackCopyright => 'Copyright';
|
|
|
|
@override
|
|
String get trackDownloaded => 'Downloaded';
|
|
|
|
@override
|
|
String get trackCopyLyrics => 'Copy lyrics';
|
|
|
|
@override
|
|
String trackLyricsSource(String source) {
|
|
return 'Source: $source';
|
|
}
|
|
|
|
@override
|
|
String get trackLyricsNotAvailable => 'Lyrics not available for this track';
|
|
|
|
@override
|
|
String get trackLyricsNotInFile => 'No lyrics found in this file';
|
|
|
|
@override
|
|
String get trackFetchOnlineLyrics => 'Fetch from Online';
|
|
|
|
@override
|
|
String get trackLyricsTimeout => 'Request timed out. Try again later.';
|
|
|
|
@override
|
|
String get trackLyricsLoadFailed => 'Failed to load lyrics';
|
|
|
|
@override
|
|
String get trackEmbedLyrics => 'Embed Lyrics';
|
|
|
|
@override
|
|
String get trackLyricsEmbedded => 'Lyrics embedded successfully';
|
|
|
|
@override
|
|
String get trackInstrumental => 'Instrumental track';
|
|
|
|
@override
|
|
String get trackCopiedToClipboard => 'Copied to clipboard';
|
|
|
|
@override
|
|
String get trackDeleteConfirmTitle => 'Remove from device?';
|
|
|
|
@override
|
|
String get trackDeleteConfirmMessage =>
|
|
'This will permanently delete the downloaded file and remove it from your history.';
|
|
|
|
@override
|
|
String get dateToday => 'Today';
|
|
|
|
@override
|
|
String get dateYesterday => 'Yesterday';
|
|
|
|
@override
|
|
String dateDaysAgo(int count) {
|
|
return '$count days ago';
|
|
}
|
|
|
|
@override
|
|
String dateWeeksAgo(int count) {
|
|
return '$count weeks ago';
|
|
}
|
|
|
|
@override
|
|
String dateMonthsAgo(int count) {
|
|
return '$count months ago';
|
|
}
|
|
|
|
@override
|
|
String get storeFilterAll => 'All';
|
|
|
|
@override
|
|
String get storeFilterMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get storeFilterDownload => 'Download';
|
|
|
|
@override
|
|
String get storeFilterUtility => 'Utility';
|
|
|
|
@override
|
|
String get storeFilterLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get storeFilterIntegration => 'Integration';
|
|
|
|
@override
|
|
String get storeClearFilters => 'Clear filters';
|
|
|
|
@override
|
|
String get storeAddRepoTitle => 'Add Extension Repository';
|
|
|
|
@override
|
|
String get storeAddRepoDescription =>
|
|
'Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.';
|
|
|
|
@override
|
|
String get storeRepoUrlLabel => 'Repository URL';
|
|
|
|
@override
|
|
String get storeRepoUrlHint => 'https://github.com/user/repo';
|
|
|
|
@override
|
|
String get storeRepoUrlHelper =>
|
|
'e.g. https://github.com/user/extensions-repo';
|
|
|
|
@override
|
|
String get storeAddRepoButton => 'Add Repository';
|
|
|
|
@override
|
|
String get storeChangeRepoTooltip => 'Change repository';
|
|
|
|
@override
|
|
String get storeRepoDialogTitle => 'Extension Repository';
|
|
|
|
@override
|
|
String get storeRepoDialogCurrent => 'Current repository:';
|
|
|
|
@override
|
|
String get storeNewRepoUrlLabel => 'New Repository URL';
|
|
|
|
@override
|
|
String get storeLoadError => 'Failed to load repository';
|
|
|
|
@override
|
|
String get storeEmptyNoExtensions => 'No extensions available';
|
|
|
|
@override
|
|
String get storeEmptyNoResults => 'No extensions found';
|
|
|
|
@override
|
|
String get extensionDefaultProvider => 'Default Search';
|
|
|
|
@override
|
|
String get extensionDefaultProviderSubtitle =>
|
|
'Use the default metadata search';
|
|
|
|
@override
|
|
String get extensionAuthor => 'Author';
|
|
|
|
@override
|
|
String get extensionId => 'ID';
|
|
|
|
@override
|
|
String get extensionError => 'Error';
|
|
|
|
@override
|
|
String get extensionCapabilities => 'Capabilities';
|
|
|
|
@override
|
|
String get extensionMetadataProvider => 'Metadata Provider';
|
|
|
|
@override
|
|
String get extensionDownloadProvider => 'Download Provider';
|
|
|
|
@override
|
|
String get extensionLyricsProvider => 'Lyrics Provider';
|
|
|
|
@override
|
|
String get extensionUrlHandler => 'URL Handler';
|
|
|
|
@override
|
|
String get extensionQualityOptions => 'Quality Options';
|
|
|
|
@override
|
|
String get extensionPostProcessingHooks => 'Post-Processing Hooks';
|
|
|
|
@override
|
|
String get extensionPermissions => 'Permissions';
|
|
|
|
@override
|
|
String get extensionSettings => 'Settings';
|
|
|
|
@override
|
|
String get extensionRemoveButton => 'Remove Extension';
|
|
|
|
@override
|
|
String get extensionUpdated => 'Updated';
|
|
|
|
@override
|
|
String get extensionMinAppVersion => 'Min App Version';
|
|
|
|
@override
|
|
String get extensionCustomTrackMatching => 'Custom Track Matching';
|
|
|
|
@override
|
|
String get extensionPostProcessing => 'Post-Processing';
|
|
|
|
@override
|
|
String extensionHooksAvailable(int count) {
|
|
return '$count hook(s) available';
|
|
}
|
|
|
|
@override
|
|
String extensionPatternsCount(int count) {
|
|
return '$count pattern(s)';
|
|
}
|
|
|
|
@override
|
|
String extensionStrategy(String strategy) {
|
|
return 'Strategy: $strategy';
|
|
}
|
|
|
|
@override
|
|
String get extensionsProviderPrioritySection => 'Provider Priority';
|
|
|
|
@override
|
|
String get extensionsInstalledSection => 'Installed Extensions';
|
|
|
|
@override
|
|
String get extensionsNoExtensions => 'No extensions installed';
|
|
|
|
@override
|
|
String get extensionsNoExtensionsSubtitle =>
|
|
'Install .spotiflac-ext files to add new providers';
|
|
|
|
@override
|
|
String get extensionsInstallButton => 'Install Extension';
|
|
|
|
@override
|
|
String get extensionsInfoTip =>
|
|
'Extensions can add new metadata and download providers. Only install extensions from trusted sources.';
|
|
|
|
@override
|
|
String get extensionsInstalledSuccess => 'Extension installed successfully';
|
|
|
|
@override
|
|
String extensionsInstalledCount(int count) {
|
|
return '$count extensions installed successfully';
|
|
}
|
|
|
|
@override
|
|
String extensionsInstallPartialSuccess(int installed, int attempted) {
|
|
return 'Installed $installed of $attempted extensions';
|
|
}
|
|
|
|
@override
|
|
String get extensionsDownloadPriority => 'Download Priority';
|
|
|
|
@override
|
|
String get extensionsDownloadPrioritySubtitle => 'Set download service order';
|
|
|
|
@override
|
|
String get extensionsFallbackTitle => 'Fallback Extensions';
|
|
|
|
@override
|
|
String get extensionsFallbackSubtitle =>
|
|
'Choose which installed download extensions can be used as fallback';
|
|
|
|
@override
|
|
String get extensionsNoDownloadProvider =>
|
|
'No extensions with download provider';
|
|
|
|
@override
|
|
String get extensionsMetadataPriority => 'Metadata Priority';
|
|
|
|
@override
|
|
String get extensionsMetadataPrioritySubtitle =>
|
|
'Set search & metadata source order';
|
|
|
|
@override
|
|
String get extensionsNoMetadataProvider =>
|
|
'No extensions with metadata provider';
|
|
|
|
@override
|
|
String get extensionsSearchProvider => 'Search Provider';
|
|
|
|
@override
|
|
String get extensionsNoCustomSearch => 'No extensions with custom search';
|
|
|
|
@override
|
|
String get extensionsSearchProviderDescription =>
|
|
'Choose which service to use for searching tracks';
|
|
|
|
@override
|
|
String get extensionsCustomSearch => 'Custom search';
|
|
|
|
@override
|
|
String get extensionsErrorLoading => 'Error loading extension';
|
|
|
|
@override
|
|
String get qualityFlacLossless => 'FLAC Lossless';
|
|
|
|
@override
|
|
String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz';
|
|
|
|
@override
|
|
String get qualityHiResFlac => 'Hi-Res FLAC';
|
|
|
|
@override
|
|
String get qualityHiResFlacSubtitle => '24-bit / up to 96kHz';
|
|
|
|
@override
|
|
String get qualityHiResFlacMax => 'Hi-Res FLAC Max';
|
|
|
|
@override
|
|
String get qualityHiResFlacMaxSubtitle => '24-bit / up to 192kHz';
|
|
|
|
@override
|
|
String get downloadLossy320 => 'Lossy 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyFormat => 'Lossy Format';
|
|
|
|
@override
|
|
String get downloadLossy320Format => 'Lossy 320kbps Format';
|
|
|
|
@override
|
|
String get downloadLossy320FormatDesc =>
|
|
'Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.';
|
|
|
|
@override
|
|
String get downloadLossyMp3 => 'MP3 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track';
|
|
|
|
@override
|
|
String get downloadLossyAac => 'AAC/M4A 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyAacSubtitle =>
|
|
'Best mobile compatibility, M4A container';
|
|
|
|
@override
|
|
String get downloadLossyOpus256 => 'Opus 256kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus256Subtitle =>
|
|
'Best quality Opus, ~8MB per track';
|
|
|
|
@override
|
|
String get downloadLossyOpus128 => 'Opus 128kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track';
|
|
|
|
@override
|
|
String get qualityNote =>
|
|
'Actual quality depends on track availability from the service';
|
|
|
|
@override
|
|
String get downloadAskBeforeDownload => 'Ask Before Download';
|
|
|
|
@override
|
|
String get downloadDirectory => 'Download Directory';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesFolder => 'Separate Singles Folder';
|
|
|
|
@override
|
|
String get downloadAlbumFolderStructure => 'Album Folder Structure';
|
|
|
|
@override
|
|
String get albumFolderStructureDescription =>
|
|
'Choose how album folders are structured';
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFolders => 'Use Album Artist for folders';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyEnabled =>
|
|
'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyDisabled =>
|
|
'Full artist string used for folder name';
|
|
|
|
@override
|
|
String get downloadSelectQuality => 'Select Quality';
|
|
|
|
@override
|
|
String get downloadFrom => 'Download From';
|
|
|
|
@override
|
|
String get appearanceAmoledDark => 'AMOLED Dark';
|
|
|
|
@override
|
|
String get appearanceAmoledDarkSubtitle => 'Pure black background';
|
|
|
|
@override
|
|
String get queueClearAll => 'Clear All';
|
|
|
|
@override
|
|
String get queueClearAllMessage =>
|
|
'Are you sure you want to clear all downloads?';
|
|
|
|
@override
|
|
String get settingsAutoExportFailed => 'Auto-export failed downloads';
|
|
|
|
@override
|
|
String get settingsAutoExportFailedSubtitle =>
|
|
'Save failed downloads to TXT file automatically';
|
|
|
|
@override
|
|
String get settingsDownloadNetwork => 'Download Network';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkAny => 'WiFi + Mobile Data';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkWifiOnly => 'WiFi Only';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkSubtitle =>
|
|
'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloads => 'Concurrent downloads';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloadsSubtitle =>
|
|
'Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.';
|
|
|
|
@override
|
|
String get concurrentDownloadsOne => '1 track at a time';
|
|
|
|
@override
|
|
String concurrentDownloadsCount(int count) {
|
|
return 'Up to $count tracks at once';
|
|
}
|
|
|
|
@override
|
|
String get albumFolderArtistAlbum => 'Artist / Album';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbum => 'Artist / [Year] Album';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbumSubtitle =>
|
|
'Albums/Artist Name/[2005] Album Name/';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnly => 'Album Only';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/';
|
|
|
|
@override
|
|
String get albumFolderYearAlbum => '[Year] Album';
|
|
|
|
@override
|
|
String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Album Name/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSinglesSubtitle =>
|
|
'Artist/Album/ and Artist/Singles/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlatSubtitle =>
|
|
'Artist/Album/ and Artist/song.flac';
|
|
|
|
@override
|
|
String get downloadedAlbumDeleteSelected => 'Delete Selected';
|
|
|
|
@override
|
|
String downloadedAlbumDeleteMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.';
|
|
}
|
|
|
|
@override
|
|
String downloadedAlbumSelectedCount(int count) {
|
|
return '$count selected';
|
|
}
|
|
|
|
@override
|
|
String get downloadedAlbumAllSelected => 'All tracks selected';
|
|
|
|
@override
|
|
String get downloadedAlbumTapToSelect => 'Tap tracks to select';
|
|
|
|
@override
|
|
String downloadedAlbumDeleteCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get downloadedAlbumSelectToDelete => 'Select tracks to delete';
|
|
|
|
@override
|
|
String downloadedAlbumDiscHeader(int discNumber) {
|
|
return 'Disc $discNumber';
|
|
}
|
|
|
|
@override
|
|
String get recentTypeArtist => 'Artist';
|
|
|
|
@override
|
|
String get recentTypeAlbum => 'Album';
|
|
|
|
@override
|
|
String get recentTypeSong => 'Song';
|
|
|
|
@override
|
|
String get recentTypePlaylist => 'Playlist';
|
|
|
|
@override
|
|
String get recentEmpty => 'No recent items yet';
|
|
|
|
@override
|
|
String get recentShowAllDownloads => 'Show All Downloads';
|
|
|
|
@override
|
|
String recentPlaylistInfo(String name) {
|
|
return 'Playlist: $name';
|
|
}
|
|
|
|
@override
|
|
String get discographyDownload => 'Download Discography';
|
|
|
|
@override
|
|
String get discographyDownloadAll => 'Download All';
|
|
|
|
@override
|
|
String discographyDownloadAllSubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount releases';
|
|
}
|
|
|
|
@override
|
|
String get discographyAlbumsOnly => 'Albums Only';
|
|
|
|
@override
|
|
String discographyAlbumsOnlySubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount albums';
|
|
}
|
|
|
|
@override
|
|
String get discographySinglesOnly => 'Singles & EPs Only';
|
|
|
|
@override
|
|
String discographySinglesOnlySubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount singles';
|
|
}
|
|
|
|
@override
|
|
String get discographySelectAlbums => 'Select Albums...';
|
|
|
|
@override
|
|
String get discographySelectAlbumsSubtitle =>
|
|
'Choose specific albums or singles';
|
|
|
|
@override
|
|
String get discographyFetchingTracks => 'Fetching tracks...';
|
|
|
|
@override
|
|
String discographyFetchingAlbum(int current, int total) {
|
|
return 'Fetching $current of $total...';
|
|
}
|
|
|
|
@override
|
|
String discographySelectedCount(int count) {
|
|
return '$count selected';
|
|
}
|
|
|
|
@override
|
|
String get discographyDownloadSelected => 'Download Selected';
|
|
|
|
@override
|
|
String discographyAddedToQueue(int count) {
|
|
return 'Added $count tracks to queue';
|
|
}
|
|
|
|
@override
|
|
String discographySkippedDownloaded(int added, int skipped) {
|
|
return '$added added, $skipped already downloaded';
|
|
}
|
|
|
|
@override
|
|
String get discographyNoAlbums => 'No albums available';
|
|
|
|
@override
|
|
String get discographyFailedToFetch => 'Failed to fetch some albums';
|
|
|
|
@override
|
|
String get sectionStorageAccess => 'Storage Access';
|
|
|
|
@override
|
|
String get allFilesAccess => 'All Files Access';
|
|
|
|
@override
|
|
String get allFilesAccessEnabledSubtitle => 'Can write to any folder';
|
|
|
|
@override
|
|
String get allFilesAccessDisabledSubtitle => 'Limited to media folders only';
|
|
|
|
@override
|
|
String get allFilesAccessDescription =>
|
|
'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.';
|
|
|
|
@override
|
|
String get allFilesAccessDeniedMessage =>
|
|
'Permission was denied. Please enable \'All files access\' manually in system settings.';
|
|
|
|
@override
|
|
String get allFilesAccessDisabledMessage =>
|
|
'All Files Access disabled. The app will use limited storage access.';
|
|
|
|
@override
|
|
String get settingsLocalLibrary => 'Local Library';
|
|
|
|
@override
|
|
String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates';
|
|
|
|
@override
|
|
String get settingsCache => 'Storage & Cache';
|
|
|
|
@override
|
|
String get settingsCacheSubtitle => 'View size and clear cached data';
|
|
|
|
@override
|
|
String get libraryTitle => 'Local Library';
|
|
|
|
@override
|
|
String get libraryScanSettings => 'Scan Settings';
|
|
|
|
@override
|
|
String get libraryEnableLocalLibrary => 'Enable Local Library';
|
|
|
|
@override
|
|
String get libraryEnableLocalLibrarySubtitle =>
|
|
'Scan and track your existing music';
|
|
|
|
@override
|
|
String get libraryFolder => 'Library Folder';
|
|
|
|
@override
|
|
String get libraryFolderHint => 'Tap to select folder';
|
|
|
|
@override
|
|
String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator';
|
|
|
|
@override
|
|
String get libraryShowDuplicateIndicatorSubtitle =>
|
|
'Show when searching for existing tracks';
|
|
|
|
@override
|
|
String get libraryAutoScan => 'Auto Scan';
|
|
|
|
@override
|
|
String get libraryAutoScanSubtitle =>
|
|
'Automatically scan your library for new files';
|
|
|
|
@override
|
|
String get libraryAutoScanOff => 'Off';
|
|
|
|
@override
|
|
String get libraryAutoScanOnOpen => 'Every app open';
|
|
|
|
@override
|
|
String get libraryAutoScanDaily => 'Daily';
|
|
|
|
@override
|
|
String get libraryAutoScanWeekly => 'Weekly';
|
|
|
|
@override
|
|
String get libraryActions => 'Actions';
|
|
|
|
@override
|
|
String get libraryScan => 'Scan Library';
|
|
|
|
@override
|
|
String get libraryScanSubtitle => 'Scan for audio files';
|
|
|
|
@override
|
|
String get libraryScanSelectFolderFirst => 'Select a folder first';
|
|
|
|
@override
|
|
String get libraryCleanupMissingFiles => 'Cleanup Missing Files';
|
|
|
|
@override
|
|
String get libraryCleanupMissingFilesSubtitle =>
|
|
'Remove entries for files that no longer exist';
|
|
|
|
@override
|
|
String get libraryClear => 'Clear Library';
|
|
|
|
@override
|
|
String get libraryClearSubtitle => 'Remove all scanned tracks';
|
|
|
|
@override
|
|
String get libraryClearConfirmTitle => 'Clear Library';
|
|
|
|
@override
|
|
String get libraryClearConfirmMessage =>
|
|
'This will remove all scanned tracks from your library. Your actual music files will not be deleted.';
|
|
|
|
@override
|
|
String get libraryAbout => 'About Local Library';
|
|
|
|
@override
|
|
String get libraryAboutDescription =>
|
|
'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.';
|
|
|
|
@override
|
|
String libraryTracksUnit(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String libraryFilesUnit(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'files',
|
|
one: 'file',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String libraryLastScanned(String time) {
|
|
return 'Last scanned: $time';
|
|
}
|
|
|
|
@override
|
|
String get libraryLastScannedNever => 'Never';
|
|
|
|
@override
|
|
String get libraryScanning => 'Scanning...';
|
|
|
|
@override
|
|
String get libraryScanFinalizing => 'Finalizing library...';
|
|
|
|
@override
|
|
String libraryScanProgress(String progress, int total) {
|
|
return '$progress% of $total files';
|
|
}
|
|
|
|
@override
|
|
String get libraryInLibrary => 'In Library';
|
|
|
|
@override
|
|
String libraryRemovedMissingFiles(int count) {
|
|
return 'Removed $count missing files from library';
|
|
}
|
|
|
|
@override
|
|
String get libraryCleared => 'Library cleared';
|
|
|
|
@override
|
|
String get libraryStorageAccessRequired => 'Storage Access Required';
|
|
|
|
@override
|
|
String get libraryStorageAccessMessage =>
|
|
'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.';
|
|
|
|
@override
|
|
String get libraryFolderNotExist => 'Selected folder does not exist';
|
|
|
|
@override
|
|
String get librarySourceDownloaded => 'Downloaded';
|
|
|
|
@override
|
|
String get librarySourceLocal => 'Local';
|
|
|
|
@override
|
|
String get libraryFilterAll => 'All';
|
|
|
|
@override
|
|
String get libraryFilterDownloaded => 'Downloaded';
|
|
|
|
@override
|
|
String get libraryFilterLocal => 'Local';
|
|
|
|
@override
|
|
String get libraryFilterTitle => 'Filters';
|
|
|
|
@override
|
|
String get libraryFilterReset => 'Reset';
|
|
|
|
@override
|
|
String get libraryFilterApply => 'Apply';
|
|
|
|
@override
|
|
String get libraryFilterSource => 'Source';
|
|
|
|
@override
|
|
String get libraryFilterQuality => 'Quality';
|
|
|
|
@override
|
|
String get libraryFilterQualityHiRes => 'Hi-Res (24bit)';
|
|
|
|
@override
|
|
String get libraryFilterQualityCD => 'CD (16bit)';
|
|
|
|
@override
|
|
String get libraryFilterQualityLossy => 'Lossy';
|
|
|
|
@override
|
|
String get libraryFilterFormat => 'Format';
|
|
|
|
@override
|
|
String get libraryFilterMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataComplete => 'Complete metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingAny => 'Missing any metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingYear => 'Missing year';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingGenre => 'Missing genre';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist';
|
|
|
|
@override
|
|
String get libraryFilterSort => 'Sort';
|
|
|
|
@override
|
|
String get libraryFilterSortLatest => 'Latest';
|
|
|
|
@override
|
|
String get libraryFilterSortOldest => 'Oldest';
|
|
|
|
@override
|
|
String get libraryFilterSortAlbumAsc => 'Album (A-Z)';
|
|
|
|
@override
|
|
String get libraryFilterSortAlbumDesc => 'Album (Z-A)';
|
|
|
|
@override
|
|
String get libraryFilterSortGenreAsc => 'Genre (A-Z)';
|
|
|
|
@override
|
|
String get libraryFilterSortGenreDesc => 'Genre (Z-A)';
|
|
|
|
@override
|
|
String get timeJustNow => 'Just now';
|
|
|
|
@override
|
|
String timeMinutesAgo(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count minutes ago',
|
|
one: '1 minute ago',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String timeHoursAgo(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count hours ago',
|
|
one: '1 hour ago',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!';
|
|
|
|
@override
|
|
String get tutorialWelcomeDesc =>
|
|
'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip1 =>
|
|
'Download music from Spotify, Deezer, or paste any supported URL';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip2 =>
|
|
'Get FLAC quality audio from installed download extensions';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip3 =>
|
|
'Automatic metadata, cover art, and lyrics embedding';
|
|
|
|
@override
|
|
String get tutorialSearchTitle => 'Finding Music';
|
|
|
|
@override
|
|
String get tutorialSearchDesc =>
|
|
'There are two easy ways to find music you want to download.';
|
|
|
|
@override
|
|
String get tutorialDownloadTitle => 'Downloading Music';
|
|
|
|
@override
|
|
String get tutorialDownloadDesc =>
|
|
'Downloading music is simple and fast. Here\'s how it works.';
|
|
|
|
@override
|
|
String get tutorialLibraryTitle => 'Your Library';
|
|
|
|
@override
|
|
String get tutorialLibraryDesc =>
|
|
'All your downloaded music is organized in the Library tab.';
|
|
|
|
@override
|
|
String get tutorialLibraryTip1 =>
|
|
'View download progress and queue in the Library tab';
|
|
|
|
@override
|
|
String get tutorialLibraryTip2 =>
|
|
'Tap any track to play it with your music player';
|
|
|
|
@override
|
|
String get tutorialLibraryTip3 =>
|
|
'Switch between list and grid view for better browsing';
|
|
|
|
@override
|
|
String get tutorialExtensionsTitle => 'Extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsDesc =>
|
|
'Extend the app\'s capabilities with community extensions.';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip1 =>
|
|
'Browse the Repo tab to discover useful extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip2 =>
|
|
'Add new download providers or search sources';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip3 =>
|
|
'Get lyrics, enhanced metadata, and more features';
|
|
|
|
@override
|
|
String get tutorialSettingsTitle => 'Customize Your Experience';
|
|
|
|
@override
|
|
String get tutorialSettingsDesc =>
|
|
'Personalize the app in Settings to match your preferences.';
|
|
|
|
@override
|
|
String get tutorialSettingsTip1 =>
|
|
'Change download location and folder organization';
|
|
|
|
@override
|
|
String get tutorialSettingsTip2 =>
|
|
'Set default audio quality and format preferences';
|
|
|
|
@override
|
|
String get tutorialSettingsTip3 => 'Customize app theme and appearance';
|
|
|
|
@override
|
|
String get tutorialReadyMessage =>
|
|
'You\'re all set! Start downloading your favorite music now.';
|
|
|
|
@override
|
|
String get libraryForceFullScan => 'Force Full Scan';
|
|
|
|
@override
|
|
String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsSubtitle =>
|
|
'Remove history entries for files that no longer exist';
|
|
|
|
@override
|
|
String cleanupOrphanedDownloadsResult(int count) {
|
|
return 'Removed $count orphaned entries from history';
|
|
}
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsNone => 'No orphaned entries found';
|
|
|
|
@override
|
|
String get cacheTitle => 'Storage & Cache';
|
|
|
|
@override
|
|
String get cacheSummaryTitle => 'Cache overview';
|
|
|
|
@override
|
|
String get cacheSummarySubtitle =>
|
|
'Clearing cache will not remove downloaded music files.';
|
|
|
|
@override
|
|
String cacheEstimatedTotal(String size) {
|
|
return 'Estimated cache usage: $size';
|
|
}
|
|
|
|
@override
|
|
String get cacheSectionStorage => 'Cached Data';
|
|
|
|
@override
|
|
String get cacheSectionMaintenance => 'Maintenance';
|
|
|
|
@override
|
|
String get cacheAppDirectory => 'App cache directory';
|
|
|
|
@override
|
|
String get cacheAppDirectoryDesc =>
|
|
'HTTP responses, WebView data, and other temporary app data.';
|
|
|
|
@override
|
|
String get cacheTempDirectory => 'Temporary directory';
|
|
|
|
@override
|
|
String get cacheTempDirectoryDesc =>
|
|
'Temporary files from downloads and audio conversion.';
|
|
|
|
@override
|
|
String get cacheCoverImage => 'Cover image cache';
|
|
|
|
@override
|
|
String get cacheCoverImageDesc =>
|
|
'Downloaded album and track cover art. Will re-download when viewed.';
|
|
|
|
@override
|
|
String get cacheLibraryCover => 'Library cover cache';
|
|
|
|
@override
|
|
String get cacheLibraryCoverDesc =>
|
|
'Cover art extracted from local music files. Will re-extract on next scan.';
|
|
|
|
@override
|
|
String get cacheExploreFeed => 'Explore feed cache';
|
|
|
|
@override
|
|
String get cacheExploreFeedDesc =>
|
|
'Explore tab content (new releases, trending). Will refresh on next visit.';
|
|
|
|
@override
|
|
String get cacheTrackLookup => 'Track lookup cache';
|
|
|
|
@override
|
|
String get cacheTrackLookupDesc =>
|
|
'Spotify/Deezer track ID lookups. Clearing may slow next few searches.';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedDesc =>
|
|
'Remove orphaned download history and library entries for missing files.';
|
|
|
|
@override
|
|
String get cacheNoData => 'No cached data';
|
|
|
|
@override
|
|
String cacheSizeWithFiles(String size, int count) {
|
|
return '$size in $count files';
|
|
}
|
|
|
|
@override
|
|
String cacheSizeOnly(String size) {
|
|
return '$size';
|
|
}
|
|
|
|
@override
|
|
String cacheEntries(int count) {
|
|
return '$count entries';
|
|
}
|
|
|
|
@override
|
|
String cacheClearSuccess(String target) {
|
|
return 'Cleared: $target';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearConfirmTitle => 'Clear cache?';
|
|
|
|
@override
|
|
String cacheClearConfirmMessage(String target) {
|
|
return 'This will clear cached data for $target. Downloaded music files will not be deleted.';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearAllConfirmTitle => 'Clear all cache?';
|
|
|
|
@override
|
|
String get cacheClearAllConfirmMessage =>
|
|
'This will clear all cache categories on this page. Downloaded music files will not be deleted.';
|
|
|
|
@override
|
|
String get cacheClearAll => 'Clear all cache';
|
|
|
|
@override
|
|
String get cacheCleanupUnused => 'Cleanup unused data';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedSubtitle =>
|
|
'Remove orphaned download history and missing library entries';
|
|
|
|
@override
|
|
String cacheCleanupResult(int downloadCount, int libraryCount) {
|
|
return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries';
|
|
}
|
|
|
|
@override
|
|
String get cacheRefreshStats => 'Refresh stats';
|
|
|
|
@override
|
|
String get trackSaveCoverArt => 'Save Cover Art';
|
|
|
|
@override
|
|
String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file';
|
|
|
|
@override
|
|
String get trackSaveLyrics => 'Save Lyrics (.lrc)';
|
|
|
|
@override
|
|
String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file';
|
|
|
|
@override
|
|
String get trackSaveLyricsProgress => 'Saving lyrics...';
|
|
|
|
@override
|
|
String get trackReEnrich => 'Re-enrich';
|
|
|
|
@override
|
|
String get trackReEnrichOnlineSubtitle =>
|
|
'Search metadata online and embed into file';
|
|
|
|
@override
|
|
String get trackReEnrichFieldsTitle => 'Fields to update';
|
|
|
|
@override
|
|
String get trackReEnrichFieldCover => 'Cover Art';
|
|
|
|
@override
|
|
String get trackReEnrichFieldLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get trackReEnrichFieldBasicTags => 'Album, Album Artist';
|
|
|
|
@override
|
|
String get trackReEnrichFieldTrackInfo => 'Track & Disc Number';
|
|
|
|
@override
|
|
String get trackReEnrichFieldReleaseInfo => 'Date & ISRC';
|
|
|
|
@override
|
|
String get trackReEnrichFieldExtra => 'Genre, Label, Copyright';
|
|
|
|
@override
|
|
String get trackReEnrichSelectAll => 'Select All';
|
|
|
|
@override
|
|
String get trackEditMetadata => 'Edit Metadata';
|
|
|
|
@override
|
|
String trackCoverSaved(String fileName) {
|
|
return 'Cover art saved to $fileName';
|
|
}
|
|
|
|
@override
|
|
String get trackCoverNoSource => 'No cover art source available';
|
|
|
|
@override
|
|
String trackLyricsSaved(String fileName) {
|
|
return 'Lyrics saved to $fileName';
|
|
}
|
|
|
|
@override
|
|
String get trackReEnrichProgress => 'Re-enriching metadata...';
|
|
|
|
@override
|
|
String get trackReEnrichSearching => 'Searching metadata online...';
|
|
|
|
@override
|
|
String get trackReEnrichSuccess => 'Metadata re-enriched successfully';
|
|
|
|
@override
|
|
String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed';
|
|
|
|
@override
|
|
String get queueFlacAction => 'Queue FLAC';
|
|
|
|
@override
|
|
String queueFlacConfirmMessage(int count) {
|
|
return 'Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n$count selected';
|
|
}
|
|
|
|
@override
|
|
String queueFlacFindingProgress(int current, int total) {
|
|
return 'Finding FLAC matches... ($current/$total)';
|
|
}
|
|
|
|
@override
|
|
String get queueFlacNoReliableMatches =>
|
|
'No reliable online matches found for the selection';
|
|
|
|
@override
|
|
String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) {
|
|
return 'Added $addedCount tracks to queue, skipped $skippedCount';
|
|
}
|
|
|
|
@override
|
|
String trackSaveFailed(String error) {
|
|
return 'Failed: $error';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertFormat => 'Convert Format';
|
|
|
|
@override
|
|
String get trackConvertFormatSubtitle =>
|
|
'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC';
|
|
|
|
@override
|
|
String get trackConvertTitle => 'Convert Audio';
|
|
|
|
@override
|
|
String get trackConvertTargetFormat => 'Target Format';
|
|
|
|
@override
|
|
String get trackConvertBitrate => 'Bitrate';
|
|
|
|
@override
|
|
String get trackConvertConfirmTitle => 'Confirm Conversion';
|
|
|
|
@override
|
|
String trackConvertConfirmMessage(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String bitrate,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String trackConvertConfirmMessageLossless(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertLosslessHint =>
|
|
'Lossless conversion — no quality loss';
|
|
|
|
@override
|
|
String get trackConvertConverting => 'Converting audio...';
|
|
|
|
@override
|
|
String trackConvertSuccess(String format) {
|
|
return 'Converted to $format successfully';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertFailed => 'Conversion failed';
|
|
|
|
@override
|
|
String get cueSplitTitle => 'Split CUE Sheet';
|
|
|
|
@override
|
|
String get cueSplitSubtitle => 'Split CUE+FLAC into individual tracks';
|
|
|
|
@override
|
|
String cueSplitAlbum(String album) {
|
|
return 'Album: $album';
|
|
}
|
|
|
|
@override
|
|
String cueSplitArtist(String artist) {
|
|
return 'Artist: $artist';
|
|
}
|
|
|
|
@override
|
|
String cueSplitTrackCount(int count) {
|
|
return '$count tracks';
|
|
}
|
|
|
|
@override
|
|
String get cueSplitConfirmTitle => 'Split CUE Album';
|
|
|
|
@override
|
|
String cueSplitConfirmMessage(String album, int count) {
|
|
return 'Split \"$album\" into $count individual FLAC files?\n\nFiles will be saved to the same directory.';
|
|
}
|
|
|
|
@override
|
|
String cueSplitSplitting(int current, int total) {
|
|
return 'Splitting CUE sheet... ($current/$total)';
|
|
}
|
|
|
|
@override
|
|
String cueSplitSuccess(int count) {
|
|
return 'Split into $count tracks successfully';
|
|
}
|
|
|
|
@override
|
|
String get cueSplitFailed => 'CUE split failed';
|
|
|
|
@override
|
|
String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet';
|
|
|
|
@override
|
|
String get cueSplitButton => 'Split into Tracks';
|
|
|
|
@override
|
|
String get actionCreate => 'Create';
|
|
|
|
@override
|
|
String get collectionFoldersTitle => 'My folders';
|
|
|
|
@override
|
|
String get collectionWishlist => 'Wishlist';
|
|
|
|
@override
|
|
String get collectionLoved => 'Loved';
|
|
|
|
@override
|
|
String get collectionFavoriteArtists => 'Favorite Artists';
|
|
|
|
@override
|
|
String get collectionPlaylists => 'Playlists';
|
|
|
|
@override
|
|
String get collectionPlaylist => 'Playlist';
|
|
|
|
@override
|
|
String get collectionAddToPlaylist => 'Add to playlist';
|
|
|
|
@override
|
|
String get collectionCreatePlaylist => 'Create playlist';
|
|
|
|
@override
|
|
String get collectionNoPlaylistsYet => 'No playlists yet';
|
|
|
|
@override
|
|
String get collectionNoPlaylistsSubtitle =>
|
|
'Create a playlist to start categorizing tracks';
|
|
|
|
@override
|
|
String collectionPlaylistTracks(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks',
|
|
one: '1 track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String collectionArtistCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count artists',
|
|
one: '1 artist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedToPlaylist(String playlistName) {
|
|
return 'Added to \"$playlistName\"';
|
|
}
|
|
|
|
@override
|
|
String collectionAlreadyInPlaylist(String playlistName) {
|
|
return 'Already in \"$playlistName\"';
|
|
}
|
|
|
|
@override
|
|
String get collectionPlaylistCreated => 'Playlist created';
|
|
|
|
@override
|
|
String get collectionPlaylistNameHint => 'Playlist name';
|
|
|
|
@override
|
|
String get collectionPlaylistNameRequired => 'Playlist name is required';
|
|
|
|
@override
|
|
String get collectionRenamePlaylist => 'Rename playlist';
|
|
|
|
@override
|
|
String get collectionDeletePlaylist => 'Delete playlist';
|
|
|
|
@override
|
|
String collectionDeletePlaylistMessage(String playlistName) {
|
|
return 'Delete \"$playlistName\" and all tracks inside it?';
|
|
}
|
|
|
|
@override
|
|
String get collectionPlaylistDeleted => 'Playlist deleted';
|
|
|
|
@override
|
|
String get collectionPlaylistRenamed => 'Playlist renamed';
|
|
|
|
@override
|
|
String get collectionWishlistEmptyTitle => 'Wishlist is empty';
|
|
|
|
@override
|
|
String get collectionWishlistEmptySubtitle =>
|
|
'Tap + on tracks to save what you want to download later';
|
|
|
|
@override
|
|
String get collectionLovedEmptyTitle => 'Loved folder is empty';
|
|
|
|
@override
|
|
String get collectionLovedEmptySubtitle =>
|
|
'Tap love on tracks to keep your favorites';
|
|
|
|
@override
|
|
String get collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet';
|
|
|
|
@override
|
|
String get collectionFavoriteArtistsEmptySubtitle =>
|
|
'Tap the heart on an artist page to keep them here';
|
|
|
|
@override
|
|
String get collectionPlaylistEmptyTitle => 'Playlist is empty';
|
|
|
|
@override
|
|
String get collectionPlaylistEmptySubtitle =>
|
|
'Long-press + on any track to add it here';
|
|
|
|
@override
|
|
String get collectionRemoveFromPlaylist => 'Remove from playlist';
|
|
|
|
@override
|
|
String get collectionRemoveFromFolder => 'Remove from folder';
|
|
|
|
@override
|
|
String collectionRemoved(String trackName) {
|
|
return '\"$trackName\" removed';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedToLoved(String trackName) {
|
|
return '\"$trackName\" added to Loved';
|
|
}
|
|
|
|
@override
|
|
String collectionRemovedFromLoved(String trackName) {
|
|
return '\"$trackName\" removed from Loved';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedToWishlist(String trackName) {
|
|
return '\"$trackName\" added to Wishlist';
|
|
}
|
|
|
|
@override
|
|
String collectionRemovedFromWishlist(String trackName) {
|
|
return '\"$trackName\" removed from Wishlist';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedToFavoriteArtists(String artistName) {
|
|
return '\"$artistName\" added to Favorite Artists';
|
|
}
|
|
|
|
@override
|
|
String collectionRemovedFromFavoriteArtists(String artistName) {
|
|
return '\"$artistName\" removed from Favorite Artists';
|
|
}
|
|
|
|
@override
|
|
String get trackOptionAddToLoved => 'Add to Loved';
|
|
|
|
@override
|
|
String get trackOptionRemoveFromLoved => 'Remove from Loved';
|
|
|
|
@override
|
|
String get trackOptionAddToWishlist => 'Add to Wishlist';
|
|
|
|
@override
|
|
String get trackOptionRemoveFromWishlist => 'Remove from Wishlist';
|
|
|
|
@override
|
|
String get artistOptionAddToFavorites => 'Add to Favorite Artists';
|
|
|
|
@override
|
|
String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists';
|
|
|
|
@override
|
|
String get collectionPlaylistChangeCover => 'Change cover image';
|
|
|
|
@override
|
|
String get collectionPlaylistRemoveCover => 'Remove cover image';
|
|
|
|
@override
|
|
String selectionShareCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Share $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get selectionShareNoFiles => 'No shareable files found';
|
|
|
|
@override
|
|
String selectionConvertCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get selectionConvertNoConvertible => 'No convertible tracks selected';
|
|
|
|
@override
|
|
String get selectionBatchConvertConfirmTitle => 'Batch Convert';
|
|
|
|
@override
|
|
String selectionBatchConvertConfirmMessage(
|
|
int count,
|
|
String format,
|
|
String bitrate,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertConfirmMessageLossless(int count, String format) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertProgress(int current, int total) {
|
|
return 'Converting $current of $total...';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertSuccess(int success, int total, String format) {
|
|
return 'Converted $success of $total tracks to $format';
|
|
}
|
|
|
|
@override
|
|
String downloadedAlbumDownloadedCount(int count) {
|
|
return '$count downloaded';
|
|
}
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFoldersAlbumSubtitle =>
|
|
'Folder named after Album Artist tag';
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFoldersTrackSubtitle =>
|
|
'Folder named after Track Artist tag';
|
|
|
|
@override
|
|
String get lyricsProvidersTitle => 'Lyrics Provider Priority';
|
|
|
|
@override
|
|
String get lyricsProvidersDescription =>
|
|
'Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.';
|
|
|
|
@override
|
|
String get lyricsProvidersInfoText =>
|
|
'Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.';
|
|
|
|
@override
|
|
String lyricsProvidersEnabledSection(int count) {
|
|
return 'Enabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String lyricsProvidersDisabledSection(int count) {
|
|
return 'Disabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String get lyricsProvidersAtLeastOne =>
|
|
'At least one provider must remain enabled';
|
|
|
|
@override
|
|
String get lyricsProvidersSaved => 'Lyrics provider priority saved';
|
|
|
|
@override
|
|
String get lyricsProvidersDiscardContent =>
|
|
'You have unsaved changes that will be lost.';
|
|
|
|
@override
|
|
String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database';
|
|
|
|
@override
|
|
String get lyricsProviderNeteaseDesc =>
|
|
'NetEase Cloud Music (good for Asian songs)';
|
|
|
|
@override
|
|
String get lyricsProviderMusixmatchDesc =>
|
|
'Largest lyrics database (multi-language)';
|
|
|
|
@override
|
|
String get lyricsProviderAppleMusicDesc =>
|
|
'Word-by-word synced lyrics (via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderQqMusicDesc =>
|
|
'QQ Music (good for Chinese songs, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderLyricsPlusDesc =>
|
|
'Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderExtensionDesc => 'Extension provider';
|
|
|
|
@override
|
|
String get safMigrationTitle => 'Storage Update Required';
|
|
|
|
@override
|
|
String get safMigrationMessage1 =>
|
|
'SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.';
|
|
|
|
@override
|
|
String get safMigrationMessage2 =>
|
|
'Please select your download folder again to switch to the new storage system.';
|
|
|
|
@override
|
|
String get safMigrationSuccess => 'Download folder updated to SAF mode';
|
|
|
|
@override
|
|
String get settingsDonate => 'Support Development';
|
|
|
|
@override
|
|
String get settingsDonateSubtitle => 'Buy the developer a coffee';
|
|
|
|
@override
|
|
String get settingsBackup => 'Backup & Restore';
|
|
|
|
@override
|
|
String get settingsBackupSubtitle =>
|
|
'Move your library, history and settings to a new device';
|
|
|
|
@override
|
|
String get backupTitle => 'Backup & Restore';
|
|
|
|
@override
|
|
String get backupExportSectionTitle => 'Create backup';
|
|
|
|
@override
|
|
String get backupExportSectionDescription =>
|
|
'Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.';
|
|
|
|
@override
|
|
String get backupExportButton => 'Create backup file';
|
|
|
|
@override
|
|
String get backupImportSectionTitle => 'Restore backup';
|
|
|
|
@override
|
|
String get backupImportSectionDescription =>
|
|
'Pick a backup file to restore your data. This replaces the current settings, history and library on this device.';
|
|
|
|
@override
|
|
String get backupImportButton => 'Choose backup file';
|
|
|
|
@override
|
|
String get backupCreating => 'Creating backup...';
|
|
|
|
@override
|
|
String get backupCreated => 'Backup created';
|
|
|
|
@override
|
|
String get backupCreateFailed => 'Failed to create backup';
|
|
|
|
@override
|
|
String get backupEmpty => 'There is nothing to back up yet';
|
|
|
|
@override
|
|
String get backupRestoreConfirmTitle => 'Restore this backup?';
|
|
|
|
@override
|
|
String get backupRestoreConfirmMessage =>
|
|
'This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.';
|
|
|
|
@override
|
|
String get backupRestoreConfirmButton => 'Restore';
|
|
|
|
@override
|
|
String get backupRestoring => 'Restoring backup...';
|
|
|
|
@override
|
|
String get backupRestored => 'Backup restored successfully';
|
|
|
|
@override
|
|
String get backupRestoreFailed => 'Failed to restore backup';
|
|
|
|
@override
|
|
String get backupInvalidFile => 'This file is not a valid SpotiFLAC backup';
|
|
|
|
@override
|
|
String get backupRestoreRestartHint =>
|
|
'Restart the app to make sure every change is applied.';
|
|
|
|
@override
|
|
String get backupContentsTitle => 'Backup contents';
|
|
|
|
@override
|
|
String get backupContentsSettings => 'App settings';
|
|
|
|
@override
|
|
String backupContentsHistory(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return '$count history $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsLiked(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$count liked $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsWishlist(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$count wishlist $_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsPlaylists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count playlists',
|
|
one: '1 playlist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsArtists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count favorite artists',
|
|
one: '1 favorite artist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsExtensions(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count extensions',
|
|
one: '1 extension',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get backupIncludeSecrets => 'Include extension credentials';
|
|
|
|
@override
|
|
String get backupIncludeSecretsDescription =>
|
|
'Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.';
|
|
|
|
@override
|
|
String backupExtensionsRestoreFailed(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'extensions',
|
|
one: 'extension',
|
|
);
|
|
return '$count $_temp0 could not be reinstalled. Install them manually from the store.';
|
|
}
|
|
|
|
@override
|
|
String get tooltipLoveAll => 'Love All';
|
|
|
|
@override
|
|
String get tooltipAddToPlaylist => 'Add to Playlist';
|
|
|
|
@override
|
|
String snackbarRemovedTracksFromLoved(int count) {
|
|
return 'Removed $count tracks from Loved';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToLoved(int count) {
|
|
return 'Added $count tracks to Loved';
|
|
}
|
|
|
|
@override
|
|
String get dialogDownloadAllTitle => 'Download All';
|
|
|
|
@override
|
|
String dialogDownloadAllMessage(int count) {
|
|
return 'Download $count tracks?';
|
|
}
|
|
|
|
@override
|
|
String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs';
|
|
|
|
@override
|
|
String get homeGoToAlbum => 'Go to Album';
|
|
|
|
@override
|
|
String get homeAlbumInfoUnavailable => 'Album info not available';
|
|
|
|
@override
|
|
String get snackbarLoadingCueSheet => 'Loading CUE sheet...';
|
|
|
|
@override
|
|
String get snackbarMetadataSaved => 'Metadata saved successfully';
|
|
|
|
@override
|
|
String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics';
|
|
|
|
@override
|
|
String get snackbarFailedToWriteStorage => 'Failed to write back to storage';
|
|
|
|
@override
|
|
String snackbarError(String error) {
|
|
return 'Error: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarNoActionDefined => 'No action defined for this button';
|
|
|
|
@override
|
|
String get noTracksFoundForAlbum => 'No tracks found for this album';
|
|
|
|
@override
|
|
String get downloadLocationSubtitle =>
|
|
'Choose where to save your downloaded tracks';
|
|
|
|
@override
|
|
String get storageModeAppFolder => 'App Folder (Recommended)';
|
|
|
|
@override
|
|
String get storageModeAppFolderSubtitle =>
|
|
'Saves to Music/SpotiFLAC by default';
|
|
|
|
@override
|
|
String get storageModeSaf => 'Custom Folder (SAF)';
|
|
|
|
@override
|
|
String get storageModeSafSubtitle => 'Pick any folder, including SD card';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostTitle => 'Download folder access lost';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostSubtitle =>
|
|
'Downloads will fail until you re-select the folder';
|
|
|
|
@override
|
|
String get downloadFolderReselect => 'Re-select folder';
|
|
|
|
@override
|
|
String get downloadErrorSafPermissionLost =>
|
|
'SAF permission invalid or revoked. Please reconfigure download location in Settings.';
|
|
|
|
@override
|
|
String get downloadErrorFolderAccessLost =>
|
|
'Download folder access lost. Please re-select your download folder in Settings.';
|
|
|
|
@override
|
|
String downloadFilenameDescription(
|
|
Object album,
|
|
Object artist,
|
|
Object date,
|
|
Object disc,
|
|
Object title,
|
|
Object track,
|
|
Object year,
|
|
) {
|
|
return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.';
|
|
}
|
|
|
|
@override
|
|
String get downloadFilenameInsertTag => 'Tap to insert tag:';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesEnabled =>
|
|
'Singles and EPs saved in a separate folder';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesDisabled =>
|
|
'Singles and albums saved in the same folder';
|
|
|
|
@override
|
|
String get downloadArtistNameFilters => 'Artist Name Filters';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderEnabled =>
|
|
'A subfolder is created for each playlist';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderDisabled =>
|
|
'All tracks saved directly to download folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderRedundant =>
|
|
'Handled by folder organization setting';
|
|
|
|
@override
|
|
String get downloadSongLinkRegion => 'SongLink Region';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeEnabled =>
|
|
'Using legacy TLS settings for older networks';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeDisabled =>
|
|
'Using standard network settings';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetwork => 'Allow Local Network Access';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkEnabled =>
|
|
'Requests to local/private addresses are allowed (for local proxy or custom DNS)';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkDisabled =>
|
|
'Local/private addresses are blocked for security';
|
|
|
|
@override
|
|
String get downloadSelectServiceToEnable =>
|
|
'Select a provider with quality options to enable this option';
|
|
|
|
@override
|
|
String get downloadSelectTidalQobuz =>
|
|
'Select a provider with quality options to choose audio quality';
|
|
|
|
@override
|
|
String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslation =>
|
|
'Netease: Include Translation';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslationEnabled =>
|
|
'Chinese translation lines included';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslationDisabled =>
|
|
'Original lyrics only';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanization =>
|
|
'Netease: Include Romanization';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanizationEnabled =>
|
|
'Romanization lines included';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPersonEnabled =>
|
|
'Speaker labels included for duets and group tracks';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPersonDisabled =>
|
|
'Standard lyrics without speaker labels';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSyncEnabled =>
|
|
'Raw word-by-word timestamps preserved';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSyncDisabled =>
|
|
'Safer line-by-line Apple Music lyrics';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguage => 'Musixmatch Language';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageAuto => 'Auto (original language)';
|
|
|
|
@override
|
|
String get downloadFilterContributing => 'Filter Contributing Artists';
|
|
|
|
@override
|
|
String get downloadFilterContributingEnabled =>
|
|
'Contributing artists removed from Album Artist folder name';
|
|
|
|
@override
|
|
String get downloadFilterContributingDisabled =>
|
|
'Full Album Artist string used';
|
|
|
|
@override
|
|
String get downloadProvidersNoneEnabled => 'No providers enabled';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageCode => 'Language code';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageDesc =>
|
|
'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.';
|
|
|
|
@override
|
|
String get downloadMusixmatchAuto => 'Auto';
|
|
|
|
@override
|
|
String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data';
|
|
|
|
@override
|
|
String get downloadNetworkWifiOnlySubtitle =>
|
|
'Downloads pause when on mobile data';
|
|
|
|
@override
|
|
String get downloadSongLinkRegionDesc =>
|
|
'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.';
|
|
|
|
@override
|
|
String get snackbarUnsupportedAudioFormat => 'Unsupported audio format';
|
|
|
|
@override
|
|
String get cacheRefresh => 'Refresh';
|
|
|
|
@override
|
|
String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
trackCount,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
String _temp1 = intl.Intl.pluralLogic(
|
|
playlistCount,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Download $trackCount $_temp0 from $playlistCount $_temp1?';
|
|
}
|
|
|
|
@override
|
|
String bulkDownloadPlaylistsButton(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Download $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get bulkDownloadSelectPlaylists => 'Select playlists to download';
|
|
|
|
@override
|
|
String get snackbarSelectedPlaylistsEmpty =>
|
|
'Selected playlists have no tracks';
|
|
|
|
@override
|
|
String playlistsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count playlists',
|
|
one: '1 playlist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get editMetadataAutoFill => 'Auto-fill from online';
|
|
|
|
@override
|
|
String get editMetadataAutoFillDesc =>
|
|
'Select fields to fill automatically from online metadata';
|
|
|
|
@override
|
|
String get editMetadataAutoFillFetch => 'Fetch & Fill';
|
|
|
|
@override
|
|
String get editMetadataAutoFillSearching => 'Searching online...';
|
|
|
|
@override
|
|
String get editMetadataAutoFillNoResults =>
|
|
'No matching metadata found online';
|
|
|
|
@override
|
|
String editMetadataAutoFillDone(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'fields',
|
|
one: 'field',
|
|
);
|
|
return 'Filled $count $_temp0 from online metadata';
|
|
}
|
|
|
|
@override
|
|
String get editMetadataAutoFillNoneSelected =>
|
|
'Select at least one field to auto-fill';
|
|
|
|
@override
|
|
String get editMetadataFieldTitle => 'Title';
|
|
|
|
@override
|
|
String get editMetadataFieldArtist => 'Artist';
|
|
|
|
@override
|
|
String get editMetadataFieldAlbum => 'Album';
|
|
|
|
@override
|
|
String get editMetadataFieldAlbumArtist => 'Album Artist';
|
|
|
|
@override
|
|
String get editMetadataFieldDate => 'Date';
|
|
|
|
@override
|
|
String get editMetadataFieldTrackNum => 'Track #';
|
|
|
|
@override
|
|
String get editMetadataFieldDiscNum => 'Disc #';
|
|
|
|
@override
|
|
String get editMetadataFieldGenre => 'Genre';
|
|
|
|
@override
|
|
String get editMetadataFieldIsrc => 'ISRC';
|
|
|
|
@override
|
|
String get editMetadataFieldLabel => 'Label';
|
|
|
|
@override
|
|
String get editMetadataFieldCopyright => 'Copyright';
|
|
|
|
@override
|
|
String get editMetadataFieldCover => 'Cover Art';
|
|
|
|
@override
|
|
String get editMetadataSelectAll => 'All';
|
|
|
|
@override
|
|
String get editMetadataSelectEmpty => 'Empty only';
|
|
|
|
@override
|
|
String queueDownloadingCount(int count) {
|
|
return 'Downloading ($count)';
|
|
}
|
|
|
|
@override
|
|
String get queueDownloadedHeader => 'Downloaded';
|
|
|
|
@override
|
|
String get queueFilteringIndicator => 'Filtering...';
|
|
|
|
@override
|
|
String queueTrackCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks',
|
|
one: '1 track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String queueAlbumCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count albums',
|
|
one: '1 album',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get queueEmptyAlbums => 'No album downloads';
|
|
|
|
@override
|
|
String get queueEmptyAlbumsSubtitle =>
|
|
'Download multiple tracks from an album to see them here';
|
|
|
|
@override
|
|
String get queueEmptySingles => 'No single downloads';
|
|
|
|
@override
|
|
String get queueEmptySinglesSubtitle =>
|
|
'Single track downloads will appear here';
|
|
|
|
@override
|
|
String get queueEmptyHistory => 'No download history';
|
|
|
|
@override
|
|
String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here';
|
|
|
|
@override
|
|
String get selectionAllPlaylistsSelected => 'All playlists selected';
|
|
|
|
@override
|
|
String get selectionTapPlaylistsToSelect => 'Tap playlists to select';
|
|
|
|
@override
|
|
String get selectionSelectPlaylistsToDelete => 'Select playlists to delete';
|
|
|
|
@override
|
|
String get audioAnalysisTitle => 'Audio Quality Analysis';
|
|
|
|
@override
|
|
String get audioAnalysisDescription =>
|
|
'Verify lossless quality with spectrum analysis';
|
|
|
|
@override
|
|
String get audioAnalysisAnalyzing => 'Analyzing audio...';
|
|
|
|
@override
|
|
String get audioAnalysisSampleRate => 'Sample Rate';
|
|
|
|
@override
|
|
String get audioAnalysisCodec => 'Codec';
|
|
|
|
@override
|
|
String get audioAnalysisContainer => 'Container';
|
|
|
|
@override
|
|
String get audioAnalysisDecodedFormat => 'Decoded Format';
|
|
|
|
@override
|
|
String get audioAnalysisBitDepth => 'Bit Depth';
|
|
|
|
@override
|
|
String get audioAnalysisChannels => 'Channels';
|
|
|
|
@override
|
|
String get audioAnalysisDuration => 'Duration';
|
|
|
|
@override
|
|
String get audioAnalysisNyquist => 'Nyquist';
|
|
|
|
@override
|
|
String get audioAnalysisFileSize => 'Size';
|
|
|
|
@override
|
|
String get audioAnalysisDynamicRange => 'Dynamic Range';
|
|
|
|
@override
|
|
String get audioAnalysisPeak => 'Peak';
|
|
|
|
@override
|
|
String get audioAnalysisRms => 'RMS';
|
|
|
|
@override
|
|
String get audioAnalysisLufs => 'LUFS';
|
|
|
|
@override
|
|
String get audioAnalysisTruePeak => 'True Peak';
|
|
|
|
@override
|
|
String get audioAnalysisClipping => 'Clipping';
|
|
|
|
@override
|
|
String get audioAnalysisNoClipping => 'No clipping';
|
|
|
|
@override
|
|
String get audioAnalysisSpectralCutoff => 'Spectral Cutoff';
|
|
|
|
@override
|
|
String get audioAnalysisChannelStats => 'Per-channel Stats';
|
|
|
|
@override
|
|
String get audioAnalysisSamples => 'Samples';
|
|
|
|
@override
|
|
String get audioAnalysisRescan => 'Re-analyze';
|
|
|
|
@override
|
|
String get audioAnalysisRescanning => 'Re-analyzing audio...';
|
|
|
|
@override
|
|
String extensionsSearchWith(String providerName) {
|
|
return 'Search with $providerName';
|
|
}
|
|
|
|
@override
|
|
String get extensionsHomeFeedProvider => 'Home Feed Provider';
|
|
|
|
@override
|
|
String get extensionsHomeFeedDescription =>
|
|
'Choose which extension provides the home feed on the main screen';
|
|
|
|
@override
|
|
String get extensionsHomeFeedAuto => 'Auto';
|
|
|
|
@override
|
|
String get extensionsHomeFeedAutoSubtitle =>
|
|
'Automatically select the best available';
|
|
|
|
@override
|
|
String get extensionsHomeFeedOff => 'Off';
|
|
|
|
@override
|
|
String get extensionsHomeFeedOffSubtitle =>
|
|
'Do not show the home feed on the main screen';
|
|
|
|
@override
|
|
String extensionsHomeFeedUse(String extensionName) {
|
|
return 'Use $extensionName home feed';
|
|
}
|
|
|
|
@override
|
|
String get extensionsNoHomeFeedExtensions => 'No extensions with home feed';
|
|
|
|
@override
|
|
String get sortAlphaAsc => 'A-Z';
|
|
|
|
@override
|
|
String get sortAlphaDesc => 'Z-A';
|
|
|
|
@override
|
|
String get cancelDownloadTitle => 'Cancel download?';
|
|
|
|
@override
|
|
String cancelDownloadContent(String trackName) {
|
|
return 'This will cancel the active download for \"$trackName\".';
|
|
}
|
|
|
|
@override
|
|
String get cancelDownloadKeep => 'Keep';
|
|
|
|
@override
|
|
String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg';
|
|
|
|
@override
|
|
String get metadataSaveFailedStorage =>
|
|
'Failed to write metadata back to storage';
|
|
|
|
@override
|
|
String snackbarFolderPickerFailed(String error) {
|
|
return 'Failed to open folder picker: $error';
|
|
}
|
|
|
|
@override
|
|
String get errorLoadAlbum => 'Failed to load album';
|
|
|
|
@override
|
|
String get errorLoadPlaylist => 'Failed to load playlist';
|
|
|
|
@override
|
|
String get errorLoadArtist => 'Failed to load artist';
|
|
|
|
@override
|
|
String get notifChannelDownloadName => 'Download Progress';
|
|
|
|
@override
|
|
String get notifChannelDownloadDesc => 'Shows download progress for tracks';
|
|
|
|
@override
|
|
String get notifChannelLibraryScanName => 'Library Scan';
|
|
|
|
@override
|
|
String get notifChannelLibraryScanDesc => 'Shows local library scan progress';
|
|
|
|
@override
|
|
String notifDownloadingTrack(String trackName) {
|
|
return 'Downloading $trackName';
|
|
}
|
|
|
|
@override
|
|
String notifFinalizingTrack(String trackName) {
|
|
return 'Finalizing $trackName';
|
|
}
|
|
|
|
@override
|
|
String get notifEmbeddingMetadata => 'Embedding metadata...';
|
|
|
|
@override
|
|
String notifAlreadyInLibraryCount(int completed, int total) {
|
|
return 'Already in Library ($completed/$total)';
|
|
}
|
|
|
|
@override
|
|
String get notifAlreadyInLibrary => 'Already in Library';
|
|
|
|
@override
|
|
String notifDownloadCompleteCount(int completed, int total) {
|
|
return 'Download Complete ($completed/$total)';
|
|
}
|
|
|
|
@override
|
|
String get notifDownloadComplete => 'Download Complete';
|
|
|
|
@override
|
|
String notifDownloadsFinished(int completed, int failed) {
|
|
return 'Downloads Finished ($completed done, $failed failed)';
|
|
}
|
|
|
|
@override
|
|
String get notifVerificationRequiredTitle => 'Verification required';
|
|
|
|
@override
|
|
String get notifVerificationRequiredBody =>
|
|
'Open the app to complete verification and resume downloads';
|
|
|
|
@override
|
|
String get notifAllDownloadsComplete => 'All Downloads Complete';
|
|
|
|
@override
|
|
String notifTracksDownloadedSuccess(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks downloaded successfully',
|
|
one: '1 track downloaded successfully',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String notifDownloadsFinishedBody(int completed, int failed) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
completed,
|
|
locale: localeName,
|
|
other: '$completed tracks downloaded',
|
|
one: '1 track downloaded',
|
|
);
|
|
String _temp1 = intl.Intl.pluralLogic(
|
|
failed,
|
|
locale: localeName,
|
|
other: '$failed failed',
|
|
one: '1 failed',
|
|
);
|
|
return '$_temp0, $_temp1';
|
|
}
|
|
|
|
@override
|
|
String get notifDownloadsCanceledTitle => 'Downloads canceled';
|
|
|
|
@override
|
|
String notifDownloadsCanceledBody(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count downloads canceled by user',
|
|
one: '1 download canceled by user',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get notifScanningLibrary => 'Scanning local library';
|
|
|
|
@override
|
|
String notifLibraryScanProgressWithTotal(
|
|
int scanned,
|
|
int total,
|
|
int percentage,
|
|
) {
|
|
return '$scanned/$total files • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanProgressNoTotal(int scanned, int percentage) {
|
|
return '$scanned files scanned • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanComplete => 'Library scan complete';
|
|
|
|
@override
|
|
String notifLibraryScanCompleteBody(int count) {
|
|
return '$count tracks indexed';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanExcluded(int count) {
|
|
return '$count excluded';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanErrors(int count) {
|
|
return '$count errors';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanFailed => 'Library scan failed';
|
|
|
|
@override
|
|
String get notifLibraryScanCancelled => 'Library scan cancelled';
|
|
|
|
@override
|
|
String get notifLibraryScanStopped => 'Scan stopped before completion.';
|
|
|
|
@override
|
|
String notifDownloadingUpdate(String version) {
|
|
return 'Downloading SpotiFLAC Mobile v$version';
|
|
}
|
|
|
|
@override
|
|
String notifUpdateProgress(String received, String total, int percentage) {
|
|
return '$received / $total MB • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateReady => 'Update Ready';
|
|
|
|
@override
|
|
String notifUpdateReadyBody(String version) {
|
|
return 'SpotiFLAC Mobile v$version downloaded. Tap to install.';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateFailed => 'Update Failed';
|
|
|
|
@override
|
|
String get notifUpdateFailedBody =>
|
|
'Could not download update. Try again later.';
|
|
|
|
@override
|
|
String get searchTracks => 'Tracks';
|
|
|
|
@override
|
|
String get homeSearchHintDefault => 'Paste supported URL or search...';
|
|
|
|
@override
|
|
String homeSearchHintProvider(String providerName) {
|
|
return 'Search with $providerName...';
|
|
}
|
|
|
|
@override
|
|
String get homeImportCsvTooltip => 'Import CSV';
|
|
|
|
@override
|
|
String get homeChangeSearchProviderTooltip => 'Change search provider';
|
|
|
|
@override
|
|
String get actionPaste => 'Paste';
|
|
|
|
@override
|
|
String get searchTracksHint => 'Search tracks...';
|
|
|
|
@override
|
|
String get searchTracksEmptyPrompt => 'Search for tracks';
|
|
|
|
@override
|
|
String get tutorialSearchHint => 'Paste or search...';
|
|
|
|
@override
|
|
String get tutorialDownloadCompletedSemantics => 'Download completed';
|
|
|
|
@override
|
|
String get tutorialDownloadInProgressSemantics => 'Download in progress';
|
|
|
|
@override
|
|
String get tutorialStartDownloadSemantics => 'Start download';
|
|
|
|
@override
|
|
String get optionsEmbedMetadata => 'Embed Metadata';
|
|
|
|
@override
|
|
String get optionsEmbedMetadataSubtitleOn =>
|
|
'Write metadata, cover art, and embedded lyrics to files';
|
|
|
|
@override
|
|
String get optionsEmbedMetadataSubtitleOff =>
|
|
'Disabled (advanced): skip all metadata embedding';
|
|
|
|
@override
|
|
String get optionsMaxQualityCoverSubtitleDisabled =>
|
|
'Disabled when metadata embedding is off';
|
|
|
|
@override
|
|
String downloadFilenameHintExample(Object artist, Object title) {
|
|
return '$artist - $title';
|
|
}
|
|
|
|
@override
|
|
String get trackCoverNoEmbeddedArt => 'No embedded album art found';
|
|
|
|
@override
|
|
String get trackCoverReplace => 'Replace Cover';
|
|
|
|
@override
|
|
String get trackCoverPick => 'Pick Cover';
|
|
|
|
@override
|
|
String get trackCoverClearSelected => 'Clear selected cover';
|
|
|
|
@override
|
|
String get trackCoverCurrent => 'Current cover';
|
|
|
|
@override
|
|
String get trackCoverSelected => 'Selected cover';
|
|
|
|
@override
|
|
String get trackCoverReplaceNotice =>
|
|
'The selected cover will replace the current embedded cover when you tap Save.';
|
|
|
|
@override
|
|
String get actionStop => 'Stop';
|
|
|
|
@override
|
|
String get queueFinalizingDownload => 'Finalizing download';
|
|
|
|
@override
|
|
String get queueDownloadedFileMissing => 'Downloaded file missing';
|
|
|
|
@override
|
|
String get queueDownloadCompleted => 'Download completed';
|
|
|
|
@override
|
|
String get queueRateLimitTitle => 'Service rate limited';
|
|
|
|
@override
|
|
String get queueRateLimitMessage =>
|
|
'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.';
|
|
|
|
@override
|
|
String appearanceSelectAccentColor(String hex) {
|
|
return 'Select accent color $hex';
|
|
}
|
|
|
|
@override
|
|
String get logAutoScrollOn => 'Auto-scroll ON';
|
|
|
|
@override
|
|
String get logAutoScrollOff => 'Auto-scroll OFF';
|
|
|
|
@override
|
|
String get logCopyLogs => 'Copy logs';
|
|
|
|
@override
|
|
String get logClearSearch => 'Clear search';
|
|
|
|
@override
|
|
String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED';
|
|
|
|
@override
|
|
String get logIssueIspBlockingDescription =>
|
|
'Your ISP may be blocking access to download services';
|
|
|
|
@override
|
|
String get logIssueIspBlockingSuggestion =>
|
|
'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8';
|
|
|
|
@override
|
|
String get logIssueRateLimitedLabel => 'RATE LIMITED';
|
|
|
|
@override
|
|
String get logIssueRateLimitedDescription =>
|
|
'Too many requests to the service';
|
|
|
|
@override
|
|
String get logIssueRateLimitedSuggestion =>
|
|
'Wait a few minutes before trying again';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorLabel => 'NETWORK ERROR';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorDescription => 'Connection issues detected';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorSuggestion => 'Check your internet connection';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundDescription =>
|
|
'Some tracks could not be found on download services';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundSuggestion =>
|
|
'The track may not be available in lossless quality';
|
|
|
|
@override
|
|
String get clickableLookingUpArtist => 'Looking up artist...';
|
|
|
|
@override
|
|
String clickableInformationUnavailable(String type) {
|
|
return '$type information not available';
|
|
}
|
|
|
|
@override
|
|
String get extensionDetailsTags => 'Tags';
|
|
|
|
@override
|
|
String get extensionDetailsInformation => 'Information';
|
|
|
|
@override
|
|
String get extensionUtilityFunctions => 'Utility Functions';
|
|
|
|
@override
|
|
String get actionDismiss => 'Dismiss';
|
|
|
|
@override
|
|
String get setupChangeFolderTooltip => 'Change folder';
|
|
|
|
@override
|
|
String a11yOpenTrackByArtist(String trackName, String artistName) {
|
|
return 'Open track $trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenItem(String itemType, String name) {
|
|
return 'Open $itemType $name';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenItemCount(String title, int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return 'Open $title, $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenAlbumByArtistTrackCount(
|
|
String albumName,
|
|
String artistName,
|
|
int trackCount,
|
|
) {
|
|
return 'Open album $albumName by $artistName, $trackCount tracks';
|
|
}
|
|
|
|
@override
|
|
String a11yTrackByArtist(String trackName, String artistName) {
|
|
return '$trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String a11ySelectAlbum(String albumName) {
|
|
return 'Select album $albumName';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenAlbum(String albumName) {
|
|
return 'Open album $albumName';
|
|
}
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabAlbums => 'Albums';
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabTracks => 'Tracks';
|
|
|
|
@override
|
|
String get settingsFiles => 'Files & Folders';
|
|
|
|
@override
|
|
String get settingsFilesSubtitle =>
|
|
'Download location, filename, folder structure';
|
|
|
|
@override
|
|
String get settingsMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get settingsMetadataSubtitle =>
|
|
'Cover art, tags, ReplayGain, providers';
|
|
|
|
@override
|
|
String get settingsLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get settingsLyricsSubtitle =>
|
|
'Embed, mode, providers, language options';
|
|
|
|
@override
|
|
String get settingsApp => 'App';
|
|
|
|
@override
|
|
String get settingsAppSubtitle => 'Updates, data, extension repo, debug';
|
|
|
|
@override
|
|
String get sectionMetadataProviders => 'Providers';
|
|
|
|
@override
|
|
String get sectionDuplicates => 'Duplicates';
|
|
|
|
@override
|
|
String get sectionLyricsProviderOptions => 'Provider Options';
|
|
|
|
@override
|
|
String get metadataProvidersTitle => 'Metadata Provider Priority';
|
|
|
|
@override
|
|
String get metadataProvidersSubtitle =>
|
|
'Drag to set search and metadata source order';
|
|
|
|
@override
|
|
String get downloadDeduplication => 'Skip Duplicate Downloads';
|
|
|
|
@override
|
|
String get downloadDeduplicationEnabled =>
|
|
'Already-downloaded tracks will be skipped';
|
|
|
|
@override
|
|
String get downloadDeduplicationDisabled =>
|
|
'All tracks will be downloaded regardless of history';
|
|
|
|
@override
|
|
String get downloadFallbackExtensions => 'Fallback Extensions';
|
|
|
|
@override
|
|
String get downloadFallbackExtensionsSubtitle =>
|
|
'Choose which extensions can be used as fallback';
|
|
|
|
@override
|
|
String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY';
|
|
|
|
@override
|
|
String get editMetadataFieldTrackTotal => 'Track Total';
|
|
|
|
@override
|
|
String get editMetadataFieldDiscTotal => 'Disc Total';
|
|
|
|
@override
|
|
String get editMetadataFieldComposer => 'Composer';
|
|
|
|
@override
|
|
String get editMetadataFieldComment => 'Comment';
|
|
|
|
@override
|
|
String get editMetadataAdvanced => 'Advanced';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingTrackNumber => 'Missing track number';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingArtist => 'Missing artist';
|
|
|
|
@override
|
|
String get libraryFilterMetadataIncorrectIsrcFormat =>
|
|
'Incorrect ISRC format';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingLabel => 'Missing label';
|
|
|
|
@override
|
|
String collectionDeletePlaylistsMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Delete $count $_temp0?';
|
|
}
|
|
|
|
@override
|
|
String collectionPlaylistsDeleted(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return '$count $_temp0 deleted';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedTracksToPlaylist(int count, String playlistName) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Added $count $_temp0 to $playlistName';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedTracksToPlaylistWithExisting(
|
|
int count,
|
|
String playlistName,
|
|
int alreadyCount,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)';
|
|
}
|
|
|
|
@override
|
|
String itemCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String trackReEnrichSuccessWithFailures(
|
|
int successCount,
|
|
int total,
|
|
int failedCount,
|
|
) {
|
|
return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount';
|
|
}
|
|
|
|
@override
|
|
String selectionDeleteTracksCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String queueDownloadSpeedStatus(String speed) {
|
|
return 'Downloading - $speed MB/s';
|
|
}
|
|
|
|
@override
|
|
String get queueDownloadStarting => 'Starting...';
|
|
|
|
@override
|
|
String get a11ySelectTrack => 'Select track';
|
|
|
|
@override
|
|
String get a11yDeselectTrack => 'Deselect track';
|
|
|
|
@override
|
|
String a11yPlayTrackByArtist(String trackName, String artistName) {
|
|
return 'Play $trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String storeExtensionsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'extensions',
|
|
one: 'extension',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String storeRequiresVersion(String version) {
|
|
return 'Requires v$version+';
|
|
}
|
|
|
|
@override
|
|
String get actionGo => 'Go';
|
|
|
|
@override
|
|
String get logIssueSummary => 'Issue Summary';
|
|
|
|
@override
|
|
String logTotalErrors(int count) {
|
|
return 'Total errors: $count';
|
|
}
|
|
|
|
@override
|
|
String logAffectedDomains(String domains) {
|
|
return 'Affected: $domains';
|
|
}
|
|
|
|
@override
|
|
String get libraryScanCancelled => 'Scan cancelled';
|
|
|
|
@override
|
|
String get libraryScanCancelledSubtitle =>
|
|
'You can retry the scan when ready.';
|
|
|
|
@override
|
|
String libraryDownloadsHistoryExcluded(int count) {
|
|
return '$count from Downloads history (excluded from list)';
|
|
}
|
|
|
|
@override
|
|
String get downloadNativeWorker => 'Native download worker';
|
|
|
|
@override
|
|
String get downloadNativeWorkerSubtitle =>
|
|
'Beta Android service worker for extension downloads';
|
|
|
|
@override
|
|
String get badgeBeta => 'BETA';
|
|
|
|
@override
|
|
String get extensionServiceStatus => 'Service Status';
|
|
|
|
@override
|
|
String get extensionServiceHealth => 'Service health';
|
|
|
|
@override
|
|
String extensionHealthChecksConfigured(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'checks',
|
|
one: 'check',
|
|
);
|
|
return '$count $_temp0 configured';
|
|
}
|
|
|
|
@override
|
|
String get extensionOauthConnectHint =>
|
|
'Tap Connect to Spotify to fill this field.';
|
|
|
|
@override
|
|
String extensionLastChecked(String time) {
|
|
return 'Last checked $time';
|
|
}
|
|
|
|
@override
|
|
String get extensionRefreshStatus => 'Refresh status';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandling => 'Custom URL Handling';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandlingSubtitle =>
|
|
'This extension can handle links from these sites';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandlingShareHint =>
|
|
'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.';
|
|
|
|
@override
|
|
String extensionSettingsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'settings',
|
|
one: 'setting',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get extensionHealthOnline => 'Online';
|
|
|
|
@override
|
|
String get extensionHealthDegraded => 'Degraded';
|
|
|
|
@override
|
|
String get extensionHealthOffline => 'Offline';
|
|
|
|
@override
|
|
String get extensionHealthNotConfigured => 'Not configured';
|
|
|
|
@override
|
|
String get extensionHealthUnknown => 'Unknown';
|
|
|
|
@override
|
|
String get extensionHealthRequired => 'required';
|
|
|
|
@override
|
|
String get extensionSettingNotSet => 'Not set';
|
|
|
|
@override
|
|
String get extensionActionFailed => 'Action failed';
|
|
|
|
@override
|
|
String get extensionEnterValue => 'Enter value';
|
|
|
|
@override
|
|
String get extensionHealthServiceOnline => 'Service online';
|
|
|
|
@override
|
|
String get extensionHealthServiceDegraded => 'Service degraded';
|
|
|
|
@override
|
|
String get extensionHealthServiceOffline => 'Service offline';
|
|
|
|
@override
|
|
String get extensionHealthServiceUnknown => 'Service status unknown';
|
|
|
|
@override
|
|
String get audioAnalysisStereo => 'Stereo';
|
|
|
|
@override
|
|
String get audioAnalysisMono => 'Mono';
|
|
|
|
@override
|
|
String trackOpenInService(String serviceName) {
|
|
return 'Open in $serviceName';
|
|
}
|
|
|
|
@override
|
|
String get trackLyricsEmbeddedSource => 'Embedded';
|
|
|
|
@override
|
|
String get unknownAlbum => 'Unknown Album';
|
|
|
|
@override
|
|
String get unknownArtist => 'Unknown Artist';
|
|
|
|
@override
|
|
String get permissionAudio => 'Audio';
|
|
|
|
@override
|
|
String get permissionStorage => 'Storage';
|
|
|
|
@override
|
|
String get permissionNotification => 'Notification';
|
|
|
|
@override
|
|
String get errorInvalidFolderSelected => 'Invalid folder selected';
|
|
|
|
@override
|
|
String get errorCouldNotKeepFolderAccess =>
|
|
'Could not keep access to the selected folder';
|
|
|
|
@override
|
|
String get storeAnyVersion => 'Any';
|
|
|
|
@override
|
|
String get storeCategoryMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get storeCategoryDownload => 'Download';
|
|
|
|
@override
|
|
String get storeCategoryUtility => 'Utility';
|
|
|
|
@override
|
|
String get storeCategoryLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get storeCategoryIntegration => 'Integration';
|
|
|
|
@override
|
|
String get artistReleases => 'Releases';
|
|
|
|
@override
|
|
String get editMetadataSelectNone => 'None';
|
|
|
|
@override
|
|
String queueRetryAllFailed(int count) {
|
|
return 'Retry $count failed';
|
|
}
|
|
|
|
@override
|
|
String get settingsSaveDownloadHistory => 'Save download history';
|
|
|
|
@override
|
|
String get settingsSaveDownloadHistorySubtitle =>
|
|
'Keep completed downloads in history and library views';
|
|
|
|
@override
|
|
String get dialogDisableHistoryTitle => 'Turn off download history?';
|
|
|
|
@override
|
|
String get dialogDisableHistoryMessage =>
|
|
'Existing history will be cleared. Downloaded files will not be deleted.';
|
|
|
|
@override
|
|
String get dialogDisableAndClear => 'Turn off and clear';
|
|
|
|
@override
|
|
String get openInOtherServices => 'Open in Other Services';
|
|
|
|
@override
|
|
String get shareSheetNoExtensions => 'No other compatible services';
|
|
|
|
@override
|
|
String get shareSheetNotFound => 'Not found';
|
|
|
|
@override
|
|
String get shareSheetCopyLink => 'Copy Link';
|
|
|
|
@override
|
|
String shareSheetLinkCopied(Object service) {
|
|
return '$service link copied';
|
|
}
|
|
|
|
@override
|
|
String get libraryPlayback => 'Playback';
|
|
|
|
@override
|
|
String get libraryExternalPlayer => 'External player';
|
|
|
|
@override
|
|
String get libraryExternalPlayerSubtitle =>
|
|
'Recommended for listening, best quality, gapless playback, EQ, and wider format support';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayer => 'Built-in preview player';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayerSubtitle =>
|
|
'Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening';
|
|
|
|
@override
|
|
String get libraryBuiltInPlayerInfo =>
|
|
'The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.';
|
|
|
|
@override
|
|
String get nowPlayingTitle => 'Now Playing';
|
|
|
|
@override
|
|
String get nowPlayingNothingPlaying => 'Nothing is playing';
|
|
|
|
@override
|
|
String get nowPlayingMinimize => 'Minimize';
|
|
|
|
@override
|
|
String get nowPlayingUpNext => 'Up next';
|
|
|
|
@override
|
|
String get nowPlayingDetails => 'Details';
|
|
|
|
@override
|
|
String get nowPlayingOpenInExternalPlayer => 'Open in external player';
|
|
|
|
@override
|
|
String get nowPlayingTabPlayer => 'Player';
|
|
|
|
@override
|
|
String get nowPlayingTabLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get nowPlayingNoLyrics => 'No lyrics in this file';
|
|
|
|
@override
|
|
String get nowPlayingLibraryEmpty => 'Your library is empty';
|
|
|
|
@override
|
|
String nowPlayingShuffleLibraryFailed(String error) {
|
|
return 'Could not shuffle library: $error';
|
|
}
|
|
|
|
@override
|
|
String get nowPlayingShuffleOn => 'Shuffle on';
|
|
|
|
@override
|
|
String get nowPlayingPlayInOrder => 'Play in order';
|
|
|
|
@override
|
|
String get nowPlayingShuffleLibrary => 'Shuffle library';
|
|
|
|
@override
|
|
String get nowPlayingQueueEmpty => 'Queue is empty';
|
|
|
|
@override
|
|
String get nowPlayingNoMetadata => 'No metadata available';
|
|
|
|
@override
|
|
String get announcementUnableToOpenLink =>
|
|
'Unable to open link. Please try again.';
|
|
|
|
@override
|
|
String trackConvertLosslessOutputWithCap(String quality) {
|
|
return 'Lossless output with $quality cap';
|
|
}
|
|
|
|
@override
|
|
String trackConvertConfirmMessageLosslessCapped(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertConfirmMessageLosslessCapped(
|
|
int count,
|
|
String format,
|
|
String quality,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0 to $format ($quality)?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossless(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return '$sourceFormat → $targetFormat ($quality)';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossy(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String bitrate,
|
|
) {
|
|
return '$sourceFormat → $targetFormat @ $bitrate';
|
|
}
|
|
|
|
@override
|
|
String get aboutPaxsenixSubtitle =>
|
|
'Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius';
|
|
|
|
@override
|
|
String get snackbarPlayingNext => 'Playing next';
|
|
|
|
@override
|
|
String get snackbarAddedToQueueGeneric => 'Added to queue';
|
|
|
|
@override
|
|
String selectionDeletePlaylistsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Delete $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get actionShuffle => 'Shuffle';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOn => 'Primary only: On';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOff => 'Primary only: Off';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataPrimaryOnly =>
|
|
'Album Artist metadata: Primary only';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataFull => 'Album Artist metadata: Full';
|
|
|
|
@override
|
|
String get trackConvertOriginal => 'Original';
|
|
|
|
@override
|
|
String get trackConvertOriginalQuality => 'Original quality';
|
|
|
|
@override
|
|
String get trackConvertLosslessSuffix => 'Lossless';
|
|
|
|
@override
|
|
String get trackConvertDithering => 'Dithering';
|
|
|
|
@override
|
|
String get trackConvertResampler => 'Resampler';
|
|
|
|
@override
|
|
String get trackConvertDitherNone => 'None';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangular => 'TPDF';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangularHp => 'Triangular HP';
|
|
|
|
@override
|
|
String get trackConvertResamplerSwr => 'SWR';
|
|
|
|
@override
|
|
String get trackConvertResamplerSoxr => 'SoXr';
|
|
|
|
@override
|
|
String get updateSeeReleaseNotes => 'See release notes for details.';
|
|
|
|
@override
|
|
String get unknownTitle => 'Unknown title';
|
|
|
|
@override
|
|
String get trackPlayNext => 'Play next';
|
|
|
|
@override
|
|
String get trackAddToQueue => 'Add to queue';
|
|
|
|
@override
|
|
String snackbarExtensionInstalledEnable(String extensionName) {
|
|
return '$extensionName installed. Enable it in Settings > Extensions';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdatedVersion(String extensionName, String version) {
|
|
return '$extensionName updated to v$version';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToInstallNamed(String extensionName) {
|
|
return 'Failed to install $extensionName';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToUpdateNamed(String extensionName) {
|
|
return 'Failed to update $extensionName';
|
|
}
|
|
|
|
@override
|
|
String get releaseTypeEp => 'EP';
|
|
|
|
@override
|
|
String get releaseTypeSingle => 'Single';
|
|
|
|
@override
|
|
String get trackCoverOnline => 'Online cover';
|
|
|
|
@override
|
|
String get regionCountryUS => 'United States';
|
|
|
|
@override
|
|
String get regionCountryGB => 'United Kingdom';
|
|
|
|
@override
|
|
String get regionCountryFR => 'France';
|
|
|
|
@override
|
|
String get regionCountryDE => 'Germany';
|
|
|
|
@override
|
|
String get regionCountryJP => 'Japan';
|
|
|
|
@override
|
|
String get regionCountryKR => 'South Korea';
|
|
|
|
@override
|
|
String get regionCountryIN => 'India';
|
|
|
|
@override
|
|
String get regionCountryID => 'Indonesia';
|
|
|
|
@override
|
|
String get regionCountryBR => 'Brazil';
|
|
|
|
@override
|
|
String get regionCountryMX => 'Mexico';
|
|
|
|
@override
|
|
String get regionCountryAU => 'Australia';
|
|
|
|
@override
|
|
String get regionCountryCA => 'Canada';
|
|
|
|
@override
|
|
String get regionCountryXK => 'Kosovo';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserTitle => 'Verification browser';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleExternal =>
|
|
'Open challenges in the default browser first';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleInApp =>
|
|
'Open challenges in the in-app browser first';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserExternal => 'External';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserInApp => 'In-app';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleManual =>
|
|
'Open verification manually';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleWaiting =>
|
|
'Verification still waiting';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageManual =>
|
|
'SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageWaiting =>
|
|
'If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.';
|
|
|
|
@override
|
|
String get extensionVerificationClose => 'Close';
|
|
|
|
@override
|
|
String get extensionVerificationCopyLink => 'Copy link';
|
|
|
|
@override
|
|
String get extensionVerificationLinkCopied => 'Verification link copied';
|
|
|
|
@override
|
|
String get extensionVerificationOpenBrowser => 'Open browser';
|
|
}
|