diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 499660b..a23f0f4 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -98,3449 +98,3449 @@ abstract class AppLocalizations { Locale('id'), ]; - /// No description provided for @appName. + /// App name - DO NOT TRANSLATE /// /// In en, this message translates to: /// **'SpotiFLAC'** String get appName; - /// No description provided for @appDescription. + /// App description shown in about page /// /// In en, this message translates to: /// **'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'** String get appDescription; - /// No description provided for @navHome. + /// Bottom navigation - Home tab /// /// In en, this message translates to: /// **'Home'** String get navHome; - /// No description provided for @navHistory. + /// Bottom navigation - History tab /// /// In en, this message translates to: /// **'History'** String get navHistory; - /// No description provided for @navSettings. + /// Bottom navigation - Settings tab /// /// In en, this message translates to: /// **'Settings'** String get navSettings; - /// No description provided for @navStore. + /// Bottom navigation - Extension store tab /// /// In en, this message translates to: /// **'Store'** String get navStore; - /// No description provided for @homeTitle. + /// Home screen title /// /// In en, this message translates to: /// **'Home'** String get homeTitle; - /// No description provided for @homeSearchHint. + /// Placeholder text in search box /// /// In en, this message translates to: /// **'Paste Spotify URL or search...'** String get homeSearchHint; - /// No description provided for @homeSearchHintExtension. + /// Placeholder when extension search is active /// /// In en, this message translates to: /// **'Search with {extensionName}...'** String homeSearchHintExtension(String extensionName); - /// No description provided for @homeSubtitle. + /// Subtitle shown below search box /// /// In en, this message translates to: /// **'Paste a Spotify link or search by name'** String get homeSubtitle; - /// No description provided for @homeSupports. + /// Info text about supported URL types /// /// In en, this message translates to: /// **'Supports: Track, Album, Playlist, Artist URLs'** String get homeSupports; - /// No description provided for @homeRecent. + /// Section header for recent searches /// /// In en, this message translates to: /// **'Recent'** String get homeRecent; - /// No description provided for @historyTitle. + /// History screen title /// /// In en, this message translates to: /// **'History'** String get historyTitle; - /// No description provided for @historyDownloading. + /// Tab showing active downloads count /// /// In en, this message translates to: /// **'Downloading ({count})'** String historyDownloading(int count); - /// No description provided for @historyDownloaded. + /// Tab showing completed downloads /// /// In en, this message translates to: /// **'Downloaded'** String get historyDownloaded; - /// No description provided for @historyFilterAll. + /// Filter chip - show all items /// /// In en, this message translates to: /// **'All'** String get historyFilterAll; - /// No description provided for @historyFilterAlbums. + /// Filter chip - show albums only /// /// In en, this message translates to: /// **'Albums'** String get historyFilterAlbums; - /// No description provided for @historyFilterSingles. + /// Filter chip - show singles only /// /// In en, this message translates to: /// **'Singles'** String get historyFilterSingles; - /// No description provided for @historyTracksCount. + /// Track count with plural form /// /// In en, this message translates to: /// **'{count, plural, =1{1 track} other{{count} tracks}}'** String historyTracksCount(int count); - /// No description provided for @historyAlbumsCount. + /// Album count with plural form /// /// In en, this message translates to: /// **'{count, plural, =1{1 album} other{{count} albums}}'** String historyAlbumsCount(int count); - /// No description provided for @historyNoDownloads. + /// Empty state title /// /// In en, this message translates to: /// **'No download history'** String get historyNoDownloads; - /// No description provided for @historyNoDownloadsSubtitle. + /// Empty state subtitle /// /// In en, this message translates to: /// **'Downloaded tracks will appear here'** String get historyNoDownloadsSubtitle; - /// No description provided for @historyNoAlbums. + /// Empty state when filtering albums /// /// In en, this message translates to: /// **'No album downloads'** String get historyNoAlbums; - /// No description provided for @historyNoAlbumsSubtitle. + /// Empty state subtitle for albums filter /// /// In en, this message translates to: /// **'Download multiple tracks from an album to see them here'** String get historyNoAlbumsSubtitle; - /// No description provided for @historyNoSingles. + /// Empty state when filtering singles /// /// In en, this message translates to: /// **'No single downloads'** String get historyNoSingles; - /// No description provided for @historyNoSinglesSubtitle. + /// Empty state subtitle for singles filter /// /// In en, this message translates to: /// **'Single track downloads will appear here'** String get historyNoSinglesSubtitle; - /// No description provided for @settingsTitle. + /// Settings screen title /// /// In en, this message translates to: /// **'Settings'** String get settingsTitle; - /// No description provided for @settingsDownload. + /// Settings section - download options /// /// In en, this message translates to: /// **'Download'** String get settingsDownload; - /// No description provided for @settingsAppearance. + /// Settings section - visual customization /// /// In en, this message translates to: /// **'Appearance'** String get settingsAppearance; - /// No description provided for @settingsOptions. + /// Settings section - app options /// /// In en, this message translates to: /// **'Options'** String get settingsOptions; - /// No description provided for @settingsExtensions. + /// Settings section - extension management /// /// In en, this message translates to: /// **'Extensions'** String get settingsExtensions; - /// No description provided for @settingsAbout. + /// Settings section - app info /// /// In en, this message translates to: /// **'About'** String get settingsAbout; - /// No description provided for @downloadTitle. + /// Download settings page title /// /// In en, this message translates to: /// **'Download'** String get downloadTitle; - /// No description provided for @downloadLocation. + /// Setting for download folder /// /// In en, this message translates to: /// **'Download Location'** String get downloadLocation; - /// No description provided for @downloadLocationSubtitle. + /// Subtitle for download location /// /// In en, this message translates to: /// **'Choose where to save files'** String get downloadLocationSubtitle; - /// No description provided for @downloadLocationDefault. + /// Shown when using default folder /// /// In en, this message translates to: /// **'Default location'** String get downloadLocationDefault; - /// No description provided for @downloadDefaultService. + /// Setting for preferred download service (Tidal/Qobuz/Amazon) /// /// In en, this message translates to: /// **'Default Service'** String get downloadDefaultService; - /// No description provided for @downloadDefaultServiceSubtitle. + /// Subtitle for default service /// /// In en, this message translates to: /// **'Service used for downloads'** String get downloadDefaultServiceSubtitle; - /// No description provided for @downloadDefaultQuality. + /// Setting for audio quality /// /// In en, this message translates to: /// **'Default Quality'** String get downloadDefaultQuality; - /// No description provided for @downloadAskQuality. + /// Toggle to show quality picker /// /// In en, this message translates to: /// **'Ask Quality Before Download'** String get downloadAskQuality; - /// No description provided for @downloadAskQualitySubtitle. + /// Subtitle for ask quality toggle /// /// In en, this message translates to: /// **'Show quality picker for each download'** String get downloadAskQualitySubtitle; - /// No description provided for @downloadFilenameFormat. + /// Setting for output filename pattern /// /// In en, this message translates to: /// **'Filename Format'** String get downloadFilenameFormat; - /// No description provided for @downloadFolderOrganization. + /// Setting for folder structure /// /// In en, this message translates to: /// **'Folder Organization'** String get downloadFolderOrganization; - /// No description provided for @downloadSeparateSingles. + /// Toggle to separate single tracks /// /// In en, this message translates to: /// **'Separate Singles'** String get downloadSeparateSingles; - /// No description provided for @downloadSeparateSinglesSubtitle. + /// Subtitle for separate singles toggle /// /// In en, this message translates to: /// **'Put single tracks in a separate folder'** String get downloadSeparateSinglesSubtitle; - /// No description provided for @qualityBest. + /// Audio quality option - highest available /// /// In en, this message translates to: /// **'Best Available'** String get qualityBest; - /// No description provided for @qualityFlac. + /// Audio quality option - FLAC lossless /// /// In en, this message translates to: /// **'FLAC'** String get qualityFlac; - /// No description provided for @quality320. + /// Audio quality option - 320kbps MP3 /// /// In en, this message translates to: /// **'320 kbps'** String get quality320; - /// No description provided for @quality128. + /// Audio quality option - 128kbps MP3 /// /// In en, this message translates to: /// **'128 kbps'** String get quality128; - /// No description provided for @appearanceTitle. + /// Appearance settings page title /// /// In en, this message translates to: /// **'Appearance'** String get appearanceTitle; - /// No description provided for @appearanceTheme. + /// Theme mode setting /// /// In en, this message translates to: /// **'Theme'** String get appearanceTheme; - /// No description provided for @appearanceThemeSystem. + /// Follow system theme /// /// In en, this message translates to: /// **'System'** String get appearanceThemeSystem; - /// No description provided for @appearanceThemeLight. + /// Light theme /// /// In en, this message translates to: /// **'Light'** String get appearanceThemeLight; - /// No description provided for @appearanceThemeDark. + /// Dark theme /// /// In en, this message translates to: /// **'Dark'** String get appearanceThemeDark; - /// No description provided for @appearanceDynamicColor. + /// Material You dynamic colors /// /// In en, this message translates to: /// **'Dynamic Color'** String get appearanceDynamicColor; - /// No description provided for @appearanceDynamicColorSubtitle. + /// Subtitle for dynamic color /// /// In en, this message translates to: /// **'Use colors from your wallpaper'** String get appearanceDynamicColorSubtitle; - /// No description provided for @appearanceAccentColor. + /// Custom accent color picker /// /// In en, this message translates to: /// **'Accent Color'** String get appearanceAccentColor; - /// No description provided for @appearanceHistoryView. + /// Layout style for history /// /// In en, this message translates to: /// **'History View'** String get appearanceHistoryView; - /// No description provided for @appearanceHistoryViewList. + /// List layout option /// /// In en, this message translates to: /// **'List'** String get appearanceHistoryViewList; - /// No description provided for @appearanceHistoryViewGrid. + /// Grid layout option /// /// In en, this message translates to: /// **'Grid'** String get appearanceHistoryViewGrid; - /// No description provided for @optionsTitle. + /// Options settings page title /// /// In en, this message translates to: /// **'Options'** String get optionsTitle; - /// No description provided for @optionsSearchSource. + /// Section for search provider settings /// /// In en, this message translates to: /// **'Search Source'** String get optionsSearchSource; - /// No description provided for @optionsPrimaryProvider. + /// Main search provider setting /// /// In en, this message translates to: /// **'Primary Provider'** String get optionsPrimaryProvider; - /// No description provided for @optionsPrimaryProviderSubtitle. + /// Subtitle for primary provider /// /// In en, this message translates to: /// **'Service used when searching by track name.'** String get optionsPrimaryProviderSubtitle; - /// No description provided for @optionsUsingExtension. + /// Shows active extension name /// /// In en, this message translates to: /// **'Using extension: {extensionName}'** String optionsUsingExtension(String extensionName); - /// No description provided for @optionsSwitchBack. + /// Hint to switch back to built-in providers /// /// In en, this message translates to: /// **'Tap Deezer or Spotify to switch back from extension'** String get optionsSwitchBack; - /// No description provided for @optionsAutoFallback. + /// Auto-retry with other services /// /// In en, this message translates to: /// **'Auto Fallback'** String get optionsAutoFallback; - /// No description provided for @optionsAutoFallbackSubtitle. + /// Subtitle for auto fallback /// /// In en, this message translates to: /// **'Try other services if download fails'** String get optionsAutoFallbackSubtitle; - /// No description provided for @optionsUseExtensionProviders. + /// Enable extension download providers /// /// In en, this message translates to: /// **'Use Extension Providers'** String get optionsUseExtensionProviders; - /// No description provided for @optionsUseExtensionProvidersOn. + /// Status when extension providers enabled /// /// In en, this message translates to: /// **'Extensions will be tried first'** String get optionsUseExtensionProvidersOn; - /// No description provided for @optionsUseExtensionProvidersOff. + /// Status when extension providers disabled /// /// In en, this message translates to: /// **'Using built-in providers only'** String get optionsUseExtensionProvidersOff; - /// No description provided for @optionsEmbedLyrics. + /// Embed lyrics in audio files /// /// In en, this message translates to: /// **'Embed Lyrics'** String get optionsEmbedLyrics; - /// No description provided for @optionsEmbedLyricsSubtitle. + /// Subtitle for embed lyrics /// /// In en, this message translates to: /// **'Embed synced lyrics into FLAC files'** String get optionsEmbedLyricsSubtitle; - /// No description provided for @optionsMaxQualityCover. + /// Download highest quality album art /// /// In en, this message translates to: /// **'Max Quality Cover'** String get optionsMaxQualityCover; - /// No description provided for @optionsMaxQualityCoverSubtitle. + /// Subtitle for max quality cover /// /// In en, this message translates to: /// **'Download highest resolution cover art'** String get optionsMaxQualityCoverSubtitle; - /// No description provided for @optionsConcurrentDownloads. + /// Number of parallel downloads /// /// In en, this message translates to: /// **'Concurrent Downloads'** String get optionsConcurrentDownloads; - /// No description provided for @optionsConcurrentSequential. + /// Download one at a time /// /// In en, this message translates to: /// **'Sequential (1 at a time)'** String get optionsConcurrentSequential; - /// No description provided for @optionsConcurrentParallel. + /// Multiple parallel downloads /// /// In en, this message translates to: /// **'{count} parallel downloads'** String optionsConcurrentParallel(int count); - /// No description provided for @optionsConcurrentWarning. + /// Warning about rate limits /// /// In en, this message translates to: /// **'Parallel downloads may trigger rate limiting'** String get optionsConcurrentWarning; - /// No description provided for @optionsExtensionStore. + /// Show/hide store tab /// /// In en, this message translates to: /// **'Extension Store'** String get optionsExtensionStore; - /// No description provided for @optionsExtensionStoreSubtitle. + /// Subtitle for extension store toggle /// /// In en, this message translates to: /// **'Show Store tab in navigation'** String get optionsExtensionStoreSubtitle; - /// No description provided for @optionsCheckUpdates. + /// Auto update check toggle /// /// In en, this message translates to: /// **'Check for Updates'** String get optionsCheckUpdates; - /// No description provided for @optionsCheckUpdatesSubtitle. + /// Subtitle for update check /// /// In en, this message translates to: /// **'Notify when new version is available'** String get optionsCheckUpdatesSubtitle; - /// No description provided for @optionsUpdateChannel. + /// Stable vs preview releases /// /// In en, this message translates to: /// **'Update Channel'** String get optionsUpdateChannel; - /// No description provided for @optionsUpdateChannelStable. + /// Only stable updates /// /// In en, this message translates to: /// **'Stable releases only'** String get optionsUpdateChannelStable; - /// No description provided for @optionsUpdateChannelPreview. + /// Include beta/preview updates /// /// In en, this message translates to: /// **'Get preview releases'** String get optionsUpdateChannelPreview; - /// No description provided for @optionsUpdateChannelWarning. + /// Warning about preview channel /// /// In en, this message translates to: /// **'Preview may contain bugs or incomplete features'** String get optionsUpdateChannelWarning; - /// No description provided for @optionsClearHistory. + /// Delete all download history /// /// In en, this message translates to: /// **'Clear Download History'** String get optionsClearHistory; - /// No description provided for @optionsClearHistorySubtitle. + /// Subtitle for clear history /// /// In en, this message translates to: /// **'Remove all downloaded tracks from history'** String get optionsClearHistorySubtitle; - /// No description provided for @optionsDetailedLogging. + /// Enable verbose logs for debugging /// /// In en, this message translates to: /// **'Detailed Logging'** String get optionsDetailedLogging; - /// No description provided for @optionsDetailedLoggingOn. + /// Status when logging enabled /// /// In en, this message translates to: /// **'Detailed logs are being recorded'** String get optionsDetailedLoggingOn; - /// No description provided for @optionsDetailedLoggingOff. + /// Status when logging disabled /// /// In en, this message translates to: /// **'Enable for bug reports'** String get optionsDetailedLoggingOff; - /// No description provided for @optionsSpotifyCredentials. + /// Spotify API credentials setting /// /// In en, this message translates to: /// **'Spotify Credentials'** String get optionsSpotifyCredentials; - /// No description provided for @optionsSpotifyCredentialsConfigured. + /// Shows configured client ID preview /// /// In en, this message translates to: /// **'Client ID: {clientId}...'** String optionsSpotifyCredentialsConfigured(String clientId); - /// No description provided for @optionsSpotifyCredentialsRequired. + /// Prompt to set up credentials /// /// In en, this message translates to: /// **'Required - tap to configure'** String get optionsSpotifyCredentialsRequired; - /// No description provided for @optionsSpotifyWarning. + /// Info about Spotify API requirement /// /// In en, this message translates to: /// **'Spotify requires your own API credentials. Get them free from developer.spotify.com'** String get optionsSpotifyWarning; - /// No description provided for @extensionsTitle. + /// Extensions page title /// /// In en, this message translates to: /// **'Extensions'** String get extensionsTitle; - /// No description provided for @extensionsInstalled. + /// Section header for installed extensions /// /// In en, this message translates to: /// **'Installed Extensions'** String get extensionsInstalled; - /// No description provided for @extensionsNone. + /// Empty state title /// /// In en, this message translates to: /// **'No extensions installed'** String get extensionsNone; - /// No description provided for @extensionsNoneSubtitle. + /// Empty state subtitle /// /// In en, this message translates to: /// **'Install extensions from the Store tab'** String get extensionsNoneSubtitle; - /// No description provided for @extensionsEnabled. + /// Extension status - active /// /// In en, this message translates to: /// **'Enabled'** String get extensionsEnabled; - /// No description provided for @extensionsDisabled. + /// Extension status - inactive /// /// In en, this message translates to: /// **'Disabled'** String get extensionsDisabled; - /// No description provided for @extensionsVersion. + /// Extension version display /// /// In en, this message translates to: /// **'Version {version}'** String extensionsVersion(String version); - /// No description provided for @extensionsAuthor. + /// Extension author credit /// /// In en, this message translates to: /// **'by {author}'** String extensionsAuthor(String author); - /// No description provided for @extensionsUninstall. + /// Uninstall extension button /// /// In en, this message translates to: /// **'Uninstall'** String get extensionsUninstall; - /// No description provided for @extensionsSetAsSearch. + /// Use extension for search /// /// In en, this message translates to: /// **'Set as Search Provider'** String get extensionsSetAsSearch; - /// No description provided for @storeTitle. + /// Store screen title /// /// In en, this message translates to: /// **'Extension Store'** String get storeTitle; - /// No description provided for @storeSearch. + /// Store search placeholder /// /// In en, this message translates to: /// **'Search extensions...'** String get storeSearch; - /// No description provided for @storeInstall. + /// Install extension button /// /// In en, this message translates to: /// **'Install'** String get storeInstall; - /// No description provided for @storeInstalled. + /// Already installed badge /// /// In en, this message translates to: /// **'Installed'** String get storeInstalled; - /// No description provided for @storeUpdate. + /// Update available button /// /// In en, this message translates to: /// **'Update'** String get storeUpdate; - /// No description provided for @aboutTitle. + /// About page title /// /// In en, this message translates to: /// **'About'** String get aboutTitle; - /// No description provided for @aboutContributors. + /// Section for contributors /// /// In en, this message translates to: /// **'Contributors'** String get aboutContributors; - /// No description provided for @aboutMobileDeveloper. + /// Role description for mobile dev /// /// In en, this message translates to: /// **'Mobile version developer'** String get aboutMobileDeveloper; - /// No description provided for @aboutOriginalCreator. + /// Role description for original creator /// /// In en, this message translates to: /// **'Creator of the original SpotiFLAC'** String get aboutOriginalCreator; - /// No description provided for @aboutLogoArtist. + /// Role description for logo artist /// /// In en, this message translates to: /// **'The talented artist who created our beautiful app logo!'** String get aboutLogoArtist; - /// No description provided for @aboutSpecialThanks. + /// Section for special thanks /// /// In en, this message translates to: /// **'Special Thanks'** String get aboutSpecialThanks; - /// No description provided for @aboutLinks. + /// Section for external links /// /// In en, this message translates to: /// **'Links'** String get aboutLinks; - /// No description provided for @aboutMobileSource. + /// Link to mobile GitHub repo /// /// In en, this message translates to: /// **'Mobile source code'** String get aboutMobileSource; - /// No description provided for @aboutPCSource. + /// Link to PC GitHub repo /// /// In en, this message translates to: /// **'PC source code'** String get aboutPCSource; - /// No description provided for @aboutReportIssue. + /// Link to report bugs /// /// In en, this message translates to: /// **'Report an issue'** String get aboutReportIssue; - /// No description provided for @aboutReportIssueSubtitle. + /// Subtitle for report issue /// /// In en, this message translates to: /// **'Report any problems you encounter'** String get aboutReportIssueSubtitle; - /// No description provided for @aboutFeatureRequest. + /// Link to suggest features /// /// In en, this message translates to: /// **'Feature request'** String get aboutFeatureRequest; - /// No description provided for @aboutFeatureRequestSubtitle. + /// Subtitle for feature request /// /// In en, this message translates to: /// **'Suggest new features for the app'** String get aboutFeatureRequestSubtitle; - /// No description provided for @aboutSupport. + /// Section for support/donation links /// /// In en, this message translates to: /// **'Support'** String get aboutSupport; - /// No description provided for @aboutBuyMeCoffee. + /// Donation link /// /// In en, this message translates to: /// **'Buy me a coffee'** String get aboutBuyMeCoffee; - /// No description provided for @aboutBuyMeCoffeeSubtitle. + /// Subtitle for donation /// /// In en, this message translates to: /// **'Support development on Ko-fi'** String get aboutBuyMeCoffeeSubtitle; - /// No description provided for @aboutApp. + /// Section for app info /// /// In en, this message translates to: /// **'App'** String get aboutApp; - /// No description provided for @aboutVersion. + /// Version info label /// /// In en, this message translates to: /// **'Version'** String get aboutVersion; - /// No description provided for @albumTitle. - /// - /// In en, this message translates to: - /// **'Album'** - String get albumTitle; - - /// No description provided for @albumTracks. - /// - /// In en, this message translates to: - /// **'{count, plural, =1{1 track} other{{count} tracks}}'** - String albumTracks(int count); - - /// No description provided for @albumDownloadAll. - /// - /// In en, this message translates to: - /// **'Download All'** - String get albumDownloadAll; - - /// No description provided for @albumDownloadRemaining. - /// - /// In en, this message translates to: - /// **'Download Remaining'** - String get albumDownloadRemaining; - - /// No description provided for @playlistTitle. - /// - /// In en, this message translates to: - /// **'Playlist'** - String get playlistTitle; - - /// No description provided for @artistTitle. - /// - /// In en, this message translates to: - /// **'Artist'** - String get artistTitle; - - /// No description provided for @artistAlbums. - /// - /// In en, this message translates to: - /// **'Albums'** - String get artistAlbums; - - /// No description provided for @artistSingles. - /// - /// In en, this message translates to: - /// **'Singles & EPs'** - String get artistSingles; - - /// No description provided for @trackMetadataTitle. - /// - /// In en, this message translates to: - /// **'Track Info'** - String get trackMetadataTitle; - - /// No description provided for @trackMetadataArtist. - /// - /// In en, this message translates to: - /// **'Artist'** - String get trackMetadataArtist; - - /// No description provided for @trackMetadataAlbum. - /// - /// In en, this message translates to: - /// **'Album'** - String get trackMetadataAlbum; - - /// No description provided for @trackMetadataDuration. - /// - /// In en, this message translates to: - /// **'Duration'** - String get trackMetadataDuration; - - /// No description provided for @trackMetadataQuality. - /// - /// In en, this message translates to: - /// **'Quality'** - String get trackMetadataQuality; - - /// No description provided for @trackMetadataPath. - /// - /// In en, this message translates to: - /// **'File Path'** - String get trackMetadataPath; - - /// No description provided for @trackMetadataDownloadedAt. - /// - /// In en, this message translates to: - /// **'Downloaded'** - String get trackMetadataDownloadedAt; - - /// No description provided for @trackMetadataService. - /// - /// In en, this message translates to: - /// **'Service'** - String get trackMetadataService; - - /// No description provided for @trackMetadataPlay. - /// - /// In en, this message translates to: - /// **'Play'** - String get trackMetadataPlay; - - /// No description provided for @trackMetadataShare. - /// - /// In en, this message translates to: - /// **'Share'** - String get trackMetadataShare; - - /// No description provided for @trackMetadataDelete. - /// - /// In en, this message translates to: - /// **'Delete'** - String get trackMetadataDelete; - - /// No description provided for @trackMetadataRedownload. - /// - /// In en, this message translates to: - /// **'Re-download'** - String get trackMetadataRedownload; - - /// No description provided for @trackMetadataOpenFolder. - /// - /// In en, this message translates to: - /// **'Open Folder'** - String get trackMetadataOpenFolder; - - /// No description provided for @setupTitle. - /// - /// In en, this message translates to: - /// **'Welcome to SpotiFLAC'** - String get setupTitle; - - /// No description provided for @setupSubtitle. - /// - /// In en, this message translates to: - /// **'Let\'s get you started'** - String get setupSubtitle; - - /// No description provided for @setupStoragePermission. - /// - /// In en, this message translates to: - /// **'Storage Permission'** - String get setupStoragePermission; - - /// No description provided for @setupStoragePermissionSubtitle. - /// - /// In en, this message translates to: - /// **'Required to save downloaded files'** - String get setupStoragePermissionSubtitle; - - /// No description provided for @setupStoragePermissionGranted. - /// - /// In en, this message translates to: - /// **'Permission granted'** - String get setupStoragePermissionGranted; - - /// No description provided for @setupStoragePermissionDenied. - /// - /// In en, this message translates to: - /// **'Permission denied'** - String get setupStoragePermissionDenied; - - /// No description provided for @setupGrantPermission. - /// - /// In en, this message translates to: - /// **'Grant Permission'** - String get setupGrantPermission; - - /// No description provided for @setupDownloadLocation. - /// - /// In en, this message translates to: - /// **'Download Location'** - String get setupDownloadLocation; - - /// No description provided for @setupChooseFolder. - /// - /// In en, this message translates to: - /// **'Choose Folder'** - String get setupChooseFolder; - - /// No description provided for @setupContinue. - /// - /// In en, this message translates to: - /// **'Continue'** - String get setupContinue; - - /// No description provided for @setupSkip. - /// - /// In en, this message translates to: - /// **'Skip for now'** - String get setupSkip; - - /// No description provided for @dialogCancel. - /// - /// In en, this message translates to: - /// **'Cancel'** - String get dialogCancel; - - /// No description provided for @dialogOk. - /// - /// In en, this message translates to: - /// **'OK'** - String get dialogOk; - - /// No description provided for @dialogSave. - /// - /// In en, this message translates to: - /// **'Save'** - String get dialogSave; - - /// No description provided for @dialogDelete. - /// - /// In en, this message translates to: - /// **'Delete'** - String get dialogDelete; - - /// No description provided for @dialogRetry. - /// - /// In en, this message translates to: - /// **'Retry'** - String get dialogRetry; - - /// No description provided for @dialogClose. - /// - /// In en, this message translates to: - /// **'Close'** - String get dialogClose; - - /// No description provided for @dialogYes. - /// - /// In en, this message translates to: - /// **'Yes'** - String get dialogYes; - - /// No description provided for @dialogNo. - /// - /// In en, this message translates to: - /// **'No'** - String get dialogNo; - - /// No description provided for @dialogClear. - /// - /// In en, this message translates to: - /// **'Clear'** - String get dialogClear; - - /// No description provided for @dialogConfirm. - /// - /// In en, this message translates to: - /// **'Confirm'** - String get dialogConfirm; - - /// No description provided for @dialogDone. - /// - /// In en, this message translates to: - /// **'Done'** - String get dialogDone; - - /// No description provided for @dialogClearHistoryTitle. - /// - /// In en, this message translates to: - /// **'Clear History'** - String get dialogClearHistoryTitle; - - /// No description provided for @dialogClearHistoryMessage. - /// - /// In en, this message translates to: - /// **'Are you sure you want to clear all download history? This cannot be undone.'** - String get dialogClearHistoryMessage; - - /// No description provided for @dialogDeleteSelectedTitle. - /// - /// In en, this message translates to: - /// **'Delete Selected'** - String get dialogDeleteSelectedTitle; - - /// No description provided for @dialogDeleteSelectedMessage. - /// - /// In en, this message translates to: - /// **'Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.'** - String dialogDeleteSelectedMessage(int count); - - /// No description provided for @dialogImportPlaylistTitle. - /// - /// In en, this message translates to: - /// **'Import Playlist'** - String get dialogImportPlaylistTitle; - - /// No description provided for @dialogImportPlaylistMessage. - /// - /// In en, this message translates to: - /// **'Found {count} tracks in CSV. Add them to download queue?'** - String dialogImportPlaylistMessage(int count); - - /// No description provided for @snackbarAddedToQueue. - /// - /// In en, this message translates to: - /// **'Added \"{trackName}\" to queue'** - String snackbarAddedToQueue(String trackName); - - /// No description provided for @snackbarAddedTracksToQueue. - /// - /// In en, this message translates to: - /// **'Added {count} tracks to queue'** - String snackbarAddedTracksToQueue(int count); - - /// No description provided for @snackbarAlreadyDownloaded. - /// - /// In en, this message translates to: - /// **'\"{trackName}\" already downloaded'** - String snackbarAlreadyDownloaded(String trackName); - - /// No description provided for @snackbarHistoryCleared. - /// - /// In en, this message translates to: - /// **'History cleared'** - String get snackbarHistoryCleared; - - /// No description provided for @snackbarCredentialsSaved. - /// - /// In en, this message translates to: - /// **'Credentials saved'** - String get snackbarCredentialsSaved; - - /// No description provided for @snackbarCredentialsCleared. - /// - /// In en, this message translates to: - /// **'Credentials cleared'** - String get snackbarCredentialsCleared; - - /// No description provided for @snackbarDeletedTracks. - /// - /// In en, this message translates to: - /// **'Deleted {count} {count, plural, =1{track} other{tracks}}'** - String snackbarDeletedTracks(int count); - - /// No description provided for @snackbarCannotOpenFile. - /// - /// In en, this message translates to: - /// **'Cannot open file: {error}'** - String snackbarCannotOpenFile(String error); - - /// No description provided for @snackbarFillAllFields. - /// - /// In en, this message translates to: - /// **'Please fill all fields'** - String get snackbarFillAllFields; - - /// No description provided for @snackbarViewQueue. - /// - /// In en, this message translates to: - /// **'View Queue'** - String get snackbarViewQueue; - - /// No description provided for @errorRateLimited. - /// - /// In en, this message translates to: - /// **'Rate Limited'** - String get errorRateLimited; - - /// No description provided for @errorRateLimitedMessage. - /// - /// In en, this message translates to: - /// **'Too many requests. Please wait a moment before searching again.'** - String get errorRateLimitedMessage; - - /// No description provided for @errorFailedToLoad. - /// - /// In en, this message translates to: - /// **'Failed to load {item}'** - String errorFailedToLoad(String item); - - /// No description provided for @errorNoTracksFound. - /// - /// In en, this message translates to: - /// **'No tracks found'** - String get errorNoTracksFound; - - /// No description provided for @errorMissingExtensionSource. - /// - /// In en, this message translates to: - /// **'Cannot load {item}: missing extension source'** - String errorMissingExtensionSource(String item); - - /// No description provided for @statusQueued. - /// - /// In en, this message translates to: - /// **'Queued'** - String get statusQueued; - - /// No description provided for @statusDownloading. - /// - /// In en, this message translates to: - /// **'Downloading'** - String get statusDownloading; - - /// No description provided for @statusFinalizing. - /// - /// In en, this message translates to: - /// **'Finalizing'** - String get statusFinalizing; - - /// No description provided for @statusCompleted. - /// - /// In en, this message translates to: - /// **'Completed'** - String get statusCompleted; - - /// No description provided for @statusFailed. - /// - /// In en, this message translates to: - /// **'Failed'** - String get statusFailed; - - /// No description provided for @statusSkipped. - /// - /// In en, this message translates to: - /// **'Skipped'** - String get statusSkipped; - - /// No description provided for @statusPaused. - /// - /// In en, this message translates to: - /// **'Paused'** - String get statusPaused; - - /// No description provided for @actionPause. - /// - /// In en, this message translates to: - /// **'Pause'** - String get actionPause; - - /// No description provided for @actionResume. - /// - /// In en, this message translates to: - /// **'Resume'** - String get actionResume; - - /// No description provided for @actionCancel. - /// - /// In en, this message translates to: - /// **'Cancel'** - String get actionCancel; - - /// No description provided for @actionStop. - /// - /// In en, this message translates to: - /// **'Stop'** - String get actionStop; - - /// No description provided for @actionSelect. - /// - /// In en, this message translates to: - /// **'Select'** - String get actionSelect; - - /// No description provided for @actionSelectAll. - /// - /// In en, this message translates to: - /// **'Select All'** - String get actionSelectAll; - - /// No description provided for @actionDeselect. - /// - /// In en, this message translates to: - /// **'Deselect'** - String get actionDeselect; - - /// No description provided for @actionPaste. - /// - /// In en, this message translates to: - /// **'Paste'** - String get actionPaste; - - /// No description provided for @actionImportCsv. - /// - /// In en, this message translates to: - /// **'Import CSV'** - String get actionImportCsv; - - /// No description provided for @actionRemoveCredentials. - /// - /// In en, this message translates to: - /// **'Remove Credentials'** - String get actionRemoveCredentials; - - /// No description provided for @actionSaveCredentials. - /// - /// In en, this message translates to: - /// **'Save Credentials'** - String get actionSaveCredentials; - - /// No description provided for @selectionSelected. - /// - /// In en, this message translates to: - /// **'{count} selected'** - String selectionSelected(int count); - - /// No description provided for @selectionAllSelected. - /// - /// In en, this message translates to: - /// **'All tracks selected'** - String get selectionAllSelected; - - /// No description provided for @selectionTapToSelect. - /// - /// In en, this message translates to: - /// **'Tap tracks to select'** - String get selectionTapToSelect; - - /// No description provided for @selectionDeleteTracks. - /// - /// In en, this message translates to: - /// **'Delete {count} {count, plural, =1{track} other{tracks}}'** - String selectionDeleteTracks(int count); - - /// No description provided for @selectionSelectToDelete. - /// - /// In en, this message translates to: - /// **'Select tracks to delete'** - String get selectionSelectToDelete; - - /// No description provided for @progressFetchingMetadata. - /// - /// In en, this message translates to: - /// **'Fetching metadata... {current}/{total}'** - String progressFetchingMetadata(int current, int total); - - /// No description provided for @progressReadingCsv. - /// - /// In en, this message translates to: - /// **'Reading CSV...'** - String get progressReadingCsv; - - /// No description provided for @searchSongs. - /// - /// In en, this message translates to: - /// **'Songs'** - String get searchSongs; - - /// No description provided for @searchArtists. - /// - /// In en, this message translates to: - /// **'Artists'** - String get searchArtists; - - /// No description provided for @searchAlbums. - /// - /// In en, this message translates to: - /// **'Albums'** - String get searchAlbums; - - /// No description provided for @searchPlaylists. - /// - /// In en, this message translates to: - /// **'Playlists'** - String get searchPlaylists; - - /// No description provided for @tooltipPlay. - /// - /// In en, this message translates to: - /// **'Play'** - String get tooltipPlay; - - /// No description provided for @tooltipCancel. - /// - /// In en, this message translates to: - /// **'Cancel'** - String get tooltipCancel; - - /// No description provided for @tooltipStop. - /// - /// In en, this message translates to: - /// **'Stop'** - String get tooltipStop; - - /// No description provided for @tooltipRetry. - /// - /// In en, this message translates to: - /// **'Retry'** - String get tooltipRetry; - - /// No description provided for @tooltipRemove. - /// - /// In en, this message translates to: - /// **'Remove'** - String get tooltipRemove; - - /// No description provided for @tooltipClear. - /// - /// In en, this message translates to: - /// **'Clear'** - String get tooltipClear; - - /// No description provided for @tooltipPaste. - /// - /// In en, this message translates to: - /// **'Paste'** - String get tooltipPaste; - - /// No description provided for @filenameFormat. - /// - /// In en, this message translates to: - /// **'Filename Format'** - String get filenameFormat; - - /// No description provided for @filenameFormatPreview. - /// - /// In en, this message translates to: - /// **'Preview: {preview}'** - String filenameFormatPreview(String preview); - - /// No description provided for @folderOrganization. - /// - /// In en, this message translates to: - /// **'Folder Organization'** - String get folderOrganization; - - /// No description provided for @folderOrganizationNone. - /// - /// In en, this message translates to: - /// **'None'** - String get folderOrganizationNone; - - /// No description provided for @folderOrganizationByArtist. - /// - /// In en, this message translates to: - /// **'By Artist'** - String get folderOrganizationByArtist; - - /// No description provided for @folderOrganizationByAlbum. - /// - /// In en, this message translates to: - /// **'By Album'** - String get folderOrganizationByAlbum; - - /// No description provided for @folderOrganizationByArtistAlbum. - /// - /// In en, this message translates to: - /// **'By Artist & Album'** - String get folderOrganizationByArtistAlbum; - - /// No description provided for @updateAvailable. - /// - /// In en, this message translates to: - /// **'Update Available'** - String get updateAvailable; - - /// No description provided for @updateNewVersion. - /// - /// In en, this message translates to: - /// **'Version {version} is available'** - String updateNewVersion(String version); - - /// No description provided for @updateDownload. - /// - /// In en, this message translates to: - /// **'Download'** - String get updateDownload; - - /// No description provided for @updateLater. - /// - /// In en, this message translates to: - /// **'Later'** - String get updateLater; - - /// No description provided for @updateChangelog. - /// - /// In en, this message translates to: - /// **'Changelog'** - String get updateChangelog; - - /// No description provided for @providerPriority. - /// - /// In en, this message translates to: - /// **'Provider Priority'** - String get providerPriority; - - /// No description provided for @providerPrioritySubtitle. - /// - /// In en, this message translates to: - /// **'Drag to reorder download providers'** - String get providerPrioritySubtitle; - - /// No description provided for @metadataProviderPriority. - /// - /// In en, this message translates to: - /// **'Metadata Provider Priority'** - String get metadataProviderPriority; - - /// No description provided for @metadataProviderPrioritySubtitle. - /// - /// In en, this message translates to: - /// **'Order used when fetching track metadata'** - String get metadataProviderPrioritySubtitle; - - /// No description provided for @logTitle. - /// - /// In en, this message translates to: - /// **'Logs'** - String get logTitle; - - /// No description provided for @logCopy. - /// - /// In en, this message translates to: - /// **'Copy Logs'** - String get logCopy; - - /// No description provided for @logClear. - /// - /// In en, this message translates to: - /// **'Clear Logs'** - String get logClear; - - /// No description provided for @logShare. - /// - /// In en, this message translates to: - /// **'Share Logs'** - String get logShare; - - /// No description provided for @logEmpty. - /// - /// In en, this message translates to: - /// **'No logs yet'** - String get logEmpty; - - /// No description provided for @logCopied. - /// - /// In en, this message translates to: - /// **'Logs copied to clipboard'** - String get logCopied; - - /// No description provided for @credentialsTitle. - /// - /// In en, this message translates to: - /// **'Spotify Credentials'** - String get credentialsTitle; - - /// No description provided for @credentialsDescription. - /// - /// In en, this message translates to: - /// **'Enter your Client ID and Secret to use your own Spotify application quota.'** - String get credentialsDescription; - - /// No description provided for @credentialsClientId. - /// - /// In en, this message translates to: - /// **'Client ID'** - String get credentialsClientId; - - /// No description provided for @credentialsClientIdHint. - /// - /// In en, this message translates to: - /// **'Paste Client ID'** - String get credentialsClientIdHint; - - /// No description provided for @credentialsClientSecret. - /// - /// In en, this message translates to: - /// **'Client Secret'** - String get credentialsClientSecret; - - /// No description provided for @credentialsClientSecretHint. - /// - /// In en, this message translates to: - /// **'Paste Client Secret'** - String get credentialsClientSecretHint; - - /// No description provided for @channelStable. - /// - /// In en, this message translates to: - /// **'Stable'** - String get channelStable; - - /// No description provided for @channelPreview. - /// - /// In en, this message translates to: - /// **'Preview'** - String get channelPreview; - - /// No description provided for @sectionSearchSource. - /// - /// In en, this message translates to: - /// **'Search Source'** - String get sectionSearchSource; - - /// No description provided for @sectionDownload. - /// - /// In en, this message translates to: - /// **'Download'** - String get sectionDownload; - - /// No description provided for @sectionPerformance. - /// - /// In en, this message translates to: - /// **'Performance'** - String get sectionPerformance; - - /// No description provided for @sectionApp. - /// - /// In en, this message translates to: - /// **'App'** - String get sectionApp; - - /// No description provided for @sectionData. - /// - /// In en, this message translates to: - /// **'Data'** - String get sectionData; - - /// No description provided for @sectionDebug. - /// - /// In en, this message translates to: - /// **'Debug'** - String get sectionDebug; - - /// No description provided for @sectionService. - /// - /// In en, this message translates to: - /// **'Service'** - String get sectionService; - - /// No description provided for @sectionAudioQuality. - /// - /// In en, this message translates to: - /// **'Audio Quality'** - String get sectionAudioQuality; - - /// No description provided for @sectionFileSettings. - /// - /// In en, this message translates to: - /// **'File Settings'** - String get sectionFileSettings; - - /// No description provided for @sectionColor. - /// - /// In en, this message translates to: - /// **'Color'** - String get sectionColor; - - /// No description provided for @sectionTheme. - /// - /// In en, this message translates to: - /// **'Theme'** - String get sectionTheme; - - /// No description provided for @sectionLayout. - /// - /// In en, this message translates to: - /// **'Layout'** - String get sectionLayout; - - /// No description provided for @settingsAppearanceSubtitle. - /// - /// In en, this message translates to: - /// **'Theme, colors, display'** - String get settingsAppearanceSubtitle; - - /// No description provided for @settingsDownloadSubtitle. - /// - /// In en, this message translates to: - /// **'Service, quality, filename format'** - String get settingsDownloadSubtitle; - - /// No description provided for @settingsOptionsSubtitle. - /// - /// In en, this message translates to: - /// **'Fallback, lyrics, cover art, updates'** - String get settingsOptionsSubtitle; - - /// No description provided for @settingsExtensionsSubtitle. - /// - /// In en, this message translates to: - /// **'Manage download providers'** - String get settingsExtensionsSubtitle; - - /// No description provided for @settingsLogsSubtitle. - /// - /// In en, this message translates to: - /// **'View app logs for debugging'** - String get settingsLogsSubtitle; - - /// No description provided for @loadingSharedLink. - /// - /// In en, this message translates to: - /// **'Loading shared link...'** - String get loadingSharedLink; - - /// No description provided for @pressBackAgainToExit. - /// - /// In en, this message translates to: - /// **'Press back again to exit'** - String get pressBackAgainToExit; - - /// No description provided for @artistReleases. - /// - /// In en, this message translates to: - /// **'{count, plural, =1{1 release} other{{count} releases}}'** - String artistReleases(int count); - - /// No description provided for @artistCompilations. - /// - /// In en, this message translates to: - /// **'Compilations'** - String get artistCompilations; - - /// No description provided for @tracksHeader. - /// - /// In en, this message translates to: - /// **'Tracks'** - String get tracksHeader; - - /// No description provided for @downloadAllCount. - /// - /// In en, this message translates to: - /// **'Download All ({count})'** - String downloadAllCount(int count); - - /// No description provided for @tracksCount. - /// - /// In en, this message translates to: - /// **'{count, plural, =1{1 track} other{{count} tracks}}'** - String tracksCount(int count); - - /// No description provided for @setupStorageAccessRequired. - /// - /// In en, this message translates to: - /// **'Storage Access Required'** - String get setupStorageAccessRequired; - - /// No description provided for @setupStorageAccessMessage. - /// - /// In en, this message translates to: - /// **'SpotiFLAC needs \"All files access\" permission to save music files to your chosen folder.'** - String get setupStorageAccessMessage; - - /// No description provided for @setupStorageAccessMessageAndroid11. - /// - /// In en, this message translates to: - /// **'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'** - String get setupStorageAccessMessageAndroid11; - - /// No description provided for @setupOpenSettings. - /// - /// In en, this message translates to: - /// **'Open Settings'** - String get setupOpenSettings; - - /// No description provided for @setupPermissionDeniedMessage. - /// - /// In en, this message translates to: - /// **'Permission denied. Please grant all permissions to continue.'** - String get setupPermissionDeniedMessage; - - /// No description provided for @setupPermissionRequired. - /// - /// In en, this message translates to: - /// **'{permissionType} Permission Required'** - String setupPermissionRequired(String permissionType); - - /// No description provided for @setupPermissionRequiredMessage. - /// - /// In en, this message translates to: - /// **'{permissionType} permission is required for the best experience. You can change this later in Settings.'** - String setupPermissionRequiredMessage(String permissionType); - - /// No description provided for @setupSelectDownloadFolder. - /// - /// In en, this message translates to: - /// **'Select Download Folder'** - String get setupSelectDownloadFolder; - - /// No description provided for @setupUseDefaultFolder. - /// - /// In en, this message translates to: - /// **'Use Default Folder?'** - String get setupUseDefaultFolder; - - /// No description provided for @setupNoFolderSelected. - /// - /// In en, this message translates to: - /// **'No folder selected. Would you like to use the default Music folder?'** - String get setupNoFolderSelected; - - /// No description provided for @setupUseDefault. - /// - /// In en, this message translates to: - /// **'Use Default'** - String get setupUseDefault; - - /// No description provided for @setupDownloadLocationTitle. - /// - /// In en, this message translates to: - /// **'Download Location'** - String get setupDownloadLocationTitle; - - /// No description provided for @setupDownloadLocationIosMessage. - /// - /// In en, this message translates to: - /// **'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'** - String get setupDownloadLocationIosMessage; - - /// No description provided for @setupAppDocumentsFolder. - /// - /// In en, this message translates to: - /// **'App Documents Folder'** - String get setupAppDocumentsFolder; - - /// No description provided for @setupAppDocumentsFolderSubtitle. - /// - /// In en, this message translates to: - /// **'Recommended - accessible via Files app'** - String get setupAppDocumentsFolderSubtitle; - - /// No description provided for @setupChooseFromFiles. - /// - /// In en, this message translates to: - /// **'Choose from Files'** - String get setupChooseFromFiles; - - /// No description provided for @setupChooseFromFilesSubtitle. - /// - /// In en, this message translates to: - /// **'Select iCloud or other location'** - String get setupChooseFromFilesSubtitle; - - /// No description provided for @setupIosEmptyFolderWarning. - /// - /// In en, this message translates to: - /// **'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'** - String get setupIosEmptyFolderWarning; - - /// No description provided for @setupDownloadInFlac. - /// - /// In en, this message translates to: - /// **'Download Spotify tracks in FLAC'** - String get setupDownloadInFlac; - - /// No description provided for @setupStepStorage. - /// - /// In en, this message translates to: - /// **'Storage'** - String get setupStepStorage; - - /// No description provided for @setupStepNotification. - /// - /// In en, this message translates to: - /// **'Notification'** - String get setupStepNotification; - - /// No description provided for @setupStepFolder. - /// - /// In en, this message translates to: - /// **'Folder'** - String get setupStepFolder; - - /// No description provided for @setupStepSpotify. - /// - /// In en, this message translates to: - /// **'Spotify'** - String get setupStepSpotify; - - /// No description provided for @setupStepPermission. - /// - /// In en, this message translates to: - /// **'Permission'** - String get setupStepPermission; - - /// No description provided for @setupStorageGranted. - /// - /// In en, this message translates to: - /// **'Storage Permission Granted!'** - String get setupStorageGranted; - - /// No description provided for @setupStorageRequired. - /// - /// In en, this message translates to: - /// **'Storage Permission Required'** - String get setupStorageRequired; - - /// No description provided for @setupStorageDescription. - /// - /// In en, this message translates to: - /// **'SpotiFLAC needs storage permission to save your downloaded music files.'** - String get setupStorageDescription; - - /// No description provided for @setupNotificationGranted. - /// - /// In en, this message translates to: - /// **'Notification Permission Granted!'** - String get setupNotificationGranted; - - /// No description provided for @setupNotificationEnable. - /// - /// In en, this message translates to: - /// **'Enable Notifications'** - String get setupNotificationEnable; - - /// No description provided for @setupNotificationDescription. - /// - /// In en, this message translates to: - /// **'Get notified when downloads complete or require attention.'** - String get setupNotificationDescription; - - /// No description provided for @setupFolderSelected. - /// - /// In en, this message translates to: - /// **'Download Folder Selected!'** - String get setupFolderSelected; - - /// No description provided for @setupFolderChoose. - /// - /// In en, this message translates to: - /// **'Choose Download Folder'** - String get setupFolderChoose; - - /// No description provided for @setupFolderDescription. - /// - /// In en, this message translates to: - /// **'Select a folder where your downloaded music will be saved.'** - String get setupFolderDescription; - - /// No description provided for @setupChangeFolder. - /// - /// In en, this message translates to: - /// **'Change Folder'** - String get setupChangeFolder; - - /// No description provided for @setupSelectFolder. - /// - /// In en, this message translates to: - /// **'Select Folder'** - String get setupSelectFolder; - - /// No description provided for @setupSpotifyApiOptional. - /// - /// In en, this message translates to: - /// **'Spotify API (Optional)'** - String get setupSpotifyApiOptional; - - /// No description provided for @setupSpotifyApiDescription. - /// - /// In en, this message translates to: - /// **'Add your Spotify API credentials for better search results and access to Spotify-exclusive content.'** - String get setupSpotifyApiDescription; - - /// No description provided for @setupUseSpotifyApi. - /// - /// In en, this message translates to: - /// **'Use Spotify API'** - String get setupUseSpotifyApi; - - /// No description provided for @setupEnterCredentialsBelow. - /// - /// In en, this message translates to: - /// **'Enter your credentials below'** - String get setupEnterCredentialsBelow; - - /// No description provided for @setupUsingDeezer. - /// - /// In en, this message translates to: - /// **'Using Deezer (no account needed)'** - String get setupUsingDeezer; - - /// No description provided for @setupEnterClientId. - /// - /// In en, this message translates to: - /// **'Enter Spotify Client ID'** - String get setupEnterClientId; - - /// No description provided for @setupEnterClientSecret. - /// - /// In en, this message translates to: - /// **'Enter Spotify Client Secret'** - String get setupEnterClientSecret; - - /// No description provided for @setupGetFreeCredentials. - /// - /// In en, this message translates to: - /// **'Get your free API credentials from the Spotify Developer Dashboard.'** - String get setupGetFreeCredentials; - - /// No description provided for @setupEnableNotifications. - /// - /// In en, this message translates to: - /// **'Enable Notifications'** - String get setupEnableNotifications; - - /// No description provided for @dialogImport. - /// - /// In en, this message translates to: - /// **'Import'** - String get dialogImport; - - /// No description provided for @dialogDiscard. - /// - /// In en, this message translates to: - /// **'Discard'** - String get dialogDiscard; - - /// No description provided for @dialogRemove. - /// - /// In en, this message translates to: - /// **'Remove'** - String get dialogRemove; - - /// No description provided for @dialogUninstall. - /// - /// In en, this message translates to: - /// **'Uninstall'** - String get dialogUninstall; - - /// No description provided for @dialogDiscardChanges. - /// - /// In en, this message translates to: - /// **'Discard Changes?'** - String get dialogDiscardChanges; - - /// No description provided for @dialogUnsavedChanges. - /// - /// In en, this message translates to: - /// **'You have unsaved changes. Do you want to discard them?'** - String get dialogUnsavedChanges; - - /// No description provided for @dialogDownloadFailed. - /// - /// In en, this message translates to: - /// **'Download Failed'** - String get dialogDownloadFailed; - - /// No description provided for @dialogTrackLabel. - /// - /// In en, this message translates to: - /// **'Track:'** - String get dialogTrackLabel; - - /// No description provided for @dialogArtistLabel. - /// - /// In en, this message translates to: - /// **'Artist:'** - String get dialogArtistLabel; - - /// No description provided for @dialogErrorLabel. - /// - /// In en, this message translates to: - /// **'Error:'** - String get dialogErrorLabel; - - /// No description provided for @dialogClearAll. - /// - /// In en, this message translates to: - /// **'Clear All'** - String get dialogClearAll; - - /// No description provided for @dialogClearAllDownloads. - /// - /// In en, this message translates to: - /// **'Are you sure you want to clear all downloads?'** - String get dialogClearAllDownloads; - - /// No description provided for @dialogRemoveFromDevice. - /// - /// In en, this message translates to: - /// **'Remove from device?'** - String get dialogRemoveFromDevice; - - /// No description provided for @dialogRemoveExtension. - /// - /// In en, this message translates to: - /// **'Remove Extension'** - String get dialogRemoveExtension; - - /// No description provided for @dialogRemoveExtensionMessage. - /// - /// In en, this message translates to: - /// **'Are you sure you want to remove this extension? This cannot be undone.'** - String get dialogRemoveExtensionMessage; - - /// No description provided for @dialogUninstallExtension. - /// - /// In en, this message translates to: - /// **'Uninstall Extension?'** - String get dialogUninstallExtension; - - /// No description provided for @dialogUninstallExtensionMessage. - /// - /// In en, this message translates to: - /// **'Are you sure you want to remove {extensionName}?'** - String dialogUninstallExtensionMessage(String extensionName); - - /// No description provided for @snackbarFailedToLoad. - /// - /// In en, this message translates to: - /// **'Failed to load: {error}'** - String snackbarFailedToLoad(String error); - - /// No description provided for @snackbarUrlCopied. - /// - /// In en, this message translates to: - /// **'{platform} URL copied to clipboard'** - String snackbarUrlCopied(String platform); - - /// No description provided for @snackbarFileNotFound. - /// - /// In en, this message translates to: - /// **'File not found'** - String get snackbarFileNotFound; - - /// No description provided for @snackbarSelectExtFile. - /// - /// In en, this message translates to: - /// **'Please select a .spotiflac-ext file'** - String get snackbarSelectExtFile; - - /// No description provided for @snackbarProviderPrioritySaved. - /// - /// In en, this message translates to: - /// **'Provider priority saved'** - String get snackbarProviderPrioritySaved; - - /// No description provided for @snackbarMetadataProviderSaved. - /// - /// In en, this message translates to: - /// **'Metadata provider priority saved'** - String get snackbarMetadataProviderSaved; - - /// No description provided for @snackbarExtensionInstalled. - /// - /// In en, this message translates to: - /// **'{extensionName} installed.'** - String snackbarExtensionInstalled(String extensionName); - - /// No description provided for @snackbarExtensionUpdated. - /// - /// In en, this message translates to: - /// **'{extensionName} updated.'** - String snackbarExtensionUpdated(String extensionName); - - /// No description provided for @snackbarFailedToInstall. - /// - /// In en, this message translates to: - /// **'Failed to install extension'** - String get snackbarFailedToInstall; - - /// No description provided for @snackbarFailedToUpdate. - /// - /// In en, this message translates to: - /// **'Failed to update extension'** - String get snackbarFailedToUpdate; - - /// No description provided for @storeFilterAll. - /// - /// In en, this message translates to: - /// **'All'** - String get storeFilterAll; - - /// No description provided for @storeFilterMetadata. - /// - /// In en, this message translates to: - /// **'Metadata'** - String get storeFilterMetadata; - - /// No description provided for @storeFilterDownload. - /// - /// In en, this message translates to: - /// **'Download'** - String get storeFilterDownload; - - /// No description provided for @storeFilterUtility. - /// - /// In en, this message translates to: - /// **'Utility'** - String get storeFilterUtility; - - /// No description provided for @storeFilterLyrics. - /// - /// In en, this message translates to: - /// **'Lyrics'** - String get storeFilterLyrics; - - /// No description provided for @storeFilterIntegration. - /// - /// In en, this message translates to: - /// **'Integration'** - String get storeFilterIntegration; - - /// No description provided for @storeClearFilters. - /// - /// In en, this message translates to: - /// **'Clear filters'** - String get storeClearFilters; - - /// No description provided for @storeNoResults. - /// - /// In en, this message translates to: - /// **'No extensions found'** - String get storeNoResults; - - /// No description provided for @extensionProviderPriority. - /// - /// In en, this message translates to: - /// **'Provider Priority'** - String get extensionProviderPriority; - - /// No description provided for @extensionInstallButton. - /// - /// In en, this message translates to: - /// **'Install Extension'** - String get extensionInstallButton; - - /// No description provided for @extensionDefaultProvider. - /// - /// In en, this message translates to: - /// **'Default (Deezer/Spotify)'** - String get extensionDefaultProvider; - - /// No description provided for @extensionDefaultProviderSubtitle. - /// - /// In en, this message translates to: - /// **'Use built-in search'** - String get extensionDefaultProviderSubtitle; - - /// No description provided for @extensionAuthor. - /// - /// In en, this message translates to: - /// **'Author'** - String get extensionAuthor; - - /// No description provided for @extensionId. - /// - /// In en, this message translates to: - /// **'ID'** - String get extensionId; - - /// No description provided for @extensionError. - /// - /// In en, this message translates to: - /// **'Error'** - String get extensionError; - - /// No description provided for @extensionCapabilities. - /// - /// In en, this message translates to: - /// **'Capabilities'** - String get extensionCapabilities; - - /// No description provided for @extensionMetadataProvider. - /// - /// In en, this message translates to: - /// **'Metadata Provider'** - String get extensionMetadataProvider; - - /// No description provided for @extensionDownloadProvider. - /// - /// In en, this message translates to: - /// **'Download Provider'** - String get extensionDownloadProvider; - - /// No description provided for @extensionLyricsProvider. - /// - /// In en, this message translates to: - /// **'Lyrics Provider'** - String get extensionLyricsProvider; - - /// No description provided for @extensionUrlHandler. - /// - /// In en, this message translates to: - /// **'URL Handler'** - String get extensionUrlHandler; - - /// No description provided for @extensionQualityOptions. - /// - /// In en, this message translates to: - /// **'Quality Options'** - String get extensionQualityOptions; - - /// No description provided for @extensionPostProcessingHooks. - /// - /// In en, this message translates to: - /// **'Post-Processing Hooks'** - String get extensionPostProcessingHooks; - - /// No description provided for @extensionPermissions. - /// - /// In en, this message translates to: - /// **'Permissions'** - String get extensionPermissions; - - /// No description provided for @extensionSettings. - /// - /// In en, this message translates to: - /// **'Settings'** - String get extensionSettings; - - /// No description provided for @extensionRemoveButton. - /// - /// In en, this message translates to: - /// **'Remove Extension'** - String get extensionRemoveButton; - - /// No description provided for @extensionUpdated. - /// - /// In en, this message translates to: - /// **'Updated'** - String get extensionUpdated; - - /// No description provided for @extensionMinAppVersion. - /// - /// In en, this message translates to: - /// **'Min App Version'** - String get extensionMinAppVersion; - - /// No description provided for @qualityFlacLossless. - /// - /// In en, this message translates to: - /// **'FLAC Lossless'** - String get qualityFlacLossless; - - /// No description provided for @qualityFlacLosslessSubtitle. - /// - /// In en, this message translates to: - /// **'16-bit / 44.1kHz'** - String get qualityFlacLosslessSubtitle; - - /// No description provided for @qualityHiResFlac. - /// - /// In en, this message translates to: - /// **'Hi-Res FLAC'** - String get qualityHiResFlac; - - /// No description provided for @qualityHiResFlacSubtitle. - /// - /// In en, this message translates to: - /// **'24-bit / up to 96kHz'** - String get qualityHiResFlacSubtitle; - - /// No description provided for @qualityHiResFlacMax. - /// - /// In en, this message translates to: - /// **'Hi-Res FLAC Max'** - String get qualityHiResFlacMax; - - /// No description provided for @qualityHiResFlacMaxSubtitle. - /// - /// In en, this message translates to: - /// **'24-bit / up to 192kHz'** - String get qualityHiResFlacMaxSubtitle; - - /// No description provided for @qualityNote. - /// - /// In en, this message translates to: - /// **'Actual quality depends on track availability from the service'** - String get qualityNote; - - /// No description provided for @downloadAskBeforeDownload. - /// - /// In en, this message translates to: - /// **'Ask Before Download'** - String get downloadAskBeforeDownload; - - /// No description provided for @downloadDirectory. - /// - /// In en, this message translates to: - /// **'Download Directory'** - String get downloadDirectory; - - /// No description provided for @downloadSeparateSinglesFolder. - /// - /// In en, this message translates to: - /// **'Separate Singles Folder'** - String get downloadSeparateSinglesFolder; - - /// No description provided for @downloadAlbumFolderStructure. - /// - /// In en, this message translates to: - /// **'Album Folder Structure'** - String get downloadAlbumFolderStructure; - - /// No description provided for @downloadSaveFormat. - /// - /// In en, this message translates to: - /// **'Save Format'** - String get downloadSaveFormat; - - /// No description provided for @downloadSelectService. - /// - /// In en, this message translates to: - /// **'Select Service'** - String get downloadSelectService; - - /// No description provided for @downloadSelectQuality. - /// - /// In en, this message translates to: - /// **'Select Quality'** - String get downloadSelectQuality; - - /// No description provided for @downloadFrom. - /// - /// In en, this message translates to: - /// **'Download From'** - String get downloadFrom; - - /// No description provided for @downloadDefaultQualityLabel. - /// - /// In en, this message translates to: - /// **'Default Quality'** - String get downloadDefaultQualityLabel; - - /// No description provided for @downloadBestAvailable. - /// - /// In en, this message translates to: - /// **'Best available'** - String get downloadBestAvailable; - - /// No description provided for @folderNone. - /// - /// In en, this message translates to: - /// **'None'** - String get folderNone; - - /// No description provided for @folderNoneSubtitle. - /// - /// In en, this message translates to: - /// **'Save all files directly to download folder'** - String get folderNoneSubtitle; - - /// No description provided for @folderArtist. - /// - /// In en, this message translates to: - /// **'Artist'** - String get folderArtist; - - /// No description provided for @folderArtistSubtitle. - /// - /// In en, this message translates to: - /// **'Artist Name/filename'** - String get folderArtistSubtitle; - - /// No description provided for @folderAlbum. - /// - /// In en, this message translates to: - /// **'Album'** - String get folderAlbum; - - /// No description provided for @folderAlbumSubtitle. - /// - /// In en, this message translates to: - /// **'Album Name/filename'** - String get folderAlbumSubtitle; - - /// No description provided for @folderArtistAlbum. - /// - /// In en, this message translates to: - /// **'Artist/Album'** - String get folderArtistAlbum; - - /// No description provided for @folderArtistAlbumSubtitle. - /// - /// In en, this message translates to: - /// **'Artist Name/Album Name/filename'** - String get folderArtistAlbumSubtitle; - - /// No description provided for @serviceTidal. - /// - /// In en, this message translates to: - /// **'Tidal'** - String get serviceTidal; - - /// No description provided for @serviceQobuz. - /// - /// In en, this message translates to: - /// **'Qobuz'** - String get serviceQobuz; - - /// No description provided for @serviceAmazon. - /// - /// In en, this message translates to: - /// **'Amazon'** - String get serviceAmazon; - - /// No description provided for @serviceDeezer. - /// - /// In en, this message translates to: - /// **'Deezer'** - String get serviceDeezer; - - /// No description provided for @serviceSpotify. - /// - /// In en, this message translates to: - /// **'Spotify'** - String get serviceSpotify; - - /// No description provided for @logSearchHint. - /// - /// In en, this message translates to: - /// **'Search logs...'** - String get logSearchHint; - - /// No description provided for @logFilterLevel. - /// - /// In en, this message translates to: - /// **'Level'** - String get logFilterLevel; - - /// No description provided for @logFilterSection. - /// - /// In en, this message translates to: - /// **'Filter'** - String get logFilterSection; - - /// No description provided for @logShareLogs. - /// - /// In en, this message translates to: - /// **'Share logs'** - String get logShareLogs; - - /// No description provided for @logClearLogs. - /// - /// In en, this message translates to: - /// **'Clear logs'** - String get logClearLogs; - - /// No description provided for @logClearLogsTitle. - /// - /// In en, this message translates to: - /// **'Clear Logs'** - String get logClearLogsTitle; - - /// No description provided for @logClearLogsMessage. - /// - /// In en, this message translates to: - /// **'Are you sure you want to clear all logs?'** - String get logClearLogsMessage; - - /// No description provided for @logIspBlocking. - /// - /// In en, this message translates to: - /// **'ISP BLOCKING DETECTED'** - String get logIspBlocking; - - /// No description provided for @logRateLimited. - /// - /// In en, this message translates to: - /// **'RATE LIMITED'** - String get logRateLimited; - - /// No description provided for @logNetworkError. - /// - /// In en, this message translates to: - /// **'NETWORK ERROR'** - String get logNetworkError; - - /// No description provided for @logTrackNotFound. - /// - /// In en, this message translates to: - /// **'TRACK NOT FOUND'** - String get logTrackNotFound; - - /// No description provided for @appearanceAmoledDark. - /// - /// In en, this message translates to: - /// **'AMOLED Dark'** - String get appearanceAmoledDark; - - /// No description provided for @appearanceAmoledDarkSubtitle. - /// - /// In en, this message translates to: - /// **'Pure black background'** - String get appearanceAmoledDarkSubtitle; - - /// No description provided for @appearanceChooseAccentColor. - /// - /// In en, this message translates to: - /// **'Choose Accent Color'** - String get appearanceChooseAccentColor; - - /// No description provided for @appearanceChooseTheme. - /// - /// In en, this message translates to: - /// **'Theme Mode'** - String get appearanceChooseTheme; - - /// No description provided for @updateStartingDownload. - /// - /// In en, this message translates to: - /// **'Starting download...'** - String get updateStartingDownload; - - /// No description provided for @updateDownloadFailed. - /// - /// In en, this message translates to: - /// **'Download failed'** - String get updateDownloadFailed; - - /// No description provided for @updateFailedMessage. - /// - /// In en, this message translates to: - /// **'Failed to download update'** - String get updateFailedMessage; - - /// No description provided for @updateNewVersionReady. - /// - /// In en, this message translates to: - /// **'A new version is ready'** - String get updateNewVersionReady; - - /// No description provided for @updateCurrent. - /// - /// In en, this message translates to: - /// **'Current'** - String get updateCurrent; - - /// No description provided for @updateNew. - /// - /// In en, this message translates to: - /// **'New'** - String get updateNew; - - /// No description provided for @updateDownloading. - /// - /// In en, this message translates to: - /// **'Downloading...'** - String get updateDownloading; - - /// No description provided for @updateWhatsNew. - /// - /// In en, this message translates to: - /// **'What\'s New'** - String get updateWhatsNew; - - /// No description provided for @updateDownloadInstall. - /// - /// In en, this message translates to: - /// **'Download & Install'** - String get updateDownloadInstall; - - /// No description provided for @updateDontRemind. - /// - /// In en, this message translates to: - /// **'Don\'t remind'** - String get updateDontRemind; - - /// No description provided for @trackCopyFilePath. - /// - /// In en, this message translates to: - /// **'Copy file path'** - String get trackCopyFilePath; - - /// No description provided for @trackRemoveFromDevice. - /// - /// In en, this message translates to: - /// **'Remove from device'** - String get trackRemoveFromDevice; - - /// No description provided for @trackLoadLyrics. - /// - /// In en, this message translates to: - /// **'Load Lyrics'** - String get trackLoadLyrics; - - /// No description provided for @dateToday. - /// - /// In en, this message translates to: - /// **'Today'** - String get dateToday; - - /// No description provided for @dateYesterday. - /// - /// In en, this message translates to: - /// **'Yesterday'** - String get dateYesterday; - - /// No description provided for @dateDaysAgo. - /// - /// In en, this message translates to: - /// **'{count} days ago'** - String dateDaysAgo(int count); - - /// No description provided for @dateWeeksAgo. - /// - /// In en, this message translates to: - /// **'{count} weeks ago'** - String dateWeeksAgo(int count); - - /// No description provided for @dateMonthsAgo. - /// - /// In en, this message translates to: - /// **'{count} months ago'** - String dateMonthsAgo(int count); - - /// No description provided for @concurrentSequential. - /// - /// In en, this message translates to: - /// **'Sequential'** - String get concurrentSequential; - - /// No description provided for @concurrentParallel2. - /// - /// In en, this message translates to: - /// **'2 Parallel'** - String get concurrentParallel2; - - /// No description provided for @concurrentParallel3. - /// - /// In en, this message translates to: - /// **'3 Parallel'** - String get concurrentParallel3; - - /// No description provided for @filenameAvailablePlaceholders. - /// - /// In en, this message translates to: - /// **'Available placeholders:'** - String get filenameAvailablePlaceholders; - - /// No description provided for @filenameHint. - /// - /// In en, this message translates to: - /// **'{artist} - {title}'** - String filenameHint(Object artist, Object title); - - /// No description provided for @tapToSeeError. - /// - /// In en, this message translates to: - /// **'Tap to see error details'** - String get tapToSeeError; - - /// No description provided for @setupProceedToNextStep. - /// - /// In en, this message translates to: - /// **'You can now proceed to the next step.'** - String get setupProceedToNextStep; - - /// No description provided for @setupNotificationProgressDescription. - /// - /// In en, this message translates to: - /// **'You will receive download progress notifications.'** - String get setupNotificationProgressDescription; - - /// No description provided for @setupNotificationBackgroundDescription. - /// - /// In en, this message translates to: - /// **'Get notified about download progress and completion. This helps you track downloads when the app is in background.'** - String get setupNotificationBackgroundDescription; - - /// No description provided for @setupSkipForNow. - /// - /// In en, this message translates to: - /// **'Skip for now'** - String get setupSkipForNow; - - /// No description provided for @setupBack. - /// - /// In en, this message translates to: - /// **'Back'** - String get setupBack; - - /// No description provided for @setupNext. - /// - /// In en, this message translates to: - /// **'Next'** - String get setupNext; - - /// No description provided for @setupGetStarted. - /// - /// In en, this message translates to: - /// **'Get Started'** - String get setupGetStarted; - - /// No description provided for @setupSkipAndStart. - /// - /// In en, this message translates to: - /// **'Skip & Start'** - String get setupSkipAndStart; - - /// No description provided for @setupAllowAccessToManageFiles. - /// - /// In en, this message translates to: - /// **'Please enable \"Allow access to manage all files\" in the next screen.'** - String get setupAllowAccessToManageFiles; - - /// No description provided for @setupGetCredentialsFromSpotify. - /// - /// In en, this message translates to: - /// **'Get credentials from developer.spotify.com'** - String get setupGetCredentialsFromSpotify; - - /// No description provided for @trackMetadata. - /// - /// In en, this message translates to: - /// **'Metadata'** - String get trackMetadata; - - /// No description provided for @trackFileInfo. - /// - /// In en, this message translates to: - /// **'File Info'** - String get trackFileInfo; - - /// No description provided for @trackLyrics. - /// - /// In en, this message translates to: - /// **'Lyrics'** - String get trackLyrics; - - /// No description provided for @trackFileNotFound. - /// - /// In en, this message translates to: - /// **'File not found'** - String get trackFileNotFound; - - /// No description provided for @trackOpenInDeezer. - /// - /// In en, this message translates to: - /// **'Open in Deezer'** - String get trackOpenInDeezer; - - /// No description provided for @trackOpenInSpotify. - /// - /// In en, this message translates to: - /// **'Open in Spotify'** - String get trackOpenInSpotify; - - /// No description provided for @trackTrackName. - /// - /// In en, this message translates to: - /// **'Track name'** - String get trackTrackName; - - /// No description provided for @trackArtist. - /// - /// In en, this message translates to: - /// **'Artist'** - String get trackArtist; - - /// No description provided for @trackAlbumArtist. - /// - /// In en, this message translates to: - /// **'Album artist'** - String get trackAlbumArtist; - - /// No description provided for @trackAlbum. - /// - /// In en, this message translates to: - /// **'Album'** - String get trackAlbum; - - /// No description provided for @trackTrackNumber. - /// - /// In en, this message translates to: - /// **'Track number'** - String get trackTrackNumber; - - /// No description provided for @trackDiscNumber. - /// - /// In en, this message translates to: - /// **'Disc number'** - String get trackDiscNumber; - - /// No description provided for @trackDuration. - /// - /// In en, this message translates to: - /// **'Duration'** - String get trackDuration; - - /// No description provided for @trackAudioQuality. - /// - /// In en, this message translates to: - /// **'Audio quality'** - String get trackAudioQuality; - - /// No description provided for @trackReleaseDate. - /// - /// In en, this message translates to: - /// **'Release date'** - String get trackReleaseDate; - - /// No description provided for @trackDownloaded. - /// - /// In en, this message translates to: - /// **'Downloaded'** - String get trackDownloaded; - - /// No description provided for @trackCopyLyrics. - /// - /// In en, this message translates to: - /// **'Copy lyrics'** - String get trackCopyLyrics; - - /// No description provided for @trackLyricsNotAvailable. - /// - /// In en, this message translates to: - /// **'Lyrics not available for this track'** - String get trackLyricsNotAvailable; - - /// No description provided for @trackLyricsTimeout. - /// - /// In en, this message translates to: - /// **'Request timed out. Try again later.'** - String get trackLyricsTimeout; - - /// No description provided for @trackLyricsLoadFailed. - /// - /// In en, this message translates to: - /// **'Failed to load lyrics'** - String get trackLyricsLoadFailed; - - /// No description provided for @trackCopiedToClipboard. - /// - /// In en, this message translates to: - /// **'Copied to clipboard'** - String get trackCopiedToClipboard; - - /// No description provided for @trackDeleteConfirmTitle. - /// - /// In en, this message translates to: - /// **'Remove from device?'** - String get trackDeleteConfirmTitle; - - /// No description provided for @trackDeleteConfirmMessage. - /// - /// In en, this message translates to: - /// **'This will permanently delete the downloaded file and remove it from your history.'** - String get trackDeleteConfirmMessage; - - /// No description provided for @trackCannotOpen. - /// - /// In en, this message translates to: - /// **'Cannot open: {message}'** - String trackCannotOpen(String message); - - /// No description provided for @logFilterBySeverity. - /// - /// In en, this message translates to: - /// **'Filter logs by severity'** - String get logFilterBySeverity; - - /// No description provided for @logNoLogsYet. - /// - /// In en, this message translates to: - /// **'No logs yet'** - String get logNoLogsYet; - - /// No description provided for @logNoLogsYetSubtitle. - /// - /// In en, this message translates to: - /// **'Logs will appear here as you use the app'** - String get logNoLogsYetSubtitle; - - /// No description provided for @logIssueSummary. - /// - /// In en, this message translates to: - /// **'Issue Summary'** - String get logIssueSummary; - - /// No description provided for @logIspBlockingDescription. - /// - /// In en, this message translates to: - /// **'Your ISP may be blocking access to download services'** - String get logIspBlockingDescription; - - /// No description provided for @logIspBlockingSuggestion. - /// - /// In en, this message translates to: - /// **'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'** - String get logIspBlockingSuggestion; - - /// No description provided for @logRateLimitedDescription. - /// - /// In en, this message translates to: - /// **'Too many requests to the service'** - String get logRateLimitedDescription; - - /// No description provided for @logRateLimitedSuggestion. - /// - /// In en, this message translates to: - /// **'Wait a few minutes before trying again'** - String get logRateLimitedSuggestion; - - /// No description provided for @logNetworkErrorDescription. - /// - /// In en, this message translates to: - /// **'Connection issues detected'** - String get logNetworkErrorDescription; - - /// No description provided for @logNetworkErrorSuggestion. - /// - /// In en, this message translates to: - /// **'Check your internet connection'** - String get logNetworkErrorSuggestion; - - /// No description provided for @logTrackNotFoundDescription. - /// - /// In en, this message translates to: - /// **'Some tracks could not be found on download services'** - String get logTrackNotFoundDescription; - - /// No description provided for @logTrackNotFoundSuggestion. - /// - /// In en, this message translates to: - /// **'The track may not be available in lossless quality'** - String get logTrackNotFoundSuggestion; - - /// No description provided for @logTotalErrors. - /// - /// In en, this message translates to: - /// **'Total errors: {count}'** - String logTotalErrors(int count); - - /// No description provided for @logAffected. - /// - /// In en, this message translates to: - /// **'Affected: {domains}'** - String logAffected(String domains); - - /// No description provided for @logEntriesFiltered. - /// - /// In en, this message translates to: - /// **'Entries ({count} filtered)'** - String logEntriesFiltered(int count); - - /// No description provided for @logEntries. - /// - /// In en, this message translates to: - /// **'Entries ({count})'** - String logEntries(int count); - - /// No description provided for @extensionsProviderPrioritySection. - /// - /// In en, this message translates to: - /// **'Provider Priority'** - String get extensionsProviderPrioritySection; - - /// No description provided for @extensionsInstalledSection. - /// - /// In en, this message translates to: - /// **'Installed Extensions'** - String get extensionsInstalledSection; - - /// No description provided for @extensionsNoExtensions. - /// - /// In en, this message translates to: - /// **'No extensions installed'** - String get extensionsNoExtensions; - - /// No description provided for @extensionsNoExtensionsSubtitle. - /// - /// In en, this message translates to: - /// **'Install .spotiflac-ext files to add new providers'** - String get extensionsNoExtensionsSubtitle; - - /// No description provided for @extensionsInstallButton. - /// - /// In en, this message translates to: - /// **'Install Extension'** - String get extensionsInstallButton; - - /// No description provided for @extensionsInfoTip. - /// - /// In en, this message translates to: - /// **'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'** - String get extensionsInfoTip; - - /// No description provided for @extensionsInstalledSuccess. - /// - /// In en, this message translates to: - /// **'Extension installed successfully'** - String get extensionsInstalledSuccess; - - /// No description provided for @extensionsDownloadPriority. - /// - /// In en, this message translates to: - /// **'Download Priority'** - String get extensionsDownloadPriority; - - /// No description provided for @extensionsDownloadPrioritySubtitle. - /// - /// In en, this message translates to: - /// **'Set download service order'** - String get extensionsDownloadPrioritySubtitle; - - /// No description provided for @extensionsNoDownloadProvider. - /// - /// In en, this message translates to: - /// **'No extensions with download provider'** - String get extensionsNoDownloadProvider; - - /// No description provided for @extensionsMetadataPriority. - /// - /// In en, this message translates to: - /// **'Metadata Priority'** - String get extensionsMetadataPriority; - - /// No description provided for @extensionsMetadataPrioritySubtitle. - /// - /// In en, this message translates to: - /// **'Set search & metadata source order'** - String get extensionsMetadataPrioritySubtitle; - - /// No description provided for @extensionsNoMetadataProvider. - /// - /// In en, this message translates to: - /// **'No extensions with metadata provider'** - String get extensionsNoMetadataProvider; - - /// No description provided for @extensionsSearchProvider. - /// - /// In en, this message translates to: - /// **'Search Provider'** - String get extensionsSearchProvider; - - /// No description provided for @extensionsNoCustomSearch. - /// - /// In en, this message translates to: - /// **'No extensions with custom search'** - String get extensionsNoCustomSearch; - - /// No description provided for @extensionsSearchProviderDescription. - /// - /// In en, this message translates to: - /// **'Choose which service to use for searching tracks'** - String get extensionsSearchProviderDescription; - - /// No description provided for @extensionsCustomSearch. - /// - /// In en, this message translates to: - /// **'Custom search'** - String get extensionsCustomSearch; - - /// No description provided for @extensionsErrorLoading. - /// - /// In en, this message translates to: - /// **'Error loading extension'** - String get extensionsErrorLoading; - - /// No description provided for @extensionCustomTrackMatching. - /// - /// In en, this message translates to: - /// **'Custom Track Matching'** - String get extensionCustomTrackMatching; - - /// No description provided for @extensionPostProcessing. - /// - /// In en, this message translates to: - /// **'Post-Processing'** - String get extensionPostProcessing; - - /// No description provided for @extensionHooksAvailable. - /// - /// In en, this message translates to: - /// **'{count} hook(s) available'** - String extensionHooksAvailable(int count); - - /// No description provided for @extensionPatternsCount. - /// - /// In en, this message translates to: - /// **'{count} pattern(s)'** - String extensionPatternsCount(int count); - - /// No description provided for @extensionStrategy. - /// - /// In en, this message translates to: - /// **'Strategy: {strategy}'** - String extensionStrategy(String strategy); - - /// No description provided for @aboutDoubleDouble. - /// - /// In en, this message translates to: - /// **'DoubleDouble'** - String get aboutDoubleDouble; - - /// No description provided for @aboutDoubleDoubleDesc. - /// - /// In en, this message translates to: - /// **'Amazing API for Amazon Music downloads. Thank you for making it free!'** - String get aboutDoubleDoubleDesc; - - /// No description provided for @aboutDabMusic. - /// - /// In en, this message translates to: - /// **'DAB Music'** - String get aboutDabMusic; - - /// No description provided for @aboutDabMusicDesc. - /// - /// In en, this message translates to: - /// **'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'** - String get aboutDabMusicDesc; - - /// No description provided for @queueTitle. - /// - /// In en, this message translates to: - /// **'Download Queue'** - String get queueTitle; - - /// No description provided for @queueClearAll. - /// - /// In en, this message translates to: - /// **'Clear All'** - String get queueClearAll; - - /// No description provided for @queueClearAllMessage. - /// - /// In en, this message translates to: - /// **'Are you sure you want to clear all downloads?'** - String get queueClearAllMessage; - - /// No description provided for @albumFolderArtistAlbum. - /// - /// In en, this message translates to: - /// **'Artist / Album'** - String get albumFolderArtistAlbum; - - /// No description provided for @albumFolderArtistAlbumSubtitle. - /// - /// In en, this message translates to: - /// **'Albums/Artist Name/Album Name/'** - String get albumFolderArtistAlbumSubtitle; - - /// No description provided for @albumFolderArtistYearAlbum. - /// - /// In en, this message translates to: - /// **'Artist / [Year] Album'** - String get albumFolderArtistYearAlbum; - - /// No description provided for @albumFolderArtistYearAlbumSubtitle. - /// - /// In en, this message translates to: - /// **'Albums/Artist Name/[2005] Album Name/'** - String get albumFolderArtistYearAlbumSubtitle; - - /// No description provided for @albumFolderAlbumOnly. - /// - /// In en, this message translates to: - /// **'Album Only'** - String get albumFolderAlbumOnly; - - /// No description provided for @albumFolderAlbumOnlySubtitle. - /// - /// In en, this message translates to: - /// **'Albums/Album Name/'** - String get albumFolderAlbumOnlySubtitle; - - /// No description provided for @albumFolderYearAlbum. - /// - /// In en, this message translates to: - /// **'[Year] Album'** - String get albumFolderYearAlbum; - - /// No description provided for @albumFolderYearAlbumSubtitle. - /// - /// In en, this message translates to: - /// **'Albums/[2005] Album Name/'** - String get albumFolderYearAlbumSubtitle; - - /// No description provided for @downloadedAlbumDeleteSelected. - /// - /// In en, this message translates to: - /// **'Delete Selected'** - String get downloadedAlbumDeleteSelected; - - /// No description provided for @downloadedAlbumDeleteMessage. - /// - /// In en, this message translates to: - /// **'Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.'** - String downloadedAlbumDeleteMessage(int count); - - /// No description provided for @utilityFunctions. - /// - /// In en, this message translates to: - /// **'Utility Functions'** - String get utilityFunctions; - - /// No description provided for @aboutBinimumDesc. + /// Credit description for binimum /// /// In en, this message translates to: /// **'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'** String get aboutBinimumDesc; - /// No description provided for @aboutSachinsenalDesc. + /// Credit description for sachinsenal0x64 /// /// In en, this message translates to: /// **'The original HiFi project creator. The foundation of Tidal integration!'** String get aboutSachinsenalDesc; - /// No description provided for @aboutAppDescription. + /// Name of Amazon API service - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'DoubleDouble'** + String get aboutDoubleDouble; + + /// Credit for DoubleDouble API + /// + /// In en, this message translates to: + /// **'Amazing API for Amazon Music downloads. Thank you for making it free!'** + String get aboutDoubleDoubleDesc; + + /// Name of Qobuz API service - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'DAB Music'** + String get aboutDabMusic; + + /// Credit for DAB Music API + /// + /// In en, this message translates to: + /// **'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'** + String get aboutDabMusicDesc; + + /// App description in header card /// /// In en, this message translates to: /// **'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'** String get aboutAppDescription; - /// No description provided for @providerPriorityTitle. + /// Album screen title /// /// In en, this message translates to: - /// **'Provider Priority'** - String get providerPriorityTitle; + /// **'Album'** + String get albumTitle; - /// No description provided for @providerPriorityDescription. + /// Album track count /// /// In en, this message translates to: - /// **'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'** - String get providerPriorityDescription; + /// **'{count, plural, =1{1 track} other{{count} tracks}}'** + String albumTracks(int count); - /// No description provided for @providerPriorityInfo. + /// Button to download all tracks /// /// In en, this message translates to: - /// **'If a track is not available on the first provider, the app will automatically try the next one.'** - String get providerPriorityInfo; + /// **'Download All'** + String get albumDownloadAll; - /// No description provided for @providerBuiltIn. + /// Button to download remaining tracks /// /// In en, this message translates to: - /// **'Built-in'** - String get providerBuiltIn; + /// **'Download Remaining'** + String get albumDownloadRemaining; - /// No description provided for @providerExtension. + /// Playlist screen title /// /// In en, this message translates to: - /// **'Extension'** - String get providerExtension; + /// **'Playlist'** + String get playlistTitle; - /// No description provided for @metadataProviderPriorityTitle. + /// Artist screen title /// /// In en, this message translates to: - /// **'Metadata Priority'** - String get metadataProviderPriorityTitle; + /// **'Artist'** + String get artistTitle; - /// No description provided for @metadataProviderPriorityDescription. + /// Section header for artist albums /// /// In en, this message translates to: - /// **'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'** - String get metadataProviderPriorityDescription; + /// **'Albums'** + String get artistAlbums; - /// No description provided for @metadataProviderPriorityInfo. + /// Section header for singles/EPs /// /// In en, this message translates to: - /// **'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'** - String get metadataProviderPriorityInfo; + /// **'Singles & EPs'** + String get artistSingles; - /// No description provided for @metadataNoRateLimits. + /// Section header for compilations /// /// In en, this message translates to: - /// **'No rate limits'** - String get metadataNoRateLimits; + /// **'Compilations'** + String get artistCompilations; - /// No description provided for @metadataMayRateLimit. + /// Artist release count /// /// In en, this message translates to: - /// **'May rate limit'** - String get metadataMayRateLimit; + /// **'{count, plural, =1{1 release} other{{count} releases}}'** + String artistReleases(int count); - /// No description provided for @queueEmpty. + /// Track metadata screen title /// /// In en, this message translates to: - /// **'No downloads in queue'** - String get queueEmpty; + /// **'Track Info'** + String get trackMetadataTitle; - /// No description provided for @queueEmptySubtitle. + /// Metadata field - artist name /// /// In en, this message translates to: - /// **'Add tracks from the home screen'** - String get queueEmptySubtitle; + /// **'Artist'** + String get trackMetadataArtist; - /// No description provided for @queueClearCompleted. + /// Metadata field - album name /// /// In en, this message translates to: - /// **'Clear completed'** - String get queueClearCompleted; + /// **'Album'** + String get trackMetadataAlbum; - /// No description provided for @queueDownloadFailed. + /// Metadata field - track length + /// + /// In en, this message translates to: + /// **'Duration'** + String get trackMetadataDuration; + + /// Metadata field - audio quality + /// + /// In en, this message translates to: + /// **'Quality'** + String get trackMetadataQuality; + + /// Metadata field - file location + /// + /// In en, this message translates to: + /// **'File Path'** + String get trackMetadataPath; + + /// Metadata field - download date + /// + /// In en, this message translates to: + /// **'Downloaded'** + String get trackMetadataDownloadedAt; + + /// Metadata field - download service used + /// + /// In en, this message translates to: + /// **'Service'** + String get trackMetadataService; + + /// Action button - play track + /// + /// In en, this message translates to: + /// **'Play'** + String get trackMetadataPlay; + + /// Action button - share track + /// + /// In en, this message translates to: + /// **'Share'** + String get trackMetadataShare; + + /// Action button - delete track + /// + /// In en, this message translates to: + /// **'Delete'** + String get trackMetadataDelete; + + /// Action button - download again + /// + /// In en, this message translates to: + /// **'Re-download'** + String get trackMetadataRedownload; + + /// Action button - open containing folder + /// + /// In en, this message translates to: + /// **'Open Folder'** + String get trackMetadataOpenFolder; + + /// Setup wizard title + /// + /// In en, this message translates to: + /// **'Welcome to SpotiFLAC'** + String get setupTitle; + + /// Setup wizard subtitle + /// + /// In en, this message translates to: + /// **'Let\'s get you started'** + String get setupSubtitle; + + /// Storage permission step title + /// + /// In en, this message translates to: + /// **'Storage Permission'** + String get setupStoragePermission; + + /// Explanation for storage permission + /// + /// In en, this message translates to: + /// **'Required to save downloaded files'** + String get setupStoragePermissionSubtitle; + + /// Status when permission granted + /// + /// In en, this message translates to: + /// **'Permission granted'** + String get setupStoragePermissionGranted; + + /// Status when permission denied + /// + /// In en, this message translates to: + /// **'Permission denied'** + String get setupStoragePermissionDenied; + + /// Button to request permission + /// + /// In en, this message translates to: + /// **'Grant Permission'** + String get setupGrantPermission; + + /// Download folder step title + /// + /// In en, this message translates to: + /// **'Download Location'** + String get setupDownloadLocation; + + /// Button to pick folder + /// + /// In en, this message translates to: + /// **'Choose Folder'** + String get setupChooseFolder; + + /// Continue to next step button + /// + /// In en, this message translates to: + /// **'Continue'** + String get setupContinue; + + /// Skip current step button + /// + /// In en, this message translates to: + /// **'Skip for now'** + String get setupSkip; + + /// Title when storage access needed + /// + /// In en, this message translates to: + /// **'Storage Access Required'** + String get setupStorageAccessRequired; + + /// Explanation for storage access + /// + /// In en, this message translates to: + /// **'SpotiFLAC needs \"All files access\" permission to save music files to your chosen folder.'** + String get setupStorageAccessMessage; + + /// Android 11+ specific explanation + /// + /// In en, this message translates to: + /// **'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'** + String get setupStorageAccessMessageAndroid11; + + /// Button to open system settings + /// + /// In en, this message translates to: + /// **'Open Settings'** + String get setupOpenSettings; + + /// Error when permission denied + /// + /// In en, this message translates to: + /// **'Permission denied. Please grant all permissions to continue.'** + String get setupPermissionDeniedMessage; + + /// Generic permission required title + /// + /// In en, this message translates to: + /// **'{permissionType} Permission Required'** + String setupPermissionRequired(String permissionType); + + /// Generic permission required message + /// + /// In en, this message translates to: + /// **'{permissionType} permission is required for the best experience. You can change this later in Settings.'** + String setupPermissionRequiredMessage(String permissionType); + + /// Folder selection step title + /// + /// In en, this message translates to: + /// **'Select Download Folder'** + String get setupSelectDownloadFolder; + + /// Dialog title for default folder + /// + /// In en, this message translates to: + /// **'Use Default Folder?'** + String get setupUseDefaultFolder; + + /// Prompt when no folder selected + /// + /// In en, this message translates to: + /// **'No folder selected. Would you like to use the default Music folder?'** + String get setupNoFolderSelected; + + /// Button to use default folder + /// + /// In en, this message translates to: + /// **'Use Default'** + String get setupUseDefault; + + /// Download location dialog title + /// + /// In en, this message translates to: + /// **'Download Location'** + String get setupDownloadLocationTitle; + + /// iOS-specific folder info + /// + /// In en, this message translates to: + /// **'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'** + String get setupDownloadLocationIosMessage; + + /// iOS documents folder option + /// + /// In en, this message translates to: + /// **'App Documents Folder'** + String get setupAppDocumentsFolder; + + /// Subtitle for documents folder + /// + /// In en, this message translates to: + /// **'Recommended - accessible via Files app'** + String get setupAppDocumentsFolderSubtitle; + + /// iOS file picker option + /// + /// In en, this message translates to: + /// **'Choose from Files'** + String get setupChooseFromFiles; + + /// Subtitle for file picker + /// + /// In en, this message translates to: + /// **'Select iCloud or other location'** + String get setupChooseFromFilesSubtitle; + + /// iOS folder selection warning + /// + /// In en, this message translates to: + /// **'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'** + String get setupIosEmptyFolderWarning; + + /// App tagline in setup + /// + /// In en, this message translates to: + /// **'Download Spotify tracks in FLAC'** + String get setupDownloadInFlac; + + /// Setup step indicator - storage + /// + /// In en, this message translates to: + /// **'Storage'** + String get setupStepStorage; + + /// Setup step indicator - notification + /// + /// In en, this message translates to: + /// **'Notification'** + String get setupStepNotification; + + /// Setup step indicator - folder + /// + /// In en, this message translates to: + /// **'Folder'** + String get setupStepFolder; + + /// Setup step indicator - Spotify API + /// + /// In en, this message translates to: + /// **'Spotify'** + String get setupStepSpotify; + + /// Setup step indicator - permission + /// + /// In en, this message translates to: + /// **'Permission'** + String get setupStepPermission; + + /// Success message for storage permission + /// + /// In en, this message translates to: + /// **'Storage Permission Granted!'** + String get setupStorageGranted; + + /// Title when storage permission needed + /// + /// In en, this message translates to: + /// **'Storage Permission Required'** + String get setupStorageRequired; + + /// Explanation for storage permission + /// + /// In en, this message translates to: + /// **'SpotiFLAC needs storage permission to save your downloaded music files.'** + String get setupStorageDescription; + + /// Success message for notification permission + /// + /// In en, this message translates to: + /// **'Notification Permission Granted!'** + String get setupNotificationGranted; + + /// Button to enable notifications + /// + /// In en, this message translates to: + /// **'Enable Notifications'** + String get setupNotificationEnable; + + /// Explanation for notifications + /// + /// In en, this message translates to: + /// **'Get notified when downloads complete or require attention.'** + String get setupNotificationDescription; + + /// Success message for folder selection + /// + /// In en, this message translates to: + /// **'Download Folder Selected!'** + String get setupFolderSelected; + + /// Button to choose folder + /// + /// In en, this message translates to: + /// **'Choose Download Folder'** + String get setupFolderChoose; + + /// Explanation for folder selection + /// + /// In en, this message translates to: + /// **'Select a folder where your downloaded music will be saved.'** + String get setupFolderDescription; + + /// Button to change selected folder + /// + /// In en, this message translates to: + /// **'Change Folder'** + String get setupChangeFolder; + + /// Button to select folder + /// + /// In en, this message translates to: + /// **'Select Folder'** + String get setupSelectFolder; + + /// Spotify API step title + /// + /// In en, this message translates to: + /// **'Spotify API (Optional)'** + String get setupSpotifyApiOptional; + + /// Explanation for Spotify API + /// + /// In en, this message translates to: + /// **'Add your Spotify API credentials for better search results and access to Spotify-exclusive content.'** + String get setupSpotifyApiDescription; + + /// Toggle to enable Spotify API + /// + /// In en, this message translates to: + /// **'Use Spotify API'** + String get setupUseSpotifyApi; + + /// Prompt to enter credentials + /// + /// In en, this message translates to: + /// **'Enter your credentials below'** + String get setupEnterCredentialsBelow; + + /// Status when using Deezer + /// + /// In en, this message translates to: + /// **'Using Deezer (no account needed)'** + String get setupUsingDeezer; + + /// Placeholder for client ID field + /// + /// In en, this message translates to: + /// **'Enter Spotify Client ID'** + String get setupEnterClientId; + + /// Placeholder for client secret field + /// + /// In en, this message translates to: + /// **'Enter Spotify Client Secret'** + String get setupEnterClientSecret; + + /// Info about getting Spotify credentials + /// + /// In en, this message translates to: + /// **'Get your free API credentials from the Spotify Developer Dashboard.'** + String get setupGetFreeCredentials; + + /// Button to enable notifications + /// + /// In en, this message translates to: + /// **'Enable Notifications'** + String get setupEnableNotifications; + + /// Message after completing a step + /// + /// In en, this message translates to: + /// **'You can now proceed to the next step.'** + String get setupProceedToNextStep; + + /// Info about notification usage + /// + /// In en, this message translates to: + /// **'You will receive download progress notifications.'** + String get setupNotificationProgressDescription; + + /// Detailed notification explanation + /// + /// In en, this message translates to: + /// **'Get notified about download progress and completion. This helps you track downloads when the app is in background.'** + String get setupNotificationBackgroundDescription; + + /// Skip button text + /// + /// In en, this message translates to: + /// **'Skip for now'** + String get setupSkipForNow; + + /// Back button text + /// + /// In en, this message translates to: + /// **'Back'** + String get setupBack; + + /// Next button text + /// + /// In en, this message translates to: + /// **'Next'** + String get setupNext; + + /// Final setup button + /// + /// In en, this message translates to: + /// **'Get Started'** + String get setupGetStarted; + + /// Skip setup and start app + /// + /// In en, this message translates to: + /// **'Skip & Start'** + String get setupSkipAndStart; + + /// Instruction for file access permission + /// + /// In en, this message translates to: + /// **'Please enable \"Allow access to manage all files\" in the next screen.'** + String get setupAllowAccessToManageFiles; + + /// Link text for Spotify developer portal + /// + /// In en, this message translates to: + /// **'Get credentials from developer.spotify.com'** + String get setupGetCredentialsFromSpotify; + + /// Dialog button - cancel action + /// + /// In en, this message translates to: + /// **'Cancel'** + String get dialogCancel; + + /// Dialog button - confirm/acknowledge + /// + /// In en, this message translates to: + /// **'OK'** + String get dialogOk; + + /// Dialog button - save changes + /// + /// In en, this message translates to: + /// **'Save'** + String get dialogSave; + + /// Dialog button - delete item + /// + /// In en, this message translates to: + /// **'Delete'** + String get dialogDelete; + + /// Dialog button - retry action + /// + /// In en, this message translates to: + /// **'Retry'** + String get dialogRetry; + + /// Dialog button - close dialog + /// + /// In en, this message translates to: + /// **'Close'** + String get dialogClose; + + /// Dialog button - confirm yes + /// + /// In en, this message translates to: + /// **'Yes'** + String get dialogYes; + + /// Dialog button - confirm no + /// + /// In en, this message translates to: + /// **'No'** + String get dialogNo; + + /// Dialog button - clear items + /// + /// In en, this message translates to: + /// **'Clear'** + String get dialogClear; + + /// Dialog button - confirm action + /// + /// In en, this message translates to: + /// **'Confirm'** + String get dialogConfirm; + + /// Dialog button - action completed + /// + /// In en, this message translates to: + /// **'Done'** + String get dialogDone; + + /// Dialog button - import data + /// + /// In en, this message translates to: + /// **'Import'** + String get dialogImport; + + /// Dialog button - discard changes + /// + /// In en, this message translates to: + /// **'Discard'** + String get dialogDiscard; + + /// Dialog button - remove item + /// + /// In en, this message translates to: + /// **'Remove'** + String get dialogRemove; + + /// Dialog button - uninstall extension + /// + /// In en, this message translates to: + /// **'Uninstall'** + String get dialogUninstall; + + /// Dialog title - unsaved changes warning + /// + /// In en, this message translates to: + /// **'Discard Changes?'** + String get dialogDiscardChanges; + + /// Dialog message - unsaved changes + /// + /// In en, this message translates to: + /// **'You have unsaved changes. Do you want to discard them?'** + String get dialogUnsavedChanges; + + /// Dialog title - download error /// /// In en, this message translates to: /// **'Download Failed'** - String get queueDownloadFailed; + String get dialogDownloadFailed; - /// No description provided for @queueTrackLabel. + /// Label for track name in error dialog /// /// In en, this message translates to: /// **'Track:'** - String get queueTrackLabel; + String get dialogTrackLabel; - /// No description provided for @queueArtistLabel. + /// Label for artist name in error dialog /// /// In en, this message translates to: /// **'Artist:'** - String get queueArtistLabel; + String get dialogArtistLabel; - /// No description provided for @queueErrorLabel. + /// Label for error message /// /// In en, this message translates to: /// **'Error:'** - String get queueErrorLabel; + String get dialogErrorLabel; - /// No description provided for @queueUnknownError. + /// Dialog title - clear all items /// /// In en, this message translates to: - /// **'Unknown error'** - String get queueUnknownError; + /// **'Clear All'** + String get dialogClearAll; - /// No description provided for @downloadedAlbumTracksHeader. + /// Dialog message - clear downloads confirmation /// /// In en, this message translates to: - /// **'Tracks'** - String get downloadedAlbumTracksHeader; + /// **'Are you sure you want to clear all downloads?'** + String get dialogClearAllDownloads; - /// No description provided for @downloadedAlbumDownloadedCount. + /// Dialog title - delete file confirmation /// /// In en, this message translates to: - /// **'{count} downloaded'** - String downloadedAlbumDownloadedCount(int count); + /// **'Remove from device?'** + String get dialogRemoveFromDevice; - /// No description provided for @downloadedAlbumSelectedCount. + /// Dialog title - uninstall extension + /// + /// In en, this message translates to: + /// **'Remove Extension'** + String get dialogRemoveExtension; + + /// Dialog message - uninstall confirmation + /// + /// In en, this message translates to: + /// **'Are you sure you want to remove this extension? This cannot be undone.'** + String get dialogRemoveExtensionMessage; + + /// Dialog title - uninstall extension + /// + /// In en, this message translates to: + /// **'Uninstall Extension?'** + String get dialogUninstallExtension; + + /// Dialog message - uninstall specific extension + /// + /// In en, this message translates to: + /// **'Are you sure you want to remove {extensionName}?'** + String dialogUninstallExtensionMessage(String extensionName); + + /// Dialog title - clear download history + /// + /// In en, this message translates to: + /// **'Clear History'** + String get dialogClearHistoryTitle; + + /// Dialog message - clear history confirmation + /// + /// In en, this message translates to: + /// **'Are you sure you want to clear all download history? This cannot be undone.'** + String get dialogClearHistoryMessage; + + /// Dialog title - delete selected items + /// + /// In en, this message translates to: + /// **'Delete Selected'** + String get dialogDeleteSelectedTitle; + + /// Dialog message - delete selected tracks + /// + /// In en, this message translates to: + /// **'Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.'** + String dialogDeleteSelectedMessage(int count); + + /// Dialog title - import CSV playlist + /// + /// In en, this message translates to: + /// **'Import Playlist'** + String get dialogImportPlaylistTitle; + + /// Dialog message - import playlist confirmation + /// + /// In en, this message translates to: + /// **'Found {count} tracks in CSV. Add them to download queue?'** + String dialogImportPlaylistMessage(int count); + + /// Snackbar - track added to download queue + /// + /// In en, this message translates to: + /// **'Added \"{trackName}\" to queue'** + String snackbarAddedToQueue(String trackName); + + /// Snackbar - multiple tracks added to queue + /// + /// In en, this message translates to: + /// **'Added {count} tracks to queue'** + String snackbarAddedTracksToQueue(int count); + + /// Snackbar - track already exists + /// + /// In en, this message translates to: + /// **'\"{trackName}\" already downloaded'** + String snackbarAlreadyDownloaded(String trackName); + + /// Snackbar - history deleted + /// + /// In en, this message translates to: + /// **'History cleared'** + String get snackbarHistoryCleared; + + /// Snackbar - Spotify credentials saved + /// + /// In en, this message translates to: + /// **'Credentials saved'** + String get snackbarCredentialsSaved; + + /// Snackbar - Spotify credentials removed + /// + /// In en, this message translates to: + /// **'Credentials cleared'** + String get snackbarCredentialsCleared; + + /// Snackbar - tracks deleted + /// + /// In en, this message translates to: + /// **'Deleted {count} {count, plural, =1{track} other{tracks}}'** + String snackbarDeletedTracks(int count); + + /// Snackbar - file open error + /// + /// In en, this message translates to: + /// **'Cannot open file: {error}'** + String snackbarCannotOpenFile(String error); + + /// Snackbar - validation error + /// + /// In en, this message translates to: + /// **'Please fill all fields'** + String get snackbarFillAllFields; + + /// Snackbar action - view download queue + /// + /// In en, this message translates to: + /// **'View Queue'** + String get snackbarViewQueue; + + /// Snackbar - loading error + /// + /// In en, this message translates to: + /// **'Failed to load: {error}'** + String snackbarFailedToLoad(String error); + + /// Snackbar - URL copied + /// + /// In en, this message translates to: + /// **'{platform} URL copied to clipboard'** + String snackbarUrlCopied(String platform); + + /// Snackbar - file doesn't exist + /// + /// In en, this message translates to: + /// **'File not found'** + String get snackbarFileNotFound; + + /// Snackbar - wrong file type selected + /// + /// In en, this message translates to: + /// **'Please select a .spotiflac-ext file'** + String get snackbarSelectExtFile; + + /// Snackbar - provider order saved + /// + /// In en, this message translates to: + /// **'Provider priority saved'** + String get snackbarProviderPrioritySaved; + + /// Snackbar - metadata provider order saved + /// + /// In en, this message translates to: + /// **'Metadata provider priority saved'** + String get snackbarMetadataProviderSaved; + + /// Snackbar - extension installed successfully + /// + /// In en, this message translates to: + /// **'{extensionName} installed.'** + String snackbarExtensionInstalled(String extensionName); + + /// Snackbar - extension updated successfully + /// + /// In en, this message translates to: + /// **'{extensionName} updated.'** + String snackbarExtensionUpdated(String extensionName); + + /// Snackbar - extension install error + /// + /// In en, this message translates to: + /// **'Failed to install extension'** + String get snackbarFailedToInstall; + + /// Snackbar - extension update error + /// + /// In en, this message translates to: + /// **'Failed to update extension'** + String get snackbarFailedToUpdate; + + /// Error title - too many requests + /// + /// In en, this message translates to: + /// **'Rate Limited'** + String get errorRateLimited; + + /// Error message - rate limit explanation + /// + /// In en, this message translates to: + /// **'Too many requests. Please wait a moment before searching again.'** + String get errorRateLimitedMessage; + + /// Error message - loading failed + /// + /// In en, this message translates to: + /// **'Failed to load {item}'** + String errorFailedToLoad(String item); + + /// Error - search returned no results + /// + /// In en, this message translates to: + /// **'No tracks found'** + String get errorNoTracksFound; + + /// Error - extension source not available + /// + /// In en, this message translates to: + /// **'Cannot load {item}: missing extension source'** + String errorMissingExtensionSource(String item); + + /// Download status - waiting in queue + /// + /// In en, this message translates to: + /// **'Queued'** + String get statusQueued; + + /// Download status - in progress + /// + /// In en, this message translates to: + /// **'Downloading'** + String get statusDownloading; + + /// Download status - writing metadata + /// + /// In en, this message translates to: + /// **'Finalizing'** + String get statusFinalizing; + + /// Download status - finished + /// + /// In en, this message translates to: + /// **'Completed'** + String get statusCompleted; + + /// Download status - error occurred + /// + /// In en, this message translates to: + /// **'Failed'** + String get statusFailed; + + /// Download status - already exists + /// + /// In en, this message translates to: + /// **'Skipped'** + String get statusSkipped; + + /// Download status - paused + /// + /// In en, this message translates to: + /// **'Paused'** + String get statusPaused; + + /// Action button - pause download + /// + /// In en, this message translates to: + /// **'Pause'** + String get actionPause; + + /// Action button - resume download + /// + /// In en, this message translates to: + /// **'Resume'** + String get actionResume; + + /// Action button - cancel operation + /// + /// In en, this message translates to: + /// **'Cancel'** + String get actionCancel; + + /// Action button - stop operation + /// + /// In en, this message translates to: + /// **'Stop'** + String get actionStop; + + /// Action button - enter selection mode + /// + /// In en, this message translates to: + /// **'Select'** + String get actionSelect; + + /// Action button - select all items + /// + /// In en, this message translates to: + /// **'Select All'** + String get actionSelectAll; + + /// Action button - deselect all + /// + /// In en, this message translates to: + /// **'Deselect'** + String get actionDeselect; + + /// Action button - paste from clipboard + /// + /// In en, this message translates to: + /// **'Paste'** + String get actionPaste; + + /// Action button - import CSV file + /// + /// In en, this message translates to: + /// **'Import CSV'** + String get actionImportCsv; + + /// Action button - delete Spotify credentials + /// + /// In en, this message translates to: + /// **'Remove Credentials'** + String get actionRemoveCredentials; + + /// Action button - save Spotify credentials + /// + /// In en, this message translates to: + /// **'Save Credentials'** + String get actionSaveCredentials; + + /// Selection count indicator /// /// In en, this message translates to: /// **'{count} selected'** - String downloadedAlbumSelectedCount(int count); + String selectionSelected(int count); - /// No description provided for @downloadedAlbumAllSelected. + /// Status - all items selected /// /// In en, this message translates to: /// **'All tracks selected'** - String get downloadedAlbumAllSelected; + String get selectionAllSelected; - /// No description provided for @downloadedAlbumTapToSelect. + /// Hint - how to select items /// /// In en, this message translates to: /// **'Tap tracks to select'** - String get downloadedAlbumTapToSelect; + String get selectionTapToSelect; - /// No description provided for @downloadedAlbumDeleteCount. + /// Delete button with count /// /// In en, this message translates to: /// **'Delete {count} {count, plural, =1{track} other{tracks}}'** - String downloadedAlbumDeleteCount(int count); + String selectionDeleteTracks(int count); - /// No description provided for @downloadedAlbumSelectToDelete. + /// Placeholder when nothing selected /// /// In en, this message translates to: /// **'Select tracks to delete'** - String get downloadedAlbumSelectToDelete; + String get selectionSelectToDelete; - /// No description provided for @folderOrganizationDescription. + /// Progress indicator - loading track info + /// + /// In en, this message translates to: + /// **'Fetching metadata... {current}/{total}'** + String progressFetchingMetadata(int current, int total); + + /// Progress indicator - parsing CSV file + /// + /// In en, this message translates to: + /// **'Reading CSV...'** + String get progressReadingCsv; + + /// Search result category - songs + /// + /// In en, this message translates to: + /// **'Songs'** + String get searchSongs; + + /// Search result category - artists + /// + /// In en, this message translates to: + /// **'Artists'** + String get searchArtists; + + /// Search result category - albums + /// + /// In en, this message translates to: + /// **'Albums'** + String get searchAlbums; + + /// Search result category - playlists + /// + /// In en, this message translates to: + /// **'Playlists'** + String get searchPlaylists; + + /// Tooltip - play button + /// + /// In en, this message translates to: + /// **'Play'** + String get tooltipPlay; + + /// Tooltip - cancel button + /// + /// In en, this message translates to: + /// **'Cancel'** + String get tooltipCancel; + + /// Tooltip - stop button + /// + /// In en, this message translates to: + /// **'Stop'** + String get tooltipStop; + + /// Tooltip - retry button + /// + /// In en, this message translates to: + /// **'Retry'** + String get tooltipRetry; + + /// Tooltip - remove button + /// + /// In en, this message translates to: + /// **'Remove'** + String get tooltipRemove; + + /// Tooltip - clear button + /// + /// In en, this message translates to: + /// **'Clear'** + String get tooltipClear; + + /// Tooltip - paste button + /// + /// In en, this message translates to: + /// **'Paste'** + String get tooltipPaste; + + /// Setting title - filename pattern + /// + /// In en, this message translates to: + /// **'Filename Format'** + String get filenameFormat; + + /// Preview of filename pattern + /// + /// In en, this message translates to: + /// **'Preview: {preview}'** + String filenameFormatPreview(String preview); + + /// Label for placeholder list + /// + /// In en, this message translates to: + /// **'Available placeholders:'** + String get filenameAvailablePlaceholders; + + /// Default filename format hint + /// + /// In en, this message translates to: + /// **'{artist} - {title}'** + String filenameHint(Object artist, Object title); + + /// Setting title - folder structure + /// + /// In en, this message translates to: + /// **'Folder Organization'** + String get folderOrganization; + + /// Folder option - flat structure + /// + /// In en, this message translates to: + /// **'No organization'** + String get folderOrganizationNone; + + /// Folder option - artist folders + /// + /// In en, this message translates to: + /// **'By Artist'** + String get folderOrganizationByArtist; + + /// Folder option - album folders + /// + /// In en, this message translates to: + /// **'By Album'** + String get folderOrganizationByAlbum; + + /// Folder option - nested folders + /// + /// In en, this message translates to: + /// **'Artist/Album'** + String get folderOrganizationByArtistAlbum; + + /// Folder organization sheet description /// /// In en, this message translates to: /// **'Organize downloaded files into folders'** String get folderOrganizationDescription; - /// No description provided for @folderOrganizationNoneSubtitle. + /// Subtitle for no organization option /// /// In en, this message translates to: /// **'All files in download folder'** String get folderOrganizationNoneSubtitle; - /// No description provided for @folderOrganizationByArtistSubtitle. + /// Subtitle for artist folder option /// /// In en, this message translates to: /// **'Separate folder for each artist'** String get folderOrganizationByArtistSubtitle; - /// No description provided for @folderOrganizationByAlbumSubtitle. + /// Subtitle for album folder option /// /// In en, this message translates to: /// **'Separate folder for each album'** String get folderOrganizationByAlbumSubtitle; - /// No description provided for @folderOrganizationByArtistAlbumSubtitle. + /// Subtitle for nested folder option /// /// In en, this message translates to: /// **'Nested folders for artist and album'** String get folderOrganizationByArtistAlbumSubtitle; + + /// Update dialog title + /// + /// In en, this message translates to: + /// **'Update Available'** + String get updateAvailable; + + /// Update available message + /// + /// In en, this message translates to: + /// **'Version {version} is available'** + String updateNewVersion(String version); + + /// Update button - download update + /// + /// In en, this message translates to: + /// **'Download'** + String get updateDownload; + + /// Update button - dismiss + /// + /// In en, this message translates to: + /// **'Later'** + String get updateLater; + + /// Link to changelog + /// + /// In en, this message translates to: + /// **'Changelog'** + String get updateChangelog; + + /// Update status - initializing + /// + /// In en, this message translates to: + /// **'Starting download...'** + String get updateStartingDownload; + + /// Update error title + /// + /// In en, this message translates to: + /// **'Download failed'** + String get updateDownloadFailed; + + /// Update error message + /// + /// In en, this message translates to: + /// **'Failed to download update'** + String get updateFailedMessage; + + /// Update subtitle + /// + /// In en, this message translates to: + /// **'A new version is ready'** + String get updateNewVersionReady; + + /// Label for current version + /// + /// In en, this message translates to: + /// **'Current'** + String get updateCurrent; + + /// Label for new version + /// + /// In en, this message translates to: + /// **'New'** + String get updateNew; + + /// Update status - downloading + /// + /// In en, this message translates to: + /// **'Downloading...'** + String get updateDownloading; + + /// Changelog section title + /// + /// In en, this message translates to: + /// **'What\'s New'** + String get updateWhatsNew; + + /// Update button - download and install + /// + /// In en, this message translates to: + /// **'Download & Install'** + String get updateDownloadInstall; + + /// Update button - skip this version + /// + /// In en, this message translates to: + /// **'Don\'t remind'** + String get updateDontRemind; + + /// Setting title - download provider order + /// + /// In en, this message translates to: + /// **'Provider Priority'** + String get providerPriority; + + /// Subtitle for provider priority + /// + /// In en, this message translates to: + /// **'Drag to reorder download providers'** + String get providerPrioritySubtitle; + + /// Provider priority page title + /// + /// In en, this message translates to: + /// **'Provider Priority'** + String get providerPriorityTitle; + + /// Provider priority page description + /// + /// In en, this message translates to: + /// **'Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.'** + String get providerPriorityDescription; + + /// Info tip about fallback behavior + /// + /// In en, this message translates to: + /// **'If a track is not available on the first provider, the app will automatically try the next one.'** + String get providerPriorityInfo; + + /// Label for built-in providers (Tidal/Qobuz/Amazon) + /// + /// In en, this message translates to: + /// **'Built-in'** + String get providerBuiltIn; + + /// Label for extension-provided providers + /// + /// In en, this message translates to: + /// **'Extension'** + String get providerExtension; + + /// Setting title - metadata provider order + /// + /// In en, this message translates to: + /// **'Metadata Provider Priority'** + String get metadataProviderPriority; + + /// Subtitle for metadata priority + /// + /// In en, this message translates to: + /// **'Order used when fetching track metadata'** + String get metadataProviderPrioritySubtitle; + + /// Metadata priority page title + /// + /// In en, this message translates to: + /// **'Metadata Priority'** + String get metadataProviderPriorityTitle; + + /// Metadata priority page description + /// + /// In en, this message translates to: + /// **'Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.'** + String get metadataProviderPriorityDescription; + + /// Info tip about rate limits + /// + /// In en, this message translates to: + /// **'Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.'** + String get metadataProviderPriorityInfo; + + /// Deezer provider description + /// + /// In en, this message translates to: + /// **'No rate limits'** + String get metadataNoRateLimits; + + /// Spotify provider description + /// + /// In en, this message translates to: + /// **'May rate limit'** + String get metadataMayRateLimit; + + /// Logs screen title + /// + /// In en, this message translates to: + /// **'Logs'** + String get logTitle; + + /// Action - copy logs to clipboard + /// + /// In en, this message translates to: + /// **'Copy Logs'** + String get logCopy; + + /// Action - delete all logs + /// + /// In en, this message translates to: + /// **'Clear Logs'** + String get logClear; + + /// Action - share logs file + /// + /// In en, this message translates to: + /// **'Share Logs'** + String get logShare; + + /// Empty state title + /// + /// In en, this message translates to: + /// **'No logs yet'** + String get logEmpty; + + /// Snackbar - logs copied + /// + /// In en, this message translates to: + /// **'Logs copied to clipboard'** + String get logCopied; + + /// Log search placeholder + /// + /// In en, this message translates to: + /// **'Search logs...'** + String get logSearchHint; + + /// Filter by log level + /// + /// In en, this message translates to: + /// **'Level'** + String get logFilterLevel; + + /// Filter section title + /// + /// In en, this message translates to: + /// **'Filter'** + String get logFilterSection; + + /// Share button tooltip + /// + /// In en, this message translates to: + /// **'Share logs'** + String get logShareLogs; + + /// Clear button tooltip + /// + /// In en, this message translates to: + /// **'Clear logs'** + String get logClearLogs; + + /// Clear logs dialog title + /// + /// In en, this message translates to: + /// **'Clear Logs'** + String get logClearLogsTitle; + + /// Clear logs confirmation message + /// + /// In en, this message translates to: + /// **'Are you sure you want to clear all logs?'** + String get logClearLogsMessage; + + /// Error category - ISP blocking + /// + /// In en, this message translates to: + /// **'ISP BLOCKING DETECTED'** + String get logIspBlocking; + + /// Error category - rate limiting + /// + /// In en, this message translates to: + /// **'RATE LIMITED'** + String get logRateLimited; + + /// Error category - network issues + /// + /// In en, this message translates to: + /// **'NETWORK ERROR'** + String get logNetworkError; + + /// Error category - missing tracks + /// + /// In en, this message translates to: + /// **'TRACK NOT FOUND'** + String get logTrackNotFound; + + /// Filter dialog title + /// + /// In en, this message translates to: + /// **'Filter logs by severity'** + String get logFilterBySeverity; + + /// Empty state title + /// + /// In en, this message translates to: + /// **'No logs yet'** + String get logNoLogsYet; + + /// Empty state subtitle + /// + /// In en, this message translates to: + /// **'Logs will appear here as you use the app'** + String get logNoLogsYetSubtitle; + + /// Section header for error summary + /// + /// In en, this message translates to: + /// **'Issue Summary'** + String get logIssueSummary; + + /// ISP blocking explanation + /// + /// In en, this message translates to: + /// **'Your ISP may be blocking access to download services'** + String get logIspBlockingDescription; + + /// ISP blocking fix suggestion + /// + /// In en, this message translates to: + /// **'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'** + String get logIspBlockingSuggestion; + + /// Rate limit explanation + /// + /// In en, this message translates to: + /// **'Too many requests to the service'** + String get logRateLimitedDescription; + + /// Rate limit fix suggestion + /// + /// In en, this message translates to: + /// **'Wait a few minutes before trying again'** + String get logRateLimitedSuggestion; + + /// Network error explanation + /// + /// In en, this message translates to: + /// **'Connection issues detected'** + String get logNetworkErrorDescription; + + /// Network error fix suggestion + /// + /// In en, this message translates to: + /// **'Check your internet connection'** + String get logNetworkErrorSuggestion; + + /// Track not found explanation + /// + /// In en, this message translates to: + /// **'Some tracks could not be found on download services'** + String get logTrackNotFoundDescription; + + /// Track not found explanation + /// + /// In en, this message translates to: + /// **'The track may not be available in lossless quality'** + String get logTrackNotFoundSuggestion; + + /// Error count display + /// + /// In en, this message translates to: + /// **'Total errors: {count}'** + String logTotalErrors(int count); + + /// Affected domains display + /// + /// In en, this message translates to: + /// **'Affected: {domains}'** + String logAffected(String domains); + + /// Log count with filter active + /// + /// In en, this message translates to: + /// **'Entries ({count} filtered)'** + String logEntriesFiltered(int count); + + /// Total log count + /// + /// In en, this message translates to: + /// **'Entries ({count})'** + String logEntries(int count); + + /// Credentials dialog title + /// + /// In en, this message translates to: + /// **'Spotify Credentials'** + String get credentialsTitle; + + /// Credentials dialog explanation + /// + /// In en, this message translates to: + /// **'Enter your Client ID and Secret to use your own Spotify application quota.'** + String get credentialsDescription; + + /// Client ID field label - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Client ID'** + String get credentialsClientId; + + /// Client ID placeholder + /// + /// In en, this message translates to: + /// **'Paste Client ID'** + String get credentialsClientIdHint; + + /// Client Secret field label - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Client Secret'** + String get credentialsClientSecret; + + /// Client Secret placeholder + /// + /// In en, this message translates to: + /// **'Paste Client Secret'** + String get credentialsClientSecretHint; + + /// Update channel - stable releases + /// + /// In en, this message translates to: + /// **'Stable'** + String get channelStable; + + /// Update channel - beta/preview releases + /// + /// In en, this message translates to: + /// **'Preview'** + String get channelPreview; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Search Source'** + String get sectionSearchSource; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Download'** + String get sectionDownload; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Performance'** + String get sectionPerformance; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'App'** + String get sectionApp; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Data'** + String get sectionData; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Debug'** + String get sectionDebug; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Service'** + String get sectionService; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Audio Quality'** + String get sectionAudioQuality; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'File Settings'** + String get sectionFileSettings; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Color'** + String get sectionColor; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Theme'** + String get sectionTheme; + + /// Settings section header + /// + /// In en, this message translates to: + /// **'Layout'** + String get sectionLayout; + + /// Appearance settings description + /// + /// In en, this message translates to: + /// **'Theme, colors, display'** + String get settingsAppearanceSubtitle; + + /// Download settings description + /// + /// In en, this message translates to: + /// **'Service, quality, filename format'** + String get settingsDownloadSubtitle; + + /// Options settings description + /// + /// In en, this message translates to: + /// **'Fallback, lyrics, cover art, updates'** + String get settingsOptionsSubtitle; + + /// Extensions settings description + /// + /// In en, this message translates to: + /// **'Manage download providers'** + String get settingsExtensionsSubtitle; + + /// Logs settings description + /// + /// In en, this message translates to: + /// **'View app logs for debugging'** + String get settingsLogsSubtitle; + + /// Status when opening shared URL + /// + /// In en, this message translates to: + /// **'Loading shared link...'** + String get loadingSharedLink; + + /// Exit confirmation message + /// + /// In en, this message translates to: + /// **'Press back again to exit'** + String get pressBackAgainToExit; + + /// Section header for track list + /// + /// In en, this message translates to: + /// **'Tracks'** + String get tracksHeader; + + /// Download all button with count + /// + /// In en, this message translates to: + /// **'Download All ({count})'** + String downloadAllCount(int count); + + /// Track count display + /// + /// In en, this message translates to: + /// **'{count, plural, =1{1 track} other{{count} tracks}}'** + String tracksCount(int count); + + /// Action - copy file path + /// + /// In en, this message translates to: + /// **'Copy file path'** + String get trackCopyFilePath; + + /// Action - delete downloaded file + /// + /// In en, this message translates to: + /// **'Remove from device'** + String get trackRemoveFromDevice; + + /// Action - fetch lyrics + /// + /// In en, this message translates to: + /// **'Load Lyrics'** + String get trackLoadLyrics; + + /// Tab title - track metadata + /// + /// In en, this message translates to: + /// **'Metadata'** + String get trackMetadata; + + /// Tab title - file information + /// + /// In en, this message translates to: + /// **'File Info'** + String get trackFileInfo; + + /// Tab title - lyrics + /// + /// In en, this message translates to: + /// **'Lyrics'** + String get trackLyrics; + + /// Error - file doesn't exist + /// + /// In en, this message translates to: + /// **'File not found'** + String get trackFileNotFound; + + /// Action - open track in Deezer app + /// + /// In en, this message translates to: + /// **'Open in Deezer'** + String get trackOpenInDeezer; + + /// Action - open track in Spotify app + /// + /// In en, this message translates to: + /// **'Open in Spotify'** + String get trackOpenInSpotify; + + /// Metadata label - track title + /// + /// In en, this message translates to: + /// **'Track name'** + String get trackTrackName; + + /// Metadata label - artist name + /// + /// In en, this message translates to: + /// **'Artist'** + String get trackArtist; + + /// Metadata label - album artist + /// + /// In en, this message translates to: + /// **'Album artist'** + String get trackAlbumArtist; + + /// Metadata label - album name + /// + /// In en, this message translates to: + /// **'Album'** + String get trackAlbum; + + /// Metadata label - track number + /// + /// In en, this message translates to: + /// **'Track number'** + String get trackTrackNumber; + + /// Metadata label - disc number + /// + /// In en, this message translates to: + /// **'Disc number'** + String get trackDiscNumber; + + /// Metadata label - track length + /// + /// In en, this message translates to: + /// **'Duration'** + String get trackDuration; + + /// Metadata label - audio quality + /// + /// In en, this message translates to: + /// **'Audio quality'** + String get trackAudioQuality; + + /// Metadata label - release date + /// + /// In en, this message translates to: + /// **'Release date'** + String get trackReleaseDate; + + /// Metadata label - download date + /// + /// In en, this message translates to: + /// **'Downloaded'** + String get trackDownloaded; + + /// Action - copy lyrics to clipboard + /// + /// In en, this message translates to: + /// **'Copy lyrics'** + String get trackCopyLyrics; + + /// Message when lyrics not found + /// + /// In en, this message translates to: + /// **'Lyrics not available for this track'** + String get trackLyricsNotAvailable; + + /// Message when lyrics request times out + /// + /// In en, this message translates to: + /// **'Request timed out. Try again later.'** + String get trackLyricsTimeout; + + /// Message when lyrics loading fails + /// + /// In en, this message translates to: + /// **'Failed to load lyrics'** + String get trackLyricsLoadFailed; + + /// Snackbar - content copied + /// + /// In en, this message translates to: + /// **'Copied to clipboard'** + String get trackCopiedToClipboard; + + /// Delete confirmation title + /// + /// In en, this message translates to: + /// **'Remove from device?'** + String get trackDeleteConfirmTitle; + + /// Delete confirmation message + /// + /// In en, this message translates to: + /// **'This will permanently delete the downloaded file and remove it from your history.'** + String get trackDeleteConfirmMessage; + + /// Error opening file + /// + /// In en, this message translates to: + /// **'Cannot open: {message}'** + String trackCannotOpen(String message); + + /// Relative date - today + /// + /// In en, this message translates to: + /// **'Today'** + String get dateToday; + + /// Relative date - yesterday + /// + /// In en, this message translates to: + /// **'Yesterday'** + String get dateYesterday; + + /// Relative date - days ago + /// + /// In en, this message translates to: + /// **'{count} days ago'** + String dateDaysAgo(int count); + + /// Relative date - weeks ago + /// + /// In en, this message translates to: + /// **'{count} weeks ago'** + String dateWeeksAgo(int count); + + /// Relative date - months ago + /// + /// In en, this message translates to: + /// **'{count} months ago'** + String dateMonthsAgo(int count); + + /// Download mode - one at a time + /// + /// In en, this message translates to: + /// **'Sequential'** + String get concurrentSequential; + + /// Download mode - 2 simultaneous + /// + /// In en, this message translates to: + /// **'2 Parallel'** + String get concurrentParallel2; + + /// Download mode - 3 simultaneous + /// + /// In en, this message translates to: + /// **'3 Parallel'** + String get concurrentParallel3; + + /// Tooltip for failed download + /// + /// In en, this message translates to: + /// **'Tap to see error details'** + String get tapToSeeError; + + /// Store filter - all extensions + /// + /// In en, this message translates to: + /// **'All'** + String get storeFilterAll; + + /// Store filter - metadata providers + /// + /// In en, this message translates to: + /// **'Metadata'** + String get storeFilterMetadata; + + /// Store filter - download providers + /// + /// In en, this message translates to: + /// **'Download'** + String get storeFilterDownload; + + /// Store filter - utility extensions + /// + /// In en, this message translates to: + /// **'Utility'** + String get storeFilterUtility; + + /// Store filter - lyrics providers + /// + /// In en, this message translates to: + /// **'Lyrics'** + String get storeFilterLyrics; + + /// Store filter - integrations + /// + /// In en, this message translates to: + /// **'Integration'** + String get storeFilterIntegration; + + /// Button to clear all filters + /// + /// In en, this message translates to: + /// **'Clear filters'** + String get storeClearFilters; + + /// Empty state when no extensions match filters + /// + /// In en, this message translates to: + /// **'No extensions found'** + String get storeNoResults; + + /// Extension capability - provider priority + /// + /// In en, this message translates to: + /// **'Provider Priority'** + String get extensionProviderPriority; + + /// Button to install extension + /// + /// In en, this message translates to: + /// **'Install Extension'** + String get extensionInstallButton; + + /// Default search provider option + /// + /// In en, this message translates to: + /// **'Default (Deezer/Spotify)'** + String get extensionDefaultProvider; + + /// Subtitle for default provider + /// + /// In en, this message translates to: + /// **'Use built-in search'** + String get extensionDefaultProviderSubtitle; + + /// Extension detail - author + /// + /// In en, this message translates to: + /// **'Author'** + String get extensionAuthor; + + /// Extension detail - unique ID + /// + /// In en, this message translates to: + /// **'ID'** + String get extensionId; + + /// Extension detail - error message + /// + /// In en, this message translates to: + /// **'Error'** + String get extensionError; + + /// Section header - extension features + /// + /// In en, this message translates to: + /// **'Capabilities'** + String get extensionCapabilities; + + /// Capability - provides metadata + /// + /// In en, this message translates to: + /// **'Metadata Provider'** + String get extensionMetadataProvider; + + /// Capability - provides downloads + /// + /// In en, this message translates to: + /// **'Download Provider'** + String get extensionDownloadProvider; + + /// Capability - provides lyrics + /// + /// In en, this message translates to: + /// **'Lyrics Provider'** + String get extensionLyricsProvider; + + /// Capability - handles URLs + /// + /// In en, this message translates to: + /// **'URL Handler'** + String get extensionUrlHandler; + + /// Capability - quality selection + /// + /// In en, this message translates to: + /// **'Quality Options'** + String get extensionQualityOptions; + + /// Capability - post-processing + /// + /// In en, this message translates to: + /// **'Post-Processing Hooks'** + String get extensionPostProcessingHooks; + + /// Section header - required permissions + /// + /// In en, this message translates to: + /// **'Permissions'** + String get extensionPermissions; + + /// Section header - extension settings + /// + /// In en, this message translates to: + /// **'Settings'** + String get extensionSettings; + + /// Button to uninstall extension + /// + /// In en, this message translates to: + /// **'Remove Extension'** + String get extensionRemoveButton; + + /// Extension detail - last update + /// + /// In en, this message translates to: + /// **'Updated'** + String get extensionUpdated; + + /// Extension detail - minimum app version + /// + /// In en, this message translates to: + /// **'Min App Version'** + String get extensionMinAppVersion; + + /// Capability - custom track matching algorithm + /// + /// In en, this message translates to: + /// **'Custom Track Matching'** + String get extensionCustomTrackMatching; + + /// Capability - post-download processing + /// + /// In en, this message translates to: + /// **'Post-Processing'** + String get extensionPostProcessing; + + /// Post-processing hooks count + /// + /// In en, this message translates to: + /// **'{count} hook(s) available'** + String extensionHooksAvailable(int count); + + /// URL patterns count + /// + /// In en, this message translates to: + /// **'{count} pattern(s)'** + String extensionPatternsCount(int count); + + /// Track matching strategy name + /// + /// In en, this message translates to: + /// **'Strategy: {strategy}'** + String extensionStrategy(String strategy); + + /// Section header - provider priority + /// + /// In en, this message translates to: + /// **'Provider Priority'** + String get extensionsProviderPrioritySection; + + /// Section header - installed extensions + /// + /// In en, this message translates to: + /// **'Installed Extensions'** + String get extensionsInstalledSection; + + /// Empty state - no extensions + /// + /// In en, this message translates to: + /// **'No extensions installed'** + String get extensionsNoExtensions; + + /// Empty state subtitle + /// + /// In en, this message translates to: + /// **'Install .spotiflac-ext files to add new providers'** + String get extensionsNoExtensionsSubtitle; + + /// Button to install extension from file + /// + /// In en, this message translates to: + /// **'Install Extension'** + String get extensionsInstallButton; + + /// Security warning about extensions + /// + /// In en, this message translates to: + /// **'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'** + String get extensionsInfoTip; + + /// Success message after install + /// + /// In en, this message translates to: + /// **'Extension installed successfully'** + String get extensionsInstalledSuccess; + + /// Setting - download provider order + /// + /// In en, this message translates to: + /// **'Download Priority'** + String get extensionsDownloadPriority; + + /// Subtitle for download priority + /// + /// In en, this message translates to: + /// **'Set download service order'** + String get extensionsDownloadPrioritySubtitle; + + /// Empty state - no download providers + /// + /// In en, this message translates to: + /// **'No extensions with download provider'** + String get extensionsNoDownloadProvider; + + /// Setting - metadata provider order + /// + /// In en, this message translates to: + /// **'Metadata Priority'** + String get extensionsMetadataPriority; + + /// Subtitle for metadata priority + /// + /// In en, this message translates to: + /// **'Set search & metadata source order'** + String get extensionsMetadataPrioritySubtitle; + + /// Empty state - no metadata providers + /// + /// In en, this message translates to: + /// **'No extensions with metadata provider'** + String get extensionsNoMetadataProvider; + + /// Setting - search provider selection + /// + /// In en, this message translates to: + /// **'Search Provider'** + String get extensionsSearchProvider; + + /// Empty state - no search providers + /// + /// In en, this message translates to: + /// **'No extensions with custom search'** + String get extensionsNoCustomSearch; + + /// Search provider setting description + /// + /// In en, this message translates to: + /// **'Choose which service to use for searching tracks'** + String get extensionsSearchProviderDescription; + + /// Label for custom search provider + /// + /// In en, this message translates to: + /// **'Custom search'** + String get extensionsCustomSearch; + + /// Error message when extension fails to load + /// + /// In en, this message translates to: + /// **'Error loading extension'** + String get extensionsErrorLoading; + + /// Quality option - CD quality FLAC + /// + /// In en, this message translates to: + /// **'FLAC Lossless'** + String get qualityFlacLossless; + + /// Technical spec for lossless + /// + /// In en, this message translates to: + /// **'16-bit / 44.1kHz'** + String get qualityFlacLosslessSubtitle; + + /// Quality option - high resolution FLAC + /// + /// In en, this message translates to: + /// **'Hi-Res FLAC'** + String get qualityHiResFlac; + + /// Technical spec for hi-res + /// + /// In en, this message translates to: + /// **'24-bit / up to 96kHz'** + String get qualityHiResFlacSubtitle; + + /// Quality option - maximum resolution FLAC + /// + /// In en, this message translates to: + /// **'Hi-Res FLAC Max'** + String get qualityHiResFlacMax; + + /// Technical spec for hi-res max + /// + /// In en, this message translates to: + /// **'24-bit / up to 192kHz'** + String get qualityHiResFlacMaxSubtitle; + + /// Note about quality availability + /// + /// In en, this message translates to: + /// **'Actual quality depends on track availability from the service'** + String get qualityNote; + + /// Setting - show quality picker + /// + /// In en, this message translates to: + /// **'Ask Before Download'** + String get downloadAskBeforeDownload; + + /// Setting - download folder + /// + /// In en, this message translates to: + /// **'Download Directory'** + String get downloadDirectory; + + /// Setting - separate folder for singles + /// + /// In en, this message translates to: + /// **'Separate Singles Folder'** + String get downloadSeparateSinglesFolder; + + /// Setting - album folder organization + /// + /// In en, this message translates to: + /// **'Album Folder Structure'** + String get downloadAlbumFolderStructure; + + /// Setting - output file format + /// + /// In en, this message translates to: + /// **'Save Format'** + String get downloadSaveFormat; + + /// Dialog title - choose download service + /// + /// In en, this message translates to: + /// **'Select Service'** + String get downloadSelectService; + + /// Dialog title - choose audio quality + /// + /// In en, this message translates to: + /// **'Select Quality'** + String get downloadSelectQuality; + + /// Label - download source + /// + /// In en, this message translates to: + /// **'Download From'** + String get downloadFrom; + + /// Label - default quality setting + /// + /// In en, this message translates to: + /// **'Default Quality'** + String get downloadDefaultQualityLabel; + + /// Quality option - highest available + /// + /// In en, this message translates to: + /// **'Best available'** + String get downloadBestAvailable; + + /// Folder option - no organization + /// + /// In en, this message translates to: + /// **'None'** + String get folderNone; + + /// Subtitle for no folder organization + /// + /// In en, this message translates to: + /// **'Save all files directly to download folder'** + String get folderNoneSubtitle; + + /// Folder option - by artist + /// + /// In en, this message translates to: + /// **'Artist'** + String get folderArtist; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Artist Name/filename'** + String get folderArtistSubtitle; + + /// Folder option - by album + /// + /// In en, this message translates to: + /// **'Album'** + String get folderAlbum; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Album Name/filename'** + String get folderAlbumSubtitle; + + /// Folder option - nested + /// + /// In en, this message translates to: + /// **'Artist/Album'** + String get folderArtistAlbum; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Artist Name/Album Name/filename'** + String get folderArtistAlbumSubtitle; + + /// Service name - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Tidal'** + String get serviceTidal; + + /// Service name - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Qobuz'** + String get serviceQobuz; + + /// Service name - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Amazon'** + String get serviceAmazon; + + /// Service name - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Deezer'** + String get serviceDeezer; + + /// Service name - DO NOT TRANSLATE + /// + /// In en, this message translates to: + /// **'Spotify'** + String get serviceSpotify; + + /// Theme option - pure black + /// + /// In en, this message translates to: + /// **'AMOLED Dark'** + String get appearanceAmoledDark; + + /// Subtitle for AMOLED dark + /// + /// In en, this message translates to: + /// **'Pure black background'** + String get appearanceAmoledDarkSubtitle; + + /// Color picker dialog title + /// + /// In en, this message translates to: + /// **'Choose Accent Color'** + String get appearanceChooseAccentColor; + + /// Theme picker dialog title + /// + /// In en, this message translates to: + /// **'Theme Mode'** + String get appearanceChooseTheme; + + /// Queue screen title + /// + /// In en, this message translates to: + /// **'Download Queue'** + String get queueTitle; + + /// Button - clear all queue items + /// + /// In en, this message translates to: + /// **'Clear All'** + String get queueClearAll; + + /// Clear queue confirmation + /// + /// In en, this message translates to: + /// **'Are you sure you want to clear all downloads?'** + String get queueClearAllMessage; + + /// Empty queue state title + /// + /// In en, this message translates to: + /// **'No downloads in queue'** + String get queueEmpty; + + /// Empty queue state subtitle + /// + /// In en, this message translates to: + /// **'Add tracks from the home screen'** + String get queueEmptySubtitle; + + /// Button - clear finished downloads + /// + /// In en, this message translates to: + /// **'Clear completed'** + String get queueClearCompleted; + + /// Error dialog title + /// + /// In en, this message translates to: + /// **'Download Failed'** + String get queueDownloadFailed; + + /// Label in error dialog + /// + /// In en, this message translates to: + /// **'Track:'** + String get queueTrackLabel; + + /// Label in error dialog + /// + /// In en, this message translates to: + /// **'Artist:'** + String get queueArtistLabel; + + /// Label in error dialog + /// + /// In en, this message translates to: + /// **'Error:'** + String get queueErrorLabel; + + /// Fallback error message + /// + /// In en, this message translates to: + /// **'Unknown error'** + String get queueUnknownError; + + /// Album folder option + /// + /// In en, this message translates to: + /// **'Artist / Album'** + String get albumFolderArtistAlbum; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Albums/Artist Name/Album Name/'** + String get albumFolderArtistAlbumSubtitle; + + /// Album folder option with year + /// + /// In en, this message translates to: + /// **'Artist / [Year] Album'** + String get albumFolderArtistYearAlbum; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Albums/Artist Name/[2005] Album Name/'** + String get albumFolderArtistYearAlbumSubtitle; + + /// Album folder option + /// + /// In en, this message translates to: + /// **'Album Only'** + String get albumFolderAlbumOnly; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Albums/Album Name/'** + String get albumFolderAlbumOnlySubtitle; + + /// Album folder option with year + /// + /// In en, this message translates to: + /// **'[Year] Album'** + String get albumFolderYearAlbum; + + /// Folder structure example + /// + /// In en, this message translates to: + /// **'Albums/[2005] Album Name/'** + String get albumFolderYearAlbumSubtitle; + + /// Button - delete selected tracks + /// + /// In en, this message translates to: + /// **'Delete Selected'** + String get downloadedAlbumDeleteSelected; + + /// Delete confirmation with count + /// + /// In en, this message translates to: + /// **'Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.'** + String downloadedAlbumDeleteMessage(int count); + + /// Section header for tracks + /// + /// In en, this message translates to: + /// **'Tracks'** + String get downloadedAlbumTracksHeader; + + /// Downloaded tracks count badge + /// + /// In en, this message translates to: + /// **'{count} downloaded'** + String downloadedAlbumDownloadedCount(int count); + + /// Selection count indicator + /// + /// In en, this message translates to: + /// **'{count} selected'** + String downloadedAlbumSelectedCount(int count); + + /// Status - all items selected + /// + /// In en, this message translates to: + /// **'All tracks selected'** + String get downloadedAlbumAllSelected; + + /// Selection hint + /// + /// In en, this message translates to: + /// **'Tap tracks to select'** + String get downloadedAlbumTapToSelect; + + /// Delete button text with count + /// + /// In en, this message translates to: + /// **'Delete {count} {count, plural, =1{track} other{tracks}}'** + String downloadedAlbumDeleteCount(int count); + + /// Placeholder when nothing selected + /// + /// In en, this message translates to: + /// **'Select tracks to delete'** + String get downloadedAlbumSelectToDelete; + + /// Extension capability - utility functions + /// + /// In en, this message translates to: + /// **'Utility Functions'** + String get utilityFunctions; } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 93f132f..7881a64 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -441,6 +441,32 @@ class AppLocalizationsEn extends AppLocalizations { @override String get aboutVersion => 'Version'; + @override + String get aboutBinimumDesc => + 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; + + @override + String get aboutSachinsenalDesc => + 'The original HiFi project creator. The foundation of Tidal integration!'; + + @override + String get aboutDoubleDouble => 'DoubleDouble'; + + @override + String get aboutDoubleDoubleDesc => + 'Amazing API for Amazon Music downloads. Thank you for making it free!'; + + @override + String get aboutDabMusic => 'DAB Music'; + + @override + String get aboutDabMusicDesc => + 'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'; + + @override + String get aboutAppDescription => + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; + @override String get albumTitle => 'Album'; @@ -473,6 +499,20 @@ class AppLocalizationsEn extends AppLocalizations { @override String get artistSingles => 'Singles & EPs'; + @override + String get artistCompilations => 'Compilations'; + + @override + String artistReleases(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count releases', + one: '1 release', + ); + return '$_temp0'; + } + @override String get trackMetadataTitle => 'Track Info'; @@ -546,440 +586,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get setupSkip => 'Skip for now'; - @override - String get dialogCancel => 'Cancel'; - - @override - String get dialogOk => 'OK'; - - @override - String get dialogSave => 'Save'; - - @override - String get dialogDelete => 'Delete'; - - @override - String get dialogRetry => 'Retry'; - - @override - String get dialogClose => 'Close'; - - @override - String get dialogYes => 'Yes'; - - @override - String get dialogNo => 'No'; - - @override - String get dialogClear => 'Clear'; - - @override - String get dialogConfirm => 'Confirm'; - - @override - String get dialogDone => 'Done'; - - @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 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 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 get errorRateLimited => 'Rate Limited'; - - @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; - - @override - String errorFailedToLoad(String item) { - return 'Failed to load $item'; - } - - @override - String get errorNoTracksFound => 'No tracks found'; - - @override - String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; - } - - @override - String get statusQueued => 'Queued'; - - @override - String get statusDownloading => 'Downloading'; - - @override - String get statusFinalizing => 'Finalizing'; - - @override - String get statusCompleted => 'Completed'; - - @override - String get statusFailed => 'Failed'; - - @override - String get statusSkipped => 'Skipped'; - - @override - String get statusPaused => 'Paused'; - - @override - String get actionPause => 'Pause'; - - @override - String get actionResume => 'Resume'; - - @override - String get actionCancel => 'Cancel'; - - @override - String get actionStop => 'Stop'; - - @override - String get actionSelect => 'Select'; - - @override - String get actionSelectAll => 'Select All'; - - @override - String get actionDeselect => 'Deselect'; - - @override - String get actionPaste => 'Paste'; - - @override - String get actionImportCsv => 'Import CSV'; - - @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 selectionTapToSelect => 'Tap tracks to select'; - - @override - String selectionDeleteTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'tracks', - one: 'track', - ); - return 'Delete $count $_temp0'; - } - - @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 tooltipPlay => 'Play'; - - @override - String get tooltipCancel => 'Cancel'; - - @override - String get tooltipStop => 'Stop'; - - @override - String get tooltipRetry => 'Retry'; - - @override - String get tooltipRemove => 'Remove'; - - @override - String get tooltipClear => 'Clear'; - - @override - String get tooltipPaste => 'Paste'; - - @override - String get filenameFormat => 'Filename Format'; - - @override - String filenameFormatPreview(String preview) { - return 'Preview: $preview'; - } - - @override - String get folderOrganization => 'Folder Organization'; - - @override - String get folderOrganizationNone => 'None'; - - @override - String get folderOrganizationByArtist => 'By Artist'; - - @override - String get folderOrganizationByAlbum => 'By Album'; - - @override - String get folderOrganizationByArtistAlbum => 'By Artist & Album'; - - @override - String get updateAvailable => 'Update Available'; - - @override - String updateNewVersion(String version) { - return 'Version $version is available'; - } - - @override - String get updateDownload => 'Download'; - - @override - String get updateLater => 'Later'; - - @override - String get updateChangelog => 'Changelog'; - - @override - String get providerPriority => 'Provider Priority'; - - @override - String get providerPrioritySubtitle => 'Drag to reorder download providers'; - - @override - String get metadataProviderPriority => 'Metadata Provider Priority'; - - @override - String get metadataProviderPrioritySubtitle => - 'Order used when fetching track metadata'; - - @override - String get logTitle => 'Logs'; - - @override - String get logCopy => 'Copy Logs'; - - @override - String get logClear => 'Clear Logs'; - - @override - String get logShare => 'Share Logs'; - - @override - String get logEmpty => 'No logs yet'; - - @override - String get logCopied => 'Logs copied to clipboard'; - - @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 sectionColor => 'Color'; - - @override - String get sectionTheme => 'Theme'; - - @override - String get sectionLayout => 'Layout'; - - @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; - - @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; - - @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; - - @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 artistReleases(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count releases', - one: '1 release', - ); - return '$_temp0'; - } - - @override - String get artistCompilations => 'Compilations'; - - @override - String get tracksHeader => 'Tracks'; - - @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 setupStorageAccessRequired => 'Storage Access Required'; @@ -1128,6 +734,73 @@ class AppLocalizationsEn extends AppLocalizations { @override String get setupEnableNotifications => 'Enable Notifications'; + @override + String get setupProceedToNextStep => 'You can now proceed to the next step.'; + + @override + String get setupNotificationProgressDescription => + 'You will receive download progress 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 setupBack => 'Back'; + + @override + String get setupNext => 'Next'; + + @override + String get setupGetStarted => 'Get Started'; + + @override + String get setupSkipAndStart => 'Skip & Start'; + + @override + String get setupAllowAccessToManageFiles => + 'Please enable \"Allow access to manage all files\" in the next screen.'; + + @override + String get setupGetCredentialsFromSpotify => + 'Get credentials from developer.spotify.com'; + + @override + String get dialogCancel => 'Cancel'; + + @override + String get dialogOk => 'OK'; + + @override + String get dialogSave => 'Save'; + + @override + String get dialogDelete => 'Delete'; + + @override + String get dialogRetry => 'Retry'; + + @override + String get dialogClose => 'Close'; + + @override + String get dialogYes => 'Yes'; + + @override + String get dialogNo => 'No'; + + @override + String get dialogClear => 'Clear'; + + @override + String get dialogConfirm => 'Confirm'; + + @override + String get dialogDone => 'Done'; + @override String get dialogImport => 'Import'; @@ -1184,6 +857,81 @@ class AppLocalizationsEn extends AppLocalizations { 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 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 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 snackbarFailedToLoad(String error) { return 'Failed to load: $error'; @@ -1223,6 +971,620 @@ class AppLocalizationsEn extends AppLocalizations { @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 errorFailedToLoad(String item) { + return 'Failed to load $item'; + } + + @override + String get errorNoTracksFound => 'No tracks found'; + + @override + String errorMissingExtensionSource(String item) { + return 'Cannot load $item: missing extension source'; + } + + @override + String get statusQueued => 'Queued'; + + @override + String get statusDownloading => 'Downloading'; + + @override + String get statusFinalizing => 'Finalizing'; + + @override + String get statusCompleted => 'Completed'; + + @override + String get statusFailed => 'Failed'; + + @override + String get statusSkipped => 'Skipped'; + + @override + String get statusPaused => 'Paused'; + + @override + String get actionPause => 'Pause'; + + @override + String get actionResume => 'Resume'; + + @override + String get actionCancel => 'Cancel'; + + @override + String get actionStop => 'Stop'; + + @override + String get actionSelect => 'Select'; + + @override + String get actionSelectAll => 'Select All'; + + @override + String get actionDeselect => 'Deselect'; + + @override + String get actionPaste => 'Paste'; + + @override + String get actionImportCsv => 'Import CSV'; + + @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 selectionTapToSelect => 'Tap tracks to select'; + + @override + String selectionDeleteTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Delete $count $_temp0'; + } + + @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 tooltipPlay => 'Play'; + + @override + String get tooltipCancel => 'Cancel'; + + @override + String get tooltipStop => 'Stop'; + + @override + String get tooltipRetry => 'Retry'; + + @override + String get tooltipRemove => 'Remove'; + + @override + String get tooltipClear => 'Clear'; + + @override + String get tooltipPaste => 'Paste'; + + @override + String get filenameFormat => 'Filename Format'; + + @override + String filenameFormatPreview(String preview) { + return 'Preview: $preview'; + } + + @override + String get filenameAvailablePlaceholders => 'Available placeholders:'; + + @override + String filenameHint(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get folderOrganization => 'Folder Organization'; + + @override + String get folderOrganizationNone => 'No organization'; + + @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 updateNewVersion(String version) { + return 'Version $version is available'; + } + + @override + String get updateDownload => 'Download'; + + @override + String get updateLater => 'Later'; + + @override + String get updateChangelog => 'Changelog'; + + @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 providerPriority => 'Provider Priority'; + + @override + String get providerPrioritySubtitle => 'Drag to reorder download providers'; + + @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 providerBuiltIn => 'Built-in'; + + @override + String get providerExtension => 'Extension'; + + @override + String get metadataProviderPriority => 'Metadata Provider Priority'; + + @override + String get metadataProviderPrioritySubtitle => + 'Order used when fetching track metadata'; + + @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 logCopy => 'Copy Logs'; + + @override + String get logClear => 'Clear Logs'; + + @override + String get logShare => 'Share Logs'; + + @override + String get logEmpty => 'No logs yet'; + + @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 logIspBlocking => 'ISP BLOCKING DETECTED'; + + @override + String get logRateLimited => 'RATE LIMITED'; + + @override + String get logNetworkError => 'NETWORK ERROR'; + + @override + String get logTrackNotFound => 'TRACK NOT FOUND'; + + @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 get logIssueSummary => 'Issue Summary'; + + @override + String get logIspBlockingDescription => + 'Your ISP may be blocking access to download services'; + + @override + String get logIspBlockingSuggestion => + 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; + + @override + String get logRateLimitedDescription => 'Too many requests to the service'; + + @override + String get logRateLimitedSuggestion => + 'Wait a few minutes before trying again'; + + @override + String get logNetworkErrorDescription => 'Connection issues detected'; + + @override + String get logNetworkErrorSuggestion => 'Check your internet connection'; + + @override + String get logTrackNotFoundDescription => + 'Some tracks could not be found on download services'; + + @override + String get logTrackNotFoundSuggestion => + 'The track may not be available in lossless quality'; + + @override + String logTotalErrors(int count) { + return 'Total errors: $count'; + } + + @override + String logAffected(String domains) { + return 'Affected: $domains'; + } + + @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 sectionColor => 'Color'; + + @override + String get sectionTheme => 'Theme'; + + @override + String get sectionLayout => 'Layout'; + + @override + String get settingsAppearanceSubtitle => 'Theme, colors, display'; + + @override + String get settingsDownloadSubtitle => 'Service, quality, filename format'; + + @override + String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + + @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 get tracksHeader => 'Tracks'; + + @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 trackDownloaded => 'Downloaded'; + + @override + String get trackCopyLyrics => 'Copy lyrics'; + + @override + String get trackLyricsNotAvailable => 'Lyrics not available for this track'; + + @override + String get trackLyricsTimeout => 'Request timed out. Try again later.'; + + @override + String get trackLyricsLoadFailed => 'Failed to load lyrics'; + + @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 trackCannotOpen(String message) { + return 'Cannot open: $message'; + } + + @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 concurrentSequential => 'Sequential'; + + @override + String get concurrentParallel2 => '2 Parallel'; + + @override + String get concurrentParallel3 => '3 Parallel'; + + @override + String get tapToSeeError => 'Tap to see error details'; + @override String get storeFilterAll => 'All'; @@ -1304,6 +1666,87 @@ class AppLocalizationsEn extends AppLocalizations { @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 get extensionsDownloadPriority => 'Download Priority'; + + @override + String get extensionsDownloadPrioritySubtitle => 'Set download service order'; + + @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'; @@ -1395,39 +1838,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get serviceSpotify => 'Spotify'; - @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 logIspBlocking => 'ISP BLOCKING DETECTED'; - - @override - String get logRateLimited => 'RATE LIMITED'; - - @override - String get logNetworkError => 'NETWORK ERROR'; - - @override - String get logTrackNotFound => 'TRACK NOT FOUND'; - @override String get appearanceAmoledDark => 'AMOLED Dark'; @@ -1440,351 +1850,6 @@ class AppLocalizationsEn extends AppLocalizations { @override String get appearanceChooseTheme => 'Theme Mode'; - @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 trackCopyFilePath => 'Copy file path'; - - @override - String get trackRemoveFromDevice => 'Remove from device'; - - @override - String get trackLoadLyrics => 'Load Lyrics'; - - @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 concurrentSequential => 'Sequential'; - - @override - String get concurrentParallel2 => '2 Parallel'; - - @override - String get concurrentParallel3 => '3 Parallel'; - - @override - String get filenameAvailablePlaceholders => 'Available placeholders:'; - - @override - String filenameHint(Object artist, Object title) { - return '$artist - $title'; - } - - @override - String get tapToSeeError => 'Tap to see error details'; - - @override - String get setupProceedToNextStep => 'You can now proceed to the next step.'; - - @override - String get setupNotificationProgressDescription => - 'You will receive download progress 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 setupBack => 'Back'; - - @override - String get setupNext => 'Next'; - - @override - String get setupGetStarted => 'Get Started'; - - @override - String get setupSkipAndStart => 'Skip & Start'; - - @override - String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; - - @override - String get setupGetCredentialsFromSpotify => - 'Get credentials from developer.spotify.com'; - - @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 trackDownloaded => 'Downloaded'; - - @override - String get trackCopyLyrics => 'Copy lyrics'; - - @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; - - @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; - - @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; - - @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 trackCannotOpen(String message) { - return 'Cannot open: $message'; - } - - @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 get logIssueSummary => 'Issue Summary'; - - @override - String get logIspBlockingDescription => - 'Your ISP may be blocking access to download services'; - - @override - String get logIspBlockingSuggestion => - 'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8'; - - @override - String get logRateLimitedDescription => 'Too many requests to the service'; - - @override - String get logRateLimitedSuggestion => - 'Wait a few minutes before trying again'; - - @override - String get logNetworkErrorDescription => 'Connection issues detected'; - - @override - String get logNetworkErrorSuggestion => 'Check your internet connection'; - - @override - String get logTrackNotFoundDescription => - 'Some tracks could not be found on download services'; - - @override - String get logTrackNotFoundSuggestion => - 'The track may not be available in lossless quality'; - - @override - String logTotalErrors(int count) { - return 'Total errors: $count'; - } - - @override - String logAffected(String domains) { - return 'Affected: $domains'; - } - - @override - String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; - } - - @override - String logEntries(int count) { - return 'Entries ($count)'; - } - - @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 get extensionsDownloadPriority => 'Download Priority'; - - @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; - - @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 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 aboutDoubleDouble => 'DoubleDouble'; - - @override - String get aboutDoubleDoubleDesc => - 'Amazing API for Amazon Music downloads. Thank you for making it free!'; - - @override - String get aboutDabMusic => 'DAB Music'; - - @override - String get aboutDabMusicDesc => - 'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'; - @override String get queueTitle => 'Download Queue'; @@ -1795,6 +1860,30 @@ class AppLocalizationsEn extends AppLocalizations { String get queueClearAllMessage => 'Are you sure you want to clear all downloads?'; + @override + String get queueEmpty => 'No downloads in queue'; + + @override + String get queueEmptySubtitle => 'Add tracks from the home screen'; + + @override + String get queueClearCompleted => 'Clear completed'; + + @override + String get queueDownloadFailed => 'Download Failed'; + + @override + String get queueTrackLabel => 'Track:'; + + @override + String get queueArtistLabel => 'Artist:'; + + @override + String get queueErrorLabel => 'Error:'; + + @override + String get queueUnknownError => 'Unknown error'; + @override String get albumFolderArtistAlbum => 'Artist / Album'; @@ -1834,79 +1923,6 @@ class AppLocalizationsEn extends AppLocalizations { return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; } - @override - String get utilityFunctions => 'Utility Functions'; - - @override - String get aboutBinimumDesc => - 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; - - @override - String get aboutSachinsenalDesc => - 'The original HiFi project creator. The foundation of Tidal integration!'; - - @override - String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; - - @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 providerBuiltIn => 'Built-in'; - - @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 queueEmpty => 'No downloads in queue'; - - @override - String get queueEmptySubtitle => 'Add tracks from the home screen'; - - @override - String get queueClearCompleted => 'Clear completed'; - - @override - String get queueDownloadFailed => 'Download Failed'; - - @override - String get queueTrackLabel => 'Track:'; - - @override - String get queueArtistLabel => 'Artist:'; - - @override - String get queueErrorLabel => 'Error:'; - - @override - String get queueUnknownError => 'Unknown error'; - @override String get downloadedAlbumTracksHeader => 'Tracks'; @@ -1941,21 +1957,5 @@ class AppLocalizationsEn extends AppLocalizations { String get downloadedAlbumSelectToDelete => 'Select tracks to delete'; @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'; + String get utilityFunctions => 'Utility Functions'; } diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 55b8dae..78c876c 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -446,6 +446,32 @@ class AppLocalizationsId extends AppLocalizations { @override String get aboutVersion => 'Versi'; + @override + String get aboutBinimumDesc => + 'Pembuat QQDL & HiFi API. Tanpa API ini, unduhan Tidal tidak akan ada!'; + + @override + String get aboutSachinsenalDesc => + 'Pembuat proyek HiFi asli. Fondasi dari integrasi Tidal!'; + + @override + String get aboutDoubleDouble => 'DoubleDouble'; + + @override + String get aboutDoubleDoubleDesc => + 'API luar biasa untuk unduhan Amazon Music. Terima kasih sudah membuatnya gratis!'; + + @override + String get aboutDabMusic => 'DAB Music'; + + @override + String get aboutDabMusicDesc => + 'API streaming Qobuz terbaik. Unduhan Hi-Res tidak akan mungkin tanpa ini!'; + + @override + String get aboutAppDescription => + 'Unduh lagu Spotify dalam kualitas lossless dari Tidal, Qobuz, dan Amazon Music.'; + @override String get albumTitle => 'Album'; @@ -478,6 +504,20 @@ class AppLocalizationsId extends AppLocalizations { @override String get artistSingles => 'Single & EP'; + @override + String get artistCompilations => 'Kompilasi'; + + @override + String artistReleases(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count rilis', + one: '1 rilis', + ); + return '$_temp0'; + } + @override String get trackMetadataTitle => 'Info Lagu'; @@ -551,441 +591,6 @@ class AppLocalizationsId extends AppLocalizations { @override String get setupSkip => 'Lewati untuk sekarang'; - @override - String get dialogCancel => 'Batal'; - - @override - String get dialogOk => 'OK'; - - @override - String get dialogSave => 'Simpan'; - - @override - String get dialogDelete => 'Hapus'; - - @override - String get dialogRetry => 'Coba Lagi'; - - @override - String get dialogClose => 'Tutup'; - - @override - String get dialogYes => 'Ya'; - - @override - String get dialogNo => 'Tidak'; - - @override - String get dialogClear => 'Hapus'; - - @override - String get dialogConfirm => 'Konfirmasi'; - - @override - String get dialogDone => 'Selesai'; - - @override - String get dialogClearHistoryTitle => 'Hapus Riwayat'; - - @override - String get dialogClearHistoryMessage => - 'Apakah Anda yakin ingin menghapus semua riwayat unduhan? Ini tidak dapat dibatalkan.'; - - @override - String get dialogDeleteSelectedTitle => 'Hapus yang Dipilih'; - - @override - String dialogDeleteSelectedMessage(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'lagu', - one: 'lagu', - ); - return 'Hapus $count $_temp0 dari riwayat?\n\nIni juga akan menghapus file dari penyimpanan.'; - } - - @override - String get dialogImportPlaylistTitle => 'Impor Playlist'; - - @override - String dialogImportPlaylistMessage(int count) { - return 'Ditemukan $count lagu di CSV. Tambahkan ke antrian unduhan?'; - } - - @override - String snackbarAddedToQueue(String trackName) { - return 'Menambahkan \"$trackName\" ke antrian'; - } - - @override - String snackbarAddedTracksToQueue(int count) { - return 'Menambahkan $count lagu ke antrian'; - } - - @override - String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" sudah diunduh'; - } - - @override - String get snackbarHistoryCleared => 'Riwayat dihapus'; - - @override - String get snackbarCredentialsSaved => 'Kredensial disimpan'; - - @override - String get snackbarCredentialsCleared => 'Kredensial dihapus'; - - @override - String snackbarDeletedTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'lagu', - one: 'lagu', - ); - return 'Menghapus $count $_temp0'; - } - - @override - String snackbarCannotOpenFile(String error) { - return 'Tidak dapat membuka file: $error'; - } - - @override - String get snackbarFillAllFields => 'Harap isi semua field'; - - @override - String get snackbarViewQueue => 'Lihat Antrian'; - - @override - String get errorRateLimited => 'Dibatasi'; - - @override - String get errorRateLimitedMessage => - 'Terlalu banyak permintaan. Harap tunggu sebentar sebelum mencari lagi.'; - - @override - String errorFailedToLoad(String item) { - return 'Gagal memuat $item'; - } - - @override - String get errorNoTracksFound => 'Tidak ada lagu ditemukan'; - - @override - String errorMissingExtensionSource(String item) { - return 'Tidak dapat memuat $item: sumber ekstensi tidak ada'; - } - - @override - String get statusQueued => 'Mengantri'; - - @override - String get statusDownloading => 'Mengunduh'; - - @override - String get statusFinalizing => 'Menyelesaikan'; - - @override - String get statusCompleted => 'Selesai'; - - @override - String get statusFailed => 'Gagal'; - - @override - String get statusSkipped => 'Dilewati'; - - @override - String get statusPaused => 'Dijeda'; - - @override - String get actionPause => 'Jeda'; - - @override - String get actionResume => 'Lanjutkan'; - - @override - String get actionCancel => 'Batal'; - - @override - String get actionStop => 'Hentikan'; - - @override - String get actionSelect => 'Pilih'; - - @override - String get actionSelectAll => 'Pilih Semua'; - - @override - String get actionDeselect => 'Batal Pilih'; - - @override - String get actionPaste => 'Tempel'; - - @override - String get actionImportCsv => 'Impor CSV'; - - @override - String get actionRemoveCredentials => 'Hapus Kredensial'; - - @override - String get actionSaveCredentials => 'Simpan Kredensial'; - - @override - String selectionSelected(int count) { - return '$count dipilih'; - } - - @override - String get selectionAllSelected => 'Semua lagu dipilih'; - - @override - String get selectionTapToSelect => 'Ketuk lagu untuk memilih'; - - @override - String selectionDeleteTracks(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: 'lagu', - one: 'lagu', - ); - return 'Hapus $count $_temp0'; - } - - @override - String get selectionSelectToDelete => 'Pilih lagu untuk dihapus'; - - @override - String progressFetchingMetadata(int current, int total) { - return 'Mengambil metadata... $current/$total'; - } - - @override - String get progressReadingCsv => 'Membaca CSV...'; - - @override - String get searchSongs => 'Lagu'; - - @override - String get searchArtists => 'Artis'; - - @override - String get searchAlbums => 'Album'; - - @override - String get searchPlaylists => 'Playlist'; - - @override - String get tooltipPlay => 'Putar'; - - @override - String get tooltipCancel => 'Batal'; - - @override - String get tooltipStop => 'Hentikan'; - - @override - String get tooltipRetry => 'Coba Lagi'; - - @override - String get tooltipRemove => 'Hapus'; - - @override - String get tooltipClear => 'Hapus'; - - @override - String get tooltipPaste => 'Tempel'; - - @override - String get filenameFormat => 'Format Nama File'; - - @override - String filenameFormatPreview(String preview) { - return 'Pratinjau: $preview'; - } - - @override - String get folderOrganization => 'Organisasi Folder'; - - @override - String get folderOrganizationNone => 'Tidak ada'; - - @override - String get folderOrganizationByArtist => 'Berdasarkan Artis'; - - @override - String get folderOrganizationByAlbum => 'Berdasarkan Album'; - - @override - String get folderOrganizationByArtistAlbum => 'Berdasarkan Artis & Album'; - - @override - String get updateAvailable => 'Pembaruan Tersedia'; - - @override - String updateNewVersion(String version) { - return 'Versi $version tersedia'; - } - - @override - String get updateDownload => 'Unduh'; - - @override - String get updateLater => 'Nanti'; - - @override - String get updateChangelog => 'Log Perubahan'; - - @override - String get providerPriority => 'Prioritas Provider'; - - @override - String get providerPrioritySubtitle => - 'Seret untuk mengatur ulang provider unduhan'; - - @override - String get metadataProviderPriority => 'Prioritas Provider Metadata'; - - @override - String get metadataProviderPrioritySubtitle => - 'Urutan yang digunakan saat mengambil metadata lagu'; - - @override - String get logTitle => 'Log'; - - @override - String get logCopy => 'Salin Log'; - - @override - String get logClear => 'Hapus Log'; - - @override - String get logShare => 'Bagikan Log'; - - @override - String get logEmpty => 'Belum ada log'; - - @override - String get logCopied => 'Log disalin ke clipboard'; - - @override - String get credentialsTitle => 'Kredensial Spotify'; - - @override - String get credentialsDescription => - 'Masukkan Client ID dan Secret Anda untuk menggunakan kuota aplikasi Spotify Anda sendiri.'; - - @override - String get credentialsClientId => 'Client ID'; - - @override - String get credentialsClientIdHint => 'Tempel Client ID'; - - @override - String get credentialsClientSecret => 'Client Secret'; - - @override - String get credentialsClientSecretHint => 'Tempel Client Secret'; - - @override - String get channelStable => 'Stabil'; - - @override - String get channelPreview => 'Preview'; - - @override - String get sectionSearchSource => 'Sumber Pencarian'; - - @override - String get sectionDownload => 'Unduhan'; - - @override - String get sectionPerformance => 'Performa'; - - @override - String get sectionApp => 'Aplikasi'; - - @override - String get sectionData => 'Data'; - - @override - String get sectionDebug => 'Debug'; - - @override - String get sectionService => 'Layanan'; - - @override - String get sectionAudioQuality => 'Kualitas Audio'; - - @override - String get sectionFileSettings => 'Pengaturan File'; - - @override - String get sectionColor => 'Warna'; - - @override - String get sectionTheme => 'Tema'; - - @override - String get sectionLayout => 'Tata Letak'; - - @override - String get settingsAppearanceSubtitle => 'Tema, warna, tampilan'; - - @override - String get settingsDownloadSubtitle => 'Layanan, kualitas, format nama file'; - - @override - String get settingsOptionsSubtitle => 'Fallback, lirik, cover art, pembaruan'; - - @override - String get settingsExtensionsSubtitle => 'Kelola provider unduhan'; - - @override - String get settingsLogsSubtitle => 'Lihat log aplikasi untuk debugging'; - - @override - String get loadingSharedLink => 'Memuat link yang dibagikan...'; - - @override - String get pressBackAgainToExit => 'Tekan kembali sekali lagi untuk keluar'; - - @override - String artistReleases(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count rilis', - one: '1 rilis', - ); - return '$_temp0'; - } - - @override - String get artistCompilations => 'Kompilasi'; - - @override - String get tracksHeader => 'Lagu'; - - @override - String downloadAllCount(int count) { - return 'Unduh Semua ($count)'; - } - - @override - String tracksCount(int count) { - String _temp0 = intl.Intl.pluralLogic( - count, - locale: localeName, - other: '$count lagu', - one: '1 lagu', - ); - return '$_temp0'; - } - @override String get setupStorageAccessRequired => 'Akses Penyimpanan Diperlukan'; @@ -1134,6 +739,74 @@ class AppLocalizationsId extends AppLocalizations { @override String get setupEnableNotifications => 'Aktifkan Notifikasi'; + @override + String get setupProceedToNextStep => + 'Anda dapat melanjutkan ke langkah berikutnya.'; + + @override + String get setupNotificationProgressDescription => + 'Anda akan menerima notifikasi progres unduhan.'; + + @override + String get setupNotificationBackgroundDescription => + 'Dapatkan notifikasi tentang progres dan penyelesaian unduhan. Ini membantu Anda melacak unduhan saat aplikasi di latar belakang.'; + + @override + String get setupSkipForNow => 'Lewati untuk sekarang'; + + @override + String get setupBack => 'Kembali'; + + @override + String get setupNext => 'Lanjut'; + + @override + String get setupGetStarted => 'Mulai'; + + @override + String get setupSkipAndStart => 'Lewati & Mulai'; + + @override + String get setupAllowAccessToManageFiles => + 'Harap aktifkan \"Izinkan akses untuk mengelola semua file\" di layar berikutnya.'; + + @override + String get setupGetCredentialsFromSpotify => + 'Dapatkan kredensial dari developer.spotify.com'; + + @override + String get dialogCancel => 'Batal'; + + @override + String get dialogOk => 'OK'; + + @override + String get dialogSave => 'Simpan'; + + @override + String get dialogDelete => 'Hapus'; + + @override + String get dialogRetry => 'Coba Lagi'; + + @override + String get dialogClose => 'Tutup'; + + @override + String get dialogYes => 'Ya'; + + @override + String get dialogNo => 'Tidak'; + + @override + String get dialogClear => 'Hapus'; + + @override + String get dialogConfirm => 'Konfirmasi'; + + @override + String get dialogDone => 'Selesai'; + @override String get dialogImport => 'Impor'; @@ -1190,6 +863,81 @@ class AppLocalizationsId extends AppLocalizations { return 'Apakah Anda yakin ingin menghapus $extensionName?'; } + @override + String get dialogClearHistoryTitle => 'Hapus Riwayat'; + + @override + String get dialogClearHistoryMessage => + 'Apakah Anda yakin ingin menghapus semua riwayat unduhan? Ini tidak dapat dibatalkan.'; + + @override + String get dialogDeleteSelectedTitle => 'Hapus yang Dipilih'; + + @override + String dialogDeleteSelectedMessage(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'lagu', + one: 'lagu', + ); + return 'Hapus $count $_temp0 dari riwayat?\n\nIni juga akan menghapus file dari penyimpanan.'; + } + + @override + String get dialogImportPlaylistTitle => 'Impor Playlist'; + + @override + String dialogImportPlaylistMessage(int count) { + return 'Ditemukan $count lagu di CSV. Tambahkan ke antrian unduhan?'; + } + + @override + String snackbarAddedToQueue(String trackName) { + return 'Menambahkan \"$trackName\" ke antrian'; + } + + @override + String snackbarAddedTracksToQueue(int count) { + return 'Menambahkan $count lagu ke antrian'; + } + + @override + String snackbarAlreadyDownloaded(String trackName) { + return '\"$trackName\" sudah diunduh'; + } + + @override + String get snackbarHistoryCleared => 'Riwayat dihapus'; + + @override + String get snackbarCredentialsSaved => 'Kredensial disimpan'; + + @override + String get snackbarCredentialsCleared => 'Kredensial dihapus'; + + @override + String snackbarDeletedTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'lagu', + one: 'lagu', + ); + return 'Menghapus $count $_temp0'; + } + + @override + String snackbarCannotOpenFile(String error) { + return 'Tidak dapat membuka file: $error'; + } + + @override + String get snackbarFillAllFields => 'Harap isi semua field'; + + @override + String get snackbarViewQueue => 'Lihat Antrian'; + @override String snackbarFailedToLoad(String error) { return 'Gagal memuat: $error'; @@ -1229,6 +977,624 @@ class AppLocalizationsId extends AppLocalizations { @override String get snackbarFailedToUpdate => 'Gagal memperbarui ekstensi'; + @override + String get errorRateLimited => 'Dibatasi'; + + @override + String get errorRateLimitedMessage => + 'Terlalu banyak permintaan. Harap tunggu sebentar sebelum mencari lagi.'; + + @override + String errorFailedToLoad(String item) { + return 'Gagal memuat $item'; + } + + @override + String get errorNoTracksFound => 'Tidak ada lagu ditemukan'; + + @override + String errorMissingExtensionSource(String item) { + return 'Tidak dapat memuat $item: sumber ekstensi tidak ada'; + } + + @override + String get statusQueued => 'Mengantri'; + + @override + String get statusDownloading => 'Mengunduh'; + + @override + String get statusFinalizing => 'Menyelesaikan'; + + @override + String get statusCompleted => 'Selesai'; + + @override + String get statusFailed => 'Gagal'; + + @override + String get statusSkipped => 'Dilewati'; + + @override + String get statusPaused => 'Dijeda'; + + @override + String get actionPause => 'Jeda'; + + @override + String get actionResume => 'Lanjutkan'; + + @override + String get actionCancel => 'Batal'; + + @override + String get actionStop => 'Hentikan'; + + @override + String get actionSelect => 'Pilih'; + + @override + String get actionSelectAll => 'Pilih Semua'; + + @override + String get actionDeselect => 'Batal Pilih'; + + @override + String get actionPaste => 'Tempel'; + + @override + String get actionImportCsv => 'Impor CSV'; + + @override + String get actionRemoveCredentials => 'Hapus Kredensial'; + + @override + String get actionSaveCredentials => 'Simpan Kredensial'; + + @override + String selectionSelected(int count) { + return '$count dipilih'; + } + + @override + String get selectionAllSelected => 'Semua lagu dipilih'; + + @override + String get selectionTapToSelect => 'Ketuk lagu untuk memilih'; + + @override + String selectionDeleteTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'lagu', + one: 'lagu', + ); + return 'Hapus $count $_temp0'; + } + + @override + String get selectionSelectToDelete => 'Pilih lagu untuk dihapus'; + + @override + String progressFetchingMetadata(int current, int total) { + return 'Mengambil metadata... $current/$total'; + } + + @override + String get progressReadingCsv => 'Membaca CSV...'; + + @override + String get searchSongs => 'Lagu'; + + @override + String get searchArtists => 'Artis'; + + @override + String get searchAlbums => 'Album'; + + @override + String get searchPlaylists => 'Playlist'; + + @override + String get tooltipPlay => 'Putar'; + + @override + String get tooltipCancel => 'Batal'; + + @override + String get tooltipStop => 'Hentikan'; + + @override + String get tooltipRetry => 'Coba Lagi'; + + @override + String get tooltipRemove => 'Hapus'; + + @override + String get tooltipClear => 'Hapus'; + + @override + String get tooltipPaste => 'Tempel'; + + @override + String get filenameFormat => 'Format Nama File'; + + @override + String filenameFormatPreview(String preview) { + return 'Pratinjau: $preview'; + } + + @override + String get filenameAvailablePlaceholders => 'Placeholder yang tersedia:'; + + @override + String filenameHint(Object artist, Object title) { + return '$artist - $title'; + } + + @override + String get folderOrganization => 'Organisasi Folder'; + + @override + String get folderOrganizationNone => 'Tidak ada'; + + @override + String get folderOrganizationByArtist => 'Berdasarkan Artis'; + + @override + String get folderOrganizationByAlbum => 'Berdasarkan Album'; + + @override + String get folderOrganizationByArtistAlbum => 'Berdasarkan Artis & Album'; + + @override + String get folderOrganizationDescription => + 'Atur file yang diunduh ke dalam folder'; + + @override + String get folderOrganizationNoneSubtitle => 'Semua file di folder unduhan'; + + @override + String get folderOrganizationByArtistSubtitle => + 'Folder terpisah untuk setiap artis'; + + @override + String get folderOrganizationByAlbumSubtitle => + 'Folder terpisah untuk setiap album'; + + @override + String get folderOrganizationByArtistAlbumSubtitle => + 'Folder bersarang untuk artis dan album'; + + @override + String get updateAvailable => 'Pembaruan Tersedia'; + + @override + String updateNewVersion(String version) { + return 'Versi $version tersedia'; + } + + @override + String get updateDownload => 'Unduh'; + + @override + String get updateLater => 'Nanti'; + + @override + String get updateChangelog => 'Log Perubahan'; + + @override + String get updateStartingDownload => 'Memulai unduhan...'; + + @override + String get updateDownloadFailed => 'Unduhan gagal'; + + @override + String get updateFailedMessage => 'Gagal mengunduh pembaruan'; + + @override + String get updateNewVersionReady => 'Versi baru sudah siap'; + + @override + String get updateCurrent => 'Saat ini'; + + @override + String get updateNew => 'Baru'; + + @override + String get updateDownloading => 'Mengunduh...'; + + @override + String get updateWhatsNew => 'Yang Baru'; + + @override + String get updateDownloadInstall => 'Unduh & Pasang'; + + @override + String get updateDontRemind => 'Jangan ingatkan'; + + @override + String get providerPriority => 'Prioritas Provider'; + + @override + String get providerPrioritySubtitle => + 'Seret untuk mengatur ulang provider unduhan'; + + @override + String get providerPriorityTitle => 'Prioritas Provider'; + + @override + String get providerPriorityDescription => + 'Seret untuk mengatur ulang urutan provider unduhan. Aplikasi akan mencoba provider dari atas ke bawah saat mengunduh lagu.'; + + @override + String get providerPriorityInfo => + 'Jika lagu tidak tersedia di provider pertama, aplikasi akan otomatis mencoba yang berikutnya.'; + + @override + String get providerBuiltIn => 'Bawaan'; + + @override + String get providerExtension => 'Ekstensi'; + + @override + String get metadataProviderPriority => 'Prioritas Provider Metadata'; + + @override + String get metadataProviderPrioritySubtitle => + 'Urutan yang digunakan saat mengambil metadata lagu'; + + @override + String get metadataProviderPriorityTitle => 'Prioritas Metadata'; + + @override + String get metadataProviderPriorityDescription => + 'Seret untuk mengatur ulang urutan provider metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.'; + + @override + String get metadataProviderPriorityInfo => + 'Deezer tidak memiliki batas rate dan direkomendasikan sebagai utama. Spotify mungkin membatasi rate setelah banyak permintaan.'; + + @override + String get metadataNoRateLimits => 'Tidak ada batas rate'; + + @override + String get metadataMayRateLimit => 'Mungkin dibatasi rate'; + + @override + String get logTitle => 'Log'; + + @override + String get logCopy => 'Salin Log'; + + @override + String get logClear => 'Hapus Log'; + + @override + String get logShare => 'Bagikan Log'; + + @override + String get logEmpty => 'Belum ada log'; + + @override + String get logCopied => 'Log disalin ke clipboard'; + + @override + String get logSearchHint => 'Cari log...'; + + @override + String get logFilterLevel => 'Level'; + + @override + String get logFilterSection => 'Filter'; + + @override + String get logShareLogs => 'Bagikan log'; + + @override + String get logClearLogs => 'Hapus log'; + + @override + String get logClearLogsTitle => 'Hapus Log'; + + @override + String get logClearLogsMessage => + 'Apakah Anda yakin ingin menghapus semua log?'; + + @override + String get logIspBlocking => 'PEMBLOKIRAN ISP TERDETEKSI'; + + @override + String get logRateLimited => 'DIBATASI'; + + @override + String get logNetworkError => 'ERROR JARINGAN'; + + @override + String get logTrackNotFound => 'LAGU TIDAK DITEMUKAN'; + + @override + String get logFilterBySeverity => 'Filter log berdasarkan tingkat keparahan'; + + @override + String get logNoLogsYet => 'Belum ada log'; + + @override + String get logNoLogsYetSubtitle => + 'Log akan muncul di sini saat Anda menggunakan aplikasi'; + + @override + String get logIssueSummary => 'Ringkasan Masalah'; + + @override + String get logIspBlockingDescription => + 'ISP Anda mungkin memblokir akses ke layanan unduhan'; + + @override + String get logIspBlockingSuggestion => + 'Coba gunakan VPN atau ubah DNS ke 1.1.1.1 atau 8.8.8.8'; + + @override + String get logRateLimitedDescription => + 'Terlalu banyak permintaan ke layanan'; + + @override + String get logRateLimitedSuggestion => + 'Tunggu beberapa menit sebelum mencoba lagi'; + + @override + String get logNetworkErrorDescription => 'Masalah koneksi terdeteksi'; + + @override + String get logNetworkErrorSuggestion => 'Periksa koneksi internet Anda'; + + @override + String get logTrackNotFoundDescription => + 'Beberapa lagu tidak dapat ditemukan di layanan unduhan'; + + @override + String get logTrackNotFoundSuggestion => + 'Lagu mungkin tidak tersedia dalam kualitas lossless'; + + @override + String logTotalErrors(int count) { + return 'Total error: $count'; + } + + @override + String logAffected(String domains) { + return 'Terpengaruh: $domains'; + } + + @override + String logEntriesFiltered(int count) { + return 'Entri ($count difilter)'; + } + + @override + String logEntries(int count) { + return 'Entri ($count)'; + } + + @override + String get credentialsTitle => 'Kredensial Spotify'; + + @override + String get credentialsDescription => + 'Masukkan Client ID dan Secret Anda untuk menggunakan kuota aplikasi Spotify Anda sendiri.'; + + @override + String get credentialsClientId => 'Client ID'; + + @override + String get credentialsClientIdHint => 'Tempel Client ID'; + + @override + String get credentialsClientSecret => 'Client Secret'; + + @override + String get credentialsClientSecretHint => 'Tempel Client Secret'; + + @override + String get channelStable => 'Stabil'; + + @override + String get channelPreview => 'Preview'; + + @override + String get sectionSearchSource => 'Sumber Pencarian'; + + @override + String get sectionDownload => 'Unduhan'; + + @override + String get sectionPerformance => 'Performa'; + + @override + String get sectionApp => 'Aplikasi'; + + @override + String get sectionData => 'Data'; + + @override + String get sectionDebug => 'Debug'; + + @override + String get sectionService => 'Layanan'; + + @override + String get sectionAudioQuality => 'Kualitas Audio'; + + @override + String get sectionFileSettings => 'Pengaturan File'; + + @override + String get sectionColor => 'Warna'; + + @override + String get sectionTheme => 'Tema'; + + @override + String get sectionLayout => 'Tata Letak'; + + @override + String get settingsAppearanceSubtitle => 'Tema, warna, tampilan'; + + @override + String get settingsDownloadSubtitle => 'Layanan, kualitas, format nama file'; + + @override + String get settingsOptionsSubtitle => 'Fallback, lirik, cover art, pembaruan'; + + @override + String get settingsExtensionsSubtitle => 'Kelola provider unduhan'; + + @override + String get settingsLogsSubtitle => 'Lihat log aplikasi untuk debugging'; + + @override + String get loadingSharedLink => 'Memuat link yang dibagikan...'; + + @override + String get pressBackAgainToExit => 'Tekan kembali sekali lagi untuk keluar'; + + @override + String get tracksHeader => 'Lagu'; + + @override + String downloadAllCount(int count) { + return 'Unduh Semua ($count)'; + } + + @override + String tracksCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count lagu', + one: '1 lagu', + ); + return '$_temp0'; + } + + @override + String get trackCopyFilePath => 'Salin lokasi file'; + + @override + String get trackRemoveFromDevice => 'Hapus dari perangkat'; + + @override + String get trackLoadLyrics => 'Muat Lirik'; + + @override + String get trackMetadata => 'Metadata'; + + @override + String get trackFileInfo => 'Info File'; + + @override + String get trackLyrics => 'Lirik'; + + @override + String get trackFileNotFound => 'File tidak ditemukan'; + + @override + String get trackOpenInDeezer => 'Buka di Deezer'; + + @override + String get trackOpenInSpotify => 'Buka di Spotify'; + + @override + String get trackTrackName => 'Nama lagu'; + + @override + String get trackArtist => 'Artis'; + + @override + String get trackAlbumArtist => 'Artis album'; + + @override + String get trackAlbum => 'Album'; + + @override + String get trackTrackNumber => 'Nomor lagu'; + + @override + String get trackDiscNumber => 'Nomor disc'; + + @override + String get trackDuration => 'Durasi'; + + @override + String get trackAudioQuality => 'Kualitas audio'; + + @override + String get trackReleaseDate => 'Tanggal rilis'; + + @override + String get trackDownloaded => 'Diunduh'; + + @override + String get trackCopyLyrics => 'Salin lirik'; + + @override + String get trackLyricsNotAvailable => 'Lirik tidak tersedia untuk lagu ini'; + + @override + String get trackLyricsTimeout => 'Permintaan timeout. Coba lagi nanti.'; + + @override + String get trackLyricsLoadFailed => 'Gagal memuat lirik'; + + @override + String get trackCopiedToClipboard => 'Disalin ke clipboard'; + + @override + String get trackDeleteConfirmTitle => 'Hapus dari perangkat?'; + + @override + String get trackDeleteConfirmMessage => + 'Ini akan menghapus file unduhan secara permanen dan menghapusnya dari riwayat Anda.'; + + @override + String trackCannotOpen(String message) { + return 'Tidak dapat membuka: $message'; + } + + @override + String get dateToday => 'Hari ini'; + + @override + String get dateYesterday => 'Kemarin'; + + @override + String dateDaysAgo(int count) { + return '$count hari lalu'; + } + + @override + String dateWeeksAgo(int count) { + return '$count minggu lalu'; + } + + @override + String dateMonthsAgo(int count) { + return '$count bulan lalu'; + } + + @override + String get concurrentSequential => 'Berurutan'; + + @override + String get concurrentParallel2 => '2 Paralel'; + + @override + String get concurrentParallel3 => '3 Paralel'; + + @override + String get tapToSeeError => 'Ketuk untuk melihat detail error'; + @override String get storeFilterAll => 'Semua'; @@ -1310,6 +1676,89 @@ class AppLocalizationsId extends AppLocalizations { @override String get extensionMinAppVersion => 'Versi App Minimum'; + @override + String get extensionCustomTrackMatching => 'Pencocokan Lagu Kustom'; + + @override + String get extensionPostProcessing => 'Pasca-Pemrosesan'; + + @override + String extensionHooksAvailable(int count) { + return '$count hook tersedia'; + } + + @override + String extensionPatternsCount(int count) { + return '$count pola'; + } + + @override + String extensionStrategy(String strategy) { + return 'Strategi: $strategy'; + } + + @override + String get extensionsProviderPrioritySection => 'Prioritas Provider'; + + @override + String get extensionsInstalledSection => 'Ekstensi Terpasang'; + + @override + String get extensionsNoExtensions => 'Tidak ada ekstensi terpasang'; + + @override + String get extensionsNoExtensionsSubtitle => + 'Pasang file .spotiflac-ext untuk menambahkan provider baru'; + + @override + String get extensionsInstallButton => 'Pasang Ekstensi'; + + @override + String get extensionsInfoTip => + 'Ekstensi dapat menambahkan provider metadata dan unduhan baru. Hanya pasang ekstensi dari sumber terpercaya.'; + + @override + String get extensionsInstalledSuccess => 'Ekstensi berhasil dipasang'; + + @override + String get extensionsDownloadPriority => 'Prioritas Unduhan'; + + @override + String get extensionsDownloadPrioritySubtitle => + 'Atur urutan layanan unduhan'; + + @override + String get extensionsNoDownloadProvider => + 'Tidak ada ekstensi dengan provider unduhan'; + + @override + String get extensionsMetadataPriority => 'Prioritas Metadata'; + + @override + String get extensionsMetadataPrioritySubtitle => + 'Atur urutan sumber pencarian & metadata'; + + @override + String get extensionsNoMetadataProvider => + 'Tidak ada ekstensi dengan provider metadata'; + + @override + String get extensionsSearchProvider => 'Provider Pencarian'; + + @override + String get extensionsNoCustomSearch => + 'Tidak ada ekstensi dengan pencarian kustom'; + + @override + String get extensionsSearchProviderDescription => + 'Pilih layanan yang digunakan untuk mencari lagu'; + + @override + String get extensionsCustomSearch => 'Pencarian kustom'; + + @override + String get extensionsErrorLoading => 'Error memuat ekstensi'; + @override String get qualityFlacLossless => 'FLAC Lossless'; @@ -1402,40 +1851,6 @@ class AppLocalizationsId extends AppLocalizations { @override String get serviceSpotify => 'Spotify'; - @override - String get logSearchHint => 'Cari log...'; - - @override - String get logFilterLevel => 'Level'; - - @override - String get logFilterSection => 'Filter'; - - @override - String get logShareLogs => 'Bagikan log'; - - @override - String get logClearLogs => 'Hapus log'; - - @override - String get logClearLogsTitle => 'Hapus Log'; - - @override - String get logClearLogsMessage => - 'Apakah Anda yakin ingin menghapus semua log?'; - - @override - String get logIspBlocking => 'PEMBLOKIRAN ISP TERDETEKSI'; - - @override - String get logRateLimited => 'DIBATASI'; - - @override - String get logNetworkError => 'ERROR JARINGAN'; - - @override - String get logTrackNotFound => 'LAGU TIDAK DITEMUKAN'; - @override String get appearanceAmoledDark => 'AMOLED Gelap'; @@ -1448,356 +1863,6 @@ class AppLocalizationsId extends AppLocalizations { @override String get appearanceChooseTheme => 'Mode Tema'; - @override - String get updateStartingDownload => 'Memulai unduhan...'; - - @override - String get updateDownloadFailed => 'Unduhan gagal'; - - @override - String get updateFailedMessage => 'Gagal mengunduh pembaruan'; - - @override - String get updateNewVersionReady => 'Versi baru sudah siap'; - - @override - String get updateCurrent => 'Saat ini'; - - @override - String get updateNew => 'Baru'; - - @override - String get updateDownloading => 'Mengunduh...'; - - @override - String get updateWhatsNew => 'Yang Baru'; - - @override - String get updateDownloadInstall => 'Unduh & Pasang'; - - @override - String get updateDontRemind => 'Jangan ingatkan'; - - @override - String get trackCopyFilePath => 'Salin lokasi file'; - - @override - String get trackRemoveFromDevice => 'Hapus dari perangkat'; - - @override - String get trackLoadLyrics => 'Muat Lirik'; - - @override - String get dateToday => 'Hari ini'; - - @override - String get dateYesterday => 'Kemarin'; - - @override - String dateDaysAgo(int count) { - return '$count hari lalu'; - } - - @override - String dateWeeksAgo(int count) { - return '$count minggu lalu'; - } - - @override - String dateMonthsAgo(int count) { - return '$count bulan lalu'; - } - - @override - String get concurrentSequential => 'Berurutan'; - - @override - String get concurrentParallel2 => '2 Paralel'; - - @override - String get concurrentParallel3 => '3 Paralel'; - - @override - String get filenameAvailablePlaceholders => 'Placeholder yang tersedia:'; - - @override - String filenameHint(Object artist, Object title) { - return '$artist - $title'; - } - - @override - String get tapToSeeError => 'Ketuk untuk melihat detail error'; - - @override - String get setupProceedToNextStep => - 'Anda dapat melanjutkan ke langkah berikutnya.'; - - @override - String get setupNotificationProgressDescription => - 'Anda akan menerima notifikasi progres unduhan.'; - - @override - String get setupNotificationBackgroundDescription => - 'Dapatkan notifikasi tentang progres dan penyelesaian unduhan. Ini membantu Anda melacak unduhan saat aplikasi di latar belakang.'; - - @override - String get setupSkipForNow => 'Lewati untuk sekarang'; - - @override - String get setupBack => 'Kembali'; - - @override - String get setupNext => 'Lanjut'; - - @override - String get setupGetStarted => 'Mulai'; - - @override - String get setupSkipAndStart => 'Lewati & Mulai'; - - @override - String get setupAllowAccessToManageFiles => - 'Harap aktifkan \"Izinkan akses untuk mengelola semua file\" di layar berikutnya.'; - - @override - String get setupGetCredentialsFromSpotify => - 'Dapatkan kredensial dari developer.spotify.com'; - - @override - String get trackMetadata => 'Metadata'; - - @override - String get trackFileInfo => 'Info File'; - - @override - String get trackLyrics => 'Lirik'; - - @override - String get trackFileNotFound => 'File tidak ditemukan'; - - @override - String get trackOpenInDeezer => 'Buka di Deezer'; - - @override - String get trackOpenInSpotify => 'Buka di Spotify'; - - @override - String get trackTrackName => 'Nama lagu'; - - @override - String get trackArtist => 'Artis'; - - @override - String get trackAlbumArtist => 'Artis album'; - - @override - String get trackAlbum => 'Album'; - - @override - String get trackTrackNumber => 'Nomor lagu'; - - @override - String get trackDiscNumber => 'Nomor disc'; - - @override - String get trackDuration => 'Durasi'; - - @override - String get trackAudioQuality => 'Kualitas audio'; - - @override - String get trackReleaseDate => 'Tanggal rilis'; - - @override - String get trackDownloaded => 'Diunduh'; - - @override - String get trackCopyLyrics => 'Salin lirik'; - - @override - String get trackLyricsNotAvailable => 'Lirik tidak tersedia untuk lagu ini'; - - @override - String get trackLyricsTimeout => 'Permintaan timeout. Coba lagi nanti.'; - - @override - String get trackLyricsLoadFailed => 'Gagal memuat lirik'; - - @override - String get trackCopiedToClipboard => 'Disalin ke clipboard'; - - @override - String get trackDeleteConfirmTitle => 'Hapus dari perangkat?'; - - @override - String get trackDeleteConfirmMessage => - 'Ini akan menghapus file unduhan secara permanen dan menghapusnya dari riwayat Anda.'; - - @override - String trackCannotOpen(String message) { - return 'Tidak dapat membuka: $message'; - } - - @override - String get logFilterBySeverity => 'Filter log berdasarkan tingkat keparahan'; - - @override - String get logNoLogsYet => 'Belum ada log'; - - @override - String get logNoLogsYetSubtitle => - 'Log akan muncul di sini saat Anda menggunakan aplikasi'; - - @override - String get logIssueSummary => 'Ringkasan Masalah'; - - @override - String get logIspBlockingDescription => - 'ISP Anda mungkin memblokir akses ke layanan unduhan'; - - @override - String get logIspBlockingSuggestion => - 'Coba gunakan VPN atau ubah DNS ke 1.1.1.1 atau 8.8.8.8'; - - @override - String get logRateLimitedDescription => - 'Terlalu banyak permintaan ke layanan'; - - @override - String get logRateLimitedSuggestion => - 'Tunggu beberapa menit sebelum mencoba lagi'; - - @override - String get logNetworkErrorDescription => 'Masalah koneksi terdeteksi'; - - @override - String get logNetworkErrorSuggestion => 'Periksa koneksi internet Anda'; - - @override - String get logTrackNotFoundDescription => - 'Beberapa lagu tidak dapat ditemukan di layanan unduhan'; - - @override - String get logTrackNotFoundSuggestion => - 'Lagu mungkin tidak tersedia dalam kualitas lossless'; - - @override - String logTotalErrors(int count) { - return 'Total error: $count'; - } - - @override - String logAffected(String domains) { - return 'Terpengaruh: $domains'; - } - - @override - String logEntriesFiltered(int count) { - return 'Entri ($count difilter)'; - } - - @override - String logEntries(int count) { - return 'Entri ($count)'; - } - - @override - String get extensionsProviderPrioritySection => 'Prioritas Provider'; - - @override - String get extensionsInstalledSection => 'Ekstensi Terpasang'; - - @override - String get extensionsNoExtensions => 'Tidak ada ekstensi terpasang'; - - @override - String get extensionsNoExtensionsSubtitle => - 'Pasang file .spotiflac-ext untuk menambahkan provider baru'; - - @override - String get extensionsInstallButton => 'Pasang Ekstensi'; - - @override - String get extensionsInfoTip => - 'Ekstensi dapat menambahkan provider metadata dan unduhan baru. Hanya pasang ekstensi dari sumber terpercaya.'; - - @override - String get extensionsInstalledSuccess => 'Ekstensi berhasil dipasang'; - - @override - String get extensionsDownloadPriority => 'Prioritas Unduhan'; - - @override - String get extensionsDownloadPrioritySubtitle => - 'Atur urutan layanan unduhan'; - - @override - String get extensionsNoDownloadProvider => - 'Tidak ada ekstensi dengan provider unduhan'; - - @override - String get extensionsMetadataPriority => 'Prioritas Metadata'; - - @override - String get extensionsMetadataPrioritySubtitle => - 'Atur urutan sumber pencarian & metadata'; - - @override - String get extensionsNoMetadataProvider => - 'Tidak ada ekstensi dengan provider metadata'; - - @override - String get extensionsSearchProvider => 'Provider Pencarian'; - - @override - String get extensionsNoCustomSearch => - 'Tidak ada ekstensi dengan pencarian kustom'; - - @override - String get extensionsSearchProviderDescription => - 'Pilih layanan yang digunakan untuk mencari lagu'; - - @override - String get extensionsCustomSearch => 'Pencarian kustom'; - - @override - String get extensionsErrorLoading => 'Error memuat ekstensi'; - - @override - String get extensionCustomTrackMatching => 'Pencocokan Lagu Kustom'; - - @override - String get extensionPostProcessing => 'Pasca-Pemrosesan'; - - @override - String extensionHooksAvailable(int count) { - return '$count hook tersedia'; - } - - @override - String extensionPatternsCount(int count) { - return '$count pola'; - } - - @override - String extensionStrategy(String strategy) { - return 'Strategi: $strategy'; - } - - @override - String get aboutDoubleDouble => 'DoubleDouble'; - - @override - String get aboutDoubleDoubleDesc => - 'API luar biasa untuk unduhan Amazon Music. Terima kasih sudah membuatnya gratis!'; - - @override - String get aboutDabMusic => 'DAB Music'; - - @override - String get aboutDabMusicDesc => - 'API streaming Qobuz terbaik. Unduhan Hi-Res tidak akan mungkin tanpa ini!'; - @override String get queueTitle => 'Antrian Unduhan'; @@ -1808,6 +1873,30 @@ class AppLocalizationsId extends AppLocalizations { String get queueClearAllMessage => 'Apakah Anda yakin ingin menghapus semua unduhan?'; + @override + String get queueEmpty => 'Tidak ada unduhan dalam antrian'; + + @override + String get queueEmptySubtitle => 'Tambahkan lagu dari layar beranda'; + + @override + String get queueClearCompleted => 'Hapus yang selesai'; + + @override + String get queueDownloadFailed => 'Unduhan Gagal'; + + @override + String get queueTrackLabel => 'Lagu:'; + + @override + String get queueArtistLabel => 'Artis:'; + + @override + String get queueErrorLabel => 'Error:'; + + @override + String get queueUnknownError => 'Error tidak diketahui'; + @override String get albumFolderArtistAlbum => 'Artis / Album'; @@ -1847,79 +1936,6 @@ class AppLocalizationsId extends AppLocalizations { return 'Hapus $count $_temp0 dari album ini?\n\nIni juga akan menghapus file dari penyimpanan.'; } - @override - String get utilityFunctions => 'Fungsi Utilitas'; - - @override - String get aboutBinimumDesc => - 'Pembuat QQDL & HiFi API. Tanpa API ini, unduhan Tidal tidak akan ada!'; - - @override - String get aboutSachinsenalDesc => - 'Pembuat proyek HiFi asli. Fondasi dari integrasi Tidal!'; - - @override - String get aboutAppDescription => - 'Unduh lagu Spotify dalam kualitas lossless dari Tidal, Qobuz, dan Amazon Music.'; - - @override - String get providerPriorityTitle => 'Prioritas Provider'; - - @override - String get providerPriorityDescription => - 'Seret untuk mengatur ulang urutan provider unduhan. Aplikasi akan mencoba provider dari atas ke bawah saat mengunduh lagu.'; - - @override - String get providerPriorityInfo => - 'Jika lagu tidak tersedia di provider pertama, aplikasi akan otomatis mencoba yang berikutnya.'; - - @override - String get providerBuiltIn => 'Bawaan'; - - @override - String get providerExtension => 'Ekstensi'; - - @override - String get metadataProviderPriorityTitle => 'Prioritas Metadata'; - - @override - String get metadataProviderPriorityDescription => - 'Seret untuk mengatur ulang urutan provider metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.'; - - @override - String get metadataProviderPriorityInfo => - 'Deezer tidak memiliki batas rate dan direkomendasikan sebagai utama. Spotify mungkin membatasi rate setelah banyak permintaan.'; - - @override - String get metadataNoRateLimits => 'Tidak ada batas rate'; - - @override - String get metadataMayRateLimit => 'Mungkin dibatasi rate'; - - @override - String get queueEmpty => 'Tidak ada unduhan dalam antrian'; - - @override - String get queueEmptySubtitle => 'Tambahkan lagu dari layar beranda'; - - @override - String get queueClearCompleted => 'Hapus yang selesai'; - - @override - String get queueDownloadFailed => 'Unduhan Gagal'; - - @override - String get queueTrackLabel => 'Lagu:'; - - @override - String get queueArtistLabel => 'Artis:'; - - @override - String get queueErrorLabel => 'Error:'; - - @override - String get queueUnknownError => 'Error tidak diketahui'; - @override String get downloadedAlbumTracksHeader => 'Lagu'; @@ -1954,21 +1970,5 @@ class AppLocalizationsId extends AppLocalizations { String get downloadedAlbumSelectToDelete => 'Pilih lagu untuk dihapus'; @override - String get folderOrganizationDescription => - 'Atur file yang diunduh ke dalam folder'; - - @override - String get folderOrganizationNoneSubtitle => 'Semua file di folder unduhan'; - - @override - String get folderOrganizationByArtistSubtitle => - 'Folder terpisah untuk setiap artis'; - - @override - String get folderOrganizationByAlbumSubtitle => - 'Folder terpisah untuk setiap album'; - - @override - String get folderOrganizationByArtistAlbumSubtitle => - 'Folder bersarang untuk artis dan album'; + String get utilityFunctions => 'Fungsi Utilitas'; } diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index ec9da65..6567834 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -3,256 +3,613 @@ "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", + "@appName": {"description": "App name - DO NOT TRANSLATE"}, "appDescription": "Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.", + "@appDescription": {"description": "App description shown in about page"}, "navHome": "Home", + "@navHome": {"description": "Bottom navigation - Home tab"}, "navHistory": "History", + "@navHistory": {"description": "Bottom navigation - History tab"}, "navSettings": "Settings", + "@navSettings": {"description": "Bottom navigation - Settings tab"}, "navStore": "Store", + "@navStore": {"description": "Bottom navigation - Extension store tab"}, "homeTitle": "Home", + "@homeTitle": {"description": "Home screen title"}, "homeSearchHint": "Paste Spotify URL or search...", + "@homeSearchHint": {"description": "Placeholder text in search box"}, "homeSearchHintExtension": "Search with {extensionName}...", "@homeSearchHintExtension": { + "description": "Placeholder when extension search is active", "placeholders": { - "extensionName": {"type": "String"} + "extensionName": {"type": "String", "description": "Name of the active extension"} } }, "homeSubtitle": "Paste a Spotify link or search by name", + "@homeSubtitle": {"description": "Subtitle shown below search box"}, "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": {"description": "Info text about supported URL types"}, "homeRecent": "Recent", + "@homeRecent": {"description": "Section header for recent searches"}, "historyTitle": "History", + "@historyTitle": {"description": "History screen title"}, "historyDownloading": "Downloading ({count})", "@historyDownloading": { + "description": "Tab showing active downloads count", "placeholders": { - "count": {"type": "int"} + "count": {"type": "int", "description": "Number of active downloads"} } }, "historyDownloaded": "Downloaded", + "@historyDownloaded": {"description": "Tab showing completed downloads"}, "historyFilterAll": "All", + "@historyFilterAll": {"description": "Filter chip - show all items"}, "historyFilterAlbums": "Albums", + "@historyFilterAlbums": {"description": "Filter chip - show albums only"}, "historyFilterSingles": "Singles", + "@historyFilterSingles": {"description": "Filter chip - show singles only"}, "historyTracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", "@historyTracksCount": { + "description": "Track count with plural form", "placeholders": { "count": {"type": "int"} } }, "historyAlbumsCount": "{count, plural, =1{1 album} other{{count} albums}}", "@historyAlbumsCount": { + "description": "Album count with plural form", "placeholders": { "count": {"type": "int"} } }, "historyNoDownloads": "No download history", + "@historyNoDownloads": {"description": "Empty state title"}, "historyNoDownloadsSubtitle": "Downloaded tracks will appear here", + "@historyNoDownloadsSubtitle": {"description": "Empty state subtitle"}, "historyNoAlbums": "No album downloads", + "@historyNoAlbums": {"description": "Empty state when filtering albums"}, "historyNoAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@historyNoAlbumsSubtitle": {"description": "Empty state subtitle for albums filter"}, "historyNoSingles": "No single downloads", + "@historyNoSingles": {"description": "Empty state when filtering singles"}, "historyNoSinglesSubtitle": "Single track downloads will appear here", + "@historyNoSinglesSubtitle": {"description": "Empty state subtitle for singles filter"}, "settingsTitle": "Settings", + "@settingsTitle": {"description": "Settings screen title"}, "settingsDownload": "Download", + "@settingsDownload": {"description": "Settings section - download options"}, "settingsAppearance": "Appearance", + "@settingsAppearance": {"description": "Settings section - visual customization"}, "settingsOptions": "Options", + "@settingsOptions": {"description": "Settings section - app options"}, "settingsExtensions": "Extensions", + "@settingsExtensions": {"description": "Settings section - extension management"}, "settingsAbout": "About", + "@settingsAbout": {"description": "Settings section - app info"}, "downloadTitle": "Download", + "@downloadTitle": {"description": "Download settings page title"}, "downloadLocation": "Download Location", + "@downloadLocation": {"description": "Setting for download folder"}, "downloadLocationSubtitle": "Choose where to save files", + "@downloadLocationSubtitle": {"description": "Subtitle for download location"}, "downloadLocationDefault": "Default location", + "@downloadLocationDefault": {"description": "Shown when using default folder"}, "downloadDefaultService": "Default Service", + "@downloadDefaultService": {"description": "Setting for preferred download service (Tidal/Qobuz/Amazon)"}, "downloadDefaultServiceSubtitle": "Service used for downloads", + "@downloadDefaultServiceSubtitle": {"description": "Subtitle for default service"}, "downloadDefaultQuality": "Default Quality", + "@downloadDefaultQuality": {"description": "Setting for audio quality"}, "downloadAskQuality": "Ask Quality Before Download", + "@downloadAskQuality": {"description": "Toggle to show quality picker"}, "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": {"description": "Subtitle for ask quality toggle"}, "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": {"description": "Setting for output filename pattern"}, "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": {"description": "Setting for folder structure"}, "downloadSeparateSingles": "Separate Singles", + "@downloadSeparateSingles": {"description": "Toggle to separate single tracks"}, "downloadSeparateSinglesSubtitle": "Put single tracks in a separate folder", + "@downloadSeparateSinglesSubtitle": {"description": "Subtitle for separate singles toggle"}, "qualityBest": "Best Available", + "@qualityBest": {"description": "Audio quality option - highest available"}, "qualityFlac": "FLAC", + "@qualityFlac": {"description": "Audio quality option - FLAC lossless"}, "quality320": "320 kbps", + "@quality320": {"description": "Audio quality option - 320kbps MP3"}, "quality128": "128 kbps", + "@quality128": {"description": "Audio quality option - 128kbps MP3"}, "appearanceTitle": "Appearance", + "@appearanceTitle": {"description": "Appearance settings page title"}, "appearanceTheme": "Theme", + "@appearanceTheme": {"description": "Theme mode setting"}, "appearanceThemeSystem": "System", + "@appearanceThemeSystem": {"description": "Follow system theme"}, "appearanceThemeLight": "Light", + "@appearanceThemeLight": {"description": "Light theme"}, "appearanceThemeDark": "Dark", + "@appearanceThemeDark": {"description": "Dark theme"}, "appearanceDynamicColor": "Dynamic Color", + "@appearanceDynamicColor": {"description": "Material You dynamic colors"}, "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", + "@appearanceDynamicColorSubtitle": {"description": "Subtitle for dynamic color"}, "appearanceAccentColor": "Accent Color", + "@appearanceAccentColor": {"description": "Custom accent color picker"}, "appearanceHistoryView": "History View", + "@appearanceHistoryView": {"description": "Layout style for history"}, "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": {"description": "List layout option"}, "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": {"description": "Grid layout option"}, "optionsTitle": "Options", + "@optionsTitle": {"description": "Options settings page title"}, "optionsSearchSource": "Search Source", + "@optionsSearchSource": {"description": "Section for search provider settings"}, "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": {"description": "Main search provider setting"}, "optionsPrimaryProviderSubtitle": "Service used when searching by track name.", + "@optionsPrimaryProviderSubtitle": {"description": "Subtitle for primary provider"}, "optionsUsingExtension": "Using extension: {extensionName}", "@optionsUsingExtension": { + "description": "Shows active extension name", "placeholders": { "extensionName": {"type": "String"} } }, "optionsSwitchBack": "Tap Deezer or Spotify to switch back from extension", + "@optionsSwitchBack": {"description": "Hint to switch back to built-in providers"}, "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": {"description": "Auto-retry with other services"}, "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": {"description": "Subtitle for auto fallback"}, "optionsUseExtensionProviders": "Use Extension Providers", + "@optionsUseExtensionProviders": {"description": "Enable extension download providers"}, "optionsUseExtensionProvidersOn": "Extensions will be tried first", + "@optionsUseExtensionProvidersOn": {"description": "Status when extension providers enabled"}, "optionsUseExtensionProvidersOff": "Using built-in providers only", + "@optionsUseExtensionProvidersOff": {"description": "Status when extension providers disabled"}, "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": {"description": "Embed lyrics in audio files"}, "optionsEmbedLyricsSubtitle": "Embed synced lyrics into FLAC files", + "@optionsEmbedLyricsSubtitle": {"description": "Subtitle for embed lyrics"}, "optionsMaxQualityCover": "Max Quality Cover", + "@optionsMaxQualityCover": {"description": "Download highest quality album art"}, "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", + "@optionsMaxQualityCoverSubtitle": {"description": "Subtitle for max quality cover"}, "optionsConcurrentDownloads": "Concurrent Downloads", + "@optionsConcurrentDownloads": {"description": "Number of parallel downloads"}, "optionsConcurrentSequential": "Sequential (1 at a time)", + "@optionsConcurrentSequential": {"description": "Download one at a time"}, "optionsConcurrentParallel": "{count} parallel downloads", "@optionsConcurrentParallel": { + "description": "Multiple parallel downloads", "placeholders": { "count": {"type": "int"} } }, "optionsConcurrentWarning": "Parallel downloads may trigger rate limiting", + "@optionsConcurrentWarning": {"description": "Warning about rate limits"}, "optionsExtensionStore": "Extension Store", + "@optionsExtensionStore": {"description": "Show/hide store tab"}, "optionsExtensionStoreSubtitle": "Show Store tab in navigation", + "@optionsExtensionStoreSubtitle": {"description": "Subtitle for extension store toggle"}, "optionsCheckUpdates": "Check for Updates", + "@optionsCheckUpdates": {"description": "Auto update check toggle"}, "optionsCheckUpdatesSubtitle": "Notify when new version is available", + "@optionsCheckUpdatesSubtitle": {"description": "Subtitle for update check"}, "optionsUpdateChannel": "Update Channel", + "@optionsUpdateChannel": {"description": "Stable vs preview releases"}, "optionsUpdateChannelStable": "Stable releases only", + "@optionsUpdateChannelStable": {"description": "Only stable updates"}, "optionsUpdateChannelPreview": "Get preview releases", + "@optionsUpdateChannelPreview": {"description": "Include beta/preview updates"}, "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", + "@optionsUpdateChannelWarning": {"description": "Warning about preview channel"}, "optionsClearHistory": "Clear Download History", + "@optionsClearHistory": {"description": "Delete all download history"}, "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", + "@optionsClearHistorySubtitle": {"description": "Subtitle for clear history"}, "optionsDetailedLogging": "Detailed Logging", + "@optionsDetailedLogging": {"description": "Enable verbose logs for debugging"}, "optionsDetailedLoggingOn": "Detailed logs are being recorded", + "@optionsDetailedLoggingOn": {"description": "Status when logging enabled"}, "optionsDetailedLoggingOff": "Enable for bug reports", + "@optionsDetailedLoggingOff": {"description": "Status when logging disabled"}, "optionsSpotifyCredentials": "Spotify Credentials", + "@optionsSpotifyCredentials": {"description": "Spotify API credentials setting"}, "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", "@optionsSpotifyCredentialsConfigured": { + "description": "Shows configured client ID preview", "placeholders": { "clientId": {"type": "String"} } }, "optionsSpotifyCredentialsRequired": "Required - tap to configure", + "@optionsSpotifyCredentialsRequired": {"description": "Prompt to set up credentials"}, "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", + "@optionsSpotifyWarning": {"description": "Info about Spotify API requirement"}, "extensionsTitle": "Extensions", + "@extensionsTitle": {"description": "Extensions page title"}, "extensionsInstalled": "Installed Extensions", + "@extensionsInstalled": {"description": "Section header for installed extensions"}, "extensionsNone": "No extensions installed", + "@extensionsNone": {"description": "Empty state title"}, "extensionsNoneSubtitle": "Install extensions from the Store tab", + "@extensionsNoneSubtitle": {"description": "Empty state subtitle"}, "extensionsEnabled": "Enabled", + "@extensionsEnabled": {"description": "Extension status - active"}, "extensionsDisabled": "Disabled", + "@extensionsDisabled": {"description": "Extension status - inactive"}, "extensionsVersion": "Version {version}", "@extensionsVersion": { + "description": "Extension version display", "placeholders": { "version": {"type": "String"} } }, "extensionsAuthor": "by {author}", "@extensionsAuthor": { + "description": "Extension author credit", "placeholders": { "author": {"type": "String"} } }, "extensionsUninstall": "Uninstall", + "@extensionsUninstall": {"description": "Uninstall extension button"}, "extensionsSetAsSearch": "Set as Search Provider", + "@extensionsSetAsSearch": {"description": "Use extension for search"}, "storeTitle": "Extension Store", + "@storeTitle": {"description": "Store screen title"}, "storeSearch": "Search extensions...", + "@storeSearch": {"description": "Store search placeholder"}, "storeInstall": "Install", + "@storeInstall": {"description": "Install extension button"}, "storeInstalled": "Installed", + "@storeInstalled": {"description": "Already installed badge"}, "storeUpdate": "Update", + "@storeUpdate": {"description": "Update available button"}, "aboutTitle": "About", + "@aboutTitle": {"description": "About page title"}, "aboutContributors": "Contributors", + "@aboutContributors": {"description": "Section for contributors"}, "aboutMobileDeveloper": "Mobile version developer", + "@aboutMobileDeveloper": {"description": "Role description for mobile dev"}, "aboutOriginalCreator": "Creator of the original SpotiFLAC", + "@aboutOriginalCreator": {"description": "Role description for original creator"}, "aboutLogoArtist": "The talented artist who created our beautiful app logo!", + "@aboutLogoArtist": {"description": "Role description for logo artist"}, "aboutSpecialThanks": "Special Thanks", + "@aboutSpecialThanks": {"description": "Section for special thanks"}, "aboutLinks": "Links", + "@aboutLinks": {"description": "Section for external links"}, "aboutMobileSource": "Mobile source code", + "@aboutMobileSource": {"description": "Link to mobile GitHub repo"}, "aboutPCSource": "PC source code", + "@aboutPCSource": {"description": "Link to PC GitHub repo"}, "aboutReportIssue": "Report an issue", + "@aboutReportIssue": {"description": "Link to report bugs"}, "aboutReportIssueSubtitle": "Report any problems you encounter", + "@aboutReportIssueSubtitle": {"description": "Subtitle for report issue"}, "aboutFeatureRequest": "Feature request", + "@aboutFeatureRequest": {"description": "Link to suggest features"}, "aboutFeatureRequestSubtitle": "Suggest new features for the app", + "@aboutFeatureRequestSubtitle": {"description": "Subtitle for feature request"}, "aboutSupport": "Support", + "@aboutSupport": {"description": "Section for support/donation links"}, "aboutBuyMeCoffee": "Buy me a coffee", + "@aboutBuyMeCoffee": {"description": "Donation link"}, "aboutBuyMeCoffeeSubtitle": "Support development on Ko-fi", + "@aboutBuyMeCoffeeSubtitle": {"description": "Subtitle for donation"}, "aboutApp": "App", + "@aboutApp": {"description": "Section for app info"}, "aboutVersion": "Version", + "@aboutVersion": {"description": "Version info label"}, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn't exist!", + "@aboutBinimumDesc": {"description": "Credit description for binimum"}, + "aboutSachinsenalDesc": "The original HiFi project creator. The foundation of Tidal integration!", + "@aboutSachinsenalDesc": {"description": "Credit description for sachinsenal0x64"}, + "aboutDoubleDouble": "DoubleDouble", + "@aboutDoubleDouble": {"description": "Name of Amazon API service - DO NOT TRANSLATE"}, + "aboutDoubleDoubleDesc": "Amazing API for Amazon Music downloads. Thank you for making it free!", + "@aboutDoubleDoubleDesc": {"description": "Credit for DoubleDouble API"}, + "aboutDabMusic": "DAB Music", + "@aboutDabMusic": {"description": "Name of Qobuz API service - DO NOT TRANSLATE"}, + "aboutDabMusicDesc": "The best Qobuz streaming API. Hi-Res downloads wouldn't be possible without this!", + "@aboutDabMusicDesc": {"description": "Credit for DAB Music API"}, + "aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.", + "@aboutAppDescription": {"description": "App description in header card"}, "albumTitle": "Album", + "@albumTitle": {"description": "Album screen title"}, "albumTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@albumTracks": { + "description": "Album track count", "placeholders": { "count": {"type": "int"} } }, "albumDownloadAll": "Download All", + "@albumDownloadAll": {"description": "Button to download all tracks"}, "albumDownloadRemaining": "Download Remaining", + "@albumDownloadRemaining": {"description": "Button to download remaining tracks"}, "playlistTitle": "Playlist", + "@playlistTitle": {"description": "Playlist screen title"}, "artistTitle": "Artist", + "@artistTitle": {"description": "Artist screen title"}, "artistAlbums": "Albums", + "@artistAlbums": {"description": "Section header for artist albums"}, "artistSingles": "Singles & EPs", + "@artistSingles": {"description": "Section header for singles/EPs"}, + "artistCompilations": "Compilations", + "@artistCompilations": {"description": "Section header for compilations"}, + "artistReleases": "{count, plural, =1{1 release} other{{count} releases}}", + "@artistReleases": { + "description": "Artist release count", + "placeholders": { + "count": {"type": "int"} + } + }, "trackMetadataTitle": "Track Info", + "@trackMetadataTitle": {"description": "Track metadata screen title"}, "trackMetadataArtist": "Artist", + "@trackMetadataArtist": {"description": "Metadata field - artist name"}, "trackMetadataAlbum": "Album", + "@trackMetadataAlbum": {"description": "Metadata field - album name"}, "trackMetadataDuration": "Duration", + "@trackMetadataDuration": {"description": "Metadata field - track length"}, "trackMetadataQuality": "Quality", + "@trackMetadataQuality": {"description": "Metadata field - audio quality"}, "trackMetadataPath": "File Path", + "@trackMetadataPath": {"description": "Metadata field - file location"}, "trackMetadataDownloadedAt": "Downloaded", + "@trackMetadataDownloadedAt": {"description": "Metadata field - download date"}, "trackMetadataService": "Service", + "@trackMetadataService": {"description": "Metadata field - download service used"}, "trackMetadataPlay": "Play", + "@trackMetadataPlay": {"description": "Action button - play track"}, "trackMetadataShare": "Share", + "@trackMetadataShare": {"description": "Action button - share track"}, "trackMetadataDelete": "Delete", + "@trackMetadataDelete": {"description": "Action button - delete track"}, "trackMetadataRedownload": "Re-download", + "@trackMetadataRedownload": {"description": "Action button - download again"}, "trackMetadataOpenFolder": "Open Folder", + "@trackMetadataOpenFolder": {"description": "Action button - open containing folder"}, "setupTitle": "Welcome to SpotiFLAC", + "@setupTitle": {"description": "Setup wizard title"}, "setupSubtitle": "Let's get you started", + "@setupSubtitle": {"description": "Setup wizard subtitle"}, "setupStoragePermission": "Storage Permission", + "@setupStoragePermission": {"description": "Storage permission step title"}, "setupStoragePermissionSubtitle": "Required to save downloaded files", + "@setupStoragePermissionSubtitle": {"description": "Explanation for storage permission"}, "setupStoragePermissionGranted": "Permission granted", + "@setupStoragePermissionGranted": {"description": "Status when permission granted"}, "setupStoragePermissionDenied": "Permission denied", + "@setupStoragePermissionDenied": {"description": "Status when permission denied"}, "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": {"description": "Button to request permission"}, "setupDownloadLocation": "Download Location", + "@setupDownloadLocation": {"description": "Download folder step title"}, "setupChooseFolder": "Choose Folder", + "@setupChooseFolder": {"description": "Button to pick folder"}, "setupContinue": "Continue", + "@setupContinue": {"description": "Continue to next step button"}, "setupSkip": "Skip for now", + "@setupSkip": {"description": "Skip current step button"}, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": {"description": "Title when storage access needed"}, + "setupStorageAccessMessage": "SpotiFLAC needs \"All files access\" permission to save music files to your chosen folder.", + "@setupStorageAccessMessage": {"description": "Explanation for storage access"}, + "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", + "@setupStorageAccessMessageAndroid11": {"description": "Android 11+ specific explanation"}, + "setupOpenSettings": "Open Settings", + "@setupOpenSettings": {"description": "Button to open system settings"}, + "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", + "@setupPermissionDeniedMessage": {"description": "Error when permission denied"}, + "setupPermissionRequired": "{permissionType} Permission Required", + "@setupPermissionRequired": { + "description": "Generic permission required title", + "placeholders": { + "permissionType": {"type": "String", "description": "Type of permission (Storage/Notification)"} + } + }, + "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", + "@setupPermissionRequiredMessage": { + "description": "Generic permission required message", + "placeholders": { + "permissionType": {"type": "String"} + } + }, + "setupSelectDownloadFolder": "Select Download Folder", + "@setupSelectDownloadFolder": {"description": "Folder selection step title"}, + "setupUseDefaultFolder": "Use Default Folder?", + "@setupUseDefaultFolder": {"description": "Dialog title for default folder"}, + "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", + "@setupNoFolderSelected": {"description": "Prompt when no folder selected"}, + "setupUseDefault": "Use Default", + "@setupUseDefault": {"description": "Button to use default folder"}, + "setupDownloadLocationTitle": "Download Location", + "@setupDownloadLocationTitle": {"description": "Download location dialog title"}, + "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", + "@setupDownloadLocationIosMessage": {"description": "iOS-specific folder info"}, + "setupAppDocumentsFolder": "App Documents Folder", + "@setupAppDocumentsFolder": {"description": "iOS documents folder option"}, + "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", + "@setupAppDocumentsFolderSubtitle": {"description": "Subtitle for documents folder"}, + "setupChooseFromFiles": "Choose from Files", + "@setupChooseFromFiles": {"description": "iOS file picker option"}, + "setupChooseFromFilesSubtitle": "Select iCloud or other location", + "@setupChooseFromFilesSubtitle": {"description": "Subtitle for file picker"}, + "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", + "@setupIosEmptyFolderWarning": {"description": "iOS folder selection warning"}, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": {"description": "App tagline in setup"}, + "setupStepStorage": "Storage", + "@setupStepStorage": {"description": "Setup step indicator - storage"}, + "setupStepNotification": "Notification", + "@setupStepNotification": {"description": "Setup step indicator - notification"}, + "setupStepFolder": "Folder", + "@setupStepFolder": {"description": "Setup step indicator - folder"}, + "setupStepSpotify": "Spotify", + "@setupStepSpotify": {"description": "Setup step indicator - Spotify API"}, + "setupStepPermission": "Permission", + "@setupStepPermission": {"description": "Setup step indicator - permission"}, + "setupStorageGranted": "Storage Permission Granted!", + "@setupStorageGranted": {"description": "Success message for storage permission"}, + "setupStorageRequired": "Storage Permission Required", + "@setupStorageRequired": {"description": "Title when storage permission needed"}, + "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", + "@setupStorageDescription": {"description": "Explanation for storage permission"}, + "setupNotificationGranted": "Notification Permission Granted!", + "@setupNotificationGranted": {"description": "Success message for notification permission"}, + "setupNotificationEnable": "Enable Notifications", + "@setupNotificationEnable": {"description": "Button to enable notifications"}, + "setupNotificationDescription": "Get notified when downloads complete or require attention.", + "@setupNotificationDescription": {"description": "Explanation for notifications"}, + "setupFolderSelected": "Download Folder Selected!", + "@setupFolderSelected": {"description": "Success message for folder selection"}, + "setupFolderChoose": "Choose Download Folder", + "@setupFolderChoose": {"description": "Button to choose folder"}, + "setupFolderDescription": "Select a folder where your downloaded music will be saved.", + "@setupFolderDescription": {"description": "Explanation for folder selection"}, + "setupChangeFolder": "Change Folder", + "@setupChangeFolder": {"description": "Button to change selected folder"}, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": {"description": "Button to select folder"}, + "setupSpotifyApiOptional": "Spotify API (Optional)", + "@setupSpotifyApiOptional": {"description": "Spotify API step title"}, + "setupSpotifyApiDescription": "Add your Spotify API credentials for better search results and access to Spotify-exclusive content.", + "@setupSpotifyApiDescription": {"description": "Explanation for Spotify API"}, + "setupUseSpotifyApi": "Use Spotify API", + "@setupUseSpotifyApi": {"description": "Toggle to enable Spotify API"}, + "setupEnterCredentialsBelow": "Enter your credentials below", + "@setupEnterCredentialsBelow": {"description": "Prompt to enter credentials"}, + "setupUsingDeezer": "Using Deezer (no account needed)", + "@setupUsingDeezer": {"description": "Status when using Deezer"}, + "setupEnterClientId": "Enter Spotify Client ID", + "@setupEnterClientId": {"description": "Placeholder for client ID field"}, + "setupEnterClientSecret": "Enter Spotify Client Secret", + "@setupEnterClientSecret": {"description": "Placeholder for client secret field"}, + "setupGetFreeCredentials": "Get your free API credentials from the Spotify Developer Dashboard.", + "@setupGetFreeCredentials": {"description": "Info about getting Spotify credentials"}, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": {"description": "Button to enable notifications"}, + "setupProceedToNextStep": "You can now proceed to the next step.", + "@setupProceedToNextStep": {"description": "Message after completing a step"}, + "setupNotificationProgressDescription": "You will receive download progress notifications.", + "@setupNotificationProgressDescription": {"description": "Info about notification usage"}, + "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", + "@setupNotificationBackgroundDescription": {"description": "Detailed notification explanation"}, + "setupSkipForNow": "Skip for now", + "@setupSkipForNow": {"description": "Skip button text"}, + "setupBack": "Back", + "@setupBack": {"description": "Back button text"}, + "setupNext": "Next", + "@setupNext": {"description": "Next button text"}, + "setupGetStarted": "Get Started", + "@setupGetStarted": {"description": "Final setup button"}, + "setupSkipAndStart": "Skip & Start", + "@setupSkipAndStart": {"description": "Skip setup and start app"}, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": {"description": "Instruction for file access permission"}, + "setupGetCredentialsFromSpotify": "Get credentials from developer.spotify.com", + "@setupGetCredentialsFromSpotify": {"description": "Link text for Spotify developer portal"}, "dialogCancel": "Cancel", + "@dialogCancel": {"description": "Dialog button - cancel action"}, "dialogOk": "OK", + "@dialogOk": {"description": "Dialog button - confirm/acknowledge"}, "dialogSave": "Save", + "@dialogSave": {"description": "Dialog button - save changes"}, "dialogDelete": "Delete", + "@dialogDelete": {"description": "Dialog button - delete item"}, "dialogRetry": "Retry", + "@dialogRetry": {"description": "Dialog button - retry action"}, "dialogClose": "Close", + "@dialogClose": {"description": "Dialog button - close dialog"}, "dialogYes": "Yes", + "@dialogYes": {"description": "Dialog button - confirm yes"}, "dialogNo": "No", + "@dialogNo": {"description": "Dialog button - confirm no"}, "dialogClear": "Clear", + "@dialogClear": {"description": "Dialog button - clear items"}, "dialogConfirm": "Confirm", + "@dialogConfirm": {"description": "Dialog button - confirm action"}, "dialogDone": "Done", - + "@dialogDone": {"description": "Dialog button - action completed"}, + "dialogImport": "Import", + "@dialogImport": {"description": "Dialog button - import data"}, + "dialogDiscard": "Discard", + "@dialogDiscard": {"description": "Dialog button - discard changes"}, + "dialogRemove": "Remove", + "@dialogRemove": {"description": "Dialog button - remove item"}, + "dialogUninstall": "Uninstall", + "@dialogUninstall": {"description": "Dialog button - uninstall extension"}, + "dialogDiscardChanges": "Discard Changes?", + "@dialogDiscardChanges": {"description": "Dialog title - unsaved changes warning"}, + "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", + "@dialogUnsavedChanges": {"description": "Dialog message - unsaved changes"}, + "dialogDownloadFailed": "Download Failed", + "@dialogDownloadFailed": {"description": "Dialog title - download error"}, + "dialogTrackLabel": "Track:", + "@dialogTrackLabel": {"description": "Label for track name in error dialog"}, + "dialogArtistLabel": "Artist:", + "@dialogArtistLabel": {"description": "Label for artist name in error dialog"}, + "dialogErrorLabel": "Error:", + "@dialogErrorLabel": {"description": "Label for error message"}, + "dialogClearAll": "Clear All", + "@dialogClearAll": {"description": "Dialog title - clear all items"}, + "dialogClearAllDownloads": "Are you sure you want to clear all downloads?", + "@dialogClearAllDownloads": {"description": "Dialog message - clear downloads confirmation"}, + "dialogRemoveFromDevice": "Remove from device?", + "@dialogRemoveFromDevice": {"description": "Dialog title - delete file confirmation"}, + "dialogRemoveExtension": "Remove Extension", + "@dialogRemoveExtension": {"description": "Dialog title - uninstall extension"}, + "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", + "@dialogRemoveExtensionMessage": {"description": "Dialog message - uninstall confirmation"}, + "dialogUninstallExtension": "Uninstall Extension?", + "@dialogUninstallExtension": {"description": "Dialog title - uninstall extension"}, + "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", + "@dialogUninstallExtensionMessage": { + "description": "Dialog message - uninstall specific extension", + "placeholders": { + "extensionName": {"type": "String"} + } + }, "dialogClearHistoryTitle": "Clear History", + "@dialogClearHistoryTitle": {"description": "Dialog title - clear download history"}, "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", + "@dialogClearHistoryMessage": {"description": "Dialog message - clear history confirmation"}, "dialogDeleteSelectedTitle": "Delete Selected", + "@dialogDeleteSelectedTitle": {"description": "Dialog title - delete selected items"}, "dialogDeleteSelectedMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from history?\n\nThis will also delete the files from storage.", "@dialogDeleteSelectedMessage": { + "description": "Dialog message - delete selected tracks", "placeholders": { "count": {"type": "int"} } }, "dialogImportPlaylistTitle": "Import Playlist", + "@dialogImportPlaylistTitle": {"description": "Dialog title - import CSV playlist"}, "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", "placeholders": { "count": {"type": "int"} } @@ -260,651 +617,834 @@ "snackbarAddedToQueue": "Added \"{trackName}\" to queue", "@snackbarAddedToQueue": { + "description": "Snackbar - track added to download queue", "placeholders": { "trackName": {"type": "String"} } }, "snackbarAddedTracksToQueue": "Added {count} tracks to queue", "@snackbarAddedTracksToQueue": { + "description": "Snackbar - multiple tracks added to queue", "placeholders": { "count": {"type": "int"} } }, "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", "@snackbarAlreadyDownloaded": { + "description": "Snackbar - track already exists", "placeholders": { "trackName": {"type": "String"} } }, "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": {"description": "Snackbar - history deleted"}, "snackbarCredentialsSaved": "Credentials saved", + "@snackbarCredentialsSaved": {"description": "Snackbar - Spotify credentials saved"}, "snackbarCredentialsCleared": "Credentials cleared", + "@snackbarCredentialsCleared": {"description": "Snackbar - Spotify credentials removed"}, "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", "@snackbarDeletedTracks": { + "description": "Snackbar - tracks deleted", "placeholders": { "count": {"type": "int"} } }, "snackbarCannotOpenFile": "Cannot open file: {error}", "@snackbarCannotOpenFile": { + "description": "Snackbar - file open error", "placeholders": { "error": {"type": "String"} } }, "snackbarFillAllFields": "Please fill all fields", + "@snackbarFillAllFields": {"description": "Snackbar - validation error"}, "snackbarViewQueue": "View Queue", - - "errorRateLimited": "Rate Limited", - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", - "errorFailedToLoad": "Failed to load {item}", - "@errorFailedToLoad": { - "placeholders": { - "item": {"type": "String"} - } - }, - "errorNoTracksFound": "No tracks found", - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", - "@errorMissingExtensionSource": { - "placeholders": { - "item": {"type": "String"} - } - }, - - "statusQueued": "Queued", - "statusDownloading": "Downloading", - "statusFinalizing": "Finalizing", - "statusCompleted": "Completed", - "statusFailed": "Failed", - "statusSkipped": "Skipped", - "statusPaused": "Paused", - - "actionPause": "Pause", - "actionResume": "Resume", - "actionCancel": "Cancel", - "actionStop": "Stop", - "actionSelect": "Select", - "actionSelectAll": "Select All", - "actionDeselect": "Deselect", - "actionPaste": "Paste", - "actionImportCsv": "Import CSV", - "actionRemoveCredentials": "Remove Credentials", - "actionSaveCredentials": "Save Credentials", - - "selectionSelected": "{count} selected", - "@selectionSelected": { - "placeholders": { - "count": {"type": "int"} - } - }, - "selectionAllSelected": "All tracks selected", - "selectionTapToSelect": "Tap tracks to select", - "selectionDeleteTracks": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@selectionDeleteTracks": { - "placeholders": { - "count": {"type": "int"} - } - }, - "selectionSelectToDelete": "Select tracks to delete", - - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", - "@progressFetchingMetadata": { - "placeholders": { - "current": {"type": "int"}, - "total": {"type": "int"} - } - }, - "progressReadingCsv": "Reading CSV...", - - "searchSongs": "Songs", - "searchArtists": "Artists", - "searchAlbums": "Albums", - "searchPlaylists": "Playlists", - - "tooltipPlay": "Play", - "tooltipCancel": "Cancel", - "tooltipStop": "Stop", - "tooltipRetry": "Retry", - "tooltipRemove": "Remove", - "tooltipClear": "Clear", - "tooltipPaste": "Paste", - - "filenameFormat": "Filename Format", - "filenameFormatPreview": "Preview: {preview}", - "@filenameFormatPreview": { - "placeholders": { - "preview": {"type": "String"} - } - }, - "folderOrganization": "Folder Organization", - "folderOrganizationNone": "No organization", - "folderOrganizationByArtist": "By Artist", - "folderOrganizationByAlbum": "By Album", - "folderOrganizationByArtistAlbum": "Artist/Album", - - "updateAvailable": "Update Available", - "updateNewVersion": "Version {version} is available", - "@updateNewVersion": { - "placeholders": { - "version": {"type": "String"} - } - }, - "updateDownload": "Download", - "updateLater": "Later", - "updateChangelog": "Changelog", - - "providerPriority": "Provider Priority", - "providerPrioritySubtitle": "Drag to reorder download providers", - "metadataProviderPriority": "Metadata Provider Priority", - "metadataProviderPrioritySubtitle": "Order used when fetching track metadata", - - "logTitle": "Logs", - "logCopy": "Copy Logs", - "logClear": "Clear Logs", - "logShare": "Share Logs", - "logEmpty": "No logs yet", - "logCopied": "Logs copied to clipboard", - - "credentialsTitle": "Spotify Credentials", - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "credentialsClientId": "Client ID", - "credentialsClientIdHint": "Paste Client ID", - "credentialsClientSecret": "Client Secret", - "credentialsClientSecretHint": "Paste Client Secret", - - "channelStable": "Stable", - "channelPreview": "Preview", - - "sectionSearchSource": "Search Source", - "sectionDownload": "Download", - "sectionPerformance": "Performance", - "sectionApp": "App", - "sectionData": "Data", - "sectionDebug": "Debug", - "sectionService": "Service", - "sectionAudioQuality": "Audio Quality", - "sectionFileSettings": "File Settings", - "sectionColor": "Color", - "sectionTheme": "Theme", - "sectionLayout": "Layout", - - "settingsAppearanceSubtitle": "Theme, colors, display", - "settingsDownloadSubtitle": "Service, quality, filename format", - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", - "settingsExtensionsSubtitle": "Manage download providers", - "settingsLogsSubtitle": "View app logs for debugging", - - "loadingSharedLink": "Loading shared link...", - "pressBackAgainToExit": "Press back again to exit", - - "artistReleases": "{count, plural, =1{1 release} other{{count} releases}}", - "@artistReleases": { - "placeholders": { - "count": {"type": "int"} - } - }, - "artistCompilations": "Compilations", - - "tracksHeader": "Tracks", - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "placeholders": { - "count": {"type": "int"} - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "placeholders": { - "count": {"type": "int"} - } - }, - - "setupStorageAccessRequired": "Storage Access Required", - "setupStorageAccessMessage": "SpotiFLAC needs \"All files access\" permission to save music files to your chosen folder.", - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", - "setupOpenSettings": "Open Settings", - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", - "setupPermissionRequired": "{permissionType} Permission Required", - "@setupPermissionRequired": { - "placeholders": { - "permissionType": {"type": "String"} - } - }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", - "@setupPermissionRequiredMessage": { - "placeholders": { - "permissionType": {"type": "String"} - } - }, - "setupSelectDownloadFolder": "Select Download Folder", - "setupUseDefaultFolder": "Use Default Folder?", - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", - "setupUseDefault": "Use Default", - "setupDownloadLocationTitle": "Download Location", - "setupDownloadLocationIosMessage": "On iOS, downloads are saved to the app's Documents folder. You can access them via the Files app.", - "setupAppDocumentsFolder": "App Documents Folder", - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", - "setupChooseFromFiles": "Choose from Files", - "setupChooseFromFilesSubtitle": "Select iCloud or other location", - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", - "setupDownloadInFlac": "Download Spotify tracks in FLAC", - "setupStepStorage": "Storage", - "setupStepNotification": "Notification", - "setupStepFolder": "Folder", - "setupStepSpotify": "Spotify", - "setupStepPermission": "Permission", - "setupStorageGranted": "Storage Permission Granted!", - "setupStorageRequired": "Storage Permission Required", - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", - "setupNotificationGranted": "Notification Permission Granted!", - "setupNotificationEnable": "Enable Notifications", - "setupNotificationDescription": "Get notified when downloads complete or require attention.", - "setupFolderSelected": "Download Folder Selected!", - "setupFolderChoose": "Choose Download Folder", - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", - "setupChangeFolder": "Change Folder", - "setupSelectFolder": "Select Folder", - "setupSpotifyApiOptional": "Spotify API (Optional)", - "setupSpotifyApiDescription": "Add your Spotify API credentials for better search results and access to Spotify-exclusive content.", - "setupUseSpotifyApi": "Use Spotify API", - "setupEnterCredentialsBelow": "Enter your credentials below", - "setupUsingDeezer": "Using Deezer (no account needed)", - "setupEnterClientId": "Enter Spotify Client ID", - "setupEnterClientSecret": "Enter Spotify Client Secret", - "setupGetFreeCredentials": "Get your free API credentials from the Spotify Developer Dashboard.", - "setupEnableNotifications": "Enable Notifications", - - "dialogImport": "Import", - "dialogDiscard": "Discard", - "dialogRemove": "Remove", - "dialogUninstall": "Uninstall", - "dialogDiscardChanges": "Discard Changes?", - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", - "dialogDownloadFailed": "Download Failed", - "dialogTrackLabel": "Track:", - "dialogArtistLabel": "Artist:", - "dialogErrorLabel": "Error:", - "dialogClearAll": "Clear All", - "dialogClearAllDownloads": "Are you sure you want to clear all downloads?", - "dialogRemoveFromDevice": "Remove from device?", - "dialogRemoveExtension": "Remove Extension", - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", - "dialogUninstallExtension": "Uninstall Extension?", - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", - "@dialogUninstallExtensionMessage": { - "placeholders": { - "extensionName": {"type": "String"} - } - }, - + "@snackbarViewQueue": {"description": "Snackbar action - view download queue"}, "snackbarFailedToLoad": "Failed to load: {error}", "@snackbarFailedToLoad": { + "description": "Snackbar - loading error", "placeholders": { "error": {"type": "String"} } }, "snackbarUrlCopied": "{platform} URL copied to clipboard", "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", "placeholders": { - "platform": {"type": "String"} + "platform": {"type": "String", "description": "Platform name (Spotify/Deezer)"} } }, "snackbarFileNotFound": "File not found", + "@snackbarFileNotFound": {"description": "Snackbar - file doesn't exist"}, "snackbarSelectExtFile": "Please select a .spotiflac-ext file", + "@snackbarSelectExtFile": {"description": "Snackbar - wrong file type selected"}, "snackbarProviderPrioritySaved": "Provider priority saved", + "@snackbarProviderPrioritySaved": {"description": "Snackbar - provider order saved"}, "snackbarMetadataProviderSaved": "Metadata provider priority saved", + "@snackbarMetadataProviderSaved": {"description": "Snackbar - metadata provider order saved"}, "snackbarExtensionInstalled": "{extensionName} installed.", "@snackbarExtensionInstalled": { + "description": "Snackbar - extension installed successfully", "placeholders": { "extensionName": {"type": "String"} } }, "snackbarExtensionUpdated": "{extensionName} updated.", "@snackbarExtensionUpdated": { + "description": "Snackbar - extension updated successfully", "placeholders": { "extensionName": {"type": "String"} } }, "snackbarFailedToInstall": "Failed to install extension", + "@snackbarFailedToInstall": {"description": "Snackbar - extension install error"}, "snackbarFailedToUpdate": "Failed to update extension", + "@snackbarFailedToUpdate": {"description": "Snackbar - extension update error"}, - "storeFilterAll": "All", - "storeFilterMetadata": "Metadata", - "storeFilterDownload": "Download", - "storeFilterUtility": "Utility", - "storeFilterLyrics": "Lyrics", - "storeFilterIntegration": "Integration", - "storeClearFilters": "Clear filters", - "storeNoResults": "No extensions found", + "errorRateLimited": "Rate Limited", + "@errorRateLimited": {"description": "Error title - too many requests"}, + "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", + "@errorRateLimitedMessage": {"description": "Error message - rate limit explanation"}, + "errorFailedToLoad": "Failed to load {item}", + "@errorFailedToLoad": { + "description": "Error message - loading failed", + "placeholders": { + "item": {"type": "String", "description": "Item that failed to load (album/playlist/etc)"} + } + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": {"description": "Error - search returned no results"}, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": {"type": "String"} + } + }, - "extensionProviderPriority": "Provider Priority", - "extensionInstallButton": "Install Extension", - "extensionDefaultProvider": "Default (Deezer/Spotify)", - "extensionDefaultProviderSubtitle": "Use built-in search", - "extensionAuthor": "Author", - "extensionId": "ID", - "extensionError": "Error", - "extensionCapabilities": "Capabilities", - "extensionMetadataProvider": "Metadata Provider", - "extensionDownloadProvider": "Download Provider", - "extensionLyricsProvider": "Lyrics Provider", - "extensionUrlHandler": "URL Handler", - "extensionQualityOptions": "Quality Options", - "extensionPostProcessingHooks": "Post-Processing Hooks", - "extensionPermissions": "Permissions", - "extensionSettings": "Settings", - "extensionRemoveButton": "Remove Extension", - "extensionUpdated": "Updated", - "extensionMinAppVersion": "Min App Version", + "statusQueued": "Queued", + "@statusQueued": {"description": "Download status - waiting in queue"}, + "statusDownloading": "Downloading", + "@statusDownloading": {"description": "Download status - in progress"}, + "statusFinalizing": "Finalizing", + "@statusFinalizing": {"description": "Download status - writing metadata"}, + "statusCompleted": "Completed", + "@statusCompleted": {"description": "Download status - finished"}, + "statusFailed": "Failed", + "@statusFailed": {"description": "Download status - error occurred"}, + "statusSkipped": "Skipped", + "@statusSkipped": {"description": "Download status - already exists"}, + "statusPaused": "Paused", + "@statusPaused": {"description": "Download status - paused"}, - "qualityFlacLossless": "FLAC Lossless", - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "qualityHiResFlac": "Hi-Res FLAC", - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "qualityNote": "Actual quality depends on track availability from the service", + "actionPause": "Pause", + "@actionPause": {"description": "Action button - pause download"}, + "actionResume": "Resume", + "@actionResume": {"description": "Action button - resume download"}, + "actionCancel": "Cancel", + "@actionCancel": {"description": "Action button - cancel operation"}, + "actionStop": "Stop", + "@actionStop": {"description": "Action button - stop operation"}, + "actionSelect": "Select", + "@actionSelect": {"description": "Action button - enter selection mode"}, + "actionSelectAll": "Select All", + "@actionSelectAll": {"description": "Action button - select all items"}, + "actionDeselect": "Deselect", + "@actionDeselect": {"description": "Action button - deselect all"}, + "actionPaste": "Paste", + "@actionPaste": {"description": "Action button - paste from clipboard"}, + "actionImportCsv": "Import CSV", + "@actionImportCsv": {"description": "Action button - import CSV file"}, + "actionRemoveCredentials": "Remove Credentials", + "@actionRemoveCredentials": {"description": "Action button - delete Spotify credentials"}, + "actionSaveCredentials": "Save Credentials", + "@actionSaveCredentials": {"description": "Action button - save Spotify credentials"}, - "downloadAskBeforeDownload": "Ask Before Download", - "downloadDirectory": "Download Directory", - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "downloadAlbumFolderStructure": "Album Folder Structure", - "downloadSaveFormat": "Save Format", - "downloadSelectService": "Select Service", - "downloadSelectQuality": "Select Quality", - "downloadFrom": "Download From", - "downloadDefaultQualityLabel": "Default Quality", - "downloadBestAvailable": "Best available", - - "folderNone": "None", - "folderNoneSubtitle": "Save all files directly to download folder", - "folderArtist": "Artist", - "folderArtistSubtitle": "Artist Name/filename", - "folderAlbum": "Album", - "folderAlbumSubtitle": "Album Name/filename", - "folderArtistAlbum": "Artist/Album", - "folderArtistAlbumSubtitle": "Artist Name/Album Name/filename", - - "serviceTidal": "Tidal", - "serviceQobuz": "Qobuz", - "serviceAmazon": "Amazon", - "serviceDeezer": "Deezer", - "serviceSpotify": "Spotify", - - "logSearchHint": "Search logs...", - "logFilterLevel": "Level", - "logFilterSection": "Filter", - "logShareLogs": "Share logs", - "logClearLogs": "Clear logs", - "logClearLogsTitle": "Clear Logs", - "logClearLogsMessage": "Are you sure you want to clear all logs?", - "logIspBlocking": "ISP BLOCKING DETECTED", - "logRateLimited": "RATE LIMITED", - "logNetworkError": "NETWORK ERROR", - "logTrackNotFound": "TRACK NOT FOUND", - - "appearanceAmoledDark": "AMOLED Dark", - "appearanceAmoledDarkSubtitle": "Pure black background", - "appearanceChooseAccentColor": "Choose Accent Color", - "appearanceChooseTheme": "Theme Mode", - - "updateStartingDownload": "Starting download...", - "updateDownloadFailed": "Download failed", - "updateFailedMessage": "Failed to download update", - "updateNewVersionReady": "A new version is ready", - "updateCurrent": "Current", - "updateNew": "New", - "updateDownloading": "Downloading...", - "updateWhatsNew": "What's New", - "updateDownloadInstall": "Download & Install", - "updateDontRemind": "Don't remind", - - "trackCopyFilePath": "Copy file path", - "trackRemoveFromDevice": "Remove from device", - "trackLoadLyrics": "Load Lyrics", - - "dateToday": "Today", - "dateYesterday": "Yesterday", - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", "placeholders": { "count": {"type": "int"} } }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": {"description": "Status - all items selected"}, + "selectionTapToSelect": "Tap tracks to select", + "@selectionTapToSelect": {"description": "Hint - how to select items"}, + "selectionDeleteTracks": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracks": { + "description": "Delete button with count", "placeholders": { "count": {"type": "int"} } }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": {"description": "Placeholder when nothing selected"}, + + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", "placeholders": { - "count": {"type": "int"} + "current": {"type": "int"}, + "total": {"type": "int"} } }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": {"description": "Progress indicator - parsing CSV file"}, - "concurrentSequential": "Sequential", - "concurrentParallel2": "2 Parallel", - "concurrentParallel3": "3 Parallel", + "searchSongs": "Songs", + "@searchSongs": {"description": "Search result category - songs"}, + "searchArtists": "Artists", + "@searchArtists": {"description": "Search result category - artists"}, + "searchAlbums": "Albums", + "@searchAlbums": {"description": "Search result category - albums"}, + "searchPlaylists": "Playlists", + "@searchPlaylists": {"description": "Search result category - playlists"}, + "tooltipPlay": "Play", + "@tooltipPlay": {"description": "Tooltip - play button"}, + "tooltipCancel": "Cancel", + "@tooltipCancel": {"description": "Tooltip - cancel button"}, + "tooltipStop": "Stop", + "@tooltipStop": {"description": "Tooltip - stop button"}, + "tooltipRetry": "Retry", + "@tooltipRetry": {"description": "Tooltip - retry button"}, + "tooltipRemove": "Remove", + "@tooltipRemove": {"description": "Tooltip - remove button"}, + "tooltipClear": "Clear", + "@tooltipClear": {"description": "Tooltip - clear button"}, + "tooltipPaste": "Paste", + "@tooltipPaste": {"description": "Tooltip - paste button"}, + + "filenameFormat": "Filename Format", + "@filenameFormat": {"description": "Setting title - filename pattern"}, + "filenameFormatPreview": "Preview: {preview}", + "@filenameFormatPreview": { + "description": "Preview of filename pattern", + "placeholders": { + "preview": {"type": "String"} + } + }, "filenameAvailablePlaceholders": "Available placeholders:", + "@filenameAvailablePlaceholders": {"description": "Label for placeholder list"}, "filenameHint": "{artist} - {title}", + "@filenameHint": {"description": "Default filename format hint"}, - "tapToSeeError": "Tap to see error details", + "folderOrganization": "Folder Organization", + "@folderOrganization": {"description": "Setting title - folder structure"}, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": {"description": "Folder option - flat structure"}, + "folderOrganizationByArtist": "By Artist", + "@folderOrganizationByArtist": {"description": "Folder option - artist folders"}, + "folderOrganizationByAlbum": "By Album", + "@folderOrganizationByAlbum": {"description": "Folder option - album folders"}, + "folderOrganizationByArtistAlbum": "Artist/Album", + "@folderOrganizationByArtistAlbum": {"description": "Folder option - nested folders"}, + "folderOrganizationDescription": "Organize downloaded files into folders", + "@folderOrganizationDescription": {"description": "Folder organization sheet description"}, + "folderOrganizationNoneSubtitle": "All files in download folder", + "@folderOrganizationNoneSubtitle": {"description": "Subtitle for no organization option"}, + "folderOrganizationByArtistSubtitle": "Separate folder for each artist", + "@folderOrganizationByArtistSubtitle": {"description": "Subtitle for artist folder option"}, + "folderOrganizationByAlbumSubtitle": "Separate folder for each album", + "@folderOrganizationByAlbumSubtitle": {"description": "Subtitle for album folder option"}, + "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album", + "@folderOrganizationByArtistAlbumSubtitle": {"description": "Subtitle for nested folder option"}, - "setupProceedToNextStep": "You can now proceed to the next step.", - "setupNotificationProgressDescription": "You will receive download progress notifications.", - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", - "setupSkipForNow": "Skip for now", - "setupBack": "Back", - "setupNext": "Next", - "setupGetStarted": "Get Started", - "setupSkipAndStart": "Skip & Start", - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", - "setupGetCredentialsFromSpotify": "Get credentials from developer.spotify.com", - - "trackMetadata": "Metadata", - "trackFileInfo": "File Info", - "trackLyrics": "Lyrics", - "trackFileNotFound": "File not found", - "trackOpenInDeezer": "Open in Deezer", - "trackOpenInSpotify": "Open in Spotify", - "trackTrackName": "Track name", - "trackArtist": "Artist", - "trackAlbumArtist": "Album artist", - "trackAlbum": "Album", - "trackTrackNumber": "Track number", - "trackDiscNumber": "Disc number", - "trackDuration": "Duration", - "trackAudioQuality": "Audio quality", - "trackReleaseDate": "Release date", - "trackDownloaded": "Downloaded", - "trackCopyLyrics": "Copy lyrics", - "trackLyricsNotAvailable": "Lyrics not available for this track", - "trackLyricsTimeout": "Request timed out. Try again later.", - "trackLyricsLoadFailed": "Failed to load lyrics", - "trackCopiedToClipboard": "Copied to clipboard", - "trackDeleteConfirmTitle": "Remove from device?", - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "trackCannotOpen": "Cannot open: {message}", - "@trackCannotOpen": { + "updateAvailable": "Update Available", + "@updateAvailable": {"description": "Update dialog title"}, + "updateNewVersion": "Version {version} is available", + "@updateNewVersion": { + "description": "Update available message", "placeholders": { - "message": {"type": "String"} + "version": {"type": "String"} } }, + "updateDownload": "Download", + "@updateDownload": {"description": "Update button - download update"}, + "updateLater": "Later", + "@updateLater": {"description": "Update button - dismiss"}, + "updateChangelog": "Changelog", + "@updateChangelog": {"description": "Link to changelog"}, + "updateStartingDownload": "Starting download...", + "@updateStartingDownload": {"description": "Update status - initializing"}, + "updateDownloadFailed": "Download failed", + "@updateDownloadFailed": {"description": "Update error title"}, + "updateFailedMessage": "Failed to download update", + "@updateFailedMessage": {"description": "Update error message"}, + "updateNewVersionReady": "A new version is ready", + "@updateNewVersionReady": {"description": "Update subtitle"}, + "updateCurrent": "Current", + "@updateCurrent": {"description": "Label for current version"}, + "updateNew": "New", + "@updateNew": {"description": "Label for new version"}, + "updateDownloading": "Downloading...", + "@updateDownloading": {"description": "Update status - downloading"}, + "updateWhatsNew": "What's New", + "@updateWhatsNew": {"description": "Changelog section title"}, + "updateDownloadInstall": "Download & Install", + "@updateDownloadInstall": {"description": "Update button - download and install"}, + "updateDontRemind": "Don't remind", + "@updateDontRemind": {"description": "Update button - skip this version"}, + "providerPriority": "Provider Priority", + "@providerPriority": {"description": "Setting title - download provider order"}, + "providerPrioritySubtitle": "Drag to reorder download providers", + "@providerPrioritySubtitle": {"description": "Subtitle for provider priority"}, + "providerPriorityTitle": "Provider Priority", + "@providerPriorityTitle": {"description": "Provider priority page title"}, + "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", + "@providerPriorityDescription": {"description": "Provider priority page description"}, + "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", + "@providerPriorityInfo": {"description": "Info tip about fallback behavior"}, + "providerBuiltIn": "Built-in", + "@providerBuiltIn": {"description": "Label for built-in providers (Tidal/Qobuz/Amazon)"}, + "providerExtension": "Extension", + "@providerExtension": {"description": "Label for extension-provided providers"}, + + "metadataProviderPriority": "Metadata Provider Priority", + "@metadataProviderPriority": {"description": "Setting title - metadata provider order"}, + "metadataProviderPrioritySubtitle": "Order used when fetching track metadata", + "@metadataProviderPrioritySubtitle": {"description": "Subtitle for metadata priority"}, + "metadataProviderPriorityTitle": "Metadata Priority", + "@metadataProviderPriorityTitle": {"description": "Metadata priority page title"}, + "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", + "@metadataProviderPriorityDescription": {"description": "Metadata priority page description"}, + "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", + "@metadataProviderPriorityInfo": {"description": "Info tip about rate limits"}, + "metadataNoRateLimits": "No rate limits", + "@metadataNoRateLimits": {"description": "Deezer provider description"}, + "metadataMayRateLimit": "May rate limit", + "@metadataMayRateLimit": {"description": "Spotify provider description"}, + + "logTitle": "Logs", + "@logTitle": {"description": "Logs screen title"}, + "logCopy": "Copy Logs", + "@logCopy": {"description": "Action - copy logs to clipboard"}, + "logClear": "Clear Logs", + "@logClear": {"description": "Action - delete all logs"}, + "logShare": "Share Logs", + "@logShare": {"description": "Action - share logs file"}, + "logEmpty": "No logs yet", + "@logEmpty": {"description": "Empty state title"}, + "logCopied": "Logs copied to clipboard", + "@logCopied": {"description": "Snackbar - logs copied"}, + "logSearchHint": "Search logs...", + "@logSearchHint": {"description": "Log search placeholder"}, + "logFilterLevel": "Level", + "@logFilterLevel": {"description": "Filter by log level"}, + "logFilterSection": "Filter", + "@logFilterSection": {"description": "Filter section title"}, + "logShareLogs": "Share logs", + "@logShareLogs": {"description": "Share button tooltip"}, + "logClearLogs": "Clear logs", + "@logClearLogs": {"description": "Clear button tooltip"}, + "logClearLogsTitle": "Clear Logs", + "@logClearLogsTitle": {"description": "Clear logs dialog title"}, + "logClearLogsMessage": "Are you sure you want to clear all logs?", + "@logClearLogsMessage": {"description": "Clear logs confirmation message"}, + "logIspBlocking": "ISP BLOCKING DETECTED", + "@logIspBlocking": {"description": "Error category - ISP blocking"}, + "logRateLimited": "RATE LIMITED", + "@logRateLimited": {"description": "Error category - rate limiting"}, + "logNetworkError": "NETWORK ERROR", + "@logNetworkError": {"description": "Error category - network issues"}, + "logTrackNotFound": "TRACK NOT FOUND", + "@logTrackNotFound": {"description": "Error category - missing tracks"}, "logFilterBySeverity": "Filter logs by severity", + "@logFilterBySeverity": {"description": "Filter dialog title"}, "logNoLogsYet": "No logs yet", + "@logNoLogsYet": {"description": "Empty state title"}, "logNoLogsYetSubtitle": "Logs will appear here as you use the app", + "@logNoLogsYetSubtitle": {"description": "Empty state subtitle"}, "logIssueSummary": "Issue Summary", + "@logIssueSummary": {"description": "Section header for error summary"}, "logIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIspBlockingDescription": {"description": "ISP blocking explanation"}, "logIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIspBlockingSuggestion": {"description": "ISP blocking fix suggestion"}, "logRateLimitedDescription": "Too many requests to the service", + "@logRateLimitedDescription": {"description": "Rate limit explanation"}, "logRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logRateLimitedSuggestion": {"description": "Rate limit fix suggestion"}, "logNetworkErrorDescription": "Connection issues detected", + "@logNetworkErrorDescription": {"description": "Network error explanation"}, "logNetworkErrorSuggestion": "Check your internet connection", + "@logNetworkErrorSuggestion": {"description": "Network error fix suggestion"}, "logTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logTrackNotFoundDescription": {"description": "Track not found explanation"}, "logTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logTrackNotFoundSuggestion": {"description": "Track not found explanation"}, "logTotalErrors": "Total errors: {count}", "@logTotalErrors": { + "description": "Error count display", "placeholders": { "count": {"type": "int"} } }, "logAffected": "Affected: {domains}", "@logAffected": { + "description": "Affected domains display", "placeholders": { "domains": {"type": "String"} } }, "logEntriesFiltered": "Entries ({count} filtered)", "@logEntriesFiltered": { + "description": "Log count with filter active", "placeholders": { "count": {"type": "int"} } }, "logEntries": "Entries ({count})", "@logEntries": { + "description": "Total log count", "placeholders": { "count": {"type": "int"} } }, - "extensionsProviderPrioritySection": "Provider Priority", - "extensionsInstalledSection": "Installed Extensions", - "extensionsNoExtensions": "No extensions installed", - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "extensionsInstallButton": "Install Extension", - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "extensionsInstalledSuccess": "Extension installed successfully", - "extensionsDownloadPriority": "Download Priority", - "extensionsDownloadPrioritySubtitle": "Set download service order", - "extensionsNoDownloadProvider": "No extensions with download provider", - "extensionsMetadataPriority": "Metadata Priority", - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "extensionsSearchProvider": "Search Provider", - "extensionsNoCustomSearch": "No extensions with custom search", - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "extensionsCustomSearch": "Custom search", - "extensionsErrorLoading": "Error loading extension", + "credentialsTitle": "Spotify Credentials", + "@credentialsTitle": {"description": "Credentials dialog title"}, + "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", + "@credentialsDescription": {"description": "Credentials dialog explanation"}, + "credentialsClientId": "Client ID", + "@credentialsClientId": {"description": "Client ID field label - DO NOT TRANSLATE"}, + "credentialsClientIdHint": "Paste Client ID", + "@credentialsClientIdHint": {"description": "Client ID placeholder"}, + "credentialsClientSecret": "Client Secret", + "@credentialsClientSecret": {"description": "Client Secret field label - DO NOT TRANSLATE"}, + "credentialsClientSecretHint": "Paste Client Secret", + "@credentialsClientSecretHint": {"description": "Client Secret placeholder"}, + "channelStable": "Stable", + "@channelStable": {"description": "Update channel - stable releases"}, + "channelPreview": "Preview", + "@channelPreview": {"description": "Update channel - beta/preview releases"}, + + "sectionSearchSource": "Search Source", + "@sectionSearchSource": {"description": "Settings section header"}, + "sectionDownload": "Download", + "@sectionDownload": {"description": "Settings section header"}, + "sectionPerformance": "Performance", + "@sectionPerformance": {"description": "Settings section header"}, + "sectionApp": "App", + "@sectionApp": {"description": "Settings section header"}, + "sectionData": "Data", + "@sectionData": {"description": "Settings section header"}, + "sectionDebug": "Debug", + "@sectionDebug": {"description": "Settings section header"}, + "sectionService": "Service", + "@sectionService": {"description": "Settings section header"}, + "sectionAudioQuality": "Audio Quality", + "@sectionAudioQuality": {"description": "Settings section header"}, + "sectionFileSettings": "File Settings", + "@sectionFileSettings": {"description": "Settings section header"}, + "sectionColor": "Color", + "@sectionColor": {"description": "Settings section header"}, + "sectionTheme": "Theme", + "@sectionTheme": {"description": "Settings section header"}, + "sectionLayout": "Layout", + "@sectionLayout": {"description": "Settings section header"}, + + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": {"description": "Appearance settings description"}, + "settingsDownloadSubtitle": "Service, quality, filename format", + "@settingsDownloadSubtitle": {"description": "Download settings description"}, + "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", + "@settingsOptionsSubtitle": {"description": "Options settings description"}, + "settingsExtensionsSubtitle": "Manage download providers", + "@settingsExtensionsSubtitle": {"description": "Extensions settings description"}, + "settingsLogsSubtitle": "View app logs for debugging", + "@settingsLogsSubtitle": {"description": "Logs settings description"}, + + "loadingSharedLink": "Loading shared link...", + "@loadingSharedLink": {"description": "Status when opening shared URL"}, + "pressBackAgainToExit": "Press back again to exit", + "@pressBackAgainToExit": {"description": "Exit confirmation message"}, + + "tracksHeader": "Tracks", + "@tracksHeader": {"description": "Section header for track list"}, + "downloadAllCount": "Download All ({count})", + "@downloadAllCount": { + "description": "Download all button with count", + "placeholders": { + "count": {"type": "int"} + } + }, + "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@tracksCount": { + "description": "Track count display", + "placeholders": { + "count": {"type": "int"} + } + }, + + "trackCopyFilePath": "Copy file path", + "@trackCopyFilePath": {"description": "Action - copy file path"}, + "trackRemoveFromDevice": "Remove from device", + "@trackRemoveFromDevice": {"description": "Action - delete downloaded file"}, + "trackLoadLyrics": "Load Lyrics", + "@trackLoadLyrics": {"description": "Action - fetch lyrics"}, + "trackMetadata": "Metadata", + "@trackMetadata": {"description": "Tab title - track metadata"}, + "trackFileInfo": "File Info", + "@trackFileInfo": {"description": "Tab title - file information"}, + "trackLyrics": "Lyrics", + "@trackLyrics": {"description": "Tab title - lyrics"}, + "trackFileNotFound": "File not found", + "@trackFileNotFound": {"description": "Error - file doesn't exist"}, + "trackOpenInDeezer": "Open in Deezer", + "@trackOpenInDeezer": {"description": "Action - open track in Deezer app"}, + "trackOpenInSpotify": "Open in Spotify", + "@trackOpenInSpotify": {"description": "Action - open track in Spotify app"}, + "trackTrackName": "Track name", + "@trackTrackName": {"description": "Metadata label - track title"}, + "trackArtist": "Artist", + "@trackArtist": {"description": "Metadata label - artist name"}, + "trackAlbumArtist": "Album artist", + "@trackAlbumArtist": {"description": "Metadata label - album artist"}, + "trackAlbum": "Album", + "@trackAlbum": {"description": "Metadata label - album name"}, + "trackTrackNumber": "Track number", + "@trackTrackNumber": {"description": "Metadata label - track number"}, + "trackDiscNumber": "Disc number", + "@trackDiscNumber": {"description": "Metadata label - disc number"}, + "trackDuration": "Duration", + "@trackDuration": {"description": "Metadata label - track length"}, + "trackAudioQuality": "Audio quality", + "@trackAudioQuality": {"description": "Metadata label - audio quality"}, + "trackReleaseDate": "Release date", + "@trackReleaseDate": {"description": "Metadata label - release date"}, + "trackDownloaded": "Downloaded", + "@trackDownloaded": {"description": "Metadata label - download date"}, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": {"description": "Action - copy lyrics to clipboard"}, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": {"description": "Message when lyrics not found"}, + "trackLyricsTimeout": "Request timed out. Try again later.", + "@trackLyricsTimeout": {"description": "Message when lyrics request times out"}, + "trackLyricsLoadFailed": "Failed to load lyrics", + "@trackLyricsLoadFailed": {"description": "Message when lyrics loading fails"}, + "trackCopiedToClipboard": "Copied to clipboard", + "@trackCopiedToClipboard": {"description": "Snackbar - content copied"}, + "trackDeleteConfirmTitle": "Remove from device?", + "@trackDeleteConfirmTitle": {"description": "Delete confirmation title"}, + "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", + "@trackDeleteConfirmMessage": {"description": "Delete confirmation message"}, + "trackCannotOpen": "Cannot open: {message}", + "@trackCannotOpen": { + "description": "Error opening file", + "placeholders": { + "message": {"type": "String"} + } + }, + + "dateToday": "Today", + "@dateToday": {"description": "Relative date - today"}, + "dateYesterday": "Yesterday", + "@dateYesterday": {"description": "Relative date - yesterday"}, + "dateDaysAgo": "{count} days ago", + "@dateDaysAgo": { + "description": "Relative date - days ago", + "placeholders": { + "count": {"type": "int"} + } + }, + "dateWeeksAgo": "{count} weeks ago", + "@dateWeeksAgo": { + "description": "Relative date - weeks ago", + "placeholders": { + "count": {"type": "int"} + } + }, + "dateMonthsAgo": "{count} months ago", + "@dateMonthsAgo": { + "description": "Relative date - months ago", + "placeholders": { + "count": {"type": "int"} + } + }, + + "concurrentSequential": "Sequential", + "@concurrentSequential": {"description": "Download mode - one at a time"}, + "concurrentParallel2": "2 Parallel", + "@concurrentParallel2": {"description": "Download mode - 2 simultaneous"}, + "concurrentParallel3": "3 Parallel", + "@concurrentParallel3": {"description": "Download mode - 3 simultaneous"}, + + "tapToSeeError": "Tap to see error details", + "@tapToSeeError": {"description": "Tooltip for failed download"}, + + "storeFilterAll": "All", + "@storeFilterAll": {"description": "Store filter - all extensions"}, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": {"description": "Store filter - metadata providers"}, + "storeFilterDownload": "Download", + "@storeFilterDownload": {"description": "Store filter - download providers"}, + "storeFilterUtility": "Utility", + "@storeFilterUtility": {"description": "Store filter - utility extensions"}, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": {"description": "Store filter - lyrics providers"}, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": {"description": "Store filter - integrations"}, + "storeClearFilters": "Clear filters", + "@storeClearFilters": {"description": "Button to clear all filters"}, + "storeNoResults": "No extensions found", + "@storeNoResults": {"description": "Empty state when no extensions match filters"}, + + "extensionProviderPriority": "Provider Priority", + "@extensionProviderPriority": {"description": "Extension capability - provider priority"}, + "extensionInstallButton": "Install Extension", + "@extensionInstallButton": {"description": "Button to install extension"}, + "extensionDefaultProvider": "Default (Deezer/Spotify)", + "@extensionDefaultProvider": {"description": "Default search provider option"}, + "extensionDefaultProviderSubtitle": "Use built-in search", + "@extensionDefaultProviderSubtitle": {"description": "Subtitle for default provider"}, + "extensionAuthor": "Author", + "@extensionAuthor": {"description": "Extension detail - author"}, + "extensionId": "ID", + "@extensionId": {"description": "Extension detail - unique ID"}, + "extensionError": "Error", + "@extensionError": {"description": "Extension detail - error message"}, + "extensionCapabilities": "Capabilities", + "@extensionCapabilities": {"description": "Section header - extension features"}, + "extensionMetadataProvider": "Metadata Provider", + "@extensionMetadataProvider": {"description": "Capability - provides metadata"}, + "extensionDownloadProvider": "Download Provider", + "@extensionDownloadProvider": {"description": "Capability - provides downloads"}, + "extensionLyricsProvider": "Lyrics Provider", + "@extensionLyricsProvider": {"description": "Capability - provides lyrics"}, + "extensionUrlHandler": "URL Handler", + "@extensionUrlHandler": {"description": "Capability - handles URLs"}, + "extensionQualityOptions": "Quality Options", + "@extensionQualityOptions": {"description": "Capability - quality selection"}, + "extensionPostProcessingHooks": "Post-Processing Hooks", + "@extensionPostProcessingHooks": {"description": "Capability - post-processing"}, + "extensionPermissions": "Permissions", + "@extensionPermissions": {"description": "Section header - required permissions"}, + "extensionSettings": "Settings", + "@extensionSettings": {"description": "Section header - extension settings"}, + "extensionRemoveButton": "Remove Extension", + "@extensionRemoveButton": {"description": "Button to uninstall extension"}, + "extensionUpdated": "Updated", + "@extensionUpdated": {"description": "Extension detail - last update"}, + "extensionMinAppVersion": "Min App Version", + "@extensionMinAppVersion": {"description": "Extension detail - minimum app version"}, "extensionCustomTrackMatching": "Custom Track Matching", + "@extensionCustomTrackMatching": {"description": "Capability - custom track matching algorithm"}, "extensionPostProcessing": "Post-Processing", + "@extensionPostProcessing": {"description": "Capability - post-download processing"}, "extensionHooksAvailable": "{count} hook(s) available", "@extensionHooksAvailable": { + "description": "Post-processing hooks count", "placeholders": { "count": {"type": "int"} } }, "extensionPatternsCount": "{count} pattern(s)", "@extensionPatternsCount": { + "description": "URL patterns count", "placeholders": { "count": {"type": "int"} } }, "extensionStrategy": "Strategy: {strategy}", "@extensionStrategy": { + "description": "Track matching strategy name", "placeholders": { "strategy": {"type": "String"} } }, + "extensionsProviderPrioritySection": "Provider Priority", + "@extensionsProviderPrioritySection": {"description": "Section header - provider priority"}, + "extensionsInstalledSection": "Installed Extensions", + "@extensionsInstalledSection": {"description": "Section header - installed extensions"}, + "extensionsNoExtensions": "No extensions installed", + "@extensionsNoExtensions": {"description": "Empty state - no extensions"}, + "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", + "@extensionsNoExtensionsSubtitle": {"description": "Empty state subtitle"}, + "extensionsInstallButton": "Install Extension", + "@extensionsInstallButton": {"description": "Button to install extension from file"}, + "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", + "@extensionsInfoTip": {"description": "Security warning about extensions"}, + "extensionsInstalledSuccess": "Extension installed successfully", + "@extensionsInstalledSuccess": {"description": "Success message after install"}, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": {"description": "Setting - download provider order"}, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": {"description": "Subtitle for download priority"}, + "extensionsNoDownloadProvider": "No extensions with download provider", + "@extensionsNoDownloadProvider": {"description": "Empty state - no download providers"}, + "extensionsMetadataPriority": "Metadata Priority", + "@extensionsMetadataPriority": {"description": "Setting - metadata provider order"}, + "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", + "@extensionsMetadataPrioritySubtitle": {"description": "Subtitle for metadata priority"}, + "extensionsNoMetadataProvider": "No extensions with metadata provider", + "@extensionsNoMetadataProvider": {"description": "Empty state - no metadata providers"}, + "extensionsSearchProvider": "Search Provider", + "@extensionsSearchProvider": {"description": "Setting - search provider selection"}, + "extensionsNoCustomSearch": "No extensions with custom search", + "@extensionsNoCustomSearch": {"description": "Empty state - no search providers"}, + "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", + "@extensionsSearchProviderDescription": {"description": "Search provider setting description"}, + "extensionsCustomSearch": "Custom search", + "@extensionsCustomSearch": {"description": "Label for custom search provider"}, + "extensionsErrorLoading": "Error loading extension", + "@extensionsErrorLoading": {"description": "Error message when extension fails to load"}, - "aboutDoubleDouble": "DoubleDouble", - "aboutDoubleDoubleDesc": "Amazing API for Amazon Music downloads. Thank you for making it free!", - "aboutDabMusic": "DAB Music", - "aboutDabMusicDesc": "The best Qobuz streaming API. Hi-Res downloads wouldn't be possible without this!", + "qualityFlacLossless": "FLAC Lossless", + "@qualityFlacLossless": {"description": "Quality option - CD quality FLAC"}, + "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", + "@qualityFlacLosslessSubtitle": {"description": "Technical spec for lossless"}, + "qualityHiResFlac": "Hi-Res FLAC", + "@qualityHiResFlac": {"description": "Quality option - high resolution FLAC"}, + "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", + "@qualityHiResFlacSubtitle": {"description": "Technical spec for hi-res"}, + "qualityHiResFlacMax": "Hi-Res FLAC Max", + "@qualityHiResFlacMax": {"description": "Quality option - maximum resolution FLAC"}, + "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", + "@qualityHiResFlacMaxSubtitle": {"description": "Technical spec for hi-res max"}, + "qualityNote": "Actual quality depends on track availability from the service", + "@qualityNote": {"description": "Note about quality availability"}, + + "downloadAskBeforeDownload": "Ask Before Download", + "@downloadAskBeforeDownload": {"description": "Setting - show quality picker"}, + "downloadDirectory": "Download Directory", + "@downloadDirectory": {"description": "Setting - download folder"}, + "downloadSeparateSinglesFolder": "Separate Singles Folder", + "@downloadSeparateSinglesFolder": {"description": "Setting - separate folder for singles"}, + "downloadAlbumFolderStructure": "Album Folder Structure", + "@downloadAlbumFolderStructure": {"description": "Setting - album folder organization"}, + "downloadSaveFormat": "Save Format", + "@downloadSaveFormat": {"description": "Setting - output file format"}, + "downloadSelectService": "Select Service", + "@downloadSelectService": {"description": "Dialog title - choose download service"}, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": {"description": "Dialog title - choose audio quality"}, + "downloadFrom": "Download From", + "@downloadFrom": {"description": "Label - download source"}, + "downloadDefaultQualityLabel": "Default Quality", + "@downloadDefaultQualityLabel": {"description": "Label - default quality setting"}, + "downloadBestAvailable": "Best available", + "@downloadBestAvailable": {"description": "Quality option - highest available"}, + + "folderNone": "None", + "@folderNone": {"description": "Folder option - no organization"}, + "folderNoneSubtitle": "Save all files directly to download folder", + "@folderNoneSubtitle": {"description": "Subtitle for no folder organization"}, + "folderArtist": "Artist", + "@folderArtist": {"description": "Folder option - by artist"}, + "folderArtistSubtitle": "Artist Name/filename", + "@folderArtistSubtitle": {"description": "Folder structure example"}, + "folderAlbum": "Album", + "@folderAlbum": {"description": "Folder option - by album"}, + "folderAlbumSubtitle": "Album Name/filename", + "@folderAlbumSubtitle": {"description": "Folder structure example"}, + "folderArtistAlbum": "Artist/Album", + "@folderArtistAlbum": {"description": "Folder option - nested"}, + "folderArtistAlbumSubtitle": "Artist Name/Album Name/filename", + "@folderArtistAlbumSubtitle": {"description": "Folder structure example"}, + + "serviceTidal": "Tidal", + "@serviceTidal": {"description": "Service name - DO NOT TRANSLATE"}, + "serviceQobuz": "Qobuz", + "@serviceQobuz": {"description": "Service name - DO NOT TRANSLATE"}, + "serviceAmazon": "Amazon", + "@serviceAmazon": {"description": "Service name - DO NOT TRANSLATE"}, + "serviceDeezer": "Deezer", + "@serviceDeezer": {"description": "Service name - DO NOT TRANSLATE"}, + "serviceSpotify": "Spotify", + "@serviceSpotify": {"description": "Service name - DO NOT TRANSLATE"}, + + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": {"description": "Theme option - pure black"}, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@appearanceAmoledDarkSubtitle": {"description": "Subtitle for AMOLED dark"}, + "appearanceChooseAccentColor": "Choose Accent Color", + "@appearanceChooseAccentColor": {"description": "Color picker dialog title"}, + "appearanceChooseTheme": "Theme Mode", + "@appearanceChooseTheme": {"description": "Theme picker dialog title"}, "queueTitle": "Download Queue", + "@queueTitle": {"description": "Queue screen title"}, "queueClearAll": "Clear All", + "@queueClearAll": {"description": "Button - clear all queue items"}, "queueClearAllMessage": "Are you sure you want to clear all downloads?", + "@queueClearAllMessage": {"description": "Clear queue confirmation"}, + "queueEmpty": "No downloads in queue", + "@queueEmpty": {"description": "Empty queue state title"}, + "queueEmptySubtitle": "Add tracks from the home screen", + "@queueEmptySubtitle": {"description": "Empty queue state subtitle"}, + "queueClearCompleted": "Clear completed", + "@queueClearCompleted": {"description": "Button - clear finished downloads"}, + "queueDownloadFailed": "Download Failed", + "@queueDownloadFailed": {"description": "Error dialog title"}, + "queueTrackLabel": "Track:", + "@queueTrackLabel": {"description": "Label in error dialog"}, + "queueArtistLabel": "Artist:", + "@queueArtistLabel": {"description": "Label in error dialog"}, + "queueErrorLabel": "Error:", + "@queueErrorLabel": {"description": "Label in error dialog"}, + "queueUnknownError": "Unknown error", + "@queueUnknownError": {"description": "Fallback error message"}, "albumFolderArtistAlbum": "Artist / Album", + "@albumFolderArtistAlbum": {"description": "Album folder option"}, "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", + "@albumFolderArtistAlbumSubtitle": {"description": "Folder structure example"}, "albumFolderArtistYearAlbum": "Artist / [Year] Album", + "@albumFolderArtistYearAlbum": {"description": "Album folder option with year"}, "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", + "@albumFolderArtistYearAlbumSubtitle": {"description": "Folder structure example"}, "albumFolderAlbumOnly": "Album Only", + "@albumFolderAlbumOnly": {"description": "Album folder option"}, "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", + "@albumFolderAlbumOnlySubtitle": {"description": "Folder structure example"}, "albumFolderYearAlbum": "[Year] Album", + "@albumFolderYearAlbum": {"description": "Album folder option with year"}, "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", + "@albumFolderYearAlbumSubtitle": {"description": "Folder structure example"}, "downloadedAlbumDeleteSelected": "Delete Selected", + "@downloadedAlbumDeleteSelected": {"description": "Button - delete selected tracks"}, "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", "@downloadedAlbumDeleteMessage": { + "description": "Delete confirmation with count", "placeholders": { "count": {"type": "int"} } }, - - "utilityFunctions": "Utility Functions", - - "aboutMobileDeveloper": "Mobile version developer", - "aboutOriginalCreator": "Creator of the original SpotiFLAC", - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", - "aboutBinimumDesc": "The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn't exist!", - "aboutSachinsenalDesc": "The original HiFi project creator. The foundation of Tidal integration!", - "aboutMobileSource": "Mobile source code", - "aboutPCSource": "PC source code", - "aboutReportIssue": "Report an issue", - "aboutReportIssueSubtitle": "Report any problems you encounter", - "aboutFeatureRequest": "Feature request", - "aboutFeatureRequestSubtitle": "Suggest new features for the app", - "aboutBuyMeCoffee": "Buy me a coffee", - "aboutBuyMeCoffeeSubtitle": "Support development on Ko-fi", - "aboutVersion": "Version", - "aboutAppDescription": "Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.", - - "providerPriorityTitle": "Provider Priority", - "providerPriorityDescription": "Drag to reorder download providers. The app will try providers from top to bottom when downloading tracks.", - "providerPriorityInfo": "If a track is not available on the first provider, the app will automatically try the next one.", - "providerBuiltIn": "Built-in", - "providerExtension": "Extension", - - "metadataProviderPriorityTitle": "Metadata Priority", - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "metadataNoRateLimits": "No rate limits", - "metadataMayRateLimit": "May rate limit", - - "queueEmpty": "No downloads in queue", - "queueEmptySubtitle": "Add tracks from the home screen", - "queueClearCompleted": "Clear completed", - "queueDownloadFailed": "Download Failed", - "queueTrackLabel": "Track:", - "queueArtistLabel": "Artist:", - "queueErrorLabel": "Error:", - "queueUnknownError": "Unknown error", - "downloadedAlbumTracksHeader": "Tracks", + "@downloadedAlbumTracksHeader": {"description": "Section header for tracks"}, "downloadedAlbumDownloadedCount": "{count} downloaded", "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", "placeholders": { "count": {"type": "int"} } }, "downloadedAlbumSelectedCount": "{count} selected", "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", "placeholders": { "count": {"type": "int"} } }, "downloadedAlbumAllSelected": "All tracks selected", + "@downloadedAlbumAllSelected": {"description": "Status - all items selected"}, "downloadedAlbumTapToSelect": "Tap tracks to select", + "@downloadedAlbumTapToSelect": {"description": "Selection hint"}, "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", "@downloadedAlbumDeleteCount": { + "description": "Delete button text with count", "placeholders": { "count": {"type": "int"} } }, "downloadedAlbumSelectToDelete": "Select tracks to delete", + "@downloadedAlbumSelectToDelete": {"description": "Placeholder when nothing selected"}, - "folderOrganizationDescription": "Organize downloaded files into folders", - "folderOrganizationNone": "None", - "folderOrganizationNoneSubtitle": "All files in download folder", - "folderOrganizationByArtist": "By Artist", - "folderOrganizationByArtistSubtitle": "Separate folder for each artist", - "folderOrganizationByAlbum": "By Album", - "folderOrganizationByAlbumSubtitle": "Separate folder for each album", - "folderOrganizationByArtistAlbum": "By Artist & Album", - "folderOrganizationByArtistAlbumSubtitle": "Nested folders for artist and album" + "utilityFunctions": "Utility Functions", + "@utilityFunctions": {"description": "Extension capability - utility functions"} }