diff --git a/lib/l10n/arb/app_hi.arb b/lib/l10n/arb/app_hi.arb index 1350fc51..70ced75a 100644 --- a/lib/l10n/arb/app_hi.arb +++ b/lib/l10n/arb/app_hi.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Home", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Options", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensions", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Options", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Primary Provider", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Auto Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Use Extension Providers", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Embed Lyrics", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Check for Updates", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@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" - }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensions", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "by {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Uninstall", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Search extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Install", "@storeInstall": { @@ -912,14 +850,6 @@ "@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", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Please fill all fields", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "View Queue", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Save Credentials", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selected", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Current", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@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" @@ -1378,30 +1293,6 @@ } } }, - "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" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Manage download providers", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "All", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Download", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Clear filters", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "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" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Clear All", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artist / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted"