From 1b4dfa7580b028ce3c3ac4559cbf66b7db136e96 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 28 Jul 2026 09:13:54 +0700 Subject: [PATCH 01/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 60298371..c2d67a7a 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -1154,7 +1154,7 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateRequiredTitle": "Update required", + "updateRequiredTitle": "Actualización Necesaria", "@updateRequiredTitle": { "description": "Title of the mandatory update dialog shown when the installed version is too old" }, From 0e03681cfca99f87882a8209b61628d222c0336f Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Wed, 29 Jul 2026 23:12:28 +0700 Subject: [PATCH 02/72] New translations app_en.arb (Russian) [ci skip] --- lib/l10n/arb/app_ru.arb | 82 ++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index b2a768c2..9de35f75 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -29,11 +29,11 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "No search providers yet", + "homeEmptyTitle": "Нет поставщиков поиска", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "Install an extension to continue.", + "homeEmptySubtitle": "Установите расширение, чтобы продолжить.", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, @@ -162,7 +162,7 @@ "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Выберите, какая вкладка открывает новые результаты поиска.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, @@ -194,27 +194,27 @@ "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "Сканировать громкость и вставить теги ReplayGain (EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "Выключено: нет тегов нормализации громкости", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "trackReplayGain": "Rescan ReplayGain", + "trackReplayGain": "Пересканировать ReplayGain", "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainScanning": "Analyzing loudness...", + "trackReplayGainScanning": "Анализ громкости...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" }, - "trackReplayGainSuccess": "ReplayGain tags added", + "trackReplayGainSuccess": "Добавлены теги ReplayGain", "@trackReplayGainSuccess": { "description": "Snackbar message after ReplayGain tags written for a single track" }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", + "trackReplayGainFailed": "Не удалось добавить теги ReplayGain", "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, @@ -227,11 +227,11 @@ } } }, - "replayGainBatchConfirmTitle": "Add ReplayGain", + "replayGainBatchConfirmTitle": "Добавить ReplayGain", "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "replayGainBatchConfirmMessage": "Проанализировать громкость и записать ReplayGain теги на {count} трек(-а)?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -240,11 +240,11 @@ } } }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "replayGainBatchAnalyzing": "Анализ ReplayGain...", "@replayGainBatchAnalyzing": { "description": "Progress dialog title while batch scanning ReplayGain" }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "replayGainBatchSuccess": "ReplayGain добавлен к {success} треков {total}", "@replayGainBatchSuccess": { "description": "Snackbar after batch ReplayGain completes", "placeholders": { @@ -256,11 +256,11 @@ } } }, - "optionsArtistTagMode": "Artist Tag Mode", + "optionsArtistTagMode": "Режим тега исполнителя", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "optionsArtistTagModeDescription": "Выберите, как несколько исполнителей записываются встроенные теги.", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, @@ -272,7 +272,7 @@ "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "optionsArtistTagModeSplitVorbis": "Разделить теги для FLAC/Opus", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, @@ -284,7 +284,7 @@ "@optionsExtensionStore": { "description": "Show/hide repo tab" }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "optionsExtensionStoreSubtitle": "Показывать вкладку репозитория в навигации", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension repo toggle" }, @@ -413,7 +413,7 @@ "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Сохранить Android открытым", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -473,7 +473,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Ищите метаданных музыки, управляйте расширениями и организуйте свою библиотеку.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -666,15 +666,15 @@ "@setupAllowAccessToManageFiles": { "description": "Instruction for file access permission" }, - "setupLanguageTitle": "Choose Language", + "setupLanguageTitle": "Выберите язык", "@setupLanguageTitle": { "description": "Title for the language selection step in setup" }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "setupLanguageDescription": "Выберите язык для приложения. Вы можете изменить его позже в настройках.", "@setupLanguageDescription": { "description": "Description for the language selection step in setup" }, - "setupLanguageSystemDefault": "System Default", + "setupLanguageSystemDefault": "Системные настройки", "@setupLanguageSystemDefault": { "description": "Option to use the system language" }, @@ -710,15 +710,15 @@ "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Play preview", + "previewPlay": "Предпросмотр проигрывания", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Stop preview", + "previewStop": "Остановить предпросмотр", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "Preview unavailable", + "previewUnavailable": "Предпросмотр недоступен", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, @@ -779,7 +779,7 @@ "@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": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} из истории?\n\nЭто также удалит файлы из хранилища.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -850,7 +850,7 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", + "snackbarDeletedTracks": "Удалено {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -936,7 +936,7 @@ "@errorNoTracksFound": { "description": "Error - search returned no results" }, - "searchEmptyResultSubtitle": "Try another keyword", + "searchEmptyResultSubtitle": "Попробуйте другое ключевое слово", "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, @@ -1154,11 +1154,11 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateRequiredTitle": "Update required", + "updateRequiredTitle": "Требуется обновление", "@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": "Эта версия {count} больше не поддерживается. Обновите, чтобы продолжить использовать приложение.", "@updateRequiredNotice": { "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", "placeholders": { @@ -1207,7 +1207,7 @@ "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "providerPriorityFallbackExtensionsHint": "Здесь перечислены только включенные расширения с возможностями поставщика загрузок.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, @@ -1397,7 +1397,7 @@ "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, fallback", + "settingsDownloadSubtitle": "Сервис, качество, откат", "@settingsDownloadSubtitle": { "description": "Download settings description" }, @@ -1426,7 +1426,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "tracksCount": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} =1 {1 трек} other {{count} треков}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1527,7 +1527,7 @@ "@trackCopyLyrics": { "description": "Action - copy lyrics to clipboard" }, - "trackLyricsSource": "Source: {source}", + "trackLyricsSource": "Источник: {source}", "@trackLyricsSource": { "description": "Label showing the lyrics source/provider", "placeholders": { @@ -1540,11 +1540,11 @@ "@trackLyricsNotAvailable": { "description": "Message when lyrics not found" }, - "trackLyricsNotInFile": "No lyrics found in this file", + "trackLyricsNotInFile": "В этом файле не найдено текстов песен", "@trackLyricsNotInFile": { "description": "Message when no embedded lyrics in audio file" }, - "trackFetchOnlineLyrics": "Fetch from Online", + "trackFetchOnlineLyrics": "Поиск в сети", "@trackFetchOnlineLyrics": { "description": "Action - fetch lyrics from online providers" }, @@ -1643,15 +1643,15 @@ "@storeClearFilters": { "description": "Button to clear all filters" }, - "storeAddRepoTitle": "Add Extension Repository", + "storeAddRepoTitle": "Добавить репозиторий расширения", "@storeAddRepoTitle": { "description": "Store setup screen - heading when no repo is configured" }, - "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "storeAddRepoDescription": "Введите URL-адрес репозитория GitHub, который содержит файл registry.json для просмотра и установки расширений.", "@storeAddRepoDescription": { "description": "Store setup screen - explanatory text" }, - "storeRepoUrlLabel": "Repository URL", + "storeRepoUrlLabel": "Ссылка на репозиторий", "@storeRepoUrlLabel": { "description": "Label for the repository URL input field" }, @@ -1667,7 +1667,7 @@ "@storeChangeRepoTooltip": { "description": "Tooltip for the change-repository icon button in the app bar" }, - "storeRepoDialogTitle": "Extension Repository", + "storeRepoDialogTitle": "Репозиторий расширения", "@storeRepoDialogTitle": { "description": "Title of the change/remove repository dialog" }, @@ -1675,7 +1675,7 @@ "@storeRepoDialogCurrent": { "description": "Label shown above the current repository URL in the dialog" }, - "storeNewRepoUrlLabel": "New Repository URL", + "storeNewRepoUrlLabel": "Новый URL репозитория", "@storeNewRepoUrlLabel": { "description": "Label for the new repository URL field inside the dialog" }, From 54463d37f36eaf7d95ef3c78d2de62f16c074bfe Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 30 Jul 2026 00:25:43 +0700 Subject: [PATCH 03/72] New translations app_en.arb (Russian) [ci skip] --- lib/l10n/arb/app_ru.arb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index 9de35f75..b2609379 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -3167,7 +3167,7 @@ } } }, - "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "trackConvertConfirmMessageLossless": "Конвертировать {sourceFormat} в {targetFormat}? (Lossless — Без потери качества)\n\nОригинальные файлы будут удалены после конвертации.", "@trackConvertConfirmMessageLossless": { "description": "Confirmation dialog message for lossless-to-lossless conversion", "placeholders": { @@ -3308,7 +3308,7 @@ "@collectionLoved": { "description": "Custom folder for favorite tracks" }, - "collectionFavoriteArtists": "Favorite Artists", + "collectionFavoriteArtists": "Избранный исполнитель", "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, @@ -3400,11 +3400,11 @@ "@collectionLovedEmptySubtitle": { "description": "Loved empty state subtitle" }, - "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "collectionFavoriteArtistsEmptyTitle": "Нет избранных исполнителей", "@collectionFavoriteArtistsEmptyTitle": { "description": "Favorite artists empty state title" }, - "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "collectionFavoriteArtistsEmptySubtitle": "Нажмите на сердце на странице исполнителя, чтобы сохранить его здесь", "@collectionFavoriteArtistsEmptySubtitle": { "description": "Favorite artists empty state subtitle" }, @@ -3460,7 +3460,7 @@ } } }, - "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "collectionAddedToFavoriteArtists": "\"{artistName}\" добавлен в избранные исполнители", "@collectionAddedToFavoriteArtists": { "description": "Snackbar after adding artist to favorite artists", "placeholders": { @@ -3469,7 +3469,7 @@ } } }, - "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" удалено из избранных исполнителей", "@collectionRemovedFromFavoriteArtists": { "description": "Snackbar after removing artist from favorite artists", "placeholders": { @@ -3494,11 +3494,11 @@ "@trackOptionRemoveFromWishlist": { "description": "Bottom sheet action label - remove track from wishlist" }, - "artistOptionAddToFavorites": "Add to Favorite Artists", + "artistOptionAddToFavorites": "Добавить в избранные исполнители", "@artistOptionAddToFavorites": { "description": "Action label - add artist to favorite artists" }, - "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "artistOptionRemoveFromFavorites": "Удалить из избранных исполнителей", "@artistOptionRemoveFromFavorites": { "description": "Action label - remove artist from favorite artists" }, @@ -3510,7 +3510,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "selectionShareCount": "Отправить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3523,7 +3523,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "selectionConvertCount": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3567,7 +3567,7 @@ } } }, - "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": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} в {format}?\n\nОригинальные файлы будут храниться и преобразовываться как отдельные элементы библиотеки.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3641,11 +3641,11 @@ } } }, - "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "lyricsProvidersAtLeastOne": "По крайней мере один провайдер должен оставаться включенным", "@lyricsProvidersAtLeastOne": { "description": "Snackbar when user tries to disable the last enabled provider" }, - "lyricsProvidersSaved": "Lyrics provider priority saved", + "lyricsProvidersSaved": "Приоритетный провайдер текстов песен сохранен", "@lyricsProvidersSaved": { "description": "Snackbar after saving lyrics provider priority" }, @@ -3661,7 +3661,7 @@ "@lyricsProviderNeteaseDesc": { "description": "Description for Netease provider" }, - "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "lyricsProviderMusixmatchDesc": "Крупнейшая база данных текстов песен (мультиязычная)", "@lyricsProviderMusixmatchDesc": { "description": "Description for Musixmatch provider" }, From c46cc4d68ffa3ae446314e25bd5b906e0f22bac3 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 1 Aug 2026 00:33:00 +0700 Subject: [PATCH 04/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 92cb565f..cb6d92b4 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -6003,7 +6003,7 @@ "@extensionVerificationHelpMessageManual": { "description": "Dialog message when automatic browser launch for verification fails" }, - "extensionVerificationHelpMessageWaiting": "브라우저가 열리지 않았거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아오지 않았다면, 아래 링크를 다시 열거나 직접 복사하세요", + "extensionVerificationHelpMessageWaiting": "브라우저가 열리지 않거나 인증을 완료한 후에도 SpotiFLAC Mobile로 돌아가지 않는다면, 아래 링크를 다시 열거나 직접 복사하세요", "@extensionVerificationHelpMessageWaiting": { "description": "Dialog message when verification may need manual browser help" }, From 285f31387585496038f4a691b558cc320281485f Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 1 Aug 2026 20:51:28 +0700 Subject: [PATCH 05/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index cb6d92b4..e0abdb08 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -2145,7 +2145,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", + "downloadedAlbumDeleteCount": "{count} 개의 {count, plural, =1{트랙} other{트랙}} 삭제", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -3510,7 +3510,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "{count} {count, plural, =1{트랙} other{트랙}} 공유", + "selectionShareCount": "{count} 개의 {count, plural, =1{트랙} other{트랙}} 공유", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3523,7 +3523,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "{count} {count, plural, =1{트랙} other{트랙}} 변환", + "selectionConvertCount": "{count} 개의 {count, plural, =1{트랙} other{트랙}} 변환", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -5249,7 +5249,7 @@ } } }, - "selectionDeleteTracksCount": "{count} {count, plural, =1{트랙} other{트랙}} 삭제", + "selectionDeleteTracksCount": "{count} 개의 {count, plural, =1{트랙} other{트랙}} 삭제", "@selectionDeleteTracksCount": { "description": "Button label for deleting selected tracks", "placeholders": { From 23255b641898431fcbff01fb48f03b147167d1a0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:48 +0700 Subject: [PATCH 06/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index e0abdb08..5398a581 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "CSV 파일에서 {count} 개의 트랙을 찾았습니다. 다운로드 목록에 추가하시겠습니까?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "CSV 파일의 트랙: {count}", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "모두 지우기", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "SpotiFLAC에 오신 것을 환영합니다!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Spotify, Deezer 또는 지원되는 URL에서 음악을 다운로드할 수 있습니다", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "온라인 메타데이터에서 자동으로 채워질 필드를 선택하세요", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "가져오기 & 채우기", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "다운로드 기록이 없음", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "채널별 통계", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "FFmpeg를 통해 메타데이터 저장 실패", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "CSV 가져오기", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "검색 제공자 변경", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "중지", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "다운로드된 파일이 없음", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "선택된 음질을 파일 이름에 추가하고, 각 버전을 다운로드 기록에 유지합니다", + "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "레이블 누락", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "베타", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "서비스 상태", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "브라우저 열기", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From c394443d934675d2eb8e702d555db5f1742b6e5f Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:49 +0700 Subject: [PATCH 07/72] New translations app_en.arb (Portuguese) [ci skip] --- lib/l10n/arb/app_pt_PT.arb | 271 +++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index d486bf51..61b54058 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "{count} Faixas encontradas em CSV. Adicioná-las à lista de downloads?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} faixas do CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Limpar Tudo", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Fetch & Fill", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "No download history", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 30dd4d1317a34257d8aa8b19180cf68f482b9abb Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:51 +0700 Subject: [PATCH 08/72] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 6f583e89..8257db4d 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Ditemukan {count} lagu di CSV. Tambahkan ke antrian unduhan?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} trek dari CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Hapus Semua", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Selamat Datang di SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Unduh musik dari Spotify, Deezer, atau tempel URL yang didukung", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Fetch & Fill", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "No download history", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 965b897b5794c359b864bbe648f437fd9f980d05 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:53 +0700 Subject: [PATCH 09/72] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 86f92e0a..62023f3d 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "{count} pistes ont été trouvées dans le fichier CSV. Voulez-vous les ajouter à la file d'attente de téléchargement ?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} pistes issues d'un fichier CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Tout effacer", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Bienvenue sur SpotiFLAC !", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Téléchargez de la musique depuis Spotify ou Deezer, ou collez n'importe quelle URL prise en charge", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Sélectionnez les champs à remplir automatiquement à partir des métadonnées en ligne", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Récupérer & remplir", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "Aucun historique de téléchargement", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Statistiques par chaîne", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Échec de l'enregistrement des métadonnées via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Importer un fichier CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Changer de moteur de recherche", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Arrêter", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Fichier téléchargé manquant", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Ajouter la qualité sélectionnée au nom du fichier et conserver chaque version dans l'historique des téléchargements", + "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Label manquant", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BÊTA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "État du service", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Ouvrir le navigateur", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From f26a285e23d50aef5feadef6651426d4c45abf34 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:54 +0700 Subject: [PATCH 10/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 271 +++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index c2d67a7a..3d48e892 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Se han encontrado pistas {count} en CSV. ¿Añadirlas para descargar la cola?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} pistas de CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Eliminar todo", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "¡Bienvenido a SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Descarga música de Spotify, Deezer, o pega cualquier URL soportada", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Selecciona los campos para rellenar automáticamente con metadatos en línea", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Recuperar y llenar", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "No hay historial de descargas", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Importar CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Detener", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Falta etiqueta", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Estado del servicio", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 6bfa1cb0d0e36d352c50918fe9b14f16abbfdf1e Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:56 +0700 Subject: [PATCH 11/72] New translations app_en.arb (Arabic) [ci skip] --- lib/l10n/arb/app_ar-SA.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_ar-SA.arb diff --git a/lib/l10n/arb/app_ar-SA.arb b/lib/l10n/arb/app_ar-SA.arb new file mode 100644 index 00000000..8c4bf31a --- /dev/null +++ b/lib/l10n/arb/app_ar-SA.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "ar", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "الرئيسية", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "المكتبة", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "الإعدادات", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "المستودع", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "الصفحة الرئيسية", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "ألصق عنوان URL مدعوم أو ابحث بالاسم", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "لا يوجد مزودي بحث بعد", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "قم بتثبيت مكون إضافي للمتابعة.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "يدعم: الأغنية، الألبوم، قائمة التشغيل، عناوين URL للفنان", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "الأخيرة", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "historyFilterAll": "الكل", + "@historyFilterAll": { + "description": "Filter chip - show all items" + }, + "historyFilterAlbums": "الألبومات", + "@historyFilterAlbums": { + "description": "Filter chip - show albums only" + }, + "historyFilterSingles": "الأغاني", + "@historyFilterSingles": { + "description": "Filter chip - show singles only" + }, + "historySearchHint": "سجل البحث...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "الإعدادات", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "إعدادات التحميل", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "المظهر", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "الإضافات", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "حول البرنامج", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "إعدادات التحميل", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "إظهار منتقي الجودة لكل تنزيل", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "تنسيق اسم الملف", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "تنسيق اسم الملف الفردي", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "نمط اسم الملف للعازفين و EPs. يستخدم نفس العلامات مثل تنسيق الألبوم.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "تنظيم المجلدات", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "المظهر", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "appearanceThemeSystem": "النظام", + "@appearanceThemeSystem": { + "description": "Follow system theme" + }, + "appearanceThemeLight": "فاتح", + "@appearanceThemeLight": { + "description": "Light theme" + }, + "appearanceThemeDark": "مظلم", + "@appearanceThemeDark": { + "description": "Dark theme" + }, + "appearanceDynamicColor": "لون ديناميكي", + "@appearanceDynamicColor": { + "description": "Material You dynamic colors" + }, + "appearanceDynamicColorSubtitle": "استخدام الألوان من الخلفية", + "@appearanceDynamicColorSubtitle": { + "description": "Subtitle for dynamic color" + }, + "appearanceHistoryView": "عرض السجل", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "قائمة", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "شبكة", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "المزود الرئيسي", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "الخدمة المستخدمة للبحث عن طريق اسم الأغنية أو الألبوم", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "استخدام الإضافة: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "تبويب البحث الافتراضي", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "اختر علامة التبويب التي تفتح أولاً لنتائج البحث الجديدة.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "التراجع التلقائي", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "تجربة خدمات أخرى إذا فشل التنزيل", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "تضمين كلمات الأغنية", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "حفظ كلمات الأغاني المتزامنة جنبا إلى جنب مع المسارات التي تم تنزيلها", + "@optionsEmbedLyricsSubtitle": { + "description": "Subtitle for embed lyrics" + }, + "optionsMaxQualityCover": "اختيار أعلى جودة للغلاف", + "@optionsMaxQualityCover": { + "description": "Download highest quality album art" + }, + "optionsMaxQualityCoverSubtitle": "تنزيل أعلى دقة لغلاف الأغنية", + "@optionsMaxQualityCoverSubtitle": { + "description": "Subtitle for max quality cover" + }, + "optionsReplayGain": "ReplyGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "مسح الصوت و تضمين علامات ReplayGain (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "معطل: لا توجد علامات تطبيع للصوت", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "إعادة مسح ReplyGain", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "تحليل الصوت...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "تم إضافة وسم ReplyGain", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "فشل في إضافة علامات ReplayGain", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ٌReplyGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "إضافة ReplyGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "تحليل الصوت وكتابة وسوم ReplayGain إلى مسار(مسارات) {count}؟", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "تحليل ReplyGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "تمت إضافة وسوم ReplyGain ل {success} أغنية من أصل {total}", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "وضع وسم الفنان", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "اختر كيف يتم كتابة العديد من الفنانين في العلامات المضمنة.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "قيمة مشتركة واحدة", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "اكتب قيمة ARTIST واحدة مثل \"الفنان A، الفنان B\" لتحقيق التوافق الأقصى لمشغل الأغاني.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "تقسيم العلامات على FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "اكتب علامة فنان لكل فنان لـ FLAC و Opus؛ تبقى MP3 و M4A منضمة.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "مستودع الإضافات", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "إظهار صفحة المستودع في شريط التنقل", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo toggle" + }, + "optionsCheckUpdates": "التحقق من وجود تحديثات", + "@optionsCheckUpdates": { + "description": "Auto update check toggle" + }, + "optionsCheckUpdatesSubtitle": "إعلام عند توفر إصدار جديد", + "@optionsCheckUpdatesSubtitle": { + "description": "Subtitle for update check" + }, + "optionsUpdateChannel": "قناة التحديث", + "@optionsUpdateChannel": { + "description": "Stable vs preview releases" + }, + "optionsUpdateChannelStable": "الإصدارات المستقرة فقط", + "@optionsUpdateChannelStable": { + "description": "Only stable updates" + }, + "optionsUpdateChannelPreview": "الحصول على إصدارات تجريبية", + "@optionsUpdateChannelPreview": { + "description": "Include beta/preview updates" + }, + "optionsUpdateChannelWarning": "قد تحتوي الإصدارات التجريبية أخطاءً أو ميزات غير مكتملة", + "@optionsUpdateChannelWarning": { + "description": "Warning about preview channel" + }, + "optionsClearHistory": "مسح سجل التحميلات", + "@optionsClearHistory": { + "description": "Delete all download history" + }, + "optionsClearHistorySubtitle": "إزالة جميع الأغاني التي تم تنزيلها من السجل", + "@optionsClearHistorySubtitle": { + "description": "Subtitle for clear history" + }, + "optionsDetailedLogging": "تسجيل تفصيلي", + "@optionsDetailedLogging": { + "description": "Enable verbose logs for debugging" + }, + "optionsDetailedLoggingOn": "يتم تسجيل السجلات التفصيلية", + "@optionsDetailedLoggingOn": { + "description": "Status when logging enabled" + }, + "optionsDetailedLoggingOff": "تمكين لتقارير الأخطاء", + "@optionsDetailedLoggingOff": { + "description": "Status when logging disabled" + }, + "extensionsTitle": "الإضافات", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "معطَّل", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "الإصدار {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "إلغاء التثبيت", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "مستودع الإضافات", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "البحث في الإضافات...", + "@storeSearch": { + "description": "Repo search placeholder" + }, + "storeInstall": "تثبيت", + "@storeInstall": { + "description": "Install extension button" + }, + "storeInstalled": "مثبت", + "@storeInstalled": { + "description": "Already installed badge" + }, + "storeUpdate": "تحديث", + "@storeUpdate": { + "description": "Update available button" + }, + "aboutTitle": "حول", + "@aboutTitle": { + "description": "About page title" + }, + "aboutContributors": "المساهمون", + "@aboutContributors": { + "description": "Section for contributors" + }, + "aboutMobileDeveloper": "مطور نسخة الهاتف", + "@aboutMobileDeveloper": { + "description": "Role description for mobile dev" + }, + "aboutOriginalCreator": "منشئ SpotiFLAC", + "@aboutOriginalCreator": { + "description": "Role description for original creator" + }, + "aboutLogoArtist": "الفنان الموهوب الذي أنشأ شعار التطبيق الجميل!", + "@aboutLogoArtist": { + "description": "Role description for logo artist" + }, + "aboutTranslators": "المترجمون", + "@aboutTranslators": { + "description": "Section for translators" + }, + "aboutSpecialThanks": "شكر خاص لِ", + "@aboutSpecialThanks": { + "description": "Section for special thanks" + }, + "aboutLinks": "روابط", + "@aboutLinks": { + "description": "Section for external links" + }, + "aboutMobileSource": "كود مصدر برنامج الهاتف", + "@aboutMobileSource": { + "description": "Link to mobile GitHub repo" + }, + "aboutPCSource": "كود مصدر برنامج الكمبيوتر", + "@aboutPCSource": { + "description": "Link to PC GitHub repo" + }, + "aboutKeepAndroidOpen": "ابقي اندرويد مفتوحا", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "aboutReportIssue": "الإبلاغ عن خطأ", + "@aboutReportIssue": { + "description": "Link to report bugs" + }, + "aboutReportIssueSubtitle": "الإبلاغ عن أي مشكلة تواجهك", + "@aboutReportIssueSubtitle": { + "description": "Subtitle for report issue" + }, + "aboutFeatureRequest": "اقتراح ميزة", + "@aboutFeatureRequest": { + "description": "Link to suggest features" + }, + "aboutFeatureRequestSubtitle": "اقتراح ميزات جديدة للتطبيق", + "@aboutFeatureRequestSubtitle": { + "description": "Subtitle for feature request" + }, + "aboutTelegramChannel": "قناة تيليجرام", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "الإعلانات والتحديثات", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "مجتمع تليجرام", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "الدردشة مع المستخدمين الآخرين", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "التواصل الإجتماعي", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "التطبيق", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "الإصدار", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "منشئ API QQDL و HiFi. ساعد هذا المشروع في تشكيل دعم تحميل غير فاقد للجودة.", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "منشئ مشروع HiFi الأصلي. مؤسسة للتكامل بدون مصدر.", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "منشئ ل I Don't Have Spotify (IHDS). محلل الروابط الذي ينقذ اليوم!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "البحث عن بيانات التعريف الموسيقي، وإدارة الملحقات، وتنظيم مكتبتك.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "artistAlbums": "الألبومات", + "@artistAlbums": { + "description": "Section header for artist albums" + }, + "artistSingles": "الأغاني و ال EPs", + "@artistSingles": { + "description": "Section header for singles/EPs" + }, + "artistCompilations": "التجميع", + "@artistCompilations": { + "description": "Section header for compilations" + }, + "artistPopular": "الأكثر شعبية", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} مستمع شهري", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "trackMetadataService": "الخدمة", + "@trackMetadataService": { + "description": "Metadata field - download service used" + }, + "trackMetadataPlay": "تشغيل", + "@trackMetadataPlay": { + "description": "Action button - play track" + }, + "trackMetadataShare": "مشاركة", + "@trackMetadataShare": { + "description": "Action button - share track" + }, + "trackMetadataDelete": "حذف", + "@trackMetadataDelete": { + "description": "Action button - delete track" + }, + "setupGrantPermission": "منح الصلاحيات", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "التخطي الآن", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "إذن دخول وحدة التخزين مطلوب", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "setupStorageAccessMessageAndroid11": "يتطلب أندرويد 11+ إذن \"الوصول إلى جميع الملفات\" لحفظ الملفات في مجلد التحميل الذي اخترته.", + "@setupStorageAccessMessageAndroid11": { + "description": "Android 11+ specific explanation" + }, + "setupOpenSettings": "فتح الإعدادات", + "@setupOpenSettings": { + "description": "Button to open system settings" + }, + "setupPermissionDeniedMessage": "تم رفض الإذن. الرجاء منح كافة الصلاحيات للمتابعة.", + "@setupPermissionDeniedMessage": { + "description": "Error when permission denied" + }, + "setupPermissionRequired": "{permissionType} مطلوب الإذن", + "@setupPermissionRequired": { + "description": "Generic permission required title", + "placeholders": { + "permissionType": { + "type": "String", + "description": "Type of permission (Storage/Notification)" + } + } + }, + "setupPermissionRequiredMessage": "الإذن {permissionType} مطلوب لأفضل التجربة. يمكنك تغيير هذا لاحقاً في الإعدادات.", + "@setupPermissionRequiredMessage": { + "description": "Generic permission required message", + "placeholders": { + "permissionType": { + "type": "String" + } + } + }, + "setupUseDefaultFolder": "استخدام المجلد الافتراضي؟", + "@setupUseDefaultFolder": { + "description": "Dialog title for default folder" + }, + "setupNoFolderSelected": "لم يتم تحديد مجلد. هل ترغب في استخدام مجلد الموسيقى الافتراضي؟", + "@setupNoFolderSelected": { + "description": "Prompt when no folder selected" + }, + "setupUseDefault": "استخدم الافتراضي", + "@setupUseDefault": { + "description": "Button to use default folder" + }, + "setupDownloadLocationTitle": "موقع حفظ التنزيلات", + "@setupDownloadLocationTitle": { + "description": "Download location dialog title" + }, + "setupDownloadLocationIosMessage": "على iOS، يتم حفظ التحميلات إلى مجلد مستندات التطبيق. يمكنك الوصول إليها عبر تطبيق الملفات.", + "@setupDownloadLocationIosMessage": { + "description": "iOS-specific folder info" + }, + "setupAppDocumentsFolder": "مجلد مستندات التطبيق", + "@setupAppDocumentsFolder": { + "description": "iOS documents folder option" + }, + "setupAppDocumentsFolderSubtitle": "موصى به - يمكن الوصول إليه عبر تطبيق الملفات", + "@setupAppDocumentsFolderSubtitle": { + "description": "Subtitle for documents folder" + }, + "setupChooseFromFiles": "اختر من الملفات", + "@setupChooseFromFiles": { + "description": "iOS file picker option" + }, + "setupChooseFromFilesSubtitle": "حدد iCloud أو موقع آخر", + "@setupChooseFromFilesSubtitle": { + "description": "Subtitle for file picker" + }, + "setupIosEmptyFolderWarning": "حدود iOS: لا يمكن تحديد مجلدات فارغة. اختر مجلدا مع ملف واحد على الأقل.", + "@setupIosEmptyFolderWarning": { + "description": "iOS folder selection warning" + }, + "setupIcloudNotSupported": "iCloud Drive غير مدعوم. الرجاء استخدام مجلد مستندات التطبيق.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "تحميل اغاني Spotify بصيغة FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "setupStorageGranted": "تم منح إذن التخزين!", + "@setupStorageGranted": { + "description": "Success message for storage permission" + }, + "setupStorageRequired": "الإذن مطلوب للتخزين", + "@setupStorageRequired": { + "description": "Title when storage permission needed" + }, + "setupStorageDescription": "SpotiFLAC يحتاج إلى إذن تخزين لحفظ ملفات الموسيقى الخاصة بك التي تم تنزيلها.", + "@setupStorageDescription": { + "description": "Explanation for storage permission" + }, + "setupNotificationGranted": "تم منح إذن الإشعارات!", + "@setupNotificationGranted": { + "description": "Success message for notification permission" + }, + "setupNotificationEnable": "تمكين الإشعارات", + "@setupNotificationEnable": { + "description": "Button to enable notifications" + }, + "setupFolderChoose": "اختر مجلد التحميل", + "@setupFolderChoose": { + "description": "Button to choose folder" + }, + "setupFolderDescription": "حدد مجلد حيث سيتم حفظ الموسيقى التي تم تنزيلها.", + "@setupFolderDescription": { + "description": "Explanation for folder selection" + }, + "setupSelectFolder": "حدد الملف", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "تمكين الإشعارات", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "setupNotificationBackgroundDescription": "الحصول على إشعار حول تقدم التحميل وإكماله. هذا يساعدك على تتبع التنزيلات عندما يكون التطبيق في الخلفية.", + "@setupNotificationBackgroundDescription": { + "description": "Detailed notification explanation" + }, + "setupSkipForNow": "التخطي الآن", + "@setupSkipForNow": { + "description": "Skip button text" + }, + "setupNext": "التالي", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "إبدأ الآن", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "الرجاء تمكين \"السماح بالوصول لإدارة جميع الملفات\" في الشاشة التالية.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "اِختر اللغة", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "حدد لغتك المفضلة للتطبيق. يمكنك تغيير هذا لاحقًا من الإعدادات.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "الوضع الافتراضي للنظام", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "إلغاء", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "حفظ", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "حذف", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "إعادة المحاولة", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "محو", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "تم", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "استيراد", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "تنزيل", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "تشغيل المعاينة", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "إيقاف المعاينة", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "المعاينة غير متوفرة", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "dialogDiscard": "تجاهل", + "@dialogDiscard": { + "description": "Dialog button - discard changes" + }, + "dialogRemove": "إزالة", + "@dialogRemove": { + "description": "Dialog button - remove item" + }, + "dialogUninstall": "إلغاء التثبيت", + "@dialogUninstall": { + "description": "Dialog button - uninstall extension" + }, + "dialogDiscardChanges": "تجاهل التغييرات؟", + "@dialogDiscardChanges": { + "description": "Dialog title - unsaved changes warning" + }, + "dialogUnsavedChanges": "لديك تغييرات غير محفوظة. هل تريد المتابعة دون حفظها؟", + "@dialogUnsavedChanges": { + "description": "Dialog message - unsaved changes" + }, + "dialogClearAll": "مسح الكل", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "dialogRemoveExtension": "إزالة إضافة", + "@dialogRemoveExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogRemoveExtensionMessage": "هل أنت متأكد من أنك تريد إزالة هذه الإضافة؟ لا يمكن التراجع عن ذلك.", + "@dialogRemoveExtensionMessage": { + "description": "Dialog message - uninstall confirmation" + }, + "dialogUninstallExtension": "إلغاء تثبيت الإضافة؟", + "@dialogUninstallExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogUninstallExtensionMessage": "هل أنت متأكد من أنك تريد إزالة {extensionName}؟", + "@dialogUninstallExtensionMessage": { + "description": "Dialog message - uninstall specific extension", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "dialogClearHistoryTitle": "مسح السجل", + "@dialogClearHistoryTitle": { + "description": "Dialog title - clear download history" + }, + "dialogClearHistoryMessage": "هل أنت متأكد من أنك تريد مسح كل سجل التنزيلات؟ لا يمكن التراجع عن هذا.", + "@dialogClearHistoryMessage": { + "description": "Dialog message - clear history confirmation" + }, + "dialogDeleteSelectedTitle": "حذف المحدد", + "@dialogDeleteSelectedTitle": { + "description": "Dialog title - delete selected items" + }, + "dialogDeleteSelectedMessage": "حذف {count} {count, plural, zero {} one {المسارات} two {أغنيتين} few {أغانٍ} many {أغنية}=1{أغنية} other{الأغاني}} من التاريخ؟\n\nسيؤدي هذا أيضا إلى حذف الملفات من وحدة التخزين.", + "@dialogDeleteSelectedMessage": { + "description": "Dialog message - delete selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogImportPlaylistTitle": "استيراد قائمة تشغيل", + "@dialogImportPlaylistTitle": { + "description": "Dialog title - import CSV playlist" + }, + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "csvImportTracks": "{count} مسارات من CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedToQueue": "تمت إضافة {trackName} إلى قائمة الانتظار", + "@snackbarAddedToQueue": { + "description": "Snackbar - track added to download queue", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAddedTracksToQueue": "تم إضافة {count} أغانٍ إلى قائمة الانتظار", + "@snackbarAddedTracksToQueue": { + "description": "Snackbar - multiple tracks added to queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAlreadyDownloaded": "تم تنزيل {trackName} بالفعل", + "@snackbarAlreadyDownloaded": { + "description": "Snackbar - track already exists", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAlreadyInLibrary": "{trackName} موجود بالفعل في مكتبتك", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "تم مسح السجل.", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "snackbarDeletedTracks": "تم حذف {count} {count, plural, zero {} one {أغنيتين} two {أغنيتين} few {أغانٍ} many {أغنية}=1{أغنية} other{أغانٍ}}", + "@snackbarDeletedTracks": { + "description": "Snackbar - tracks deleted", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarCannotOpenFile": "تعذر فتح الملف: {error}", + "@snackbarCannotOpenFile": { + "description": "Snackbar - file open error", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarViewQueue": "عرض قائمة الانتظار", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "رابط {platform} تم نسخه إلى الحافظة", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "platform": { + "type": "String", + "description": "Platform name (Spotify/Deezer)" + } + } + }, + "snackbarFileNotFound": "لم يتم العثور على الملف", + "@snackbarFileNotFound": { + "description": "Snackbar - file doesn't exist" + }, + "snackbarSelectExtFile": "الرجاء تحديد ملف .spotiflac-ext", + "@snackbarSelectExtFile": { + "description": "Snackbar - wrong file type selected" + }, + "snackbarProviderPrioritySaved": "تم حفظ أولوية المزود", + "@snackbarProviderPrioritySaved": { + "description": "Snackbar - provider order saved" + }, + "snackbarMetadataProviderSaved": "تم حفظ أولوية مزود البيانات الوصفية (metadata)", + "@snackbarMetadataProviderSaved": { + "description": "Snackbar - metadata provider order saved" + }, + "snackbarExtensionInstalled": "تم تثبيت {extensionName}.", + "@snackbarExtensionInstalled": { + "description": "Snackbar - extension installed successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdated": "تم تحديث {extensionName}.", + "@snackbarExtensionUpdated": { + "description": "Snackbar - extension updated successfully", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToInstall": "فشل تثبيت الإضافة", + "@snackbarFailedToInstall": { + "description": "Snackbar - extension install error" + }, + "snackbarFailedToUpdate": "فشل تحديث الإضافة", + "@snackbarFailedToUpdate": { + "description": "Snackbar - extension update error" + }, + "errorRateLimited": "تم الوصول للحد الأقصى", + "@errorRateLimited": { + "description": "Error title - too many requests" + }, + "errorRateLimitedMessage": "طلبات كثيرة جداً. الرجاء الانتظار قليلاً قبل البحث مرة أخرى.", + "@errorRateLimitedMessage": { + "description": "Error message - rate limit explanation" + }, + "errorNoTracksFound": "لم يتم العثور على الأغنية", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "جرّب كلمة مفتاحية أخرى", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "رابط غير معروف", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "هذا الرابط غير مدعوم. تأكد من أن الرابط صحيح وتثبيت إضافة متوافق.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "فشل تحميل المحتوى من هذا الرابط. الرجاء المحاولة مرة أخرى.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "لا يمكن تحميل {item}: مصدر الإضافة مفقود", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "إيقاف مؤقت", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "استئناف", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "إلغاء", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "تحديد الكل", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "إلغاء التحديد", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "تم تحديد {count}", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "تم اختيار جميع الأغاني", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "حدد الأغاني المراد حذفها", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "جلب البيانات الوصفية (metadata)... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "جاري قراءة CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "searchSongs": "أغاني", + "@searchSongs": { + "description": "Search result category - songs" + }, + "searchArtists": "فنانون", + "@searchArtists": { + "description": "Search result category - artists" + }, + "searchAlbums": "ألبومات", + "@searchAlbums": { + "description": "Search result category - albums" + }, + "searchPlaylists": "قوائم التشغيل", + "@searchPlaylists": { + "description": "Search result category - playlists" + }, + "searchSortTitle": "فرز النتائج", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "افتراضي", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "العنوان (أ-ي)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "العنوان (ي-أ)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "الفنان (أ-ي)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "الفنان (ي-أ)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "المدة (الأقصر)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "المدة (الأطول)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "تاريخ الإصدار (الأقدم)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "تاريخ الإصدار (الأحدث)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "تشغيل", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "صيغة الملف", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "إظهار العلامات المتقدمة", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "تمكين العلامات المنسقة لحشو المقطع الصوتي وأنماط التاريخ", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "لا توجد منظمة", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "حسب قائمة التشغيل", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "مجلد منفصل لكل قائمة تشغيل", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "folderOrganizationByArtist": "حسب الفنان", + "@folderOrganizationByArtist": { + "description": "Folder option - artist folders" + }, + "folderOrganizationByAlbum": "حسب الألبوم", + "@folderOrganizationByAlbum": { + "description": "Folder option - album folders" + }, + "folderOrganizationByArtistAlbum": "ألبوم/الفنان", + "@folderOrganizationByArtistAlbum": { + "description": "Folder option - nested folders" + }, + "folderOrganizationDescription": "تنظيم الملفات التي تم تنزيلها في المجلدات", + "@folderOrganizationDescription": { + "description": "Folder organization sheet description" + }, + "folderOrganizationNoneSubtitle": "جميع الملفات في مجلد التحميل", + "@folderOrganizationNoneSubtitle": { + "description": "Subtitle for no organization option" + }, + "folderOrganizationByArtistSubtitle": "مجلد منفصل لكل فنان", + "@folderOrganizationByArtistSubtitle": { + "description": "Subtitle for artist folder option" + }, + "folderOrganizationByAlbumSubtitle": "مجلد منفصل لكل قائمة تشغيل", + "@folderOrganizationByAlbumSubtitle": { + "description": "Subtitle for album folder option" + }, + "folderOrganizationByArtistAlbumSubtitle": "مجلدات متداخلة للفنان و الألبوم", + "@folderOrganizationByArtistAlbumSubtitle": { + "description": "Subtitle for nested folder option" + }, + "updateAvailable": "هناك تحديث متاح", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "ذكرني لاحقا", + "@updateLater": { + "description": "Update button - dismiss" + }, + "updateStartingDownload": "جاري بدء التنزيل...", + "@updateStartingDownload": { + "description": "Update status - initializing" + }, + "updateDownloadFailed": "فشل التنزيل", + "@updateDownloadFailed": { + "description": "Update error title" + }, + "updateFailedMessage": "فشل تنزيل التحديث", + "@updateFailedMessage": { + "description": "Update error message" + }, + "updateNewVersionReady": "إصدار جديد جاهز", + "@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": "الحالي", + "@updateCurrent": { + "description": "Label for current version" + }, + "updateNew": "جديد", + "@updateNew": { + "description": "Label for new version" + }, + "updateDownloading": "جاري التنزيل...", + "@updateDownloading": { + "description": "Update status - downloading" + }, + "updateWhatsNew": "ما الجديد", + "@updateWhatsNew": { + "description": "Changelog section title" + }, + "updateDownloadInstall": "تحميل وتثبيت", + "@updateDownloadInstall": { + "description": "Update button - download and install" + }, + "updateDontRemind": "لا تذكّرني", + "@updateDontRemind": { + "description": "Update button - skip this version" + }, + "providerPriorityTitle": "أولوية مقدم الخدمة", + "@providerPriorityTitle": { + "description": "Provider priority page title" + }, + "providerPriorityDescription": "اسحب لإعادة ترتيب مزودي التحميل. سيجرب التطبيق مزودي الخدمات من الأعلى إلى الأسفل عند تحميل المسار.", + "@providerPriorityDescription": { + "description": "Provider priority page description" + }, + "providerPriorityInfo": "إذا كانت الأغنية غير متوفرة عند أول مزود، فإن التطبيق سيجرب تلقائياً المزود التالي.", + "@providerPriorityInfo": { + "description": "Info tip about fallback behavior" + }, + "providerPriorityFallbackExtensionsDescription": "اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "الإضافات المفعلة فقط مع قدرة توفير التنزيل مدرجة هنا.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "الإضافة", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "metadataProviderPriorityTitle": "أولوية البيانات الوصفية (metadata)", + "@metadataProviderPriorityTitle": { + "description": "Metadata priority page title" + }, + "metadataProviderPriorityDescription": "اسحب لإعادة ترتيب موفري البيانات الوصفية (metadata). سيحاول التطبيق موفري البيانات الوصفية (metadata) من الأعلى إلى الأسفل عند البحث عن المسارات وجلب البيانات الوصفية (metadata).", + "@metadataProviderPriorityDescription": { + "description": "Metadata priority page description" + }, + "metadataProviderPriorityInfo": "Deezer ليس لديه حدود للطلبات ومُوصى به كأساسي. Spotify لديه حد للطلبات وقد لا يعمل بعد عدة عمليات.", + "@metadataProviderPriorityInfo": { + "description": "Info tip about rate limits" + }, + "logTitle": "السجلات", + "@logTitle": { + "description": "Logs screen title" + }, + "logCopied": "تم نسخ السجلات إلى الحافظة", + "@logCopied": { + "description": "Snackbar - logs copied" + }, + "logSearchHint": "البحث في السجلات...", + "@logSearchHint": { + "description": "Log search placeholder" + }, + "logFilterLevel": "المستوى", + "@logFilterLevel": { + "description": "Filter by log level" + }, + "logFilterSection": "فرز", + "@logFilterSection": { + "description": "Filter section title" + }, + "logShareLogs": "مشاركة السجلات", + "@logShareLogs": { + "description": "Share button tooltip" + }, + "logClearLogs": "حذف السجل", + "@logClearLogs": { + "description": "Clear button tooltip" + }, + "logClearLogsTitle": "حذف السجل", + "@logClearLogsTitle": { + "description": "Clear logs dialog title" + }, + "logClearLogsMessage": "هل أنت متأكد من رغبتك في مسح جميع السجلات؟", + "@logClearLogsMessage": { + "description": "Clear logs confirmation message" + }, + "logFilterBySeverity": "تصفية السجلات حسب الخطورة", + "@logFilterBySeverity": { + "description": "Filter dialog title" + }, + "logNoLogsYet": "لا توجد سجلات بعد", + "@logNoLogsYet": { + "description": "Empty state title" + }, + "logNoLogsYetSubtitle": "ستظهر السجلات هنا عند استخدام التطبيق", + "@logNoLogsYetSubtitle": { + "description": "Empty state subtitle" + }, + "logEntriesFiltered": "الإدخالات ({count} تم تصفيتها)", + "@logEntriesFiltered": { + "description": "Log count with filter active", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logEntries": "الإدخالات ({count})", + "@logEntries": { + "description": "Total log count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "channelStable": "مستقر", + "@channelStable": { + "description": "Update channel - stable releases" + }, + "channelPreview": "تجريبي", + "@channelPreview": { + "description": "Update channel - beta/preview releases" + }, + "sectionSearchSource": "مصدر البحث", + "@sectionSearchSource": { + "description": "Settings section header" + }, + "sectionDownload": "التحميل", + "@sectionDownload": { + "description": "Settings section header" + }, + "sectionPerformance": "الأداء", + "@sectionPerformance": { + "description": "Settings section header" + }, + "sectionApp": "التطبيق", + "@sectionApp": { + "description": "Settings section header" + }, + "sectionData": "البيانات", + "@sectionData": { + "description": "Settings section header" + }, + "sectionDebug": "تصحيح الأخطاء", + "@sectionDebug": { + "description": "Settings section header" + }, + "sectionService": "الخدمة", + "@sectionService": { + "description": "Settings section header" + }, + "sectionAudioQuality": "جودة الصوت", + "@sectionAudioQuality": { + "description": "Settings section header" + }, + "sectionFileSettings": "إعدادات الملف", + "@sectionFileSettings": { + "description": "Settings section header" + }, + "sectionLyrics": "كلمات الاغنية", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "وضع كلمات الأغنية", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "اختر كيفية حفظ كلمات الأغاني مع التنزيلات الخاصة بك", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "تضمين في الملف", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "كلمات الأغاني مخزنة داخل بيانات تعريف FLAC", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "ملف .lrc منفصل", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "فصل ملف .lrc لمشغلي الأغاني مثل Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "كلاهما", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "تضمين وحفظ ملف .lrc", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "اللون", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "الثيم", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "التخطيط", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "اللّغة", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "لغة التطبيق", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "السمة والألوان والعرض", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "الخدمة والجودة الأحتياطات", + "@settingsDownloadSubtitle": { + "description": "Download settings description" + }, + "settingsExtensionsSubtitle": "إدارة موفري التحميل", + "@settingsExtensionsSubtitle": { + "description": "Extensions settings description" + }, + "settingsLogsSubtitle": "عرض سجلات التطبيقات لتصحيح الأخطاء", + "@settingsLogsSubtitle": { + "description": "Logs settings description" + }, + "loadingSharedLink": "تحميل الرابط المشترك...", + "@loadingSharedLink": { + "description": "Status when opening shared URL" + }, + "pressBackAgainToExit": "اضغط رجوع مجددًا للخروج", + "@pressBackAgainToExit": { + "description": "Exit confirmation message" + }, + "downloadAllCount": "تنزيل الكل ({count})", + "@downloadAllCount": { + "description": "Download all button with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tracksCount": "{count, plural, zero {لا توجد أغاني محددة} one {{count} مسارات} two {أغنيتين} few {{count} أغانٍ} many {{count} أغانٍ}=1{أغنية واحدة} other{{count} أغانٍ}}", + "@tracksCount": { + "description": "Track count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackCopyFilePath": "نسخ مسار الملف", + "@trackCopyFilePath": { + "description": "Action - copy file path" + }, + "trackRemoveFromDevice": "حذف من الجهاز", + "@trackRemoveFromDevice": { + "description": "Action - delete downloaded file" + }, + "trackLoadLyrics": "تحميل كلمات الأغاني", + "@trackLoadLyrics": { + "description": "Action - fetch lyrics" + }, + "trackMetadata": "البيانات الوصفية (Metadata)", + "@trackMetadata": { + "description": "Tab title - track metadata" + }, + "trackFileInfo": "معلومات الملف", + "@trackFileInfo": { + "description": "Tab title - file information" + }, + "trackLyrics": "كلمات الاغنية", + "@trackLyrics": { + "description": "Tab title - lyrics" + }, + "trackFileNotFound": "لم يتم العثور على الملف", + "@trackFileNotFound": { + "description": "Error - file doesn't exist" + }, + "trackOpenInDeezer": "فتح في Deezer", + "@trackOpenInDeezer": { + "description": "Action - open track in Deezer app" + }, + "trackOpenInSpotify": "فتح في Spotify", + "@trackOpenInSpotify": { + "description": "Action - open track in Spotify app" + }, + "trackTrackName": "اسم الأغنية", + "@trackTrackName": { + "description": "Metadata label - track title" + }, + "trackArtist": "الفنان", + "@trackArtist": { + "description": "Metadata label - artist name" + }, + "trackAlbumArtist": "فنان الألبوم", + "@trackAlbumArtist": { + "description": "Metadata label - album artist" + }, + "trackAlbum": "الألبوم", + "@trackAlbum": { + "description": "Metadata label - album name" + }, + "trackTrackNumber": "رقم الأغنية", + "@trackTrackNumber": { + "description": "Metadata label - track number" + }, + "trackDiscNumber": "رقم القرص", + "@trackDiscNumber": { + "description": "Metadata label - disc number" + }, + "trackDuration": "المدة", + "@trackDuration": { + "description": "Metadata label - track length" + }, + "trackAudioQuality": "جودة الصوت", + "@trackAudioQuality": { + "description": "Metadata label - audio quality" + }, + "trackReleaseDate": "تاريخ الإصدار", + "@trackReleaseDate": { + "description": "Metadata label - release date" + }, + "trackGenre": "النوع", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "تصنيف", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "حقوق الطبع و النشر", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "تم التنزيل", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "نسخ كلمات الأغنية", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "المصدر: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "كلمات الأغنية غير متوفرة لهذه الأغنية", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "لم يتم العثور على كلمات الأغاني في هذا الملف", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "جلب من الإنترنت", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "trackLyricsTimeout": "انتهت مهلة الطلب. حاول مرة أخرى لاحقاً.", + "@trackLyricsTimeout": { + "description": "Message when lyrics request times out" + }, + "trackLyricsLoadFailed": "فشل تحميل كلمات الأغاني", + "@trackLyricsLoadFailed": { + "description": "Message when lyrics loading fails" + }, + "trackEmbedLyrics": "تضمين كلمات الأغنية", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "تمت إضافة كلمات الأغنية بنجاح", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "المسار الآلي", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "trackCopiedToClipboard": "تم النسخ إلى الحافظة", + "@trackCopiedToClipboard": { + "description": "Snackbar - content copied" + }, + "trackDeleteConfirmTitle": "حذف من الجهاز؟", + "@trackDeleteConfirmTitle": { + "description": "Delete confirmation title" + }, + "trackDeleteConfirmMessage": "سيؤدي هذا إلى حذف الملف الذي تم تنزيله وإزالته من السجل الخاص بك بشكل دائم.", + "@trackDeleteConfirmMessage": { + "description": "Delete confirmation message" + }, + "dateToday": "اليوم", + "@dateToday": { + "description": "Relative date - today" + }, + "dateYesterday": "الأمس", + "@dateYesterday": { + "description": "Relative date - yesterday" + }, + "dateDaysAgo": "قبل {count} أيام", + "@dateDaysAgo": { + "description": "Relative date - days ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateWeeksAgo": "قبل {count} أسابيع", + "@dateWeeksAgo": { + "description": "Relative date - weeks ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dateMonthsAgo": "منذ {count} أشهر", + "@dateMonthsAgo": { + "description": "Relative date - months ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeFilterAll": "الكل", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "البيانات الوصفية (Metadata)", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "التحميل", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "الأدوات", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "كلمات الأغنية", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "التكامل", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "حذف الفلاتر", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "إضافة مستودع إضافات", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "أدخل عنوان مستودع GitHub الذي يحتوي على ملف registry.json لتصفح وتثبيت الإضافات.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "رابط المستودع", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "أضف مستودعًا", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "تغيير المستودع", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "مستودع الإضافات", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "المستودع الحالي:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "رابط المستودع", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "فشل تحميل المستودع", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "لا توجد إضافات متاحة", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "لم يتم العثور على إضافات", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "extensionId": "ID", + "@extensionId": { + "description": "Extension detail - unique ID" + }, + "extensionError": "خطأ", + "@extensionError": { + "description": "Extension detail - error message" + }, + "extensionCapabilities": "الإمكانيات", + "@extensionCapabilities": { + "description": "Section header - extension features" + }, + "extensionMetadataProvider": "مزود بيانات التعريف", + "@extensionMetadataProvider": { + "description": "Capability - provides metadata" + }, + "extensionDownloadProvider": "مزود التحميل", + "@extensionDownloadProvider": { + "description": "Capability - provides downloads" + }, + "extensionLyricsProvider": "موفر كلمات الأغاني", + "@extensionLyricsProvider": { + "description": "Capability - provides lyrics" + }, + "extensionUrlHandler": "معالج الروابط", + "@extensionUrlHandler": { + "description": "Capability - handles URLs" + }, + "extensionQualityOptions": "خيارات الجودة", + "@extensionQualityOptions": { + "description": "Capability - quality selection" + }, + "extensionPostProcessingHooks": "روابط المعالجة اللاحقة", + "@extensionPostProcessingHooks": { + "description": "Capability - post-processing" + }, + "extensionPermissions": "الصلاحيات", + "@extensionPermissions": { + "description": "Section header - required permissions" + }, + "extensionSettings": "الإعدادات", + "@extensionSettings": { + "description": "Section header - extension settings" + }, + "extensionRemoveButton": "حذف الإضافة", + "@extensionRemoveButton": { + "description": "Button to uninstall extension" + }, + "extensionUpdated": "تاريخ التحديث", + "@extensionUpdated": { + "description": "Extension detail - last update" + }, + "extensionMinAppVersion": "اصدار التطبيق الأدنى", + "@extensionMinAppVersion": { + "description": "Extension detail - minimum app version" + }, + "extensionCustomTrackMatching": "مطابقة المسار المخصص", + "@extensionCustomTrackMatching": { + "description": "Capability - custom track matching algorithm" + }, + "extensionPostProcessing": "مرحلة ما بعد المعالجة", + "@extensionPostProcessing": { + "description": "Capability - post-download processing" + }, + "extensionHooksAvailable": "متاح {count} روابط", + "@extensionHooksAvailable": { + "description": "Post-processing hooks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionPatternsCount": "{count} أنماط", + "@extensionPatternsCount": { + "description": "URL patterns count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionStrategy": "الاستراتيجية: {strategy}", + "@extensionStrategy": { + "description": "Track matching strategy name", + "placeholders": { + "strategy": { + "type": "String" + } + } + }, + "extensionsProviderPrioritySection": "أولوية مزود الخدمة", + "@extensionsProviderPrioritySection": { + "description": "Section header - provider priority" + }, + "extensionsInstalledSection": "الإضافات المُثبّتة", + "@extensionsInstalledSection": { + "description": "Section header - installed extensions" + }, + "extensionsNoExtensions": "لا توجد إضافات مثبتة", + "@extensionsNoExtensions": { + "description": "Empty state - no extensions" + }, + "extensionsNoExtensionsSubtitle": "تثبيت ملفات .spotiflac-ext لإضافة موفرين جدد", + "@extensionsNoExtensionsSubtitle": { + "description": "Empty state subtitle" + }, + "extensionsInstallButton": "تثبيت الإضافة", + "@extensionsInstallButton": { + "description": "Button to install extension from file" + }, + "extensionsInfoTip": "يمكن للإضافات تزويدك بموفري بيانات التعريف الجديدة وتحميلها. ثبت الإضافات من مصادر موثوق بها فقط.", + "@extensionsInfoTip": { + "description": "Security warning about extensions" + }, + "extensionsInstalledSuccess": "تم تثبيت الإضافة بنجاح", + "@extensionsInstalledSuccess": { + "description": "Success message after install" + }, + "extensionsInstalledCount": "تم تثبيت {count} إضافات بنجاح", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "تم تثبيت {count} من أصل {attempted} إضافات", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "أولوية التحميل", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "تعيين ترتيب خدمة التحميل", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "الإضافات الاحتياطية", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "extensionsNoDownloadProvider": "لا توجد إضافات مع إمكانية مزود التحميل", + "@extensionsNoDownloadProvider": { + "description": "Empty state - no download providers" + }, + "extensionsMetadataPriority": "أولوية البيانات الوصفية (metadata)", + "@extensionsMetadataPriority": { + "description": "Setting - metadata provider order" + }, + "extensionsMetadataPrioritySubtitle": "تعيين ترتيب مصدر البحث والبيانات الوصفية", + "@extensionsMetadataPrioritySubtitle": { + "description": "Subtitle for metadata priority" + }, + "extensionsNoMetadataProvider": "لا توجد إضافات مع إمكانية مزود البيانات الوصفية", + "@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" + }, + "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 بت / ما يصل إلى 96 كيلو هرتز", + "@qualityHiResFlacSubtitle": { + "description": "Technical spec for hi-res" + }, + "qualityHiResFlacMax": "Hi-Res FLAC Max", + "@qualityHiResFlacMax": { + "description": "Quality option - maximum resolution FLAC" + }, + "qualityHiResFlacMaxSubtitle": "24 بت / ما يصل إلى 192 كيلو هرتز", + "@qualityHiResFlacMaxSubtitle": { + "description": "Technical spec for hi-res max" + }, + "downloadLossy320": "320kbps مضغوط", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "تنسيق مضغوط", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "تنسيق 320kbps مضغوط", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "اختر التنسيق النهائي للتنزيلات المضغوطة 320kbps. سيتم تحويل البث الأصلي إلى التنسيق المحدد عند الحاجة.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "أفضل توافق، ~10 ميغابايت لكل أغنية", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "أفضل توافق للجوال، صيغة M4A", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "أفضل جودة Opus, حوالي 8 ميغابايت لكل أغنية", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "أصغر حجم, ~4 ميغابايت لكل مسار", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "downloadAskBeforeDownload": "اسأل قبل التحميل", + "@downloadAskBeforeDownload": { + "description": "Setting - show quality picker" + }, + "downloadDirectory": "مسار التنزيل", + "@downloadDirectory": { + "description": "Setting - download folder" + }, + "downloadSeparateSinglesFolder": "فصل مجلد الفرديات", + "@downloadSeparateSinglesFolder": { + "description": "Setting - separate folder for singles" + }, + "downloadAlbumFolderStructure": "هيكل مجلد الألبوم", + "@downloadAlbumFolderStructure": { + "description": "Setting - album folder organization" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "استخدام فنان الألبوم للمجلدات", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "الفنان الأساسي فقط للمجلدات", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "الفنانين المتميزين الذين تمت إزالتهم من اسم المجلد (على سبيل المثال جاستين بيبر، كويفو -> جاستين بيبر)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "اسم الفنان الكامل المستخدمة لاسم المجلد", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "تحديد الجودة", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "تحميل من", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "الوضع الداكن AMOLED", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "خلفية سوداء تامة", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "queueClearAll": "مسح الكل", + "@queueClearAll": { + "description": "Button - clear all queue items" + }, + "queueClearAllMessage": "هل أنت متأكد من أنك تريد مسح جميع التنزيلات؟", + "@queueClearAllMessage": { + "description": "Clear queue confirmation" + }, + "settingsAutoExportFailed": "فشل التصدير التلقائي للتنزيلات", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "حفظ التنزيلات التي فشلت إلى ملف TXT تلقائيًا", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "تحميل الشبكة", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + بيانات الجوال", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi فقط", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "اختر الشبكة التي تريد استخدامها للتنزيلات. عند تعيين WiFi فقط، التنزيلات لن تعمل على بيانات الجوال.", + "@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": "ألبوم / الفنان", + "@albumFolderArtistAlbum": { + "description": "Album folder option" + }, + "albumFolderArtistAlbumSubtitle": "الألبومات / اسم الفنان / اسم الألبوم", + "@albumFolderArtistAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistYearAlbum": "الفنان / [Year] ألبوم", + "@albumFolderArtistYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderArtistYearAlbumSubtitle": "الألبومات/اسم الفنان /[2005] اسم الألبوم/", + "@albumFolderArtistYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderAlbumOnly": "الألبوم فقط", + "@albumFolderAlbumOnly": { + "description": "Album folder option" + }, + "albumFolderAlbumOnlySubtitle": "الألبومات/اسم الألبوم/", + "@albumFolderAlbumOnlySubtitle": { + "description": "Folder structure example" + }, + "albumFolderYearAlbum": "[Year] الألبوم", + "@albumFolderYearAlbum": { + "description": "Album folder option with year" + }, + "albumFolderYearAlbumSubtitle": "الألبومات/[2005] اسم الألبوم/", + "@albumFolderYearAlbumSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumSingles": "الفنان / الألبوم + المفردات", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "الفنان/الألبوم و الفنان / المفردات", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "فنان / ألبوم (منفردات سطحية)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "الفنان / الألبوم والفنان / الأغنية.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From 8b3944f11b061e2251de54a6eb48d5d91cad60a1 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:57 +0700 Subject: [PATCH 12/72] New translations app_en.arb (German) [ci skip] --- lib/l10n/arb/app_de.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index a6b5a6b6..16c930f1 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "{count} Titel gefunden hinzufügen?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} Titel aus CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Alles löschen", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Willkommen bei SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Lade Musik von Spotify, Deezer herunter oder jeden unterstützten Link einfügen", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Wähle Felder aus, die automatisch aus Online-Metadaten ausgefüllt werden sollen", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Abrufen & Ausfüllen", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "Kein Download-Verlauf", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Pro Kanal Statistik", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Fehler beim Speichern der Metadaten über FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "CSV-Datei importieren", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Suchanbieter ändern", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Heruntergeladene Datei fehlt", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Label fehlt", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Dienststatus", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 67396f3f78c235d87abd869cb5464ed4c65786d8 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:54:59 +0700 Subject: [PATCH 13/72] New translations app_en.arb (Japanese) [ci skip] --- lib/l10n/arb/app_ja.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index 6e74b9f6..66bd7586 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in CSV. Add them to download queue?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} tracks from CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "すべて消去", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "SpotiFLAC へようこそ!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Fetch & Fill", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "No download history", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 1a268780ac85b2cafb78d98aec9712215ed08d68 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:00 +0700 Subject: [PATCH 14/72] New translations app_en.arb (Dutch) [ci skip] --- lib/l10n/arb/app_nl-NL.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_nl-NL.arb diff --git a/lib/l10n/arb/app_nl-NL.arb b/lib/l10n/arb/app_nl-NL.arb new file mode 100644 index 00000000..eede3112 --- /dev/null +++ b/lib/l10n/arb/app_nl-NL.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "nl", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "Home", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "Library", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "Settings", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "Repo", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "Home", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "Paste a supported URL or search by name", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "Recent", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "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" + }, + "historySearchHint": "Search history...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "Settings", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "Download", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "Appearance", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "Extensions", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "About", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "Download", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "Single Filename Format", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "Appearance", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "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" + }, + "appearanceHistoryView": "History View", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "Using extension: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "Default Search Tab", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "@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" + }, + "optionsReplayGain": "ReplayGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "Rescan ReplayGain", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "Analyzing loudness...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "ReplayGain tags added", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "Failed to add ReplayGain tags", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ReplayGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "Add ReplayGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "Artist Tag Mode", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "Single joined value", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "Extension Repo", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo 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" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "Disabled", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "Version {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "Uninstall", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "Extension Repo", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "Search extensions...", + "@storeSearch": { + "description": "Repo 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" + }, + "aboutTranslators": "Translators", + "@aboutTranslators": { + "description": "Section for translators" + }, + "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" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "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" + }, + "aboutTelegramChannel": "Telegram Channel", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "Announcements and updates", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram Community", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "Chat with other users", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "Social", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "Version", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "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" + }, + "artistPopular": "Popular", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} monthly listeners", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "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" + }, + "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "Skip for now", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "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" + } + } + }, + "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" + }, + "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "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" + }, + "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" + }, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "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" + }, + "setupNext": "Next", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "Get Started", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "Cancel", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "Save", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "Delete", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "Retry", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "Clear", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "Done", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "Import", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "Play preview", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "Stop preview", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "Preview unavailable", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "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" + }, + "dialogClearAll": "Clear All", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "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 the playlist file. Add them to download queue?", + "csvImportTracks": "{count} tracks from CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + } + } + }, + "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "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" + } + } + }, + "snackbarViewQueue": "View Queue", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "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" + }, + "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" + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "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" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "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" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "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" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen 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" + }, + "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" + }, + "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" + } + } + }, + "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" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download 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" + }, + "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" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "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" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "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" + }, + "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" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "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" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "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" + }, + "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" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "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" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "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" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@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" + }, + "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" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From b9d55b023175d972ec67a0f9c5f4e01b684a09b6 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:01 +0700 Subject: [PATCH 15/72] New translations app_en.arb (Russian) [ci skip] --- lib/l10n/arb/app_ru.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index b2609379..2244a54e 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Найдено {count} треков в CSV. Добавить их в очередь загрузки?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} трек(-ов) из CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Очистить всё", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Добро пожаловать в SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Скачивайте музыку из Spotify, Deezer, или вставьте любой поддерживаемый URL", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Получить и заполнить", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "Нет истории скачиваний", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Не удалось сохранить метаданные через FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From cf8774645ae8270994c3164c6ae3667b4e3cd132 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:03 +0700 Subject: [PATCH 16/72] New translations app_en.arb (Turkish) [ci skip] --- lib/l10n/arb/app_tr.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index 6a9a882b..978ca665 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "CSV'de {count} şarkı bulundu. İndirme kuyruğuna ekle?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "CSV'den {count} şarkı", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Tümünü Temizle", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "SpotiFLAC'e hoş geldiniz!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Spotify, Deezer'dan müzik indirin veya desteklenen herhangi bir URL'yi yapıştırın", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Select fields to fill automatically from online metadata", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Fetch & Fill", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "No download history", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From 786872bda18296f4d8b078cd9462427187e2dca6 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:04 +0700 Subject: [PATCH 17/72] New translations app_en.arb (Ukrainian) [ci skip] --- lib/l10n/arb/app_uk.arb | 271 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 260 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index 37f4e4bf..f0a5f584 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Знайдено {count} треків у CSV. Додати їх до черги завантаження?", + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", "csvImportTracks": "{count} треків з CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,6 +802,79 @@ } } }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, "@dialogImportPlaylistMessage": { "description": "Dialog message - import playlist confirmation", "placeholders": { @@ -2018,6 +2091,14 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, "queueClearAll": "Усі", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2678,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Ласкаво просимо до SpotiFLAC!", + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2686,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Завантажуйте музику зі Spotify, Deezer або вставляйте будь-яку підтримувану URL-адресу", + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4202,10 +4283,51 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Виберіть поля для автоматичного заповнення з онлайн-метаданих", + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, "editMetadataAutoFillFetch": "Отримання та заповнення", "@editMetadataAutoFillFetch": { "description": "Button label to fetch online metadata and fill selected fields" @@ -4334,6 +4456,27 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, "queueEmptyHistory": "Немає історії завантажень", "@queueEmptyHistory": { "description": "Empty state title when download history is empty" @@ -4434,6 +4577,10 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, "audioAnalysisChannelStats": "Per-channel Stats", "@audioAnalysisChannelStats": { "description": "Per-channel audio analysis section label" @@ -4504,6 +4651,14 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, "metadataSaveFailedFfmpeg": "Не вдалося зберегти метадані через FFmpeg", "@metadataSaveFailedFfmpeg": { "description": "Snackbar error when FFmpeg fails to write metadata" @@ -4769,9 +4924,9 @@ } } }, - "homeImportCsvTooltip": "Import CSV", + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", "@homeImportCsvTooltip": { - "description": "Tooltip for importing a CSV file into Home search" + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, "homeChangeSearchProviderTooltip": "Change search provider", "@homeChangeSearchProviderTooltip": { @@ -4837,6 +4992,18 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, "actionStop": "Stop", "@actionStop": { "description": "Generic action - stop" @@ -4845,6 +5012,55 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, "queueDownloadedFileMissing": "Downloaded file missing", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" @@ -5120,7 +5336,7 @@ "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -5176,6 +5392,10 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, "libraryFilterMetadataMissingLabel": "Missing label", "@libraryFilterMetadataMissingLabel": { "description": "Filter option - items missing record label" @@ -5365,10 +5585,6 @@ "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, - "badgeBeta": "BETA", - "@badgeBeta": { - "description": "Badge label for beta features" - }, "extensionServiceStatus": "Service Status", "@extensionServiceStatus": { "description": "Extension detail section header for service status" @@ -6022,5 +6238,38 @@ "extensionVerificationOpenBrowser": "Open browser", "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" } } \ No newline at end of file From dd674f6fe39b7e309fc47c75b2414ab3c9af6422 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:06 +0700 Subject: [PATCH 18/72] New translations app_en.arb (Chinese Simplified) [ci skip] --- lib/l10n/arb/app_zh-CN.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_zh-CN.arb diff --git a/lib/l10n/arb/app_zh-CN.arb b/lib/l10n/arb/app_zh-CN.arb new file mode 100644 index 00000000..19087865 --- /dev/null +++ b/lib/l10n/arb/app_zh-CN.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "zh-CN", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC 移动版", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "主页", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "乐库", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "设置", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "仓库", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "主页", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "粘贴支持的 URL 或按名称搜索", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "暂无搜索提供商", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "安装一个拓展以继续。", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "支持:歌曲、专辑、播放列表、艺人网址", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "最近", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "historyFilterAll": "全部", + "@historyFilterAll": { + "description": "Filter chip - show all items" + }, + "historyFilterAlbums": "专辑", + "@historyFilterAlbums": { + "description": "Filter chip - show albums only" + }, + "historyFilterSingles": "单曲", + "@historyFilterSingles": { + "description": "Filter chip - show singles only" + }, + "historySearchHint": "搜索历史……", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "设置", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "下载", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "外观", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "扩展", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "关于", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "下载", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "为每次下载显示质量选择器", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "文件名格式", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "单曲文件名格式", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "单曲和EP的文件名格式。使用与专辑格式相同的标签。", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "文件夹结构", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "外观", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "appearanceThemeSystem": "系统", + "@appearanceThemeSystem": { + "description": "Follow system theme" + }, + "appearanceThemeLight": "浅色", + "@appearanceThemeLight": { + "description": "Light theme" + }, + "appearanceThemeDark": "深色", + "@appearanceThemeDark": { + "description": "Dark theme" + }, + "appearanceDynamicColor": "动态色彩", + "@appearanceDynamicColor": { + "description": "Material You dynamic colors" + }, + "appearanceDynamicColorSubtitle": "使用壁纸的颜色", + "@appearanceDynamicColorSubtitle": { + "description": "Subtitle for dynamic color" + }, + "appearanceHistoryView": "历史记录", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "列表", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "网格", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "主要提供者", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "用于按曲目或专辑名称搜索的服务", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "使用扩展:{extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "默认搜索栏", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "选择新搜索结果首先打开的标签页。", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "自动回退", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "如果下载失败,请尝试其他服务", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "内嵌歌词", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "将同步的歌词与你下载的音轨一起保存", + "@optionsEmbedLyricsSubtitle": { + "description": "Subtitle for embed lyrics" + }, + "optionsMaxQualityCover": "最高质量封面", + "@optionsMaxQualityCover": { + "description": "Download highest quality album art" + }, + "optionsMaxQualityCoverSubtitle": "下载最高分辨率封面", + "@optionsMaxQualityCoverSubtitle": { + "description": "Subtitle for max quality cover" + }, + "optionsReplayGain": "回放增益", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "扫描响度并嵌入 ReplayGain 标签(EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "已禁用:不添加响度标准化标签", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "重新扫描ReplayGain ", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "正在分析声音……", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "ReplayGain标签已添加", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "添加ReplayGain标签失败", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ReplayGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "添加ReplayGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "要分析响度并向 {count} 首歌曲写入 ReplayGain 标签吗?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "正在分析ReplayGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "已为 {success}/{total} 首歌曲添加 ReplayGain", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "艺术家标签模式", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "选择将多位艺人写入嵌入标签的方式", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "合并为单个值", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "写一个ARTIST 值,如“艺术家A,艺人B”,以实现最大兼容性。", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "用于 FLAC/Opus 的拆分标签", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "为 FLAC 和 Opus 的每位艺人各写入一个艺人标签;MP3 和 M4A 保持合并", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "扩展仓库", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "在导航中显示仓库标签页", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo toggle" + }, + "optionsCheckUpdates": "检查更新", + "@optionsCheckUpdates": { + "description": "Auto update check toggle" + }, + "optionsCheckUpdatesSubtitle": "当有新版本可用时通知", + "@optionsCheckUpdatesSubtitle": { + "description": "Subtitle for update check" + }, + "optionsUpdateChannel": "更新频道", + "@optionsUpdateChannel": { + "description": "Stable vs preview releases" + }, + "optionsUpdateChannelStable": "仅稳定版本", + "@optionsUpdateChannelStable": { + "description": "Only stable updates" + }, + "optionsUpdateChannelPreview": "获取预览版本", + "@optionsUpdateChannelPreview": { + "description": "Include beta/preview updates" + }, + "optionsUpdateChannelWarning": "预览版本可能包含错误或者尚未完善的功能", + "@optionsUpdateChannelWarning": { + "description": "Warning about preview channel" + }, + "optionsClearHistory": "清除下载历史记录", + "@optionsClearHistory": { + "description": "Delete all download history" + }, + "optionsClearHistorySubtitle": "从历史记录中清除所有已下载的曲目", + "@optionsClearHistorySubtitle": { + "description": "Subtitle for clear history" + }, + "optionsDetailedLogging": "详细日志", + "@optionsDetailedLogging": { + "description": "Enable verbose logs for debugging" + }, + "optionsDetailedLoggingOn": "正在记录详细日志", + "@optionsDetailedLoggingOn": { + "description": "Status when logging enabled" + }, + "optionsDetailedLoggingOff": "为错误报告启用", + "@optionsDetailedLoggingOff": { + "description": "Status when logging disabled" + }, + "extensionsTitle": "扩展", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "禁用", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "版本 {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "卸载", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "扩展仓库地址", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "搜索扩展……", + "@storeSearch": { + "description": "Repo search placeholder" + }, + "storeInstall": "安装", + "@storeInstall": { + "description": "Install extension button" + }, + "storeInstalled": "已安装", + "@storeInstalled": { + "description": "Already installed badge" + }, + "storeUpdate": "更新", + "@storeUpdate": { + "description": "Update available button" + }, + "aboutTitle": "关于", + "@aboutTitle": { + "description": "About page title" + }, + "aboutContributors": "贡献者", + "@aboutContributors": { + "description": "Section for contributors" + }, + "aboutMobileDeveloper": "移动版本开发者", + "@aboutMobileDeveloper": { + "description": "Role description for mobile dev" + }, + "aboutOriginalCreator": "原 SpotiLDAC 创建者", + "@aboutOriginalCreator": { + "description": "Role description for original creator" + }, + "aboutLogoArtist": "有才华的艺术家创建了我们美丽的应用图标!", + "@aboutLogoArtist": { + "description": "Role description for logo artist" + }, + "aboutTranslators": "译者", + "@aboutTranslators": { + "description": "Section for translators" + }, + "aboutSpecialThanks": "特别鸣谢", + "@aboutSpecialThanks": { + "description": "Section for special thanks" + }, + "aboutLinks": "相关链接", + "@aboutLinks": { + "description": "Section for external links" + }, + "aboutMobileSource": "移动版本源代码", + "@aboutMobileSource": { + "description": "Link to mobile GitHub repo" + }, + "aboutPCSource": "桌面版本源代码", + "@aboutPCSource": { + "description": "Link to PC GitHub repo" + }, + "aboutKeepAndroidOpen": "Keep Android Open(保持安卓开放)", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "aboutReportIssue": "报告一个问题", + "@aboutReportIssue": { + "description": "Link to report bugs" + }, + "aboutReportIssueSubtitle": "报告您遇到的任何问题", + "@aboutReportIssueSubtitle": { + "description": "Subtitle for report issue" + }, + "aboutFeatureRequest": "功能建议", + "@aboutFeatureRequest": { + "description": "Link to suggest features" + }, + "aboutFeatureRequestSubtitle": "为应用建议新功能", + "@aboutFeatureRequestSubtitle": { + "description": "Subtitle for feature request" + }, + "aboutTelegramChannel": "Telegram 频道", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "公告和更新", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram 社区", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "与其他用户聊天", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "社交", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "版本", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "QQDL 和 HiFi API 的创建者。本项目帮助完善了无损下载支持。", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "原 HiFi 项目创建者,为无损来源集成奠定了基础。", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "I Don't Have Spotify (IDHS) 的创建者。备用链接解析器很有帮助!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "搜索音乐元数据、管理扩展并整理你的乐库。", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "artistAlbums": "专辑", + "@artistAlbums": { + "description": "Section header for artist albums" + }, + "artistSingles": "单曲 & EP", + "@artistSingles": { + "description": "Section header for singles/EPs" + }, + "artistCompilations": "合辑", + "@artistCompilations": { + "description": "Section header for compilations" + }, + "artistPopular": "热门", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} 位月听众", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "trackMetadataService": "服务商", + "@trackMetadataService": { + "description": "Metadata field - download service used" + }, + "trackMetadataPlay": "播放", + "@trackMetadataPlay": { + "description": "Action button - play track" + }, + "trackMetadataShare": "分享", + "@trackMetadataShare": { + "description": "Action button - share track" + }, + "trackMetadataDelete": "删除", + "@trackMetadataDelete": { + "description": "Action button - delete track" + }, + "setupGrantPermission": "授予权限", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "暂时跳过", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "需要存储访问权限", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "setupStorageAccessMessageAndroid11": "Android 11+ 需要“所有文件访问权限”才能将文件保存到你选择的下载文件夹。", + "@setupStorageAccessMessageAndroid11": { + "description": "Android 11+ specific explanation" + }, + "setupOpenSettings": "打开设置", + "@setupOpenSettings": { + "description": "Button to open system settings" + }, + "setupPermissionDeniedMessage": "权限被拒绝。请授予所有权限以继续。", + "@setupPermissionDeniedMessage": { + "description": "Error when permission denied" + }, + "setupPermissionRequired": "需要 {permissionType} 权限", + "@setupPermissionRequired": { + "description": "Generic permission required title", + "placeholders": { + "permissionType": { + "type": "String", + "description": "Type of permission (Storage/Notification)" + } + } + }, + "setupPermissionRequiredMessage": "为了获得最佳体验,需要 {permissionType} 权限。你可以稍后在设置中更改。", + "@setupPermissionRequiredMessage": { + "description": "Generic permission required message", + "placeholders": { + "permissionType": { + "type": "String" + } + } + }, + "setupUseDefaultFolder": "使用默认文件夹?", + "@setupUseDefaultFolder": { + "description": "Dialog title for default folder" + }, + "setupNoFolderSelected": "未选择文件夹。要使用默认音乐文件夹吗?", + "@setupNoFolderSelected": { + "description": "Prompt when no folder selected" + }, + "setupUseDefault": "使用默认", + "@setupUseDefault": { + "description": "Button to use default folder" + }, + "setupDownloadLocationTitle": "下载位置", + "@setupDownloadLocationTitle": { + "description": "Download location dialog title" + }, + "setupDownloadLocationIosMessage": "在 iOS 上,下载内容会保存到应用的 Documents 文件夹。你可以通过“文件”应用访问。", + "@setupDownloadLocationIosMessage": { + "description": "iOS-specific folder info" + }, + "setupAppDocumentsFolder": "应用程序文档文件夹", + "@setupAppDocumentsFolder": { + "description": "iOS documents folder option" + }, + "setupAppDocumentsFolderSubtitle": "推荐 - 可通过“文件”应用访问", + "@setupAppDocumentsFolderSubtitle": { + "description": "Subtitle for documents folder" + }, + "setupChooseFromFiles": "从“文件”中选择", + "@setupChooseFromFiles": { + "description": "iOS file picker option" + }, + "setupChooseFromFilesSubtitle": "选择 iCloud 或其他位置", + "@setupChooseFromFilesSubtitle": { + "description": "Subtitle for file picker" + }, + "setupIosEmptyFolderWarning": "iOS 限制:无法选择空文件夹。请选择至少包含一个文件的文件夹。", + "@setupIosEmptyFolderWarning": { + "description": "iOS folder selection warning" + }, + "setupIcloudNotSupported": "不支持 iCloud Drive。请使用应用 Documents 文件夹。", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "以 FLAC 下载 Spotify 曲目", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "setupStorageGranted": "已授予存储权限!", + "@setupStorageGranted": { + "description": "Success message for storage permission" + }, + "setupStorageRequired": "需要存储权限", + "@setupStorageRequired": { + "description": "Title when storage permission needed" + }, + "setupStorageDescription": "SpotiFLAC 需要存储权限来保存下载的音乐文件。", + "@setupStorageDescription": { + "description": "Explanation for storage permission" + }, + "setupNotificationGranted": "已授予通知权限!", + "@setupNotificationGranted": { + "description": "Success message for notification permission" + }, + "setupNotificationEnable": "启用通知", + "@setupNotificationEnable": { + "description": "Button to enable notifications" + }, + "setupFolderChoose": "选择下载文件夹", + "@setupFolderChoose": { + "description": "Button to choose folder" + }, + "setupFolderDescription": "选择保存您下载的音乐的文件夹。", + "@setupFolderDescription": { + "description": "Explanation for folder selection" + }, + "setupSelectFolder": "选择文件夹", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "启用通知", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "setupNotificationBackgroundDescription": "接收下载进度和完成通知,方便你在应用后台时跟踪下载。", + "@setupNotificationBackgroundDescription": { + "description": "Detailed notification explanation" + }, + "setupSkipForNow": "暂时跳过", + "@setupSkipForNow": { + "description": "Skip button text" + }, + "setupNext": "下一步", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "开始使用", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "请在下一个屏幕中启用“允许管理所有文件”。", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "选择语言", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "选择应用的首选语言。你可以稍后在设置中更改。", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "跟随系统", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "取消", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "保存", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "删除", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "重试", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "清空", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "完成", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "导入", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "下载", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "Play preview", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "Stop preview", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "Preview unavailable", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "dialogDiscard": "放弃", + "@dialogDiscard": { + "description": "Dialog button - discard changes" + }, + "dialogRemove": "移除", + "@dialogRemove": { + "description": "Dialog button - remove item" + }, + "dialogUninstall": "卸载", + "@dialogUninstall": { + "description": "Dialog button - uninstall extension" + }, + "dialogDiscardChanges": "放弃更改?", + "@dialogDiscardChanges": { + "description": "Dialog title - unsaved changes warning" + }, + "dialogUnsavedChanges": "您有未保存的更改,要放弃它们吗?", + "@dialogUnsavedChanges": { + "description": "Dialog message - unsaved changes" + }, + "dialogClearAll": "全部清除", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "dialogRemoveExtension": "移除扩展", + "@dialogRemoveExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogRemoveExtensionMessage": "确定要移除此扩展吗?此操作无法撤销。", + "@dialogRemoveExtensionMessage": { + "description": "Dialog message - uninstall confirmation" + }, + "dialogUninstallExtension": "卸载扩展?", + "@dialogUninstallExtension": { + "description": "Dialog title - uninstall extension" + }, + "dialogUninstallExtensionMessage": "确定要移除 {extensionName} 吗?", + "@dialogUninstallExtensionMessage": { + "description": "Dialog message - uninstall specific extension", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "dialogClearHistoryTitle": "清除历史", + "@dialogClearHistoryTitle": { + "description": "Dialog title - clear download history" + }, + "dialogClearHistoryMessage": "您确定要清除所有下载记录吗?此操作无法撤销!", + "@dialogClearHistoryMessage": { + "description": "Dialog message - clear history confirmation" + }, + "dialogDeleteSelectedTitle": "删除所选项", + "@dialogDeleteSelectedTitle": { + "description": "Dialog title - delete selected items" + }, + "dialogDeleteSelectedMessage": "确定要从历史记录中删除 {count} {count, plural, =1{首歌曲} other{首歌曲}}吗?\n\n这也会从存储中删除文件。", + "@dialogDeleteSelectedMessage": { + "description": "Dialog message - delete selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogImportPlaylistTitle": "导入播放列表", + "@dialogImportPlaylistTitle": { + "description": "Dialog title - import CSV playlist" + }, + "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "csvImportTracks": "CSV 中的 {count} 首歌曲", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedToQueue": "已将“{trackName}”加入队列", + "@snackbarAddedToQueue": { + "description": "Snackbar - track added to download queue", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAddedTracksToQueue": "已将 {count} 首歌曲加入队列", + "@snackbarAddedTracksToQueue": { + "description": "Snackbar - multiple tracks added to queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAlreadyDownloaded": "“{trackName}”已下载", + "@snackbarAlreadyDownloaded": { + "description": "Snackbar - track already exists", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarAlreadyInLibrary": "“{trackName}”已存在于你的乐库中", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "历史记录已清除", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "snackbarDeletedTracks": "已删除 {count} {count, plural, =1{首歌曲} other{首歌曲}}", + "@snackbarDeletedTracks": { + "description": "Snackbar - tracks deleted", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarCannotOpenFile": "无法打开文件:{error}", + "@snackbarCannotOpenFile": { + "description": "Snackbar - file open error", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarViewQueue": "查看队列", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "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" + }, + "errorRateLimited": "Rate Limited", + "@errorRateLimited": { + "description": "Error title - too many requests" + }, + "errorRateLimitedMessage": "请求过多。请等一会再搜索。", + "@errorRateLimitedMessage": { + "description": "Error message - rate limit explanation" + }, + "errorNoTracksFound": "未找到曲目", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "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" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "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" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "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" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen 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" + }, + "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" + }, + "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" + } + } + }, + "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" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download 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" + }, + "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" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "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" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "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" + }, + "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" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "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" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "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" + }, + "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" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "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" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "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" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@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" + }, + "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" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From 2da814d1eecfb90d815cb090d75efb863eafa223 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:07 +0700 Subject: [PATCH 19/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_zh-TW.arb diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb new file mode 100644 index 00000000..5e542598 --- /dev/null +++ b/lib/l10n/arb/app_zh-TW.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "zh-TW", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "Home", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "Library", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "Settings", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "Repo", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "Home", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "Paste a supported URL or search by name", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "最新的", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "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" + }, + "historySearchHint": "Search history...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "Settings", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "Download", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "Appearance", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "Extensions", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "About", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "Download", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "Single Filename Format", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "Appearance", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "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" + }, + "appearanceHistoryView": "History View", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "Using extension: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "Default Search Tab", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "@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" + }, + "optionsReplayGain": "ReplayGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "Rescan ReplayGain", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "Analyzing loudness...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "ReplayGain tags added", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "Failed to add ReplayGain tags", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ReplayGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "Add ReplayGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "Artist Tag Mode", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "Single joined value", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "Extension Repo", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo 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" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "Disabled", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "Version {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "Uninstall", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "Extension Repo", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "Search extensions...", + "@storeSearch": { + "description": "Repo 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" + }, + "aboutTranslators": "Translators", + "@aboutTranslators": { + "description": "Section for translators" + }, + "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" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "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" + }, + "aboutTelegramChannel": "Telegram Channel", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "Announcements and updates", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram Community", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "Chat with other users", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "Social", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "Version", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "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" + }, + "artistPopular": "Popular", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} monthly listeners", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "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" + }, + "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "Skip for now", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "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" + } + } + }, + "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" + }, + "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "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" + }, + "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" + }, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "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" + }, + "setupNext": "Next", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "Get Started", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "Cancel", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "Save", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "Delete", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "Retry", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "Clear", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "Done", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "Import", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "Play preview", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "Stop preview", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "Preview unavailable", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "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" + }, + "dialogClearAll": "Clear All", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "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 the playlist file. Add them to download queue?", + "csvImportTracks": "{count} tracks from CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + } + } + }, + "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "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" + } + } + }, + "snackbarViewQueue": "View Queue", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "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" + }, + "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" + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "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" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "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" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "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" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen 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" + }, + "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" + }, + "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" + } + } + }, + "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" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download 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" + }, + "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" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "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" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "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" + }, + "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" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "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" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "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" + }, + "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" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "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" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "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" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@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" + }, + "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" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From d0f7f1b3c4e22542c32d11ac923b98fb87c83b16 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 00:55:08 +0700 Subject: [PATCH 20/72] New translations app_en.arb (Hindi) [ci skip] --- lib/l10n/arb/app_hi-IN.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_hi-IN.arb diff --git a/lib/l10n/arb/app_hi-IN.arb b/lib/l10n/arb/app_hi-IN.arb new file mode 100644 index 00000000..99ebc774 --- /dev/null +++ b/lib/l10n/arb/app_hi-IN.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "hi", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "होम", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "Library", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "विकल्प", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "Repo", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "Home", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "Paste a supported URL or search by name", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "Recent", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "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" + }, + "historySearchHint": "Search history...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "Settings", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "Download", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "Appearance", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "Extensions", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "About", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "Download", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "Single Filename Format", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "दिखावट", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "appearanceThemeSystem": "System", + "@appearanceThemeSystem": { + "description": "Follow system theme" + }, + "appearanceThemeLight": "Light", + "@appearanceThemeLight": { + "description": "Light theme" + }, + "appearanceThemeDark": "Dark", + "@appearanceThemeDark": { + "description": "Dark theme" + }, + "appearanceDynamicColor": "डायनेमिक रंग", + "@appearanceDynamicColor": { + "description": "Material You dynamic colors" + }, + "appearanceDynamicColorSubtitle": "वॉलपेपर से रंग इस्तेमाल करें", + "@appearanceDynamicColorSubtitle": { + "description": "Subtitle for dynamic color" + }, + "appearanceHistoryView": "History View", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "Using extension: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "Default Search Tab", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "@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" + }, + "optionsReplayGain": "ReplayGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "Rescan ReplayGain", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "Analyzing loudness...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "ReplayGain tags added", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "Failed to add ReplayGain tags", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ReplayGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "Add ReplayGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "Artist Tag Mode", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "Single joined value", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "Extension Repo", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo 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" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "Disabled", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "Version {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "Uninstall", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "Extension Repo", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "Search extensions...", + "@storeSearch": { + "description": "Repo 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" + }, + "aboutTranslators": "Translators", + "@aboutTranslators": { + "description": "Section for translators" + }, + "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" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "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" + }, + "aboutTelegramChannel": "Telegram Channel", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "Announcements and updates", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram Community", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "Chat with other users", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "Social", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "Version", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "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" + }, + "artistPopular": "Popular", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} monthly listeners", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "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" + }, + "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "Skip for now", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "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" + } + } + }, + "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" + }, + "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "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" + }, + "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" + }, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "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" + }, + "setupNext": "Next", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "Get Started", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "Cancel", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "Save", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "Delete", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "Retry", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "Clear", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "Done", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "Import", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "Play preview", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "Stop preview", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "Preview unavailable", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "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" + }, + "dialogClearAll": "Clear All", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "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 the playlist file. Add them to download queue?", + "csvImportTracks": "{count} tracks from CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + } + } + }, + "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "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" + } + } + }, + "snackbarViewQueue": "View Queue", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "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" + }, + "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" + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "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" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "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" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "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" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen 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" + }, + "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" + }, + "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" + } + } + }, + "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" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download 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" + }, + "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" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "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" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "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" + }, + "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" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "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" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "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" + }, + "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" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "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" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "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" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@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" + }, + "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" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From f200cf6e3bcda581f280aad00130edf81553bc72 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 01:52:53 +0700 Subject: [PATCH 21/72] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 62023f3d..0be5755b 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "dialogImportPlaylistMessage": "{count} titres ont été trouvés dans le fichier de la playlist. Voulez-vous les ajouter à la file d'attente de téléchargement ?", "csvImportTracks": "{count} pistes issues d'un fichier CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Exporter au format M3U8", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "{exported} titres exportés sur {total}", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,15 +818,15 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "Aucun fichier téléchargé à exporter", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "L'exportation a échoué", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Ouvrir sur...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, @@ -842,11 +842,11 @@ "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Doublons", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "Aucun titre en double n'a été détecté.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, @@ -854,7 +854,7 @@ "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "Supprimer {count} copies de moindre qualité de « {trackName} » ?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -866,7 +866,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "Souhaitez-vous supprimer cette copie de « {trackName} » ?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -2091,7 +2091,7 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, - "appearanceForceBlur": "Always use blur effects", + "appearanceForceBlur": "Utilisez toujours des effets de flou", "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, @@ -2759,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "tutorialWelcomeTitle": "Bienvenue sur SpotiFLAC Mobile !", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2767,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Recherchez de la musique ou collez un lien provenant de n'importe quelle source prise en charge par vos extensions installées", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4283,23 +4283,23 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "editMetadataAutoFillDesc": "Choisissez une extension de métadonnées, sélectionnez les champs, puis vérifiez les données avant de l'appliquer", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillSource": "Metadata source", + "editMetadataAutoFillSource": "Source des métadonnées", "@editMetadataAutoFillSource": { "description": "Label for the metadata extension selector in online auto-fill" }, - "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "editMetadataAutoFillSourceAutomatic": "Automatique (priorité au fournisseur)", "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, - "editMetadataAutoFillFind": "Find metadata", + "editMetadataAutoFillFind": "Rechercher des métadonnées", "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, - "editMetadataAutoFillPreview": "Data from {source}", + "editMetadataAutoFillPreview": "Données provenant de {source}", "@editMetadataAutoFillPreview": { "description": "Title for the online metadata preview", "placeholders": { @@ -4312,7 +4312,7 @@ "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "Apply selected data", + "editMetadataAutoFillApply": "Appliquer les données sélectionnées", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, @@ -5392,7 +5392,7 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "libraryFilterMetadataMissingIsrc": "ISRC manquant", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, From fad1c455500d48f0b26a3e8f98e728226d536635 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 02:54:15 +0700 Subject: [PATCH 22/72] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 72 ++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 0be5755b..29c76406 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -830,15 +830,15 @@ "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "Aucun lien vers une plateforme n'a été trouvé pour ce titre.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "Vérifier les doublons", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "Rechercher les titres enregistrés plusieurs fois", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, @@ -850,7 +850,7 @@ "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Garder le meilleur", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, @@ -2095,7 +2095,7 @@ "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "appearanceForceBlurSubtitle": "Activer l'effet de flou de la barre de navigation même sur les appareils où cette option est désactivée par défaut. Cela peut nuire aux performances.", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -4308,7 +4308,7 @@ } } }, - "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "editMetadataAutoFillCoverAvailable": "Illustration de couverture disponible", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, @@ -4316,7 +4316,7 @@ "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, - "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "editMetadataAutoFillDoneFromSource": "Rempli {count} {count, plural, one {}=1{champ} other{champs}} ont été renseignés à partir de {source}", "@editMetadataAutoFillDoneFromSource": { "description": "Snackbar confirming fields applied from a selected metadata source", "placeholders": { @@ -4465,15 +4465,15 @@ } } }, - "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "queueEmptyPlaylistsSubtitle": "Créez une playlist pour organiser vos morceaux", "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, - "libraryDefaultView": "Default view", + "libraryDefaultView": "Affichage par défaut", "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "Last used", + "libraryDefaultViewLastUsed": "Dernière utilisation", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4577,7 +4577,7 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, - "audioAnalysisCutoffNotDetected": "Not detected", + "audioAnalysisCutoffNotDetected": "Non détecté", "@audioAnalysisCutoffNotDetected": { "description": "Displayed when no reliable broadband spectral cutoff can be detected" }, @@ -4651,11 +4651,11 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "queueCancelledTitle": "Download cancelled", + "queueCancelledTitle": "Téléchargement annulé", "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "queueCancelledMessage": "Ce téléchargement a été annulé. Veuillez réessayer ou le supprimer de la file d'attente.", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, @@ -4924,7 +4924,7 @@ } } }, - "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "homeImportCsvTooltip": "Importer une playlist (CSV, M3U)", "@homeImportCsvTooltip": { "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, @@ -4992,15 +4992,15 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, - "trackCoverResolution": "Cover resolution", + "trackCoverResolution": "Résolution de la couverture", "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, - "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "trackCoverResolutionHint": "Définit la longueur maximale de l'image lors de l'enregistrement. L'agrandissement n'apporte pas davantage de détails à l'image.", "@trackCoverResolutionHint": { "description": "Explanation below the embedded cover art resolution selector" }, - "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "trackCoverResizeFailed": "L'image de couverture n'a pas pu être redimensionnée. Veuillez essayer une autre taille ou une autre image.", "@trackCoverResizeFailed": { "description": "Error shown when resizing cover art before saving metadata fails" }, @@ -5012,47 +5012,47 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "Télécharger le suivant", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "Remonter", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "Descendre", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, - "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "editMetadataMusicBrainzButton": "Récupérer depuis MusicBrainz", "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, - "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "editMetadataMusicBrainzFilled": "Mise à jour à partir de MusicBrainz", "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, - "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "editMetadataMusicBrainzNothing": "Aucun résultat trouvé sur MusicBrainz", "@editMetadataMusicBrainzNothing": { "description": "Snackbar when the MusicBrainz lookup returns no data" }, - "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "editMetadataMusicBrainzNeedsIsrc": "Nécessite une balise ISRC", "@editMetadataMusicBrainzNeedsIsrc": { "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" }, - "nowPlayingRepeatOff": "Repeat off", + "nowPlayingRepeatOff": "Répétition désactivée", "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "Repeat all", + "nowPlayingRepeatAll": "Tout répéter", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, - "nowPlayingRepeatOne": "Repeat one", + "nowPlayingRepeatOne": "Répéter une fois", "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "{count} downloads failed while offline", + "queueNetworkFailedOffline": "{count} téléchargements ont échoué en mode hors ligne", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5336,7 +5336,7 @@ "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "downloadQualityVariantsDescription": "Conserver toutes les versions de qualité ; n'ajouter la note de qualité au nom de fichier que si ce nom est déjà utilisé", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -6239,11 +6239,11 @@ "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, - "settingsSearchHint": "Search settings", + "settingsSearchHint": "Paramètres de recherche", "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "No settings match \"{query}\"", + "settingsSearchNoResults": "Aucun paramètre ne correspond à « {query} »", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6252,23 +6252,23 @@ } } }, - "settingsGroupInterface": "Extensions & appearance", + "settingsGroupInterface": "Extensions & Apparence", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "Content & metadata", + "settingsGroupContent": "Contenu & Métadonnées", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, - "settingsGroupDownloads": "Downloads & files", + "settingsGroupDownloads": "Téléchargements & Fichiers", "@settingsGroupDownloads": { "description": "Settings group covering download behaviour and storage" }, - "settingsGroupSystem": "System", + "settingsGroupSystem": "Système", "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "About & support", + "settingsGroupHelp": "À propos & Assistance", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" } From f8d4351d9edbee60d68617afac91ba2cff2c2bff Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 05:56:00 +0700 Subject: [PATCH 23/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 98 ++++++++++++++++++++--------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 5398a581..bd4042c7 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "dialogImportPlaylistMessage": "{count}개의 트랙이 재생목록 파일에서 발견되었습니다. 다운로드 대기열에 추가하시겠습니까?", "csvImportTracks": "CSV 파일의 트랙: {count}", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "M3U8로 추출", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "{total}개의 트랙 중 {exported}개 추출됨", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,43 +818,43 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "추출할 다운로드된 파일 엊ㅅ음", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "추출 실패", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "다른 곳에서 열기...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "이 트랙의 플랫폼 링크를 찾을 수 없음.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "중복된 트랙 보기", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "중복 저장된 트랙 찾기", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "중복", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "중복된 트랙이 없습니다.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "최고 음질 선택", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "\"{trackName}\"의 {count}개의 저음질 복사본을 삭제하시겠습니까?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -866,7 +866,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "\"{trackName}\"의 복사본을 삭제하시겠습니까?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -2091,11 +2091,11 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, - "appearanceForceBlur": "Always use blur effects", + "appearanceForceBlur": "항상 블러 효과 사용", "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "appearanceForceBlurSubtitle": "기본적으로 비활성화된 기기에서도 하단 바의 블러 효과를 활성화합니다.\n성능에 영향을 줄 수도 있습니다.", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -2759,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "tutorialWelcomeTitle": "SpotiFLAC Mobile에 어서오세요!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2767,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 기능이 지원하는 출처의 링크를 붙여넣기", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -4283,23 +4283,23 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "editMetadataAutoFillDesc": "메타데이터 확장 기능을 선택하고, 필드를 지정한 다음, 적용하기 전에 해당 데이터를 확인", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillSource": "Metadata source", + "editMetadataAutoFillSource": "메타데이터 출처", "@editMetadataAutoFillSource": { "description": "Label for the metadata extension selector in online auto-fill" }, - "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "editMetadataAutoFillSourceAutomatic": "자동 (제공자 우선순위)", "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, - "editMetadataAutoFillFind": "Find metadata", + "editMetadataAutoFillFind": "메타데이터 찾기", "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, - "editMetadataAutoFillPreview": "Data from {source}", + "editMetadataAutoFillPreview": "{source}의 데이터", "@editMetadataAutoFillPreview": { "description": "Title for the online metadata preview", "placeholders": { @@ -4308,11 +4308,11 @@ } } }, - "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "editMetadataAutoFillCoverAvailable": "커버 아트워크 이용 가능", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "Apply selected data", + "editMetadataAutoFillApply": "선택된 데이터 적용하기", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, @@ -4473,7 +4473,7 @@ "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "Last used", + "libraryDefaultViewLastUsed": "마지막으로 사용됨", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4577,7 +4577,7 @@ "@audioAnalysisSpectralCutoff": { "description": "Estimated spectral cutoff metric label" }, - "audioAnalysisCutoffNotDetected": "Not detected", + "audioAnalysisCutoffNotDetected": "감지되지 않음", "@audioAnalysisCutoffNotDetected": { "description": "Displayed when no reliable broadband spectral cutoff can be detected" }, @@ -4651,11 +4651,11 @@ "@cancelDownloadKeep": { "description": "Dialog button - keep the active download (do not cancel)" }, - "queueCancelledTitle": "Download cancelled", + "queueCancelledTitle": "다운로드 취소됨", "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "queueCancelledMessage": "이 다운로드는 취소되었습니다. 다시 시도하거나, 대기열에서 삭제하세요.", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, @@ -4924,7 +4924,7 @@ } } }, - "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "homeImportCsvTooltip": "재생목록 가져오기 (CSV, M3U)", "@homeImportCsvTooltip": { "description": "Tooltip for importing a CSV or M3U playlist file into Home search" }, @@ -4992,7 +4992,7 @@ "@trackCoverReplaceNotice": { "description": "Notice shown when a new cover has been selected but not saved yet" }, - "trackCoverResolution": "Cover resolution", + "trackCoverResolution": "커버 해상도", "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, @@ -5012,47 +5012,47 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "Download next", + "queueDownloadNext": "다음으로 다운로드", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, - "queueMoveUp": "Move up", + "queueMoveUp": "위로 이동", "@queueMoveUp": { "description": "Queue item menu action - move the queued item one position earlier" }, - "queueMoveDown": "Move down", + "queueMoveDown": "아래로 이동", "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, - "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "editMetadataMusicBrainzButton": "MusicBrainz에서 가져옴", "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, - "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "editMetadataMusicBrainzFilled": "MusicBrainz에서 업데이트됨", "@editMetadataMusicBrainzFilled": { "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" }, - "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "editMetadataMusicBrainzNothing": "MusicBrainZ에서 발견되지 않음", "@editMetadataMusicBrainzNothing": { "description": "Snackbar when the MusicBrainz lookup returns no data" }, - "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "editMetadataMusicBrainzNeedsIsrc": "ISRC 태그 필요", "@editMetadataMusicBrainzNeedsIsrc": { "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" }, - "nowPlayingRepeatOff": "Repeat off", + "nowPlayingRepeatOff": "반복 끄기", "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "Repeat all", + "nowPlayingRepeatAll": "전체 반복", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, - "nowPlayingRepeatOne": "Repeat one", + "nowPlayingRepeatOne": "한 곡 반복", "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "{count} downloads failed while offline", + "queueNetworkFailedOffline": "오프라인 중에 {count}개의 다운로드 실패", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5392,7 +5392,7 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "libraryFilterMetadataMissingIsrc": "ISRC 없음", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, @@ -6239,11 +6239,11 @@ "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, - "settingsSearchHint": "Search settings", + "settingsSearchHint": "설정 찾기", "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "No settings match \"{query}\"", + "settingsSearchNoResults": "\"{query}\"과 일치하는 설정 없음", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6252,19 +6252,19 @@ } } }, - "settingsGroupInterface": "Extensions & appearance", + "settingsGroupInterface": "확장 프로그램 & 모습", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, - "settingsGroupContent": "Content & metadata", + "settingsGroupContent": "콘텐츠 & 메타데이터", "@settingsGroupContent": { "description": "Settings group covering the library, metadata and lyrics" }, - "settingsGroupDownloads": "Downloads & files", + "settingsGroupDownloads": "다운로드 & 파일", "@settingsGroupDownloads": { "description": "Settings group covering download behaviour and storage" }, - "settingsGroupSystem": "System", + "settingsGroupSystem": "시스템", "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, From 5b6aafdf1f9491a7790d9742351d1f7b0b59c7c0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 20:13:12 +0700 Subject: [PATCH 24/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index bd4042c7..f24fa37b 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -473,7 +473,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "음악 메타데이터를 검색하고\\n확장 프로그램을 관리하고\\n라이브러리를 정리하세요", + "aboutAppDescription": "음악 메타데이터를 검색하고, 확장 프로그램을 관리하고, 라이브러리를 정리하세요", "@aboutAppDescription": { "description": "App description in header card" }, @@ -670,7 +670,7 @@ "@setupLanguageTitle": { "description": "Title for the language selection step in setup" }, - "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요\\n나중에 설정에서 변경할 수 있습니다", + "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요. 나중에 설정에서 변경할 수 있습니다", "@setupLanguageDescription": { "description": "Description for the language selection step in setup" }, @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "{count}개의 트랙이 재생목록 파일에서 발견되었습니다. 다운로드 대기열에 추가하시겠습니까?", + "dialogImportPlaylistMessage": "{count} 개의 트랙이 재생목록 파일에서 발견되었습니다. 다운로드 목록에 추가하시겠습니까?", "csvImportTracks": "CSV 파일의 트랙: {count}", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "M3U8로 추출", + "collectionExportM3u": "M3U8로 내보내기", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "{total}개의 트랙 중 {exported}개 추출됨", + "collectionExportM3uDone": "{total} 개의 트랙 중 {exported} 개 내보내짐", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,11 +818,11 @@ } } }, - "collectionExportM3uNone": "추출할 다운로드된 파일 엊ㅅ음", + "collectionExportM3uNone": "내보낼 다운로드된 파일 없음", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "추출 실패", + "collectionExportM3uFailed": "내보내기 실패", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, @@ -830,7 +830,7 @@ "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "이 트랙의 플랫폼 링크를 찾을 수 없음.", + "trackOpenOnNoLinks": "이 트랙의 플랫폼 링크를 찾을 수 없습니다", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, @@ -854,7 +854,7 @@ "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "\"{trackName}\"의 {count}개의 저음질 복사본을 삭제하시겠습니까?", + "duplicatesKeepBestMessage": "\"{trackName}\"의 {count} 개의 저음질 복사본을 삭제하시겠습니까?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -2767,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 기능이 지원하는 출처의 링크를 붙여넣기", + "tutorialWelcomeTip1": "설치된 확장 프로그램에서 지원되는 음악을 검색하거나, 지원되는 출처의 음악 링크를 붙여넣으세요", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -2791,7 +2791,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다\\n작동 방식은 다음과 같습니다", + "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다. 작동 방식은 다음과 같습니다", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -4316,7 +4316,7 @@ "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, - "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "editMetadataAutoFillDoneFromSource": "{source}에서 {count} 개의 {count, plural, =1{필드} other{필드}}이 채워졌습니다", "@editMetadataAutoFillDoneFromSource": { "description": "Snackbar confirming fields applied from a selected metadata source", "placeholders": { @@ -4456,7 +4456,7 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "queuePlaylistCount": "{count, plural, =1{1 개의 재생목록} other{{count} 재생목록}}", "@queuePlaylistCount": { "description": "Playlist count label with plural support", "placeholders": { @@ -4469,7 +4469,7 @@ "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, - "libraryDefaultView": "Default view", + "libraryDefaultView": "기본 보기", "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, From 15cda358f73f6c3c4e9f7db92ce6dfbdc215991d Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 21:36:50 +0700 Subject: [PATCH 25/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 92 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 46 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index f24fa37b..c8595413 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -182,11 +182,11 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "고품질 표지 이미지", + "optionsMaxQualityCover": "고품질 앨범 커버", "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "최고 해상도의 표지 이미지를 다운로드", + "optionsMaxQualityCoverSubtitle": "최고 해상도의 앨범 커버를 다운로드", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "M3U8로 내보내기", + "collectionExportM3u": "M3U8로 추출", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "{total} 개의 트랙 중 {exported} 개 내보내짐", + "collectionExportM3uDone": "{total} 개의 트랙 중 {exported} 개 추출됨", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,11 +818,11 @@ } } }, - "collectionExportM3uNone": "내보낼 다운로드된 파일 없음", + "collectionExportM3uNone": "추출할 다운로드된 파일이 없음", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "내보내기 실패", + "collectionExportM3uFailed": "추출 실패", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, @@ -830,7 +830,7 @@ "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "이 트랙의 플랫폼 링크를 찾을 수 없습니다", + "trackOpenOnNoLinks": "이 트랙에 대한 플랫폼 링크를 찾을 수 없습니다", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, @@ -846,7 +846,7 @@ "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "중복된 트랙이 없습니다.", + "duplicatesEmpty": "중복된 트랙이 없습니다", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, @@ -1442,7 +1442,7 @@ "@lyricsModeBoth": { "description": "Lyrics mode option - embed and external" }, - "lyricsModeBothSubtitle": ".lrc 파일을 삽입하고 저장합니다", + "lyricsModeBothSubtitle": "가사를 삽입하고 .lrc 파일을 저장합니다", "@lyricsModeBothSubtitle": { "description": "Subtitle for both option" }, @@ -1875,7 +1875,7 @@ "@extensionsInstallButton": { "description": "Button to install extension from file" }, - "extensionsInfoTip": "확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처에서만 확장 프로그램을 설치하세요", + "extensionsInfoTip": "확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처의 확장 프로그램만 설치하세요", "@extensionsInfoTip": { "description": "Security warning about extensions" }, @@ -2087,7 +2087,7 @@ "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 표지 이미지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우)", + "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 앨범 커버가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우)", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, @@ -2095,7 +2095,7 @@ "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "기본적으로 비활성화된 기기에서도 하단 바의 블러 효과를 활성화합니다.\n성능에 영향을 줄 수도 있습니다.", + "appearanceForceBlurSubtitle": "기본적으로 비활성화된 기기에서도 하단바 블러 효과를 활성화합니다. 성능이 저하될 수 있습니다", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -2139,7 +2139,7 @@ "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "한 번에 1개의 트랙", + "concurrentDownloadsOne": "한 번에 1 개의 트랙", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, @@ -2767,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "설치된 확장 프로그램에서 지원되는 음악을 검색하거나, 지원되는 출처의 음악 링크를 붙여넣으세요", + "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 프로그램이 지원하는 출처의 링크를 붙여넣으세요", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -2775,7 +2775,7 @@ "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "메타데이터, 표지 이미지 및 가사를 자동으로 추가할 수 있습니다", + "tutorialWelcomeTip3": "메타데이터, 앨범 커버 및 가사를 자동으로 추가할 수 있습니다", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2933,11 +2933,11 @@ "@cacheTempDirectoryDesc": { "description": "Description of what temporary directory contains" }, - "cacheCoverImage": "표지 이미지 캐시", + "cacheCoverImage": "앨범 커버 캐시", "@cacheCoverImage": { "description": "Cache item title for persistent cover images" }, - "cacheCoverImageDesc": "다운로드된 앨범 및 트랙 표지 이미지입니다. 볼 때 다시 다운로드됩니다", + "cacheCoverImageDesc": "다운로드된 앨범 및 트랙 앨범 커버입니다. 볼 때 다시 다운로드됩니다", "@cacheCoverImageDesc": { "description": "Description of what cover image cache contains" }, @@ -2945,7 +2945,7 @@ "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, - "cacheLibraryCoverDesc": "로컬 음악 파일에서 추출된 표지 이미지입니다. 다음 스캔 시 다시 추출됩니다", + "cacheLibraryCoverDesc": "로컬 음악 파일에서 추출된 앨범 커버입니다. 다음 스캔 시 다시 추출됩니다", "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, @@ -3077,7 +3077,7 @@ "@cacheRefreshStats": { "description": "Button label to refresh cache statistics" }, - "trackSaveCoverArt": "표지 이미지 저장", + "trackSaveCoverArt": "앨범 커버 저장", "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, @@ -3097,7 +3097,7 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldCover": "표지 이미지", + "trackReEnrichFieldCover": "앨범 커버", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" }, @@ -3129,7 +3129,7 @@ "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" }, - "trackCoverSaved": "표지 이미지가 ''{fileName}''에 저장됨", + "trackCoverSaved": "앨범 커버가 ''{fileName}''에 저장됨", "@trackCoverSaved": { "description": "Snackbar after cover art saved", "placeholders": { @@ -3583,11 +3583,11 @@ "@artistOptionRemoveFromFavorites": { "description": "Action label - remove artist from favorite artists" }, - "collectionPlaylistChangeCover": "표지 이미지 변경", + "collectionPlaylistChangeCover": "앨범 커버 변경", "@collectionPlaylistChangeCover": { "description": "Bottom sheet action to pick a custom cover image for a playlist" }, - "collectionPlaylistRemoveCover": "표지 이미지 제거", + "collectionPlaylistRemoveCover": "앨범 커버 제거", "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, @@ -4283,7 +4283,7 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "메타데이터 확장 기능을 선택하고, 필드를 지정한 다음, 적용하기 전에 해당 데이터를 확인", + "editMetadataAutoFillDesc": "메타데이터 확장 프로그램을 선택하고, 필드를 지정한 다음, 적용하기 전에 해당 데이터를 확인", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, @@ -4308,15 +4308,15 @@ } } }, - "editMetadataAutoFillCoverAvailable": "커버 아트워크 이용 가능", + "editMetadataAutoFillCoverAvailable": "커버 아트워크 사용 가능", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "선택된 데이터 적용하기", + "editMetadataAutoFillApply": "선택된 데이터 적용", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, - "editMetadataAutoFillDoneFromSource": "{source}에서 {count} 개의 {count, plural, =1{필드} other{필드}}이 채워졌습니다", + "editMetadataAutoFillDoneFromSource": "{source}에서 {count} 개의 {count, plural, =1{필드} other{필드}}가 채워짐", "@editMetadataAutoFillDoneFromSource": { "description": "Snackbar confirming fields applied from a selected metadata source", "placeholders": { @@ -4397,7 +4397,7 @@ "@editMetadataFieldCopyright": { "description": "Chip label for copyright field in auto-fill selector" }, - "editMetadataFieldCover": "표지 이미지", + "editMetadataFieldCover": "앨범 커버", "@editMetadataFieldCover": { "description": "Chip label for cover art field in auto-fill selector" }, @@ -4456,7 +4456,7 @@ "@queueEmptySinglesSubtitle": { "description": "Empty state subtitle for single track downloads" }, - "queuePlaylistCount": "{count, plural, =1{1 개의 재생목록} other{{count} 재생목록}}", + "queuePlaylistCount": "{count, plural, =1{1 개의 재생목록} other{{count} 개의 재생목록}}", "@queuePlaylistCount": { "description": "Playlist count label with plural support", "placeholders": { @@ -4465,7 +4465,7 @@ } } }, - "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "queueEmptyPlaylistsSubtitle": "트랙을 정리하려면 재생목록을 만드세요", "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, @@ -4473,7 +4473,7 @@ "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "마지막으로 사용됨", + "libraryDefaultViewLastUsed": "최근 사용", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4655,7 +4655,7 @@ "@queueCancelledTitle": { "description": "Dialog title when opening a cancelled queue item" }, - "queueCancelledMessage": "이 다운로드는 취소되었습니다. 다시 시도하거나, 대기열에서 삭제하세요.", + "queueCancelledMessage": "이 다운로드가 취소되었습니다. 다시 시도하거나, 다운로드 목록에서 제거하세요", "@queueCancelledMessage": { "description": "Dialog body when opening a cancelled queue item" }, @@ -4956,7 +4956,7 @@ "@optionsEmbedMetadata": { "description": "Settings toggle title for writing metadata into downloaded files" }, - "optionsEmbedMetadataSubtitleOn": "메타데이터, 표지 이미지 및 내장 가사를 파일에 기록", + "optionsEmbedMetadataSubtitleOn": "메타데이터, 앨범 커버 및 내장된 가사를 파일에 기록", "@optionsEmbedMetadataSubtitleOn": { "description": "Subtitle when metadata embedding is enabled" }, @@ -4964,7 +4964,7 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "trackCoverNoEmbeddedArt": "내장된 표지 이미지가 없음", + "trackCoverNoEmbeddedArt": "내장된 앨범 커버가 없음", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" }, @@ -4996,11 +4996,11 @@ "@trackCoverResolution": { "description": "Label for selecting the embedded cover art resolution" }, - "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "trackCoverResolutionHint": "저장할 때 이미지의 긴 변 길이를 설정합니다. 확대해도 이미지의 세부 정보는 늘어나지 않습니다", "@trackCoverResolutionHint": { "description": "Explanation below the embedded cover art resolution selector" }, - "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "trackCoverResizeFailed": "앨범 커버를 원하는 크기로 조정할 수 없습니다. 다른 크기나 이미지를 사용해 보세요", "@trackCoverResizeFailed": { "description": "Error shown when resizing cover art before saving metadata fails" }, @@ -5012,7 +5012,7 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadNext": "다음으로 다운로드", + "queueDownloadNext": "다음 다운로드", "@queueDownloadNext": { "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" }, @@ -5024,7 +5024,7 @@ "@queueMoveDown": { "description": "Queue item menu action - move the queued item one position later" }, - "editMetadataMusicBrainzButton": "MusicBrainz에서 가져옴", + "editMetadataMusicBrainzButton": "MusicBrainz에서 가져오기", "@editMetadataMusicBrainzButton": { "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" }, @@ -5044,7 +5044,7 @@ "@nowPlayingRepeatOff": { "description": "Repeat toggle tooltip when repeat is disabled" }, - "nowPlayingRepeatAll": "전체 반복", + "nowPlayingRepeatAll": "모두 반복", "@nowPlayingRepeatAll": { "description": "Repeat toggle tooltip when the whole queue repeats" }, @@ -5052,7 +5052,7 @@ "@nowPlayingRepeatOne": { "description": "Repeat toggle tooltip when the current track repeats" }, - "queueNetworkFailedOffline": "오프라인 중에 {count}개의 다운로드 실패", + "queueNetworkFailedOffline": "오프라인 중에 {count} 개의 다운로드 실패", "@queueNetworkFailedOffline": { "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", "placeholders": { @@ -5276,7 +5276,7 @@ "@settingsMetadata": { "description": "Settings menu item - metadata settings" }, - "settingsMetadataSubtitle": "표지 이미지, 태그, 리플레이게인, 제공자", + "settingsMetadataSubtitle": "앨범 커버, 태그, 리플레이게인, 제공자", "@settingsMetadataSubtitle": { "description": "Subtitle for metadata settings" }, @@ -5336,7 +5336,7 @@ "@downloadQualityVariants": { "description": "Setting to retain multiple quality versions of the same track" }, - "downloadQualityVariantsDescription": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "downloadQualityVariantsDescription": "모든 화질 버전을 유지하고, 같은 파일 이름이 이미 있는 경우에만 측정된 화질을 파일 이름에 추가합니다", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, @@ -6239,11 +6239,11 @@ "@extensionVerificationOpenBrowser": { "description": "Button to open the extension verification URL in a browser" }, - "settingsSearchHint": "설정 찾기", + "settingsSearchHint": "설정 검색", "@settingsSearchHint": { "description": "Placeholder of the search field on the Settings tab" }, - "settingsSearchNoResults": "\"{query}\"과 일치하는 설정 없음", + "settingsSearchNoResults": "\"{query}\"과 일치하는 설정이 없음", "@settingsSearchNoResults": { "description": "Shown when a Settings search returns nothing", "placeholders": { @@ -6252,7 +6252,7 @@ } } }, - "settingsGroupInterface": "확장 프로그램 & 모습", + "settingsGroupInterface": "확장 프로그램 & 디자인", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, @@ -6268,7 +6268,7 @@ "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "About & support", + "settingsGroupHelp": "정보 & 지원", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" } From 4b6c77fd501cf0c04869411dabbbd0e0dcbcb844 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 22:35:57 +0700 Subject: [PATCH 26/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index c8595413..f2f18bed 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "M3U8로 추출", + "collectionExportM3u": "M3U8로 내보내기", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "{total} 개의 트랙 중 {exported} 개 추출됨", + "collectionExportM3uDone": "{total} 개의 트랙 중 {exported} 개 내보내기 완료", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,15 +818,15 @@ } } }, - "collectionExportM3uNone": "추출할 다운로드된 파일이 없음", + "collectionExportM3uNone": "내보낼 다운로드된 파일이 없음", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "추출 실패", + "collectionExportM3uFailed": "내보내기 실패", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "다른 곳에서 열기...", + "trackOpenOn": "다른 음원 플랫폼에서 열기", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, @@ -1712,7 +1712,7 @@ "@storeFilterIntegration": { "description": "Repo filter - integrations" }, - "storeClearFilters": "필터 지우기", + "storeClearFilters": "필터 초기화", "@storeClearFilters": { "description": "Button to clear all filters" }, @@ -5906,7 +5906,7 @@ "@nowPlayingShuffleLibrary": { "description": "Button label to shuffle and play the entire local library" }, - "nowPlayingQueueEmpty": "현재 다운로드 목록이 비어 있음", + "nowPlayingQueueEmpty": "현재 재생목록이 비어 있음", "@nowPlayingQueueEmpty": { "description": "Empty state when the playback queue has no items" }, @@ -5995,7 +5995,7 @@ "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, - "snackbarAddedToQueueGeneric": "현재 다운로드 목록에 추가됨", + "snackbarAddedToQueueGeneric": "현재 재생목록에 추가됨", "@snackbarAddedToQueueGeneric": { "description": "Snackbar when a track is added to the playback queue without naming it" }, @@ -6080,7 +6080,7 @@ "@trackPlayNext": { "description": "Menu action to play a track as the next queue item" }, - "trackAddToQueue": "다운로드 목록에 추가", + "trackAddToQueue": "현재 재생목록에 추가", "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, From 7c07f245adadfb1d9a16aea41a3f9fc49f67d11c Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 2 Aug 2026 23:54:00 +0700 Subject: [PATCH 27/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index f2f18bed..1df592d0 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -793,7 +793,7 @@ "description": "Dialog title - import CSV playlist" }, "dialogImportPlaylistMessage": "{count} 개의 트랙이 재생목록 파일에서 발견되었습니다. 다운로드 목록에 추가하시겠습니까?", - "csvImportTracks": "CSV 파일의 트랙: {count}", + "csvImportTracks": "CSV 파일의 트랙 수: {count}", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -826,7 +826,7 @@ "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "다른 음원 플랫폼에서 열기", + "trackOpenOn": "음원 플랫폼에서 열기", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, From 29bb1405ad4a4d4b8f4d1713d6b7207defdb935a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 3 Aug 2026 01:05:05 +0700 Subject: [PATCH 28/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 120 ++++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 1df592d0..b86a9c75 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -33,7 +33,7 @@ "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "계속하려면 확장 프로그램을 설치하세요", + "homeEmptySubtitle": "계속하려면 확장 기능을 설치하세요", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, @@ -73,7 +73,7 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsExtensions": "확장 프로그램", + "settingsExtensions": "확장 기능", "@settingsExtensions": { "description": "Settings section - extension management" }, @@ -149,7 +149,7 @@ "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "확장 프로그램 사용: {extensionName}", + "optionsUsingExtension": "확장 기능 사용: {extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -280,7 +280,7 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "확장 프로그램 레포", + "optionsExtensionStore": "확장 기능 레포", "@optionsExtensionStore": { "description": "Show/hide repo tab" }, @@ -332,7 +332,7 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "extensionsTitle": "확장 프로그램", + "extensionsTitle": "확장 기능", "@extensionsTitle": { "description": "Extensions page title" }, @@ -353,11 +353,11 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "확장 프로그램 레포", + "storeTitle": "확장 기능 레포", "@storeTitle": { "description": "Repo screen title" }, - "storeSearch": "확장 프로그램 검색...", + "storeSearch": "확장 기능 검색...", "@storeSearch": { "description": "Repo search placeholder" }, @@ -473,7 +473,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "음악 메타데이터를 검색하고, 확장 프로그램을 관리하고, 라이브러리를 정리하세요", + "aboutAppDescription": "음악 메타데이터를 검색하고, 확장 기능을 관리하고, 라이브러리를 정리하세요", "@aboutAppDescription": { "description": "App description in header card" }, @@ -746,15 +746,15 @@ "@dialogClearAll": { "description": "Dialog title - clear all items" }, - "dialogRemoveExtension": "확장 프로그램 제거", + "dialogRemoveExtension": "확장 기능 제거", "@dialogRemoveExtension": { "description": "Dialog title - uninstall extension" }, - "dialogRemoveExtensionMessage": "이 확장 프로그램을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다", + "dialogRemoveExtensionMessage": "이 확장 기능을 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다", "@dialogRemoveExtensionMessage": { "description": "Dialog message - uninstall confirmation" }, - "dialogUninstallExtension": "확장 프로그램을 제거하시겠습니까?", + "dialogUninstallExtension": "확장 기능을 제거하시겠습니까?", "@dialogUninstallExtension": { "description": "Dialog title - uninstall extension" }, @@ -989,11 +989,11 @@ } } }, - "snackbarFailedToInstall": "확장 프로그램 설치 실패", + "snackbarFailedToInstall": "확장 기능 설치 실패", "@snackbarFailedToInstall": { "description": "Snackbar - extension install error" }, - "snackbarFailedToUpdate": "확장 프로그램 업데이트 실패", + "snackbarFailedToUpdate": "확장 기능 업데이트 실패", "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, @@ -1017,7 +1017,7 @@ "@errorUrlNotRecognized": { "description": "Error title - URL not handled by any extension or service" }, - "errorUrlNotRecognizedMessage": "이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 프로그램이 설치되어 있는지 확인하세요", + "errorUrlNotRecognizedMessage": "이 링크는 지원되지 않습니다. URL이 올바른지, 호환되는 확장 기능이 설치되어 있는지 확인하세요", "@errorUrlNotRecognizedMessage": { "description": "Error message - URL not recognized explanation" }, @@ -1276,15 +1276,15 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsDescription": "자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요", + "providerPriorityFallbackExtensionsDescription": "자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 기능을 선택하세요", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "다운로드 공급자 기능이 활성화된 확장 프로그램만 여기에 나열됩니다", + "providerPriorityFallbackExtensionsHint": "다운로드 제공자 기능이 활성화된 확장 기능만 여기에 나열됩니다", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerExtension": "확장 프로그램", + "providerExtension": "확장 기능", "@providerExtension": { "description": "Label for extension-provided providers" }, @@ -1716,11 +1716,11 @@ "@storeClearFilters": { "description": "Button to clear all filters" }, - "storeAddRepoTitle": "확장 프로그램 레포지토리 추가", + "storeAddRepoTitle": "확장 기능 레포지토리 추가", "@storeAddRepoTitle": { "description": "Store setup screen - heading when no repo is configured" }, - "storeAddRepoDescription": "확장 프로그램을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 레포지토리 URL을 입력하세요", + "storeAddRepoDescription": "확장 기능을 찾아보고 설치하려면 registry.json 파일이 포함된 GitHub 레포지토리 URL을 입력하세요", "@storeAddRepoDescription": { "description": "Store setup screen - explanatory text" }, @@ -1740,7 +1740,7 @@ "@storeChangeRepoTooltip": { "description": "Tooltip for the change-repository icon button in the app bar" }, - "storeRepoDialogTitle": "확장 프로그램 레포지토리", + "storeRepoDialogTitle": "확장 기능 레포지토리", "@storeRepoDialogTitle": { "description": "Title of the change/remove repository dialog" }, @@ -1756,11 +1756,11 @@ "@storeLoadError": { "description": "Error heading when the store cannot be loaded" }, - "storeEmptyNoExtensions": "사용 가능한 확장 프로그램이 없음", + "storeEmptyNoExtensions": "사용 가능한 확장 기능이 없음", "@storeEmptyNoExtensions": { "description": "Message when store has no extensions" }, - "storeEmptyNoResults": "확장 프로그램을 찾을 수 없음", + "storeEmptyNoResults": "확장 기능을 찾을 수 없음", "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, @@ -1808,7 +1808,7 @@ "@extensionSettings": { "description": "Section header - extension settings" }, - "extensionRemoveButton": "확장 프로그램 제거", + "extensionRemoveButton": "확장 기능 제거", "@extensionRemoveButton": { "description": "Button to uninstall extension" }, @@ -1859,11 +1859,11 @@ "@extensionsProviderPrioritySection": { "description": "Section header - provider priority" }, - "extensionsInstalledSection": "설치된 확장 프로그램", + "extensionsInstalledSection": "설치된 확장 기능", "@extensionsInstalledSection": { "description": "Section header - installed extensions" }, - "extensionsNoExtensions": "설치된 확장 프로그램이 없음", + "extensionsNoExtensions": "설치된 확장 기능이 없음", "@extensionsNoExtensions": { "description": "Empty state - no extensions" }, @@ -1871,19 +1871,19 @@ "@extensionsNoExtensionsSubtitle": { "description": "Empty state subtitle" }, - "extensionsInstallButton": "확장 프로그램 설치", + "extensionsInstallButton": "확장 기능 설치", "@extensionsInstallButton": { "description": "Button to install extension from file" }, - "extensionsInfoTip": "확장 프로그램은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처의 확장 프로그램만 설치하세요", + "extensionsInfoTip": "확장 기능은 새 메타데이터와 다운로드 제공자를 추가할 수 있습니다. 신뢰할 수 있는 출처의 확장 기능만 설치하세요", "@extensionsInfoTip": { "description": "Security warning about extensions" }, - "extensionsInstalledSuccess": "확장 프로그램 설치 성공", + "extensionsInstalledSuccess": "확장 기능 설치 성공", "@extensionsInstalledSuccess": { "description": "Success message after install" }, - "extensionsInstalledCount": "{count} 개의 확장 프로그램 설치 성공", + "extensionsInstalledCount": "{count} 개의 확장 기능 설치 성공", "@extensionsInstalledCount": { "description": "Success message after installing multiple extensions", "placeholders": { @@ -1893,7 +1893,7 @@ } } }, - "extensionsInstallPartialSuccess": "{attempted} 개의 확장 프로그램 중 {installed} 개가 설치됨", + "extensionsInstallPartialSuccess": "{attempted} 개의 확장 기능 중 {installed} 개가 설치됨", "@extensionsInstallPartialSuccess": { "description": "Message when installing multiple extensions partially succeeds", "placeholders": { @@ -1915,15 +1915,15 @@ "@extensionsDownloadPrioritySubtitle": { "description": "Subtitle for download priority" }, - "extensionsFallbackTitle": "대체 확장 프로그램", + "extensionsFallbackTitle": "대체 확장 기능", "@extensionsFallbackTitle": { "description": "Setting and page title for choosing which download extensions can be used during fallback" }, - "extensionsFallbackSubtitle": "설치된 다운로드 확장 프로그램 중 대체 프로그램으로 사용할 항목을 선택하세요", + "extensionsFallbackSubtitle": "설치된 다운로드 확장 기능 중 대체로 사용할 항목을 선택하세요", "@extensionsFallbackSubtitle": { "description": "Subtitle for download fallback extensions menu" }, - "extensionsNoDownloadProvider": "다운로드 제공자가 있는 확장 프로그램가 없음", + "extensionsNoDownloadProvider": "다운로드 제공자가 있는 확장 기능이 없음", "@extensionsNoDownloadProvider": { "description": "Empty state - no download providers" }, @@ -1935,7 +1935,7 @@ "@extensionsMetadataPrioritySubtitle": { "description": "Subtitle for metadata priority" }, - "extensionsNoMetadataProvider": "메타데이터 제공자가 있는 확장 프로그램이 없음", + "extensionsNoMetadataProvider": "메타데이터 제공자가 있는 확장 기능이 없음", "@extensionsNoMetadataProvider": { "description": "Empty state - no metadata providers" }, @@ -1943,7 +1943,7 @@ "@extensionsSearchProvider": { "description": "Setting - search provider selection" }, - "extensionsNoCustomSearch": "사용자 정의 검색이 있는 확장 프로그램이 없음", + "extensionsNoCustomSearch": "사용자 정의 검색이 있는 확장 기능이 없음", "@extensionsNoCustomSearch": { "description": "Empty state - no search providers" }, @@ -1955,7 +1955,7 @@ "@extensionsCustomSearch": { "description": "Label for custom search provider" }, - "extensionsErrorLoading": "확장 프로그램 불러오기 오류", + "extensionsErrorLoading": "확장 기능 불러오기 오류", "@extensionsErrorLoading": { "description": "Error message when extension fails to load" }, @@ -2767,11 +2767,11 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 프로그램이 지원하는 출처의 링크를 붙여넣으세요", + "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 기능이 지원하는 출처의 링크를 붙여넣으세요", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "설치된 다운로드 확장 프로그램으로 FLAC 고음질 오디오를 다운로드할 수 있습니다", + "tutorialWelcomeTip2": "설치된 다운로드 확장 기능으로 FLAC 고음질 오디오를 다운로드할 수 있습니다", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, @@ -2815,15 +2815,15 @@ "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, - "tutorialExtensionsTitle": "확장 프로그램", + "tutorialExtensionsTitle": "확장 기능", "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "커뮤니티 확장 프로그램을 사용하여 앱의 기능을 확장하세요", + "tutorialExtensionsDesc": "커뮤니티 확장 기능을 사용하여 앱의 기능을 확장하세요", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "레포 탭을 탐색하여 유용한 확장 프로그램을 찾을 수 있습니다", + "tutorialExtensionsTip1": "레포 탭을 탐색하여 유용한 확장 기능을 찾을 수 있습니다", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, @@ -3700,7 +3700,7 @@ "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, - "lyricsProvidersInfoText": "확장 프로그램 가사 제공자는 내부 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", + "lyricsProvidersInfoText": "확장 기능의 가사 제공자는 내부 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, @@ -3730,7 +3730,7 @@ "@lyricsProvidersSaved": { "description": "Snackbar after saving lyrics provider priority" }, - "lyricsProvidersDiscardContent": "저장되지 않은 변경 사항이 손실됩니다", + "lyricsProvidersDiscardContent": "저장되지 않은 변경 사항은 손실됩니다", "@lyricsProvidersDiscardContent": { "description": "Body text of the discard-changes dialog on lyrics provider page" }, @@ -3758,7 +3758,7 @@ "@lyricsProviderLyricsPlusDesc": { "description": "Description for LyricsPlus provider" }, - "lyricsProviderExtensionDesc": "확장 프로그램 제공자", + "lyricsProviderExtensionDesc": "확장 기능 제공자", "@lyricsProviderExtensionDesc": { "description": "Generic description for extension-based lyrics providers" }, @@ -3911,7 +3911,7 @@ } } }, - "backupContentsExtensions": "{count, plural, =1{1 개의 확장 프로그램} other{{count} 개의 확장 프로그램}}", + "backupContentsExtensions": "{count, plural, =1{1 개의 확장 기능} other{{count} 개의 확장 기능}}", "@backupContentsExtensions": { "description": "Backup contents row for installed extensions count", "placeholders": { @@ -3920,15 +3920,15 @@ } } }, - "backupIncludeSecrets": "확장 프로그램 자격 증명 포함", + "backupIncludeSecrets": "확장 기능 자격 증명 포함", "@backupIncludeSecrets": { "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" }, - "backupIncludeSecretsDescription": "확장 프로그램의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다", + "backupIncludeSecretsDescription": "확장 기능의 토큰과 API 키가 백업 파일에 함께 저장됩니다. 백업 파일은 안전하게 보관하세요. 비활성화하면 복원 후 다시 입력해야 합니다", "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}을 다시 설치할 수 없습니다. 레포에서 수동으로 설치하세요", + "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 기능} other{확장 기능}}을 다시 설치할 수 없습니다. 레포에서 수동으로 설치하세요", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4283,7 +4283,7 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "메타데이터 확장 프로그램을 선택하고, 필드를 지정한 다음, 적용하기 전에 해당 데이터를 확인", + "editMetadataAutoFillDesc": "메타데이터 확장 기능을 선택하고, 필드를 지정한 다음, 적용하기 전에 해당 데이터를 확인", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, @@ -4601,7 +4601,7 @@ "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" }, - "extensionsHomeFeedDescription": "메인 화면에 홈 피드를 제공하는 확장 프로그램을 선택하세요", + "extensionsHomeFeedDescription": "메인 화면에 홈 피드를 제공하는 확장 기능을 선택하세요", "@extensionsHomeFeedDescription": { "description": "Extensions page - description for home feed provider picker" }, @@ -4630,7 +4630,7 @@ } } }, - "extensionsNoHomeFeedExtensions": "홈 피드가 있는 확장 프로그램가 없음", + "extensionsNoHomeFeedExtensions": "홈 피드가 있는 확장 기능이 없음", "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, @@ -5292,7 +5292,7 @@ "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "업데이트, 데이터, 확장프로그램 레포, 디버그", + "settingsAppSubtitle": "업데이트, 데이터, 확장 기능 레포, 디버그", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, @@ -5344,11 +5344,11 @@ "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, - "downloadFallbackExtensions": "대체 확장 프로그램", + "downloadFallbackExtensions": "대체 확장 기능", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" }, - "downloadFallbackExtensionsSubtitle": "대체 확장 프로그램으로 사용할 확장 프로그램을 선택하세요", + "downloadFallbackExtensionsSubtitle": "대체 확장 기능으로 사용할 확장 기능을 선택하세요", "@downloadFallbackExtensionsSubtitle": { "description": "Subtitle for fallback extensions item" }, @@ -5516,7 +5516,7 @@ } } }, - "storeExtensionsCount": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}", + "storeExtensionsCount": "{count} 개의 {count, plural, =1{확장 기능} other{확장 기능}}", "@storeExtensionsCount": { "description": "Store extension result count", "placeholders": { @@ -5581,7 +5581,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "확장 프로그램 다운로드를 위한 Android 백그라운드 서비스", + "downloadNativeWorkerSubtitle": "확장 기능 다운로드를 위한 Android 백그라운드 서비스", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5623,11 +5623,11 @@ "@extensionCustomUrlHandling": { "description": "Extension detail section title for custom URL handling" }, - "extensionCustomUrlHandlingSubtitle": "이 확장 프로그램은 다음 사이트의 링크를 처리할 수 있습니다", + "extensionCustomUrlHandlingSubtitle": "이 확장 기능은 다음 사이트의 링크를 처리할 수 있습니다", "@extensionCustomUrlHandlingSubtitle": { "description": "Extension detail subtitle for custom URL handling" }, - "extensionCustomUrlHandlingShareHint": "이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 프로그램이 처리합니다", + "extensionCustomUrlHandlingShareHint": "이 사이트의 링크를 SpotiFLAC Mobile로 공유하면 이 확장 기능이 처리합니다", "@extensionCustomUrlHandlingShareHint": { "description": "Extension detail hint explaining share-to-app URL handling" }, @@ -6084,7 +6084,7 @@ "@trackAddToQueue": { "description": "Menu action to add a track to the playback queue" }, - "snackbarExtensionInstalledEnable": "''{extensionName}''이 설치됨. '설정 > 확장 프로그램'에서 활성화하세요", + "snackbarExtensionInstalledEnable": "''{extensionName}''이 설치됨. '설정 > 확장 기능'에서 활성화하세요", "@snackbarExtensionInstalledEnable": { "description": "Snackbar after installing an extension from the repo tab", "placeholders": { @@ -6252,7 +6252,7 @@ } } }, - "settingsGroupInterface": "확장 프로그램 & 디자인", + "settingsGroupInterface": "확장 기능 & 디자인", "@settingsGroupInterface": { "description": "Settings group covering look and feel" }, From 45df6733af5b722bcbe64d81b7b16d993202afc5 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 3 Aug 2026 09:55:42 +0700 Subject: [PATCH 29/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index b86a9c75..cd9fdd55 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -5392,7 +5392,7 @@ "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, - "libraryFilterMetadataMissingIsrc": "ISRC 없음", + "libraryFilterMetadataMissingIsrc": "ISRC 누락", "@libraryFilterMetadataMissingIsrc": { "description": "Filter option - items without any ISRC tag" }, From 46d50be8ff31fe6cf4975c60adf209e3e8a5086b Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 3 Aug 2026 11:48:27 +0700 Subject: [PATCH 30/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index cd9fdd55..f3052b7c 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1268,11 +1268,11 @@ "@providerPriorityTitle": { "description": "Provider priority page title" }, - "providerPriorityDescription": "드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래로 제공자를 차례로 시도합니다", + "providerPriorityDescription": "드래그하여 다운로드 제공자 순서를 변경하세요. 앱은 트랙을 다운로드할 경우에 위에서 아래 순서대로 제공자 사용 가능 여부를 확인합니다", "@providerPriorityDescription": { "description": "Provider priority page description" }, - "providerPriorityInfo": "첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자를 시도합니다", + "providerPriorityInfo": "첫 ​​번째 제공자에서 트랙을 사용할 수 없는 경우에 앱은 자동으로 다음 제공자 사용 가능 여부를 확인합니다", "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, @@ -1292,7 +1292,7 @@ "@metadataProviderPriorityTitle": { "description": "Metadata priority page title" }, - "metadataProviderPriorityDescription": "드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래로 제공자를 시도합니다", + "metadataProviderPriorityDescription": "드래그하여 메타데이터 제공자 순서를 변경하세요. 앱은 트랙을 검색하고 메타데이터를 가져올 경우에 위에서 아래 순서대로 제공자 사용 가능 여부를 확인합니다", "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, @@ -3696,7 +3696,7 @@ "@lyricsProvidersTitle": { "description": "Settings item title for lyrics provider order" }, - "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬할 수 있습니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다", + "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬할 수 있습니다. 가사를 찾을 때까지 위에서 아래 순서대로 제공자 사용 가능 여부를 확인합니다", "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, From ea9d0c3125cac8921e2673fe9c7428840b59135e Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 3 Aug 2026 15:08:06 +0700 Subject: [PATCH 31/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index f3052b7c..340b3d48 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1159,7 +1159,7 @@ "@filenameShowAdvancedTagsDescription": { "description": "Description for advanced filename tag toggle" }, - "folderOrganizationNone": "정리하지 않음", + "folderOrganizationNone": "분류하지 않음", "@folderOrganizationNone": { "description": "Folder option - flat structure" }, @@ -1183,7 +1183,7 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "다운로드된 파일을 폴더로 정리", + "folderOrganizationDescription": "다운로드된 파일을 폴더로 분류", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, From 9e71e1cc337745c044568af7c8f13f0b0e31e7e0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 3 Aug 2026 17:13:24 +0700 Subject: [PATCH 32/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 340b3d48..1aa32ac2 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -2059,11 +2059,11 @@ "@downloadUsePrimaryArtistOnly": { "description": "Setting - strip featured artists from folder name" }, - "downloadUsePrimaryArtistOnlyEnabled": "폴더 이름에서 피처링 아티스트가 제거됩니다 (예: Justin Bieber, Quavo → Justin Bieber)", + "downloadUsePrimaryArtistOnlyEnabled": "폴더 이름에서 피처링 아티스트를 제거합니다 (예: Justin Bieber, Quavo → Justin Bieber)", "@downloadUsePrimaryArtistOnlyEnabled": { "description": "Subtitle when primary artist only is enabled" }, - "downloadUsePrimaryArtistOnlyDisabled": "폴더 이름에 전체 아티스트 문자열이 사용됩니다", + "downloadUsePrimaryArtistOnlyDisabled": "폴더 이름에 전체 아티스트 문자열을 사용합니다", "@downloadUsePrimaryArtistOnlyDisabled": { "description": "Subtitle when primary artist only is disabled" }, @@ -3684,7 +3684,7 @@ } } }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "앨범 아티스트 태그로 이름이 지정된 폴더", + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "앨범 아티스트 태그를 기준으로 폴더 이름을 지정합니다", "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { "description": "Subtitle when album artist is used for folder names" }, @@ -4085,7 +4085,7 @@ "@downloadCreatePlaylistSourceFolder": { "description": "Setting to create a subfolder per playlist source" }, - "downloadCreatePlaylistSourceFolderEnabled": "각 재생 목록에 대한 하위 폴더를 만듭니다", + "downloadCreatePlaylistSourceFolderEnabled": "각 재생목록에 대한 하위 폴더를 만듭니다", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist folder is enabled" }, @@ -4193,11 +4193,11 @@ "@downloadFilterContributing": { "description": "Setting to strip contributing artists from Album Artist folder name" }, - "downloadFilterContributingEnabled": "앨범 아티스트 폴더 이름에서 제거된 참여 아티스트", + "downloadFilterContributingEnabled": "앨범 아티스트 폴더명에서 참여 아티스트를 제외합니다", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is on" }, - "downloadFilterContributingDisabled": "전체 앨범 아티스트 문자열 사용", + "downloadFilterContributingDisabled": "전체 앨범 아티스트 문자열을 사용합니다", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is off" }, From 00d0e957344ce3902a977b10288221031439fdf5 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 9 Aug 2026 00:29:59 +0700 Subject: [PATCH 33/72] New translations app_en.arb (Hindi) [ci skip] --- lib/l10n/arb/app_hi-IN.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/arb/app_hi-IN.arb b/lib/l10n/arb/app_hi-IN.arb index 99ebc774..5ee19c5c 100644 --- a/lib/l10n/arb/app_hi-IN.arb +++ b/lib/l10n/arb/app_hi-IN.arb @@ -1,7 +1,7 @@ { "@@locale": "hi", "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", + "appName": "Dd", "@appName": { "description": "App name - DO NOT TRANSLATE" }, @@ -9,7 +9,7 @@ "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Library", + "navLibrary": "Dd", "@navLibrary": { "description": "Bottom navigation - Library tab" }, @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Dn", "@navStore": { "description": "Bottom navigation - Extension repo tab" }, @@ -65,7 +65,7 @@ "@settingsTitle": { "description": "Settings screen title" }, - "settingsDownload": "Download", + "settingsDownload": "Omm", "@settingsDownload": { "description": "Settings section - download options" }, From bb083a06590e8a469b1f6f677968a4958e68401c Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 9 Aug 2026 01:29:56 +0700 Subject: [PATCH 34/72] New translations app_en.arb (Hindi) [ci skip] --- lib/l10n/arb/app_hi-IN.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/arb/app_hi-IN.arb b/lib/l10n/arb/app_hi-IN.arb index 5ee19c5c..d7ffdc9b 100644 --- a/lib/l10n/arb/app_hi-IN.arb +++ b/lib/l10n/arb/app_hi-IN.arb @@ -21,7 +21,7 @@ "@navStore": { "description": "Bottom navigation - Extension repo tab" }, - "homeTitle": "Home", + "homeTitle": "N", "@homeTitle": { "description": "Home screen title" }, @@ -6159,7 +6159,7 @@ "@regionCountryKR": { "description": "Country name for SongLink region picker" }, - "regionCountryIN": "India", + "regionCountryIN": "Omm", "@regionCountryIN": { "description": "Country name for SongLink region picker" }, From 7bd0b827836806792be0152b1e601f95f164ab23 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 10 Aug 2026 04:33:47 +0700 Subject: [PATCH 35/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 3d48e892..56619e99 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -802,7 +802,7 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Exportar como M3U8", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, From c9d8eb20e4be3f07ede78b32a92b34826b141b99 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 10 Aug 2026 05:32:21 +0700 Subject: [PATCH 36/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 56619e99..e31c80b4 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "dialogImportPlaylistMessage": "Se han encontrado {count} pistas en CSV. ¿Desea añadirlas en la cola de descarga?", "csvImportTracks": "{count} pistas de CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -806,7 +806,7 @@ "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "Exportado {exported} de {total} pistas", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,43 +818,43 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "No hay archivos descargados para exportar", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "Exportación fallida", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Abrir en...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "No se han encontrado enlaces para esta pista.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "Revisar duplicados", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "Encontrar pistas almacenadas más de una vez", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Duplicados", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "No se han encontrado pistas duplicadas.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Mantener mejor", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "¿Eliminar {count} copias de menor calidad del \"{trackName}\"?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -866,7 +866,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "¿Eliminar esta copia de \"{trackName}\"?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -1231,7 +1231,7 @@ "@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": "Esta versión está {count} lanzamientos detrás de la actual y ya no es soportada. Actualice para seguir usando la app.", "@updateRequiredNotice": { "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", "placeholders": { @@ -2083,19 +2083,19 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "Animaciones Hero", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "appearanceHeroAnimationsSubtitle": "Covers voladores entre pantallas, ejemplo: cuando abre el reproductor", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, - "appearanceForceBlur": "Always use blur effects", + "appearanceForceBlur": "Siempre use efecto desenfoque", "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "appearanceForceBlurSubtitle": "Habilite la barra de navegación desenfocada incluso en dispositivos donde está desactivada por defecto. Puede costar rendimiento.", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -2131,19 +2131,19 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "settingsConcurrentDownloads": "Concurrent downloads", + "settingsConcurrentDownloads": "Descargas concurrentes", "@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": "Descargar varios archivos a la vez es rápido, pero con algunos proveedores puede haber un límite en pedidos paralelos.", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "1 track at a time", + "concurrentDownloadsOne": "1 archivo a la vez", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "Up to {count} tracks at once", + "concurrentDownloadsCount": "Hasta {count} archivos a la vez", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2759,7 +2759,7 @@ } } }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "tutorialWelcomeTitle": "¡Bienvenido a SpotiFLAC Móvil!", "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, @@ -2767,7 +2767,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Busca música o pega un enlace desde cualquier fuente que soporte tus extensiones instaladas", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -2949,19 +2949,19 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "libraryPlaybackNormalization": "Volume normalization", + "libraryPlaybackNormalization": "Normalización de volumen", "@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": "Equaliza el volumen entre las pistas utilizando sus etiquetas ReplayGain o R128, cuando estén presentes", "@libraryPlaybackNormalizationSubtitle": { "description": "Subtitle explaining playback volume normalization" }, - "cacheAudioAnalysis": "Audio analysis cache", + "cacheAudioAnalysis": "Caché de análisis de audio", "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "cacheAudioAnalysisDesc": "Espectrogramas y resultados de análisis guardados. Se volverán a analizar la próxima vez que se abra el programa.", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -3221,11 +3221,11 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertKeepOriginal": "Keep original file", + "trackConvertKeepOriginal": "Mantener archivo original", "@trackConvertKeepOriginal": { "description": "Toggle to preserve the source file during conversion" }, - "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "trackConvertKeepOriginalDescription": "Agrega el archivo convertido como una entrada independiente en la biblioteca", "@trackConvertKeepOriginalDescription": { "description": "Description for preserving the source file during conversion" }, @@ -3260,7 +3260,7 @@ } } }, - "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": "¿Convertir desde {sourceFormat} a {targetFormat}?\n\nEl archivo original se conservará y el archivo convertido se agregará como una entrada independiente en la biblioteca.\n", "@trackConvertConfirmKeepOriginal": { "description": "Confirmation message when the source file will be preserved", "placeholders": { @@ -3648,7 +3648,7 @@ } } }, - "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": "¿Convertir {count} {count, plural, =1{track} other{tracks}} a {format}?\n\nLos archivos originales se conservarán y los archivos convertidos se agregarán como entradas separadas en la biblioteca.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3920,7 +3920,7 @@ } } }, - "backupIncludeSecrets": "Include extension credentials", + "backupIncludeSecrets": "Incluir credenciales de extensión", "@backupIncludeSecrets": { "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" }, @@ -3928,7 +3928,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 repo.", + "backupExtensionsRestoreFailed": "No se pudo reinstalar {count} {count, plural, =1{extension} other {extensions}}. Instálalas manualmente desde el repositorio.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4041,7 +4041,7 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFolderAccessLostTitle": "Download folder access lost", + "downloadFolderAccessLostTitle": "Se perdió el acceso a la carpeta de descargas", "@downloadFolderAccessLostTitle": { "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" }, From eed3a4ad10c2a5fb5fd289fe356308dd9310a0fb Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 17 Aug 2026 05:15:23 +0700 Subject: [PATCH 37/72] New translations app_en.arb (Ukrainian) [ci skip] --- lib/l10n/arb/app_uk.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index f0a5f584..70928152 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -1,7 +1,7 @@ { "@@locale": "uk", "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", + "appName": "", "@appName": { "description": "App name - DO NOT TRANSLATE" }, @@ -29,7 +29,7 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "No search providers yet", + "homeEmptyTitle": "", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, From a8a3db1ca907e9191201e2e8f616ecbf3c174957 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 18 Aug 2026 08:35:01 +0700 Subject: [PATCH 38/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index e31c80b4..5760a6ef 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -4045,19 +4045,19 @@ "@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": "Las descargas fallarán hasta que vuelvas a seleccionar la carpeta", "@downloadFolderAccessLostSubtitle": { "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" }, - "downloadFolderReselect": "Re-select folder", + "downloadFolderReselect": "Volver a seleccionar carpeta", "@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": "Permiso SAF inválido o revocado. Por favor, reconfigura la ubicación de descarga en Configuración.", "@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": "Se ha perdido el acceso a la carpeta de descarga. Por favor, vuelve a seleccionar tu carpeta de descargas en Configuración.", "@downloadErrorFolderAccessLost": { "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" }, @@ -4081,19 +4081,19 @@ "@downloadArtistNameFilters": { "description": "Setting title for artist folder filter options" }, - "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "downloadCreatePlaylistSourceFolder": "Carpeta de Código Fuente de Listas", "@downloadCreatePlaylistSourceFolder": { "description": "Setting to create a subfolder per playlist source" }, - "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "downloadCreatePlaylistSourceFolderEnabled": "Se crea una subcarpeta para cada lista de reproducción", "@downloadCreatePlaylistSourceFolderEnabled": { "description": "Subtitle when playlist folder is enabled" }, - "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "downloadCreatePlaylistSourceFolderDisabled": "Todas las pistas guardadas directamente en la carpeta de descargas", "@downloadCreatePlaylistSourceFolderDisabled": { "description": "Subtitle when playlist folder is disabled" }, - "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "downloadCreatePlaylistSourceFolderRedundant": "Gestionado por la configuración de organización de carpetas", "@downloadCreatePlaylistSourceFolderRedundant": { "description": "Subtitle when folder organization is already set to playlist" }, @@ -4105,7 +4105,7 @@ "@downloadNetworkCompatibilityMode": { "description": "Setting for legacy TLS/network handling" }, - "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "downloadNetworkCompatibilityModeEnabled": "Uso de ajustes TLS heredados para redes antiguas", "@downloadNetworkCompatibilityModeEnabled": { "description": "Subtitle when network compatibility mode is on" }, @@ -4113,31 +4113,31 @@ "@downloadNetworkCompatibilityModeDisabled": { "description": "Subtitle when network compatibility mode is off" }, - "downloadAllowLocalNetwork": "Allow Local Network Access", + "downloadAllowLocalNetwork": "Permitir el acceso a la red local", "@downloadAllowLocalNetwork": { "description": "Setting title for allowing requests to private/local network targets" }, - "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "downloadAllowLocalNetworkEnabled": "Se permiten solicitudes a direcciones locales/privadas (para proxy local o DNS personalizado)", "@downloadAllowLocalNetworkEnabled": { "description": "Subtitle when allow local network access is on" }, - "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "downloadAllowLocalNetworkDisabled": "Las direcciones locales/privadas están bloqueadas por seguridad", "@downloadAllowLocalNetworkDisabled": { "description": "Subtitle when allow local network access is off" }, - "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "downloadSelectServiceToEnable": "Selecciona un proveedor con opciones de calidad para habilitar esta opción", "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "downloadEmbedLyricsDisabled": "Activar primero la incrustación de metadatos", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" }, - "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "downloadNeteaseIncludeTranslation": "Netease: Incluir traducción", "@downloadNeteaseIncludeTranslation": { "description": "Setting to include translated lyrics from Netease" }, - "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "downloadNeteaseIncludeTranslationEnabled": "Líneas de traducción chinas incluyeron", "@downloadNeteaseIncludeTranslationEnabled": { "description": "Subtitle when Netease translation is on" }, @@ -4145,27 +4145,27 @@ "@downloadNeteaseIncludeTranslationDisabled": { "description": "Subtitle when Netease translation is off" }, - "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "downloadNeteaseIncludeRomanization": "Netease: Incluir la romanización", "@downloadNeteaseIncludeRomanization": { "description": "Setting to include romanized lyrics from Netease" }, - "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "downloadNeteaseIncludeRomanizationEnabled": "Las líneas de romanización incluían", "@downloadNeteaseIncludeRomanizationEnabled": { "description": "Subtitle when Netease romanization is on" }, - "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "downloadNeteaseIncludeRomanizationDisabled": "Sin romanización", "@downloadNeteaseIncludeRomanizationDisabled": { "description": "Subtitle when Netease romanization is off" }, - "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "downloadAppleQqMultiPerson": "Apple / QQ: Letras de varias personas", "@downloadAppleQqMultiPerson": { "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" }, - "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "downloadAppleQqMultiPersonEnabled": "Etiquetas de altavoces incluidas para duetos y temas grupales", "@downloadAppleQqMultiPersonEnabled": { "description": "Subtitle when multi-person lyrics is on" }, - "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "downloadAppleQqMultiPersonDisabled": "Letras estándar sin etiquetas de altavoz", "@downloadAppleQqMultiPersonDisabled": { "description": "Subtitle when multi-person lyrics is off" }, @@ -4173,7 +4173,7 @@ "@downloadAppleElrcWordSync": { "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" }, - "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "downloadAppleElrcWordSyncEnabled": "Marcas temporales brutas palabra por palabra conservadas", "@downloadAppleElrcWordSyncEnabled": { "description": "Subtitle when Apple Music eLRC word sync is enabled" }, From a218a7e118fb0ddd905501cceffcf925a494166a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 18 Aug 2026 09:35:31 +0700 Subject: [PATCH 39/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 42 +++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 5760a6ef..93c8d290 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -4177,7 +4177,7 @@ "@downloadAppleElrcWordSyncEnabled": { "description": "Subtitle when Apple Music eLRC word sync is enabled" }, - "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "downloadAppleElrcWordSyncDisabled": "Letras de Apple Music línea por línea más seguras", "@downloadAppleElrcWordSyncDisabled": { "description": "Subtitle when Apple Music eLRC word sync is disabled" }, @@ -4185,19 +4185,19 @@ "@downloadMusixmatchLanguage": { "description": "Setting for Musixmatch lyrics translation language" }, - "downloadMusixmatchLanguageAuto": "Auto (original language)", + "downloadMusixmatchLanguageAuto": "Auto (idioma original)", "@downloadMusixmatchLanguageAuto": { "description": "Subtitle when no language is set" }, - "downloadFilterContributing": "Filter Contributing Artists", + "downloadFilterContributing": "Filtra a los artistas colaboradores", "@downloadFilterContributing": { "description": "Setting to strip contributing artists from Album Artist folder name" }, - "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "downloadFilterContributingEnabled": "Artistas colaboradores eliminados del nombre de la carpeta Artista del álbum", "@downloadFilterContributingEnabled": { "description": "Subtitle when contributing artist filter is on" }, - "downloadFilterContributingDisabled": "Full Album Artist string used", + "downloadFilterContributingDisabled": "Portada completa del artista del álbum utilizada", "@downloadFilterContributingDisabled": { "description": "Subtitle when contributing artist filter is off" }, @@ -4209,7 +4209,7 @@ "@downloadMusixmatchLanguageCode": { "description": "Label for Musixmatch language input field" }, - "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "downloadMusixmatchLanguageHint": "por ejemplo, en, de, ja", "@downloadMusixmatchLanguageHint": { "description": "Placeholder for Musixmatch language input" }, @@ -4283,15 +4283,15 @@ "@editMetadataAutoFill": { "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" }, - "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "editMetadataAutoFillDesc": "Elige una extensión de metadatos, selecciona campos y revisa sus datos antes de aplicarla", "@editMetadataAutoFillDesc": { "description": "Description for the auto-fill section" }, - "editMetadataAutoFillSource": "Metadata source", + "editMetadataAutoFillSource": "Fuente de metadatos", "@editMetadataAutoFillSource": { "description": "Label for the metadata extension selector in online auto-fill" }, - "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "editMetadataAutoFillSourceAutomatic": "Automático (prioridad del proveedor)", "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, @@ -4299,7 +4299,7 @@ "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, - "editMetadataAutoFillPreview": "Data from {source}", + "editMetadataAutoFillPreview": "Datos de {source}", "@editMetadataAutoFillPreview": { "description": "Title for the online metadata preview", "placeholders": { @@ -4308,15 +4308,15 @@ } } }, - "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "editMetadataAutoFillCoverAvailable": "Portada disponible", "@editMetadataAutoFillCoverAvailable": { "description": "Preview value when the selected metadata source provides cover artwork" }, - "editMetadataAutoFillApply": "Apply selected data", + "editMetadataAutoFillApply": "Aplicar datos seleccionados", "@editMetadataAutoFillApply": { "description": "Button label for applying the previewed metadata" }, - "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "editMetadataAutoFillDoneFromSource": "Rellenado {count} {count, plural, =1{field} other{fields}} de {source}", "@editMetadataAutoFillDoneFromSource": { "description": "Snackbar confirming fields applied from a selected metadata source", "placeholders": { @@ -4465,15 +4465,15 @@ } } }, - "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "queueEmptyPlaylistsSubtitle": "Crea una lista de reproducción para organizar tus temas", "@queueEmptyPlaylistsSubtitle": { "description": "Empty state subtitle for the playlists library view" }, - "libraryDefaultView": "Default view", + "libraryDefaultView": "Vista predeterminada", "@libraryDefaultView": { "description": "Setting title - which library view opens when switching to the Library tab" }, - "libraryDefaultViewLastUsed": "Last used", + "libraryDefaultViewLastUsed": "Último uso", "@libraryDefaultViewLastUsed": { "description": "Default view option - keep the last used library view" }, @@ -4481,7 +4481,7 @@ "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "queueEmptyHistorySubtitle": "Las pistas descargadas aparecerán aquí", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, @@ -4493,15 +4493,15 @@ "@selectionTapPlaylistsToSelect": { "description": "Hint shown in playlist selection mode" }, - "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "selectionSelectPlaylistsToDelete": "Selecciona listas de reproducción para eliminar", "@selectionSelectPlaylistsToDelete": { "description": "Hint shown when no playlists are selected for deletion" }, - "audioAnalysisTitle": "Audio Quality Analysis", + "audioAnalysisTitle": "Análisis de calidad de audio", "@audioAnalysisTitle": { "description": "Title for audio analysis section" }, - "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "audioAnalysisDescription": "Verifica la calidad sin pérdidas mediante análisis de espectro", "@audioAnalysisDescription": { "description": "Description for audio analysis tap-to-analyze prompt" }, @@ -4549,7 +4549,7 @@ "@audioAnalysisDynamicRange": { "description": "Dynamic range metric label" }, - "audioAnalysisPeak": "Peak", + "audioAnalysisPeak": "Pico", "@audioAnalysisPeak": { "description": "Peak amplitude metric label" }, From f572259c7dc9189baa08ba157f40ed5ef80660d0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 20 Aug 2026 07:05:19 +0700 Subject: [PATCH 40/72] New translations app_en.arb (Italian) [ci skip] --- lib/l10n/arb/app_it-IT.arb | 6275 ++++++++++++++++++++++++++++++++++++ 1 file changed, 6275 insertions(+) create mode 100644 lib/l10n/arb/app_it-IT.arb diff --git a/lib/l10n/arb/app_it-IT.arb b/lib/l10n/arb/app_it-IT.arb new file mode 100644 index 00000000..def7bad6 --- /dev/null +++ b/lib/l10n/arb/app_it-IT.arb @@ -0,0 +1,6275 @@ +{ + "@@locale": "it", + "@@last_modified": "2026-04-28", + "appName": "SpotiFLAC Mobile", + "@appName": { + "description": "App name - DO NOT TRANSLATE" + }, + "navHome": "Home", + "@navHome": { + "description": "Bottom navigation - Home tab" + }, + "navLibrary": "Library", + "@navLibrary": { + "description": "Bottom navigation - Library tab" + }, + "navSettings": "Settings", + "@navSettings": { + "description": "Bottom navigation - Settings tab" + }, + "navStore": "Repo", + "@navStore": { + "description": "Bottom navigation - Extension repo tab" + }, + "homeTitle": "Home", + "@homeTitle": { + "description": "Home screen title" + }, + "homeSubtitle": "Paste a supported URL or search by name", + "@homeSubtitle": { + "description": "Subtitle shown below search box" + }, + "homeEmptyTitle": "No search providers yet", + "@homeEmptyTitle": { + "description": "Title shown on home when no providers are available yet" + }, + "homeEmptySubtitle": "Install an extension to continue.", + "@homeEmptySubtitle": { + "description": "Subtitle shown on home when no providers are available yet" + }, + "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "@homeSupports": { + "description": "Info text about supported URL types" + }, + "homeRecent": "Recent", + "@homeRecent": { + "description": "Section header for recent searches" + }, + "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" + }, + "historySearchHint": "Search history...", + "@historySearchHint": { + "description": "Search bar placeholder in history" + }, + "settingsTitle": "Settings", + "@settingsTitle": { + "description": "Settings screen title" + }, + "settingsDownload": "Download", + "@settingsDownload": { + "description": "Settings section - download options" + }, + "settingsAppearance": "Appearance", + "@settingsAppearance": { + "description": "Settings section - visual customization" + }, + "settingsExtensions": "Extensions", + "@settingsExtensions": { + "description": "Settings section - extension management" + }, + "settingsAbout": "About", + "@settingsAbout": { + "description": "Settings section - app info" + }, + "downloadTitle": "Download", + "@downloadTitle": { + "description": "Download settings page title" + }, + "downloadAskQualitySubtitle": "Show quality picker for each download", + "@downloadAskQualitySubtitle": { + "description": "Subtitle for ask quality toggle" + }, + "downloadFilenameFormat": "Filename Format", + "@downloadFilenameFormat": { + "description": "Setting for output filename pattern" + }, + "downloadSingleFilenameFormat": "Single Filename Format", + "@downloadSingleFilenameFormat": { + "description": "Setting for output filename pattern for singles/EPs" + }, + "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "@downloadSingleFilenameFormatDescription": { + "description": "Subtitle description for single filename format setting" + }, + "downloadFolderOrganization": "Folder Organization", + "@downloadFolderOrganization": { + "description": "Title of the folder organization picker bottom sheet" + }, + "appearanceTitle": "Appearance", + "@appearanceTitle": { + "description": "Appearance settings page title" + }, + "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" + }, + "appearanceHistoryView": "History View", + "@appearanceHistoryView": { + "description": "Layout style for history" + }, + "appearanceHistoryViewList": "List", + "@appearanceHistoryViewList": { + "description": "List layout option" + }, + "appearanceHistoryViewGrid": "Grid", + "@appearanceHistoryViewGrid": { + "description": "Grid layout option" + }, + "optionsPrimaryProvider": "Primary Provider", + "@optionsPrimaryProvider": { + "description": "Main search provider setting" + }, + "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "@optionsPrimaryProviderSubtitle": { + "description": "Subtitle for primary provider" + }, + "optionsUsingExtension": "Using extension: {extensionName}", + "@optionsUsingExtension": { + "description": "Shows active extension name", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "optionsDefaultSearchTab": "Default Search Tab", + "@optionsDefaultSearchTab": { + "description": "Title for the preferred default search tab setting" + }, + "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "@optionsDefaultSearchTabSubtitle": { + "description": "Subtitle for the preferred default search tab setting" + }, + "optionsAutoFallback": "Auto Fallback", + "@optionsAutoFallback": { + "description": "Auto-retry with other services" + }, + "optionsAutoFallbackSubtitle": "Try other services if download fails", + "@optionsAutoFallbackSubtitle": { + "description": "Subtitle for auto fallback" + }, + "optionsEmbedLyrics": "Embed Lyrics", + "@optionsEmbedLyrics": { + "description": "Embed lyrics in audio files" + }, + "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "@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" + }, + "optionsReplayGain": "ReplayGain", + "@optionsReplayGain": { + "description": "Title for ReplayGain setting toggle" + }, + "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "@optionsReplayGainSubtitleOn": { + "description": "Subtitle when ReplayGain is enabled" + }, + "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "@optionsReplayGainSubtitleOff": { + "description": "Subtitle when ReplayGain is disabled" + }, + "trackReplayGain": "Rescan ReplayGain", + "@trackReplayGain": { + "description": "Three-dot menu option to scan loudness and write ReplayGain tags" + }, + "trackReplayGainScanning": "Analyzing loudness...", + "@trackReplayGainScanning": { + "description": "Snackbar/progress message while scanning ReplayGain for a single track" + }, + "trackReplayGainSuccess": "ReplayGain tags added", + "@trackReplayGainSuccess": { + "description": "Snackbar message after ReplayGain tags written for a single track" + }, + "trackReplayGainFailed": "Failed to add ReplayGain tags", + "@trackReplayGainFailed": { + "description": "Snackbar message when ReplayGain scan/write fails" + }, + "selectionReplayGainCount": "ReplayGain ({count})", + "@selectionReplayGainCount": { + "description": "Batch selection action button label for ReplayGain", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchConfirmTitle": "Add ReplayGain", + "@replayGainBatchConfirmTitle": { + "description": "Title of the batch ReplayGain confirmation dialog" + }, + "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "@replayGainBatchConfirmMessage": { + "description": "Message of the batch ReplayGain confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "@replayGainBatchAnalyzing": { + "description": "Progress dialog title while batch scanning ReplayGain" + }, + "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "@replayGainBatchSuccess": { + "description": "Snackbar after batch ReplayGain completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "optionsArtistTagMode": "Artist Tag Mode", + "@optionsArtistTagMode": { + "description": "Setting title for how artist metadata is written into files" + }, + "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "@optionsArtistTagModeDescription": { + "description": "Bottom-sheet description for artist tag mode setting" + }, + "optionsArtistTagModeJoined": "Single joined value", + "@optionsArtistTagModeJoined": { + "description": "Artist tag mode option that joins multiple artists into one value" + }, + "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "@optionsArtistTagModeJoinedSubtitle": { + "description": "Subtitle for joined artist tag mode" + }, + "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "@optionsArtistTagModeSplitVorbis": { + "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" + }, + "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "@optionsArtistTagModeSplitVorbisSubtitle": { + "description": "Subtitle for split Vorbis artist tag mode" + }, + "optionsExtensionStore": "Extension Repo", + "@optionsExtensionStore": { + "description": "Show/hide repo tab" + }, + "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "@optionsExtensionStoreSubtitle": { + "description": "Subtitle for extension repo 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" + }, + "extensionsTitle": "Extensions", + "@extensionsTitle": { + "description": "Extensions page title" + }, + "extensionsDisabled": "Disabled", + "@extensionsDisabled": { + "description": "Extension status - inactive" + }, + "extensionsVersion": "Version {version}", + "@extensionsVersion": { + "description": "Extension version display", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "extensionsUninstall": "Uninstall", + "@extensionsUninstall": { + "description": "Uninstall extension button" + }, + "storeTitle": "Extension Repo", + "@storeTitle": { + "description": "Repo screen title" + }, + "storeSearch": "Search extensions...", + "@storeSearch": { + "description": "Repo 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" + }, + "aboutTranslators": "Translators", + "@aboutTranslators": { + "description": "Section for translators" + }, + "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" + }, + "aboutKeepAndroidOpen": "Keep Android Open", + "@aboutKeepAndroidOpen": { + "description": "Link to Keep Android Open campaign website" + }, + "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" + }, + "aboutTelegramChannel": "Telegram Channel", + "@aboutTelegramChannel": { + "description": "Link to Telegram channel" + }, + "aboutTelegramChannelSubtitle": "Announcements and updates", + "@aboutTelegramChannelSubtitle": { + "description": "Subtitle for Telegram channel" + }, + "aboutTelegramChat": "Telegram Community", + "@aboutTelegramChat": { + "description": "Link to Telegram chat group" + }, + "aboutTelegramChatSubtitle": "Chat with other users", + "@aboutTelegramChatSubtitle": { + "description": "Subtitle for Telegram chat" + }, + "aboutSocial": "Social", + "@aboutSocial": { + "description": "Section for social links" + }, + "aboutApp": "App", + "@aboutApp": { + "description": "Section for app info" + }, + "aboutVersion": "Version", + "@aboutVersion": { + "description": "Version info label" + }, + "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "@aboutBinimumDesc": { + "description": "Credit description for binimum" + }, + "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "@aboutSachinsenalDesc": { + "description": "Credit description for sachinsenal0x64" + }, + "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "@aboutSjdonadoDesc": { + "description": "Credit description for sjdonado" + }, + "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "@aboutAppDescription": { + "description": "App description in header card" + }, + "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" + }, + "artistPopular": "Popular", + "@artistPopular": { + "description": "Section header for popular/top tracks" + }, + "artistMonthlyListeners": "{count} monthly listeners", + "@artistMonthlyListeners": { + "description": "Monthly listener count display", + "placeholders": { + "count": { + "type": "String", + "description": "Formatted listener count" + } + } + }, + "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" + }, + "setupGrantPermission": "Grant Permission", + "@setupGrantPermission": { + "description": "Button to request permission" + }, + "setupSkip": "Skip for now", + "@setupSkip": { + "description": "Skip current step button" + }, + "setupStorageAccessRequired": "Storage Access Required", + "@setupStorageAccessRequired": { + "description": "Title when storage access needed" + }, + "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" + } + } + }, + "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" + }, + "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "@setupIcloudNotSupported": { + "description": "Error when user selects iCloud Drive on iOS" + }, + "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "@setupDownloadInFlac": { + "description": "App tagline in setup" + }, + "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" + }, + "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" + }, + "setupSelectFolder": "Select Folder", + "@setupSelectFolder": { + "description": "Button to select folder" + }, + "setupEnableNotifications": "Enable Notifications", + "@setupEnableNotifications": { + "description": "Button to enable notifications" + }, + "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" + }, + "setupNext": "Next", + "@setupNext": { + "description": "Next button text" + }, + "setupGetStarted": "Get Started", + "@setupGetStarted": { + "description": "Final setup button" + }, + "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "@setupAllowAccessToManageFiles": { + "description": "Instruction for file access permission" + }, + "setupLanguageTitle": "Choose Language", + "@setupLanguageTitle": { + "description": "Title for the language selection step in setup" + }, + "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "@setupLanguageDescription": { + "description": "Description for the language selection step in setup" + }, + "setupLanguageSystemDefault": "System Default", + "@setupLanguageSystemDefault": { + "description": "Option to use the system language" + }, + "dialogCancel": "Cancel", + "@dialogCancel": { + "description": "Dialog button - cancel action" + }, + "dialogSave": "Save", + "@dialogSave": { + "description": "Dialog button - save changes" + }, + "dialogDelete": "Delete", + "@dialogDelete": { + "description": "Dialog button - delete item" + }, + "dialogRetry": "Retry", + "@dialogRetry": { + "description": "Dialog button - retry action" + }, + "dialogClear": "Clear", + "@dialogClear": { + "description": "Dialog button - clear items" + }, + "dialogDone": "Done", + "@dialogDone": { + "description": "Dialog button - action completed" + }, + "dialogImport": "Import", + "@dialogImport": { + "description": "Dialog button - import data" + }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Confirm button in Download All dialog" + }, + "previewPlay": "Play preview", + "@previewPlay": { + "description": "Tooltip for the button that plays a short track preview snippet" + }, + "previewStop": "Stop preview", + "@previewStop": { + "description": "Tooltip for the button that stops the playing track preview snippet" + }, + "previewUnavailable": "Preview unavailable", + "@previewUnavailable": { + "description": "Snackbar shown when a track preview snippet cannot be played" + }, + "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" + }, + "dialogClearAll": "Clear All", + "@dialogClearAll": { + "description": "Dialog title - clear all items" + }, + "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 the playlist file. Add them to download queue?", + "csvImportTracks": "{count} tracks from CSV", + "@csvImportTracks": { + "description": "Label shown in quality picker for CSV import", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionExportM3u": "Export as M3U8", + "@collectionExportM3u": { + "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" + }, + "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "@collectionExportM3uDone": { + "description": "Snackbar after M3U8 export; tracks without a local file are not exported", + "placeholders": { + "exported": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "collectionExportM3uNone": "No downloaded files to export", + "@collectionExportM3uNone": { + "description": "Snackbar when an M3U8 export finds no local files" + }, + "collectionExportM3uFailed": "Export failed", + "@collectionExportM3uFailed": { + "description": "Snackbar when writing or sharing the M3U8 export fails" + }, + "trackOpenOn": "Open on...", + "@trackOpenOn": { + "description": "Track option and sheet title listing streaming platforms where the track can be opened" + }, + "trackOpenOnNoLinks": "No platform links found for this track.", + "@trackOpenOnNoLinks": { + "description": "Shown in the Open on sheet when song.link returns no links" + }, + "libraryReviewDuplicates": "Review duplicates", + "@libraryReviewDuplicates": { + "description": "Library settings row opening the duplicate review sheet" + }, + "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "@libraryReviewDuplicatesSubtitle": { + "description": "Subtitle for the duplicate review settings row" + }, + "duplicatesTitle": "Duplicates", + "@duplicatesTitle": { + "description": "Title of the duplicate review sheet" + }, + "duplicatesEmpty": "No duplicate tracks found.", + "@duplicatesEmpty": { + "description": "Shown when the duplicate review sheet finds nothing" + }, + "duplicatesKeepBest": "Keep best", + "@duplicatesKeepBest": { + "description": "Button that deletes all but the highest-quality copy in a duplicate group" + }, + "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "@duplicatesKeepBestMessage": { + "description": "Confirmation message for the keep-best action", + "placeholders": { + "count": { + "type": "int" + }, + "trackName": { + "type": "String" + } + } + }, + "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "@duplicatesDeleteCopyMessage": { + "description": "Confirmation message for deleting one duplicate copy", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "@dialogImportPlaylistMessage": { + "description": "Dialog message - import playlist confirmation", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + } + } + }, + "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "@snackbarAlreadyInLibrary": { + "description": "Snackbar - track already exists in local library", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "snackbarHistoryCleared": "History cleared", + "@snackbarHistoryCleared": { + "description": "Snackbar - history deleted" + }, + "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" + } + } + }, + "snackbarViewQueue": "View Queue", + "@snackbarViewQueue": { + "description": "Snackbar action - view download queue" + }, + "snackbarUrlCopied": "{platform} URL copied to clipboard", + "@snackbarUrlCopied": { + "description": "Snackbar - URL copied", + "placeholders": { + "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" + }, + "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" + }, + "errorNoTracksFound": "No tracks found", + "@errorNoTracksFound": { + "description": "Error - search returned no results" + }, + "searchEmptyResultSubtitle": "Try another keyword", + "@searchEmptyResultSubtitle": { + "description": "Subtitle shown under the empty search result state on the home screen" + }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, + "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "@errorMissingExtensionSource": { + "description": "Error - extension source not available", + "placeholders": { + "item": { + "type": "String" + } + } + }, + "actionPause": "Pause", + "@actionPause": { + "description": "Action button - pause download" + }, + "actionResume": "Resume", + "@actionResume": { + "description": "Action button - resume download" + }, + "actionCancel": "Cancel", + "@actionCancel": { + "description": "Action button - cancel operation" + }, + "actionSelectAll": "Select All", + "@actionSelectAll": { + "description": "Action button - select all items" + }, + "actionDeselect": "Deselect", + "@actionDeselect": { + "description": "Action button - deselect all" + }, + "selectionSelected": "{count} selected", + "@selectionSelected": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionAllSelected": "All tracks selected", + "@selectionAllSelected": { + "description": "Status - all items selected" + }, + "selectionSelectToDelete": "Select tracks to delete", + "@selectionSelectToDelete": { + "description": "Placeholder when nothing selected" + }, + "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "@progressFetchingMetadata": { + "description": "Progress indicator - loading track info", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "progressReadingCsv": "Reading CSV...", + "@progressReadingCsv": { + "description": "Progress indicator - parsing CSV file" + }, + "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" + }, + "searchSortTitle": "Sort Results", + "@searchSortTitle": { + "description": "Bottom sheet title for search sort options" + }, + "searchSortDefault": "Default", + "@searchSortDefault": { + "description": "Sort option - default API order" + }, + "searchSortTitleAZ": "Title (A-Z)", + "@searchSortTitleAZ": { + "description": "Sort option - title ascending" + }, + "searchSortTitleZA": "Title (Z-A)", + "@searchSortTitleZA": { + "description": "Sort option - title descending" + }, + "searchSortArtistAZ": "Artist (A-Z)", + "@searchSortArtistAZ": { + "description": "Sort option - artist ascending" + }, + "searchSortArtistZA": "Artist (Z-A)", + "@searchSortArtistZA": { + "description": "Sort option - artist descending" + }, + "searchSortDurationShort": "Duration (Shortest)", + "@searchSortDurationShort": { + "description": "Sort option - shortest duration first" + }, + "searchSortDurationLong": "Duration (Longest)", + "@searchSortDurationLong": { + "description": "Sort option - longest duration first" + }, + "searchSortDateOldest": "Release Date (Oldest)", + "@searchSortDateOldest": { + "description": "Sort option - oldest release first" + }, + "searchSortDateNewest": "Release Date (Newest)", + "@searchSortDateNewest": { + "description": "Sort option - newest release first" + }, + "tooltipPlay": "Play", + "@tooltipPlay": { + "description": "Tooltip - play button" + }, + "filenameFormat": "Filename Format", + "@filenameFormat": { + "description": "Setting title - filename pattern" + }, + "filenameShowAdvancedTags": "Show advanced tags", + "@filenameShowAdvancedTags": { + "description": "Toggle label for showing advanced filename tags" + }, + "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", + "@filenameShowAdvancedTagsDescription": { + "description": "Description for advanced filename tag toggle" + }, + "folderOrganizationNone": "No organization", + "@folderOrganizationNone": { + "description": "Folder option - flat structure" + }, + "folderOrganizationByPlaylist": "By Playlist", + "@folderOrganizationByPlaylist": { + "description": "Folder option - playlist folders" + }, + "folderOrganizationByPlaylistSubtitle": "Separate folder for each playlist", + "@folderOrganizationByPlaylistSubtitle": { + "description": "Subtitle for playlist folder option" + }, + "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" + }, + "updateAvailable": "Update Available", + "@updateAvailable": { + "description": "Update dialog title" + }, + "updateLater": "Later", + "@updateLater": { + "description": "Update button - dismiss" + }, + "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" + }, + "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" + }, + "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" + }, + "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" + }, + "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", + "@providerPriorityFallbackExtensionsDescription": { + "description": "Section description for extension fallback selection" + }, + "providerPriorityFallbackExtensionsHint": "Only enabled extensions with download-provider capability are listed here.", + "@providerPriorityFallbackExtensionsHint": { + "description": "Hint below the extension fallback selection list" + }, + "providerExtension": "Extension", + "@providerExtension": { + "description": "Label for extension-provided providers" + }, + "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" + }, + "logTitle": "Logs", + "@logTitle": { + "description": "Logs screen 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" + }, + "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" + }, + "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" + } + } + }, + "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" + }, + "sectionLyrics": "Lyrics", + "@sectionLyrics": { + "description": "Settings section header" + }, + "lyricsMode": "Lyrics Mode", + "@lyricsMode": { + "description": "Setting - how to save lyrics" + }, + "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "@lyricsModeDescription": { + "description": "Lyrics mode picker description" + }, + "lyricsModeEmbed": "Embed in file", + "@lyricsModeEmbed": { + "description": "Lyrics mode option - embed in audio file" + }, + "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "@lyricsModeEmbedSubtitle": { + "description": "Subtitle for embed option" + }, + "lyricsModeExternal": "External .lrc file", + "@lyricsModeExternal": { + "description": "Lyrics mode option - separate LRC file" + }, + "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "@lyricsModeExternalSubtitle": { + "description": "Subtitle for external option" + }, + "lyricsModeBoth": "Both", + "@lyricsModeBoth": { + "description": "Lyrics mode option - embed and external" + }, + "lyricsModeBothSubtitle": "Embed and save .lrc file", + "@lyricsModeBothSubtitle": { + "description": "Subtitle for both option" + }, + "sectionColor": "Color", + "@sectionColor": { + "description": "Settings section header" + }, + "sectionTheme": "Theme", + "@sectionTheme": { + "description": "Settings section header" + }, + "sectionLayout": "Layout", + "@sectionLayout": { + "description": "Settings section header" + }, + "sectionLanguage": "Language", + "@sectionLanguage": { + "description": "Settings section header for language" + }, + "appearanceLanguage": "App Language", + "@appearanceLanguage": { + "description": "Language setting title" + }, + "settingsAppearanceSubtitle": "Theme, colors, display", + "@settingsAppearanceSubtitle": { + "description": "Appearance settings description" + }, + "settingsDownloadSubtitle": "Service, quality, fallback", + "@settingsDownloadSubtitle": { + "description": "Download 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" + }, + "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" + }, + "trackGenre": "Genre", + "@trackGenre": { + "description": "Metadata label - music genre" + }, + "trackLabel": "Label", + "@trackLabel": { + "description": "Metadata label - record label" + }, + "trackCopyright": "Copyright", + "@trackCopyright": { + "description": "Metadata label - copyright information" + }, + "trackDownloaded": "Downloaded", + "@trackDownloaded": { + "description": "Metadata label - download date" + }, + "trackCopyLyrics": "Copy lyrics", + "@trackCopyLyrics": { + "description": "Action - copy lyrics to clipboard" + }, + "trackLyricsSource": "Source: {source}", + "@trackLyricsSource": { + "description": "Label showing the lyrics source/provider", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "trackLyricsNotAvailable": "Lyrics not available for this track", + "@trackLyricsNotAvailable": { + "description": "Message when lyrics not found" + }, + "trackLyricsNotInFile": "No lyrics found in this file", + "@trackLyricsNotInFile": { + "description": "Message when no embedded lyrics in audio file" + }, + "trackFetchOnlineLyrics": "Fetch from Online", + "@trackFetchOnlineLyrics": { + "description": "Action - fetch lyrics from online providers" + }, + "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" + }, + "trackEmbedLyrics": "Embed Lyrics", + "@trackEmbedLyrics": { + "description": "Action - embed lyrics into audio file" + }, + "trackLyricsEmbedded": "Lyrics embedded successfully", + "@trackLyricsEmbedded": { + "description": "Snackbar - lyrics saved to file" + }, + "trackInstrumental": "Instrumental track", + "@trackInstrumental": { + "description": "Message when track is instrumental (no lyrics)" + }, + "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" + }, + "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" + } + } + }, + "storeFilterAll": "All", + "@storeFilterAll": { + "description": "Repo filter - all extensions" + }, + "storeFilterMetadata": "Metadata", + "@storeFilterMetadata": { + "description": "Repo filter - metadata providers" + }, + "storeFilterDownload": "Download", + "@storeFilterDownload": { + "description": "Repo filter - download providers" + }, + "storeFilterUtility": "Utility", + "@storeFilterUtility": { + "description": "Repo filter - utility extensions" + }, + "storeFilterLyrics": "Lyrics", + "@storeFilterLyrics": { + "description": "Repo filter - lyrics providers" + }, + "storeFilterIntegration": "Integration", + "@storeFilterIntegration": { + "description": "Repo filter - integrations" + }, + "storeClearFilters": "Clear filters", + "@storeClearFilters": { + "description": "Button to clear all filters" + }, + "storeAddRepoTitle": "Add Extension Repository", + "@storeAddRepoTitle": { + "description": "Store setup screen - heading when no repo is configured" + }, + "storeAddRepoDescription": "Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.", + "@storeAddRepoDescription": { + "description": "Store setup screen - explanatory text" + }, + "storeRepoUrlLabel": "Repository URL", + "@storeRepoUrlLabel": { + "description": "Label for the repository URL input field" + }, + "storeRepoUrlHint": "https://github.com/user/repo", + "@storeRepoUrlHint": { + "description": "Hint/placeholder for the repository URL input field" + }, + "storeAddRepoButton": "Add Repository", + "@storeAddRepoButton": { + "description": "Button to submit a new repository URL" + }, + "storeChangeRepoTooltip": "Change repository", + "@storeChangeRepoTooltip": { + "description": "Tooltip for the change-repository icon button in the app bar" + }, + "storeRepoDialogTitle": "Extension Repository", + "@storeRepoDialogTitle": { + "description": "Title of the change/remove repository dialog" + }, + "storeRepoDialogCurrent": "Current repository:", + "@storeRepoDialogCurrent": { + "description": "Label shown above the current repository URL in the dialog" + }, + "storeNewRepoUrlLabel": "New Repository URL", + "@storeNewRepoUrlLabel": { + "description": "Label for the new repository URL field inside the dialog" + }, + "storeLoadError": "Failed to load repository", + "@storeLoadError": { + "description": "Error heading when the store cannot be loaded" + }, + "storeEmptyNoExtensions": "No extensions available", + "@storeEmptyNoExtensions": { + "description": "Message when store has no extensions" + }, + "storeEmptyNoResults": "No extensions found", + "@storeEmptyNoResults": { + "description": "Message when search/filter returns no results" + }, + "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" + }, + "extensionsInstalledCount": "{count} extensions installed successfully", + "@extensionsInstalledCount": { + "description": "Success message after installing multiple extensions", + "placeholders": { + "count": { + "type": "int", + "description": "Number of installed extensions" + } + } + }, + "extensionsInstallPartialSuccess": "Installed {installed} of {attempted} extensions", + "@extensionsInstallPartialSuccess": { + "description": "Message when installing multiple extensions partially succeeds", + "placeholders": { + "installed": { + "type": "int", + "description": "Number of successfully installed extensions" + }, + "attempted": { + "type": "int", + "description": "Number of selected extensions" + } + } + }, + "extensionsDownloadPriority": "Download Priority", + "@extensionsDownloadPriority": { + "description": "Setting - download provider order" + }, + "extensionsDownloadPrioritySubtitle": "Set download service order", + "@extensionsDownloadPrioritySubtitle": { + "description": "Subtitle for download priority" + }, + "extensionsFallbackTitle": "Fallback Extensions", + "@extensionsFallbackTitle": { + "description": "Setting and page title for choosing which download extensions can be used during fallback" + }, + "extensionsFallbackSubtitle": "Choose which installed download extensions can be used as fallback", + "@extensionsFallbackSubtitle": { + "description": "Subtitle for download fallback extensions menu" + }, + "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" + }, + "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" + }, + "downloadLossy320": "Lossy 320kbps", + "@downloadLossy320": { + "description": "Quality option label for lossy 320kbps" + }, + "downloadLossyFormat": "Lossy Format", + "@downloadLossyFormat": { + "description": "Setting title to pick output format for lossy downloads" + }, + "downloadLossy320Format": "Lossy 320kbps Format", + "@downloadLossy320Format": { + "description": "Title of the lossy format picker bottom sheet" + }, + "downloadLossy320FormatDesc": "Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.", + "@downloadLossy320FormatDesc": { + "description": "Description in the lossy format picker" + }, + "downloadLossyMp3": "MP3 320kbps", + "@downloadLossyMp3": { + "description": "Lossy format option - MP3 320kbps" + }, + "downloadLossyMp3Subtitle": "Best compatibility, ~10MB per track", + "@downloadLossyMp3Subtitle": { + "description": "Subtitle for MP3 320kbps lossy option" + }, + "downloadLossyAac": "AAC/M4A 320kbps", + "@downloadLossyAac": { + "description": "Lossy format option - AAC in M4A container at 320kbps" + }, + "downloadLossyAacSubtitle": "Best mobile compatibility, M4A container", + "@downloadLossyAacSubtitle": { + "description": "Subtitle for AAC/M4A 320kbps lossy option" + }, + "downloadLossyOpus256": "Opus 256kbps", + "@downloadLossyOpus256": { + "description": "Lossy format option - Opus 256kbps" + }, + "downloadLossyOpus256Subtitle": "Best quality Opus, ~8MB per track", + "@downloadLossyOpus256Subtitle": { + "description": "Subtitle for Opus 256kbps lossy option" + }, + "downloadLossyOpus128": "Opus 128kbps", + "@downloadLossyOpus128": { + "description": "Lossy format option - Opus 128kbps" + }, + "downloadLossyOpus128Subtitle": "Smallest size, ~4MB per track", + "@downloadLossyOpus128Subtitle": { + "description": "Subtitle for Opus 128kbps lossy option" + }, + "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" + }, + "albumFolderStructureDescription": "Choose how album folders are structured", + "@albumFolderStructureDescription": { + "description": "Album folder structure picker description" + }, + "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", + "@downloadUseAlbumArtistForFolders": { + "description": "Setting - choose whether artist folders use Album Artist or Track Artist" + }, + "downloadUsePrimaryArtistOnly": "Primary artist only for folders", + "@downloadUsePrimaryArtistOnly": { + "description": "Setting - strip featured artists from folder name" + }, + "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", + "@downloadUsePrimaryArtistOnlyEnabled": { + "description": "Subtitle when primary artist only is enabled" + }, + "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", + "@downloadUsePrimaryArtistOnlyDisabled": { + "description": "Subtitle when primary artist only is disabled" + }, + "downloadSelectQuality": "Select Quality", + "@downloadSelectQuality": { + "description": "Dialog title - choose audio quality" + }, + "downloadFrom": "Download From", + "@downloadFrom": { + "description": "Label - download source" + }, + "appearanceAmoledDark": "AMOLED Dark", + "@appearanceAmoledDark": { + "description": "Theme option - pure black" + }, + "appearanceAmoledDarkSubtitle": "Pure black background", + "@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" + }, + "appearanceForceBlur": "Always use blur effects", + "@appearanceForceBlur": { + "description": "Toggle that forces backdrop blur on even when the device profile disabled it" + }, + "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "@appearanceForceBlurSubtitle": { + "description": "Subtitle for the force-blur toggle" + }, + "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" + }, + "settingsAutoExportFailed": "Auto-export failed downloads", + "@settingsAutoExportFailed": { + "description": "Setting toggle for auto-export" + }, + "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", + "@settingsAutoExportFailedSubtitle": { + "description": "Subtitle for auto-export setting" + }, + "settingsDownloadNetwork": "Download Network", + "@settingsDownloadNetwork": { + "description": "Setting for network type preference" + }, + "settingsDownloadNetworkAny": "WiFi + Mobile Data", + "@settingsDownloadNetworkAny": { + "description": "Network option - use any connection" + }, + "settingsDownloadNetworkWifiOnly": "WiFi Only", + "@settingsDownloadNetworkWifiOnly": { + "description": "Network option - only use WiFi" + }, + "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", + "@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" + }, + "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" + }, + "albumFolderArtistAlbumSingles": "Artist / Album + Singles", + "@albumFolderArtistAlbumSingles": { + "description": "Album folder option with singles inside artist" + }, + "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", + "@albumFolderArtistAlbumSinglesSubtitle": { + "description": "Folder structure example" + }, + "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "@albumFolderArtistAlbumFlat": { + "description": "Album folder option with singles directly in artist folder" + }, + "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "@albumFolderArtistAlbumFlatSubtitle": { + "description": "Folder structure example for flat singles" + }, + "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" + } + } + }, + "downloadedAlbumSelectedCount": "{count} selected", + "@downloadedAlbumSelectedCount": { + "description": "Selection count indicator", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "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" + }, + "downloadedAlbumDiscHeader": "Disc {discNumber}", + "@downloadedAlbumDiscHeader": { + "description": "Header for disc separator in multi-disc albums", + "placeholders": { + "discNumber": { + "type": "int", + "example": "1" + } + } + }, + "recentTypeArtist": "Artist", + "@recentTypeArtist": { + "description": "Recent access item type - artist" + }, + "recentTypeAlbum": "Album", + "@recentTypeAlbum": { + "description": "Recent access item type - album" + }, + "recentTypeSong": "Song", + "@recentTypeSong": { + "description": "Recent access item type - song/track" + }, + "recentTypePlaylist": "Playlist", + "@recentTypePlaylist": { + "description": "Recent access item type - playlist" + }, + "recentEmpty": "No recent items yet", + "@recentEmpty": { + "description": "Empty state text for recent access list" + }, + "recentShowAllDownloads": "Show All Downloads", + "@recentShowAllDownloads": { + "description": "Button label to unhide hidden downloads in recent access" + }, + "recentPlaylistInfo": "Playlist: {name}", + "@recentPlaylistInfo": { + "description": "Snackbar message when tapping playlist in recent access", + "placeholders": { + "name": { + "type": "String", + "description": "Playlist name" + } + } + }, + "discographyDownload": "Download Discography", + "@discographyDownload": { + "description": "Button - download artist discography" + }, + "discographyDownloadAll": "Download All", + "@discographyDownloadAll": { + "description": "Option - download entire discography" + }, + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "@discographyDownloadAllSubtitle": { + "description": "Subtitle showing total tracks and albums", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographyAlbumsOnly": "Albums Only", + "@discographyAlbumsOnly": { + "description": "Option - download only albums" + }, + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "@discographyAlbumsOnlySubtitle": { + "description": "Subtitle showing album tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySinglesOnly": "Singles & EPs Only", + "@discographySinglesOnly": { + "description": "Option - download only singles" + }, + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "@discographySinglesOnlySubtitle": { + "description": "Subtitle showing singles tracks count", + "placeholders": { + "count": { + "type": "int" + }, + "albumCount": { + "type": "int" + } + } + }, + "discographySelectAlbums": "Select Albums...", + "@discographySelectAlbums": { + "description": "Option - manually select albums to download" + }, + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "@discographySelectAlbumsSubtitle": { + "description": "Subtitle for select albums option" + }, + "discographyFetchingTracks": "Fetching tracks...", + "@discographyFetchingTracks": { + "description": "Progress - fetching album tracks" + }, + "discographyFetchingAlbum": "Fetching {current} of {total}...", + "@discographyFetchingAlbum": { + "description": "Progress - fetching specific album", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "discographySelectedCount": "{count} selected", + "@discographySelectedCount": { + "description": "Selection count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographyDownloadSelected": "Download Selected", + "@discographyDownloadSelected": { + "description": "Button - download selected albums" + }, + "discographyAddedToQueue": "Added {count} tracks to queue", + "@discographyAddedToQueue": { + "description": "Snackbar - tracks added from discography", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "@discographySkippedDownloaded": { + "description": "Snackbar - with skipped tracks count", + "placeholders": { + "added": { + "type": "int" + }, + "skipped": { + "type": "int" + } + } + }, + "discographyNoAlbums": "No albums available", + "@discographyNoAlbums": { + "description": "Error - no albums found for artist" + }, + "discographyFailedToFetch": "Failed to fetch some albums", + "@discographyFailedToFetch": { + "description": "Error - some albums failed to load" + }, + "sectionStorageAccess": "Storage Access", + "@sectionStorageAccess": { + "description": "Section header for storage access settings" + }, + "allFilesAccess": "All Files Access", + "@allFilesAccess": { + "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" + }, + "allFilesAccessEnabledSubtitle": "Can write to any folder", + "@allFilesAccessEnabledSubtitle": { + "description": "Subtitle when all files access is enabled" + }, + "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "@allFilesAccessDisabledSubtitle": { + "description": "Subtitle when all files access is disabled" + }, + "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", + "@allFilesAccessDescription": { + "description": "Description explaining when to enable all files access" + }, + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "@allFilesAccessDeniedMessage": { + "description": "Message when permission is permanently denied" + }, + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "@allFilesAccessDisabledMessage": { + "description": "Snackbar message when user disables all files access" + }, + "settingsLocalLibrary": "Local Library", + "@settingsLocalLibrary": { + "description": "Settings menu item - local library" + }, + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "@settingsLocalLibrarySubtitle": { + "description": "Subtitle for local library settings" + }, + "settingsCache": "Storage & Cache", + "@settingsCache": { + "description": "Settings menu item - cache management" + }, + "settingsCacheSubtitle": "View size and clear cached data", + "@settingsCacheSubtitle": { + "description": "Subtitle for cache management menu" + }, + "libraryTitle": "Local Library", + "@libraryTitle": { + "description": "Library settings page title" + }, + "libraryScanSettings": "Scan Settings", + "@libraryScanSettings": { + "description": "Section header for scan settings" + }, + "libraryEnableLocalLibrary": "Enable Local Library", + "@libraryEnableLocalLibrary": { + "description": "Toggle to enable library scanning" + }, + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "@libraryEnableLocalLibrarySubtitle": { + "description": "Subtitle for enable toggle" + }, + "libraryFolder": "Library Folder", + "@libraryFolder": { + "description": "Folder selection setting" + }, + "libraryFolderHint": "Tap to select folder", + "@libraryFolderHint": { + "description": "Placeholder when no folder selected" + }, + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "@libraryShowDuplicateIndicator": { + "description": "Toggle for duplicate indicator in search" + }, + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "@libraryShowDuplicateIndicatorSubtitle": { + "description": "Subtitle for duplicate indicator toggle" + }, + "libraryAutoScan": "Auto Scan", + "@libraryAutoScan": { + "description": "Setting for automatic library scanning" + }, + "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "@libraryAutoScanSubtitle": { + "description": "Subtitle for auto scan setting" + }, + "libraryAutoScanOff": "Off", + "@libraryAutoScanOff": { + "description": "Auto scan disabled" + }, + "libraryAutoScanOnOpen": "Every app open", + "@libraryAutoScanOnOpen": { + "description": "Auto scan when app opens" + }, + "libraryAutoScanDaily": "Daily", + "@libraryAutoScanDaily": { + "description": "Auto scan once per day" + }, + "libraryAutoScanWeekly": "Weekly", + "@libraryAutoScanWeekly": { + "description": "Auto scan once per week" + }, + "libraryActions": "Actions", + "@libraryActions": { + "description": "Section header for library actions" + }, + "libraryScan": "Scan Library", + "@libraryScan": { + "description": "Button to start library scan" + }, + "libraryScanSubtitle": "Scan for audio files", + "@libraryScanSubtitle": { + "description": "Subtitle for scan button" + }, + "libraryScanSelectFolderFirst": "Select a folder first", + "@libraryScanSelectFolderFirst": { + "description": "Message when trying to scan without folder" + }, + "libraryCleanupMissingFiles": "Cleanup Missing Files", + "@libraryCleanupMissingFiles": { + "description": "Button to remove entries for missing files" + }, + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "@libraryCleanupMissingFilesSubtitle": { + "description": "Subtitle for cleanup button" + }, + "libraryClear": "Clear Library", + "@libraryClear": { + "description": "Button to clear all library entries" + }, + "libraryClearSubtitle": "Remove all scanned tracks", + "@libraryClearSubtitle": { + "description": "Subtitle for clear button" + }, + "libraryClearConfirmTitle": "Clear Library", + "@libraryClearConfirmTitle": { + "description": "Dialog title for clear confirmation" + }, + "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", + "@libraryClearConfirmMessage": { + "description": "Dialog message for clear confirmation" + }, + "libraryAbout": "About Local Library", + "@libraryAbout": { + "description": "Section header for about info" + }, + "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF, and APE formats. Metadata is read from file tags when available.", + "@libraryAboutDescription": { + "description": "Description of local library feature" + }, + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "@libraryTracksUnit": { + "description": "Unit label for tracks count (without the number itself)", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "@libraryFilesUnit": { + "description": "Unit label for files count during library scanning", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryLastScanned": "Last scanned: {time}", + "@libraryLastScanned": { + "description": "Last scan time display", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "libraryLastScannedNever": "Never", + "@libraryLastScannedNever": { + "description": "Shown when library has never been scanned" + }, + "libraryScanning": "Scanning...", + "@libraryScanning": { + "description": "Status during scan" + }, + "libraryScanFinalizing": "Finalizing library...", + "@libraryScanFinalizing": { + "description": "Status shown after file scanning finishes but library persistence is still running" + }, + "libraryScanProgress": "{progress}% of {total} files", + "@libraryScanProgress": { + "description": "Scan progress display", + "placeholders": { + "progress": { + "type": "String" + }, + "total": { + "type": "int" + } + } + }, + "libraryInLibrary": "In Library", + "@libraryInLibrary": { + "description": "Badge shown on tracks that exist in local library" + }, + "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "@libraryRemovedMissingFiles": { + "description": "Snackbar after cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "libraryCleared": "Library cleared", + "@libraryCleared": { + "description": "Snackbar after clearing library" + }, + "libraryStorageAccessRequired": "Storage Access Required", + "@libraryStorageAccessRequired": { + "description": "Dialog title for storage permission" + }, + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "@libraryStorageAccessMessage": { + "description": "Dialog message for storage permission" + }, + "libraryFolderNotExist": "Selected folder does not exist", + "@libraryFolderNotExist": { + "description": "Error when folder doesn't exist" + }, + "librarySourceDownloaded": "Downloaded", + "@librarySourceDownloaded": { + "description": "Badge for tracks downloaded via SpotiFLAC" + }, + "librarySourceLocal": "Local", + "@librarySourceLocal": { + "description": "Badge for tracks from local library scan" + }, + "libraryFilterAll": "All", + "@libraryFilterAll": { + "description": "Filter chip - show all library items" + }, + "libraryFilterDownloaded": "Downloaded", + "@libraryFilterDownloaded": { + "description": "Filter chip - show only downloaded items" + }, + "libraryFilterLocal": "Local", + "@libraryFilterLocal": { + "description": "Filter chip - show only local library items" + }, + "libraryFilterTitle": "Filters", + "@libraryFilterTitle": { + "description": "Filter bottom sheet title" + }, + "libraryFilterReset": "Reset", + "@libraryFilterReset": { + "description": "Reset all filters button" + }, + "libraryFilterApply": "Apply", + "@libraryFilterApply": { + "description": "Apply filters button" + }, + "libraryFilterSource": "Source", + "@libraryFilterSource": { + "description": "Filter section - source type" + }, + "libraryFilterQuality": "Quality", + "@libraryFilterQuality": { + "description": "Filter section - audio quality" + }, + "libraryFilterQualityHiRes": "Hi-Res (24bit)", + "@libraryFilterQualityHiRes": { + "description": "Filter option - high resolution audio" + }, + "libraryFilterQualityCD": "CD (16bit)", + "@libraryFilterQualityCD": { + "description": "Filter option - CD quality audio" + }, + "libraryFilterQualityLossy": "Lossy", + "@libraryFilterQualityLossy": { + "description": "Filter option - lossy compressed audio" + }, + "libraryFilterFormat": "Format", + "@libraryFilterFormat": { + "description": "Filter section - file format" + }, + "libraryFilterMetadata": "Metadata", + "@libraryFilterMetadata": { + "description": "Filter section - metadata completeness" + }, + "libraryFilterMetadataComplete": "Complete metadata", + "@libraryFilterMetadataComplete": { + "description": "Filter option - items with complete metadata" + }, + "libraryFilterMetadataMissingAny": "Missing any metadata", + "@libraryFilterMetadataMissingAny": { + "description": "Filter option - items missing any tracked metadata field" + }, + "libraryFilterMetadataMissingYear": "Missing year", + "@libraryFilterMetadataMissingYear": { + "description": "Filter option - items missing release year/date" + }, + "libraryFilterMetadataMissingGenre": "Missing genre", + "@libraryFilterMetadataMissingGenre": { + "description": "Filter option - items missing genre" + }, + "libraryFilterMetadataMissingAlbumArtist": "Missing album artist", + "@libraryFilterMetadataMissingAlbumArtist": { + "description": "Filter option - items missing album artist" + }, + "libraryFilterSort": "Sort", + "@libraryFilterSort": { + "description": "Filter section - sort order" + }, + "libraryFilterSortLatest": "Latest", + "@libraryFilterSortLatest": { + "description": "Sort option - newest first" + }, + "libraryFilterSortOldest": "Oldest", + "@libraryFilterSortOldest": { + "description": "Sort option - oldest first" + }, + "libraryFilterSortAlbumAsc": "Album (A-Z)", + "@libraryFilterSortAlbumAsc": { + "description": "Sort option - album ascending" + }, + "libraryFilterSortAlbumDesc": "Album (Z-A)", + "@libraryFilterSortAlbumDesc": { + "description": "Sort option - album descending" + }, + "libraryFilterSortGenreAsc": "Genre (A-Z)", + "@libraryFilterSortGenreAsc": { + "description": "Sort option - genre ascending" + }, + "libraryFilterSortGenreDesc": "Genre (Z-A)", + "@libraryFilterSortGenreDesc": { + "description": "Sort option - genre descending" + }, + "timeJustNow": "Just now", + "@timeJustNow": { + "description": "Relative time - less than a minute ago" + }, + "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", + "@timeMinutesAgo": { + "description": "Relative time - minutes ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", + "@timeHoursAgo": { + "description": "Relative time - hours ago", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tutorialWelcomeTitle": "Welcome to SpotiFLAC Mobile!", + "@tutorialWelcomeTitle": { + "description": "Tutorial welcome page title" + }, + "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "@tutorialWelcomeDesc": { + "description": "Tutorial welcome page description" + }, + "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "@tutorialWelcomeTip1": { + "description": "Tutorial welcome tip 1" + }, + "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "@tutorialWelcomeTip2": { + "description": "Tutorial welcome tip 2" + }, + "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "@tutorialWelcomeTip3": { + "description": "Tutorial welcome tip 3" + }, + "tutorialSearchTitle": "Finding Music", + "@tutorialSearchTitle": { + "description": "Tutorial search page title" + }, + "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "@tutorialSearchDesc": { + "description": "Tutorial search page description" + }, + "tutorialDownloadTitle": "Downloading Music", + "@tutorialDownloadTitle": { + "description": "Tutorial download page title" + }, + "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "@tutorialDownloadDesc": { + "description": "Tutorial download page description" + }, + "tutorialLibraryTitle": "Your Library", + "@tutorialLibraryTitle": { + "description": "Tutorial library page title" + }, + "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "@tutorialLibraryDesc": { + "description": "Tutorial library page description" + }, + "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "@tutorialLibraryTip1": { + "description": "Tutorial library tip 1" + }, + "tutorialLibraryTip2": "Tap any track to play it with your music player", + "@tutorialLibraryTip2": { + "description": "Tutorial library tip 2" + }, + "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "@tutorialLibraryTip3": { + "description": "Tutorial library tip 3" + }, + "tutorialExtensionsTitle": "Extensions", + "@tutorialExtensionsTitle": { + "description": "Tutorial extensions page title" + }, + "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "@tutorialExtensionsDesc": { + "description": "Tutorial extensions page description" + }, + "tutorialExtensionsTip1": "Browse the Repo tab to discover useful extensions", + "@tutorialExtensionsTip1": { + "description": "Tutorial extensions tip 1" + }, + "tutorialExtensionsTip2": "Add new download providers or search sources", + "@tutorialExtensionsTip2": { + "description": "Tutorial extensions tip 2" + }, + "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "@tutorialExtensionsTip3": { + "description": "Tutorial extensions tip 3" + }, + "tutorialSettingsTitle": "Customize Your Experience", + "@tutorialSettingsTitle": { + "description": "Tutorial settings page title" + }, + "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "@tutorialSettingsDesc": { + "description": "Tutorial settings page description" + }, + "tutorialSettingsTip1": "Change download location and folder organization", + "@tutorialSettingsTip1": { + "description": "Tutorial settings tip 1" + }, + "tutorialSettingsTip2": "Set default audio quality and format preferences", + "@tutorialSettingsTip2": { + "description": "Tutorial settings tip 2" + }, + "tutorialSettingsTip3": "Customize app theme and appearance", + "@tutorialSettingsTip3": { + "description": "Tutorial settings tip 3" + }, + "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "@tutorialReadyMessage": { + "description": "Tutorial completion message" + }, + "libraryForceFullScan": "Force Full Scan", + "@libraryForceFullScan": { + "description": "Button to force a complete rescan of library" + }, + "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", + "@libraryForceFullScanSubtitle": { + "description": "Subtitle for force full scan button" + }, + "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", + "@cleanupOrphanedDownloads": { + "description": "Button to remove history entries for deleted files" + }, + "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", + "@cleanupOrphanedDownloadsSubtitle": { + "description": "Subtitle for orphaned cleanup button" + }, + "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", + "@cleanupOrphanedDownloadsResult": { + "description": "Snackbar after orphan cleanup", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cleanupOrphanedDownloadsNone": "No orphaned entries found", + "@cleanupOrphanedDownloadsNone": { + "description": "Snackbar when no orphans found" + }, + "cacheTitle": "Storage & Cache", + "@cacheTitle": { + "description": "Cache management page title" + }, + "cacheSummaryTitle": "Cache overview", + "@cacheSummaryTitle": { + "description": "Heading for cache summary card" + }, + "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", + "@cacheSummarySubtitle": { + "description": "Helper text for cache summary card" + }, + "cacheEstimatedTotal": "Estimated cache usage: {size}", + "@cacheEstimatedTotal": { + "description": "Total cache size shown in summary", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheSectionStorage": "Cached Data", + "@cacheSectionStorage": { + "description": "Section header for cache entries" + }, + "cacheSectionMaintenance": "Maintenance", + "@cacheSectionMaintenance": { + "description": "Section header for cleanup actions" + }, + "cacheAppDirectory": "App cache directory", + "@cacheAppDirectory": { + "description": "Cache item title for app cache directory" + }, + "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", + "@cacheAppDirectoryDesc": { + "description": "Description of what app cache directory contains" + }, + "cacheTempDirectory": "Temporary directory", + "@cacheTempDirectory": { + "description": "Cache item title for temporary files directory" + }, + "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", + "@cacheTempDirectoryDesc": { + "description": "Description of what temporary directory contains" + }, + "cacheCoverImage": "Cover image cache", + "@cacheCoverImage": { + "description": "Cache item title for persistent cover images" + }, + "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", + "@cacheCoverImageDesc": { + "description": "Description of what cover image cache contains" + }, + "cacheLibraryCover": "Library cover cache", + "@cacheLibraryCover": { + "description": "Cache item title for local library cover art images" + }, + "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", + "@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" + }, + "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", + "@cacheExploreFeedDesc": { + "description": "Description of what explore feed cache contains" + }, + "cacheTrackLookup": "Track lookup cache", + "@cacheTrackLookup": { + "description": "Cache item title for track ID lookup cache" + }, + "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", + "@cacheTrackLookupDesc": { + "description": "Description of what track lookup cache contains" + }, + "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", + "@cacheCleanupUnusedDesc": { + "description": "Description of what cleanup unused data does" + }, + "cacheNoData": "No cached data", + "@cacheNoData": { + "description": "Label when cache category has no data" + }, + "cacheSizeWithFiles": "{size} in {count} files", + "@cacheSizeWithFiles": { + "description": "Cache size and file count", + "placeholders": { + "size": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cacheSizeOnly": "{size}", + "@cacheSizeOnly": { + "description": "Cache size only", + "placeholders": { + "size": { + "type": "String" + } + } + }, + "cacheEntries": "{count} entries", + "@cacheEntries": { + "description": "Track cache entry count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cacheClearSuccess": "Cleared: {target}", + "@cacheClearSuccess": { + "description": "Snackbar after clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearConfirmTitle": "Clear cache?", + "@cacheClearConfirmTitle": { + "description": "Dialog title before clearing one cache category" + }, + "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", + "@cacheClearConfirmMessage": { + "description": "Dialog message before clearing selected cache", + "placeholders": { + "target": { + "type": "String" + } + } + }, + "cacheClearAllConfirmTitle": "Clear all cache?", + "@cacheClearAllConfirmTitle": { + "description": "Dialog title before clearing all caches" + }, + "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", + "@cacheClearAllConfirmMessage": { + "description": "Dialog message before clearing all caches" + }, + "cacheClearAll": "Clear all cache", + "@cacheClearAll": { + "description": "Button label to clear all caches" + }, + "cacheCleanupUnused": "Cleanup unused data", + "@cacheCleanupUnused": { + "description": "Action title for cleaning unused entries" + }, + "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", + "@cacheCleanupUnusedSubtitle": { + "description": "Subtitle for cleanup unused data action" + }, + "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", + "@cacheCleanupResult": { + "description": "Snackbar after unused data cleanup", + "placeholders": { + "downloadCount": { + "type": "int" + }, + "libraryCount": { + "type": "int" + } + } + }, + "cacheRefreshStats": "Refresh stats", + "@cacheRefreshStats": { + "description": "Button label to refresh cache statistics" + }, + "trackSaveCoverArt": "Save Cover Art", + "@trackSaveCoverArt": { + "description": "Menu action - save album cover art as file" + }, + "trackSaveLyrics": "Save Lyrics (.lrc)", + "@trackSaveLyrics": { + "description": "Menu action - save lyrics as .lrc file" + }, + "trackSaveLyricsProgress": "Saving lyrics...", + "@trackSaveLyricsProgress": { + "description": "Snackbar while saving lyrics to file" + }, + "trackReEnrich": "Re-enrich", + "@trackReEnrich": { + "description": "Menu action - re-embed metadata into audio file" + }, + "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", + "@trackReEnrichOnlineSubtitle": { + "description": "Subtitle for re-enrich metadata action for local items" + }, + "trackReEnrichFieldCover": "Cover Art", + "@trackReEnrichFieldCover": { + "description": "Checkbox label for cover art field in re-enrich" + }, + "trackReEnrichFieldLyrics": "Lyrics", + "@trackReEnrichFieldLyrics": { + "description": "Checkbox label for lyrics field in re-enrich" + }, + "trackReEnrichFieldBasicTags": "Album, Album Artist", + "@trackReEnrichFieldBasicTags": { + "description": "Checkbox label for basic tags in re-enrich (title/artist are never overwritten)" + }, + "trackReEnrichFieldTrackInfo": "Track & Disc Number", + "@trackReEnrichFieldTrackInfo": { + "description": "Checkbox label for track info in re-enrich" + }, + "trackReEnrichFieldReleaseInfo": "Date & ISRC", + "@trackReEnrichFieldReleaseInfo": { + "description": "Checkbox label for release info in re-enrich" + }, + "trackReEnrichFieldExtra": "Genre, Label, Copyright", + "@trackReEnrichFieldExtra": { + "description": "Checkbox label for extra metadata in re-enrich" + }, + "trackReEnrichSelectAll": "Select All", + "@trackReEnrichSelectAll": { + "description": "Select all fields checkbox in re-enrich" + }, + "trackEditMetadata": "Edit Metadata", + "@trackEditMetadata": { + "description": "Menu action - edit embedded metadata" + }, + "trackCoverSaved": "Cover art saved to {fileName}", + "@trackCoverSaved": { + "description": "Snackbar after cover art saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackCoverNoSource": "No cover art source available", + "@trackCoverNoSource": { + "description": "Snackbar when no cover art URL or embedded cover" + }, + "trackLyricsSaved": "Lyrics saved to {fileName}", + "@trackLyricsSaved": { + "description": "Snackbar after lyrics saved", + "placeholders": { + "fileName": { + "type": "String" + } + } + }, + "trackReEnrichProgress": "Re-enriching metadata...", + "@trackReEnrichProgress": { + "description": "Snackbar while re-enriching metadata" + }, + "trackReEnrichSearching": "Searching metadata online...", + "@trackReEnrichSearching": { + "description": "Snackbar while searching metadata from internet for local items" + }, + "trackReEnrichSuccess": "Metadata re-enriched successfully", + "@trackReEnrichSuccess": { + "description": "Snackbar after successful re-enrichment" + }, + "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", + "@trackReEnrichFfmpegFailed": { + "description": "Snackbar when FFmpeg embed fails for MP3/Opus" + }, + "queueFlacAction": "Queue FLAC", + "@queueFlacAction": { + "description": "Action/button label for queueing FLAC redownloads for local tracks" + }, + "queueFlacConfirmMessage": "Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n{count} selected", + "@queueFlacConfirmMessage": { + "description": "Confirmation dialog body before queueing FLAC redownloads for local tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFlacNoReliableMatches": "No reliable online matches found for the selection", + "@queueFlacNoReliableMatches": { + "description": "Snackbar when no safe FLAC redownload matches were found" + }, + "queueFlacQueuedWithSkipped": "Added {addedCount} tracks to queue, skipped {skippedCount}", + "@queueFlacQueuedWithSkipped": { + "description": "Snackbar when some selected local tracks were queued for FLAC redownload and some were skipped", + "placeholders": { + "addedCount": { + "type": "int" + }, + "skippedCount": { + "type": "int" + } + } + }, + "trackSaveFailed": "Failed: {error}", + "@trackSaveFailed": { + "description": "Snackbar when save operation fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "trackConvertFormat": "Convert Format", + "@trackConvertFormat": { + "description": "Menu item - convert audio format" + }, + "trackConvertTitle": "Convert Audio", + "@trackConvertTitle": { + "description": "Title of convert bottom sheet" + }, + "trackConvertTargetFormat": "Target Format", + "@trackConvertTargetFormat": { + "description": "Label for format selection" + }, + "trackConvertBitrate": "Bitrate", + "@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" + }, + "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessage": { + "description": "Confirmation dialog message", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLossless": "Convert from {sourceFormat} to {targetFormat}? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.", + "@trackConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless-to-lossless conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, + "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" + }, + "trackConvertConverting": "Converting audio...", + "@trackConvertConverting": { + "description": "Snackbar while converting" + }, + "trackConvertSuccess": "Converted to {format} successfully", + "@trackConvertSuccess": { + "description": "Snackbar after successful conversion", + "placeholders": { + "format": { + "type": "String" + } + } + }, + "trackConvertFailed": "Conversion failed", + "@trackConvertFailed": { + "description": "Snackbar when conversion fails" + }, + "cueSplitTitle": "Split CUE Sheet", + "@cueSplitTitle": { + "description": "Title for CUE split bottom sheet" + }, + "cueSplitAlbum": "Album: {album}", + "@cueSplitAlbum": { + "description": "Album name in CUE split sheet", + "placeholders": { + "album": { + "type": "String" + } + } + }, + "cueSplitArtist": "Artist: {artist}", + "@cueSplitArtist": { + "description": "Artist name in CUE split sheet", + "placeholders": { + "artist": { + "type": "String" + } + } + }, + "cueSplitTrackCount": "{count} tracks", + "@cueSplitTrackCount": { + "description": "Number of tracks in CUE sheet", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitConfirmTitle": "Split CUE Album", + "@cueSplitConfirmTitle": { + "description": "CUE split confirmation dialog title" + }, + "cueSplitConfirmMessage": "Split \"{album}\" into {count} individual FLAC files?\n\nFiles will be saved to the same directory.", + "@cueSplitConfirmMessage": { + "description": "CUE split confirmation dialog message", + "placeholders": { + "album": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "cueSplitSplitting": "Splitting CUE sheet... ({current}/{total})", + "@cueSplitSplitting": { + "description": "Snackbar while splitting CUE", + "placeholders": { + "current": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "cueSplitSuccess": "Split into {count} tracks successfully", + "@cueSplitSuccess": { + "description": "Snackbar after successful CUE split", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "cueSplitFailed": "CUE split failed", + "@cueSplitFailed": { + "description": "Snackbar when CUE split fails" + }, + "cueSplitNoAudioFile": "Audio file not found for this CUE sheet", + "@cueSplitNoAudioFile": { + "description": "Error when CUE audio file is missing" + }, + "cueSplitButton": "Split into Tracks", + "@cueSplitButton": { + "description": "Button text to start CUE splitting" + }, + "actionCreate": "Create", + "@actionCreate": { + "description": "Generic action button - create" + }, + "collectionFoldersTitle": "My folders", + "@collectionFoldersTitle": { + "description": "Library section title for custom folders" + }, + "collectionWishlist": "Wishlist", + "@collectionWishlist": { + "description": "Custom folder for saved tracks to download later" + }, + "collectionLoved": "Loved", + "@collectionLoved": { + "description": "Custom folder for favorite tracks" + }, + "collectionFavoriteArtists": "Favorite Artists", + "@collectionFavoriteArtists": { + "description": "Custom folder for favorite artists" + }, + "collectionPlaylist": "Playlist", + "@collectionPlaylist": { + "description": "Single playlist label" + }, + "collectionAddToPlaylist": "Add to playlist", + "@collectionAddToPlaylist": { + "description": "Action to add a track to user playlist" + }, + "collectionCreatePlaylist": "Create playlist", + "@collectionCreatePlaylist": { + "description": "Action to create a new playlist" + }, + "collectionNoPlaylistsYet": "No playlists yet", + "@collectionNoPlaylistsYet": { + "description": "Empty state title when user has no playlists" + }, + "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", + "@collectionPlaylistTracks": { + "description": "Track count label for custom playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionArtistCount": "{count, plural, =1{1 artist} other{{count} artists}}", + "@collectionArtistCount": { + "description": "Artist count label for favorite artists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedToPlaylist": "Added to \"{playlistName}\"", + "@collectionAddedToPlaylist": { + "description": "Snackbar after adding track to playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", + "@collectionAlreadyInPlaylist": { + "description": "Snackbar when track already exists in playlist", + "placeholders": { + "playlistName": { + "type": "String" + } + } + }, + "collectionPlaylistNameHint": "Playlist name", + "@collectionPlaylistNameHint": { + "description": "Hint text for playlist name input" + }, + "collectionPlaylistNameRequired": "Playlist name is required", + "@collectionPlaylistNameRequired": { + "description": "Validation error for empty playlist name" + }, + "collectionRenamePlaylist": "Rename playlist", + "@collectionRenamePlaylist": { + "description": "Action to rename playlist" + }, + "collectionDeletePlaylist": "Delete playlist", + "@collectionDeletePlaylist": { + "description": "Action to delete playlist" + }, + "collectionPlaylistRenamed": "Playlist renamed", + "@collectionPlaylistRenamed": { + "description": "Snackbar after renaming playlist" + }, + "collectionWishlistEmptyTitle": "Wishlist is empty", + "@collectionWishlistEmptyTitle": { + "description": "Wishlist empty state title" + }, + "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", + "@collectionWishlistEmptySubtitle": { + "description": "Wishlist empty state subtitle" + }, + "collectionLovedEmptyTitle": "Loved folder is empty", + "@collectionLovedEmptyTitle": { + "description": "Loved empty state title" + }, + "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", + "@collectionLovedEmptySubtitle": { + "description": "Loved empty state subtitle" + }, + "collectionFavoriteArtistsEmptyTitle": "No favorite artists yet", + "@collectionFavoriteArtistsEmptyTitle": { + "description": "Favorite artists empty state title" + }, + "collectionFavoriteArtistsEmptySubtitle": "Tap the heart on an artist page to keep them here", + "@collectionFavoriteArtistsEmptySubtitle": { + "description": "Favorite artists empty state subtitle" + }, + "collectionPlaylistEmptyTitle": "Playlist is empty", + "@collectionPlaylistEmptyTitle": { + "description": "Playlist empty state title" + }, + "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "@collectionPlaylistEmptySubtitle": { + "description": "Playlist empty state subtitle" + }, + "collectionRemoveFromPlaylist": "Remove from playlist", + "@collectionRemoveFromPlaylist": { + "description": "Tooltip for removing track from playlist" + }, + "collectionRemoveFromFolder": "Remove from folder", + "@collectionRemoveFromFolder": { + "description": "Tooltip for removing track from wishlist/loved folder" + }, + "collectionAddedToLoved": "\"{trackName}\" added to Loved", + "@collectionAddedToLoved": { + "description": "Snackbar after adding track to loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", + "@collectionRemovedFromLoved": { + "description": "Snackbar after removing track from loved folder", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", + "@collectionAddedToWishlist": { + "description": "Snackbar after adding track to wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", + "@collectionRemovedFromWishlist": { + "description": "Snackbar after removing track from wishlist", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "collectionAddedToFavoriteArtists": "\"{artistName}\" added to Favorite Artists", + "@collectionAddedToFavoriteArtists": { + "description": "Snackbar after adding artist to favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "collectionRemovedFromFavoriteArtists": "\"{artistName}\" removed from Favorite Artists", + "@collectionRemovedFromFavoriteArtists": { + "description": "Snackbar after removing artist from favorite artists", + "placeholders": { + "artistName": { + "type": "String" + } + } + }, + "trackOptionAddToLoved": "Add to Loved", + "@trackOptionAddToLoved": { + "description": "Bottom sheet action label - add track to loved folder" + }, + "trackOptionRemoveFromLoved": "Remove from Loved", + "@trackOptionRemoveFromLoved": { + "description": "Bottom sheet action label - remove track from loved folder" + }, + "trackOptionAddToWishlist": "Add to Wishlist", + "@trackOptionAddToWishlist": { + "description": "Bottom sheet action label - add track to wishlist" + }, + "trackOptionRemoveFromWishlist": "Remove from Wishlist", + "@trackOptionRemoveFromWishlist": { + "description": "Bottom sheet action label - remove track from wishlist" + }, + "artistOptionAddToFavorites": "Add to Favorite Artists", + "@artistOptionAddToFavorites": { + "description": "Action label - add artist to favorite artists" + }, + "artistOptionRemoveFromFavorites": "Remove from Favorite Artists", + "@artistOptionRemoveFromFavorites": { + "description": "Action label - remove artist from favorite artists" + }, + "collectionPlaylistChangeCover": "Change cover image", + "@collectionPlaylistChangeCover": { + "description": "Bottom sheet action to pick a custom cover image for a playlist" + }, + "collectionPlaylistRemoveCover": "Remove cover image", + "@collectionPlaylistRemoveCover": { + "description": "Bottom sheet action to remove custom cover image from a playlist" + }, + "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", + "@selectionShareCount": { + "description": "Share button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionShareNoFiles": "No shareable files found", + "@selectionShareNoFiles": { + "description": "Snackbar when no selected files exist on disk" + }, + "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", + "@selectionConvertCount": { + "description": "Convert button text with count in selection mode", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "selectionConvertNoConvertible": "No convertible tracks selected", + "@selectionConvertNoConvertible": { + "description": "Snackbar when no selected tracks support conversion" + }, + "selectionBatchConvertConfirmTitle": "Batch Convert", + "@selectionBatchConvertConfirmTitle": { + "description": "Confirmation dialog title for batch conversion" + }, + "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessage": { + "description": "Confirmation dialog message for batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLossless": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}? (Lossless — no quality loss)\n\nOriginal files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLossless": { + "description": "Confirmation dialog message for lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "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": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", + "@selectionBatchConvertSuccess": { + "description": "Snackbar after batch conversion completes", + "placeholders": { + "success": { + "type": "int" + }, + "total": { + "type": "int" + }, + "format": { + "type": "String" + } + } + }, + "downloadedAlbumDownloadedCount": "{count} downloaded", + "@downloadedAlbumDownloadedCount": { + "description": "Downloaded tracks count badge", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Folder named after Album Artist tag", + "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { + "description": "Subtitle when album artist is used for folder names" + }, + "downloadUseAlbumArtistForFoldersTrackSubtitle": "Folder named after Track Artist tag", + "@downloadUseAlbumArtistForFoldersTrackSubtitle": { + "description": "Subtitle when track artist is used for folder names" + }, + "lyricsProvidersTitle": "Lyrics Provider Priority", + "@lyricsProvidersTitle": { + "description": "Settings item title for lyrics provider order" + }, + "lyricsProvidersDescription": "Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.", + "@lyricsProvidersDescription": { + "description": "Description on the lyrics provider priority page" + }, + "lyricsProvidersInfoText": "Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.", + "@lyricsProvidersInfoText": { + "description": "Info tip on lyrics provider priority page" + }, + "lyricsProvidersEnabledSection": "Enabled ({count})", + "@lyricsProvidersEnabledSection": { + "description": "Section header for enabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersDisabledSection": "Disabled ({count})", + "@lyricsProvidersDisabledSection": { + "description": "Section header for disabled providers", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "lyricsProvidersAtLeastOne": "At least one provider must remain enabled", + "@lyricsProvidersAtLeastOne": { + "description": "Snackbar when user tries to disable the last enabled provider" + }, + "lyricsProvidersSaved": "Lyrics provider priority saved", + "@lyricsProvidersSaved": { + "description": "Snackbar after saving lyrics provider priority" + }, + "lyricsProvidersDiscardContent": "You have unsaved changes that will be lost.", + "@lyricsProvidersDiscardContent": { + "description": "Body text of the discard-changes dialog on lyrics provider page" + }, + "lyricsProviderLrclibDesc": "Open-source synced lyrics database", + "@lyricsProviderLrclibDesc": { + "description": "Description for LRCLIB provider" + }, + "lyricsProviderNeteaseDesc": "NetEase Cloud Music (good for Asian songs)", + "@lyricsProviderNeteaseDesc": { + "description": "Description for Netease provider" + }, + "lyricsProviderMusixmatchDesc": "Largest lyrics database (multi-language)", + "@lyricsProviderMusixmatchDesc": { + "description": "Description for Musixmatch provider" + }, + "lyricsProviderAppleMusicDesc": "Word-by-word synced lyrics (via proxy)", + "@lyricsProviderAppleMusicDesc": { + "description": "Description for Apple Music provider" + }, + "lyricsProviderQqMusicDesc": "QQ Music (good for Chinese songs, via proxy)", + "@lyricsProviderQqMusicDesc": { + "description": "Description for QQ Music provider" + }, + "lyricsProviderLyricsPlusDesc": "Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)", + "@lyricsProviderLyricsPlusDesc": { + "description": "Description for LyricsPlus provider" + }, + "lyricsProviderExtensionDesc": "Extension provider", + "@lyricsProviderExtensionDesc": { + "description": "Generic description for extension-based lyrics providers" + }, + "safMigrationTitle": "Storage Update Required", + "@safMigrationTitle": { + "description": "Title of SAF migration dialog" + }, + "safMigrationMessage1": "SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.", + "@safMigrationMessage1": { + "description": "First paragraph of SAF migration dialog" + }, + "safMigrationMessage2": "Please select your download folder again to switch to the new storage system.", + "@safMigrationMessage2": { + "description": "Second paragraph of SAF migration dialog" + }, + "safMigrationSuccess": "Download folder updated to SAF mode", + "@safMigrationSuccess": { + "description": "Snackbar after successfully migrating to SAF" + }, + "settingsDonate": "Support Development", + "@settingsDonate": { + "description": "Settings menu item - donate page" + }, + "settingsDonateSubtitle": "Buy the developer a coffee", + "@settingsDonateSubtitle": { + "description": "Subtitle for donate menu item" + }, + "settingsBackup": "Backup & Restore", + "@settingsBackup": { + "description": "Settings menu item - backup and restore page" + }, + "settingsBackupSubtitle": "Move your library, history and settings to a new device", + "@settingsBackupSubtitle": { + "description": "Subtitle for backup and restore settings item" + }, + "backupTitle": "Backup & Restore", + "@backupTitle": { + "description": "App bar title for the backup and restore page" + }, + "backupExportSectionTitle": "Create backup", + "@backupExportSectionTitle": { + "description": "Section title for the export/backup card" + }, + "backupExportSectionDescription": "Save your settings, download history, liked tracks, wishlist, favorite artists and playlists into a single file you can keep or move to another phone.", + "@backupExportSectionDescription": { + "description": "Description of what a backup contains" + }, + "backupExportButton": "Create backup file", + "@backupExportButton": { + "description": "Button to create and share a backup file" + }, + "backupImportSectionTitle": "Restore backup", + "@backupImportSectionTitle": { + "description": "Section title for the import/restore card" + }, + "backupImportSectionDescription": "Pick a backup file to restore your data. This replaces the current settings, history and library on this device.", + "@backupImportSectionDescription": { + "description": "Description for the restore action" + }, + "backupImportButton": "Choose backup file", + "@backupImportButton": { + "description": "Button to pick a backup file to restore" + }, + "backupCreated": "Backup created", + "@backupCreated": { + "description": "Snackbar after a backup file is created" + }, + "backupCreateFailed": "Failed to create backup", + "@backupCreateFailed": { + "description": "Snackbar when backup creation fails" + }, + "backupRestoreConfirmTitle": "Restore this backup?", + "@backupRestoreConfirmTitle": { + "description": "Confirmation dialog title before restoring a backup" + }, + "backupRestoreConfirmMessage": "This will replace your current settings, download history, liked tracks, wishlist and playlists with the contents of the backup. This cannot be undone.", + "@backupRestoreConfirmMessage": { + "description": "Confirmation dialog message before restoring a backup" + }, + "backupRestoreConfirmButton": "Restore", + "@backupRestoreConfirmButton": { + "description": "Confirm button to proceed with restore" + }, + "backupRestored": "Backup restored successfully", + "@backupRestored": { + "description": "Snackbar after a successful restore" + }, + "backupRestoreFailed": "Failed to restore backup", + "@backupRestoreFailed": { + "description": "Snackbar when restore fails" + }, + "backupInvalidFile": "This file is not a valid SpotiFLAC backup", + "@backupInvalidFile": { + "description": "Snackbar when the chosen file is not a valid backup" + }, + "backupRestoreRestartHint": "Restart the app to make sure every change is applied.", + "@backupRestoreRestartHint": { + "description": "Hint shown after restoring that an app restart is recommended" + }, + "backupContentsTitle": "Backup contents", + "@backupContentsTitle": { + "description": "Header above the list summarizing what the backup contains" + }, + "backupContentsSettings": "App settings", + "@backupContentsSettings": { + "description": "Backup contents row label for settings" + }, + "backupContentsHistory": "{count} history {count, plural, =1{item} other{items}}", + "@backupContentsHistory": { + "description": "Backup contents row for history count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsLiked": "{count} liked {count, plural, =1{track} other{tracks}}", + "@backupContentsLiked": { + "description": "Backup contents row for liked tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsWishlist": "{count} wishlist {count, plural, =1{track} other{tracks}}", + "@backupContentsWishlist": { + "description": "Backup contents row for wishlist tracks count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsPlaylists": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@backupContentsPlaylists": { + "description": "Backup contents row for playlist count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsArtists": "{count, plural, =1{1 favorite artist} other{{count} favorite artists}}", + "@backupContentsArtists": { + "description": "Backup contents row for favorite artists count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupContentsExtensions": "{count, plural, =1{1 extension} other{{count} extensions}}", + "@backupContentsExtensions": { + "description": "Backup contents row for installed extensions count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "backupIncludeSecrets": "Include extension credentials", + "@backupIncludeSecrets": { + "description": "Toggle to include secret extension settings (tokens, API keys) in the backup" + }, + "backupIncludeSecretsDescription": "Tokens and API keys from extensions will be saved into the backup file. Keep the file private. When off, you re-enter them after restoring.", + "@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 repo.", + "@backupExtensionsRestoreFailed": { + "description": "Snackbar/hint when some extensions failed to reinstall during restore", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "tooltipLoveAll": "Love All", + "@tooltipLoveAll": { + "description": "Tooltip for the Love All button on album/playlist screens" + }, + "tooltipAddToPlaylist": "Add to Playlist", + "@tooltipAddToPlaylist": { + "description": "Tooltip for the Add to Playlist button" + }, + "snackbarRemovedTracksFromLoved": "Removed {count} tracks from Loved", + "@snackbarRemovedTracksFromLoved": { + "description": "Snackbar after removing multiple tracks from Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "snackbarAddedTracksToLoved": "Added {count} tracks to Loved", + "@snackbarAddedTracksToLoved": { + "description": "Snackbar after adding multiple tracks to Loved folder", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadAllMessage": "Download {count} tracks?", + "@dialogDownloadAllMessage": { + "description": "Body of the Download All confirmation dialog", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "homeSkipAlreadyDownloaded": "Skip already downloaded songs", + "@homeSkipAlreadyDownloaded": { + "description": "Checkbox label in import dialog to skip already-downloaded songs" + }, + "homeGoToAlbum": "Go to Album", + "@homeGoToAlbum": { + "description": "Context menu item to navigate to the album page" + }, + "homeAlbumInfoUnavailable": "Album info not available", + "@homeAlbumInfoUnavailable": { + "description": "Snackbar when album info cannot be loaded" + }, + "snackbarLoadingCueSheet": "Loading CUE sheet...", + "@snackbarLoadingCueSheet": { + "description": "Snackbar while loading a CUE sheet file" + }, + "snackbarMetadataSaved": "Metadata saved successfully", + "@snackbarMetadataSaved": { + "description": "Snackbar after successfully saving track metadata" + }, + "snackbarFailedToEmbedLyrics": "Failed to embed lyrics", + "@snackbarFailedToEmbedLyrics": { + "description": "Snackbar when lyrics embedding fails" + }, + "snackbarFailedToWriteStorage": "Failed to write back to storage", + "@snackbarFailedToWriteStorage": { + "description": "Snackbar when writing metadata back to file fails" + }, + "snackbarError": "Error: {error}", + "@snackbarError": { + "description": "Generic error snackbar with error detail", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "snackbarNoActionDefined": "No action defined for this button", + "@snackbarNoActionDefined": { + "description": "Snackbar when an extension button has no action configured" + }, + "noTracksFoundForAlbum": "No tracks found for this album", + "@noTracksFoundForAlbum": { + "description": "Empty state message when an album has no tracks" + }, + "downloadLocationSubtitle": "Choose where to save your downloaded tracks", + "@downloadLocationSubtitle": { + "description": "Subtitle shown in the download location picker sheet" + }, + "storageModeAppFolder": "App Folder (Recommended)", + "@storageModeAppFolder": { + "description": "Storage mode option - app-managed folder" + }, + "storageModeAppFolderSubtitle": "Saves to Music/SpotiFLAC by default", + "@storageModeAppFolderSubtitle": { + "description": "Subtitle for app folder storage mode" + }, + "storageModeSaf": "Custom Folder (SAF)", + "@storageModeSaf": { + "description": "Storage mode option - Storage Access Framework" + }, + "storageModeSafSubtitle": "Pick any folder, including SD card", + "@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" + }, + "downloadFilenameInsertTag": "Tap to insert tag:", + "@downloadFilenameInsertTag": { + "description": "Label above filename tag chips" + }, + "downloadSeparateSinglesEnabled": "Singles and EPs saved in a separate folder", + "@downloadSeparateSinglesEnabled": { + "description": "Subtitle when separate singles folder is on" + }, + "downloadSeparateSinglesDisabled": "Singles and albums saved in the same folder", + "@downloadSeparateSinglesDisabled": { + "description": "Subtitle when separate singles folder is off" + }, + "downloadArtistNameFilters": "Artist Name Filters", + "@downloadArtistNameFilters": { + "description": "Setting title for artist folder filter options" + }, + "downloadCreatePlaylistSourceFolder": "Playlist Source Folder", + "@downloadCreatePlaylistSourceFolder": { + "description": "Setting to create a subfolder per playlist source" + }, + "downloadCreatePlaylistSourceFolderEnabled": "A subfolder is created for each playlist", + "@downloadCreatePlaylistSourceFolderEnabled": { + "description": "Subtitle when playlist folder is enabled" + }, + "downloadCreatePlaylistSourceFolderDisabled": "All tracks saved directly to download folder", + "@downloadCreatePlaylistSourceFolderDisabled": { + "description": "Subtitle when playlist folder is disabled" + }, + "downloadCreatePlaylistSourceFolderRedundant": "Handled by folder organization setting", + "@downloadCreatePlaylistSourceFolderRedundant": { + "description": "Subtitle when folder organization is already set to playlist" + }, + "downloadSongLinkRegion": "SongLink Region", + "@downloadSongLinkRegion": { + "description": "Setting for SongLink region used during fallback resolution" + }, + "downloadNetworkCompatibilityMode": "Network Compatibility Mode", + "@downloadNetworkCompatibilityMode": { + "description": "Setting for legacy TLS/network handling" + }, + "downloadNetworkCompatibilityModeEnabled": "Using legacy TLS settings for older networks", + "@downloadNetworkCompatibilityModeEnabled": { + "description": "Subtitle when network compatibility mode is on" + }, + "downloadNetworkCompatibilityModeDisabled": "Using standard network settings", + "@downloadNetworkCompatibilityModeDisabled": { + "description": "Subtitle when network compatibility mode is off" + }, + "downloadAllowLocalNetwork": "Allow Local Network Access", + "@downloadAllowLocalNetwork": { + "description": "Setting title for allowing requests to private/local network targets" + }, + "downloadAllowLocalNetworkEnabled": "Requests to local/private addresses are allowed (for local proxy or custom DNS)", + "@downloadAllowLocalNetworkEnabled": { + "description": "Subtitle when allow local network access is on" + }, + "downloadAllowLocalNetworkDisabled": "Local/private addresses are blocked for security", + "@downloadAllowLocalNetworkDisabled": { + "description": "Subtitle when allow local network access is off" + }, + "downloadSelectServiceToEnable": "Select a provider with quality options to enable this option", + "@downloadSelectServiceToEnable": { + "description": "Subtitle when quality picker is disabled due to extension service" + }, + "downloadEmbedLyricsDisabled": "Enable metadata embedding first", + "@downloadEmbedLyricsDisabled": { + "description": "Subtitle when lyrics embedding is blocked by metadata toggle" + }, + "downloadNeteaseIncludeTranslation": "Netease: Include Translation", + "@downloadNeteaseIncludeTranslation": { + "description": "Setting to include translated lyrics from Netease" + }, + "downloadNeteaseIncludeTranslationEnabled": "Chinese translation lines included", + "@downloadNeteaseIncludeTranslationEnabled": { + "description": "Subtitle when Netease translation is on" + }, + "downloadNeteaseIncludeTranslationDisabled": "Original lyrics only", + "@downloadNeteaseIncludeTranslationDisabled": { + "description": "Subtitle when Netease translation is off" + }, + "downloadNeteaseIncludeRomanization": "Netease: Include Romanization", + "@downloadNeteaseIncludeRomanization": { + "description": "Setting to include romanized lyrics from Netease" + }, + "downloadNeteaseIncludeRomanizationEnabled": "Romanization lines included", + "@downloadNeteaseIncludeRomanizationEnabled": { + "description": "Subtitle when Netease romanization is on" + }, + "downloadNeteaseIncludeRomanizationDisabled": "No romanization", + "@downloadNeteaseIncludeRomanizationDisabled": { + "description": "Subtitle when Netease romanization is off" + }, + "downloadAppleQqMultiPerson": "Apple / QQ: Multi-Person Lyrics", + "@downloadAppleQqMultiPerson": { + "description": "Setting for word-by-word multi-person lyrics from Apple Music and QQ Music" + }, + "downloadAppleQqMultiPersonEnabled": "Speaker labels included for duets and group tracks", + "@downloadAppleQqMultiPersonEnabled": { + "description": "Subtitle when multi-person lyrics is on" + }, + "downloadAppleQqMultiPersonDisabled": "Standard lyrics without speaker labels", + "@downloadAppleQqMultiPersonDisabled": { + "description": "Subtitle when multi-person lyrics is off" + }, + "downloadAppleElrcWordSync": "Apple Music eLRC Word Sync", + "@downloadAppleElrcWordSync": { + "description": "Setting for preserving Apple Music word-by-word eLRC timestamps" + }, + "downloadAppleElrcWordSyncEnabled": "Raw word-by-word timestamps preserved", + "@downloadAppleElrcWordSyncEnabled": { + "description": "Subtitle when Apple Music eLRC word sync is enabled" + }, + "downloadAppleElrcWordSyncDisabled": "Safer line-by-line Apple Music lyrics", + "@downloadAppleElrcWordSyncDisabled": { + "description": "Subtitle when Apple Music eLRC word sync is disabled" + }, + "downloadMusixmatchLanguage": "Musixmatch Language", + "@downloadMusixmatchLanguage": { + "description": "Setting for Musixmatch lyrics translation language" + }, + "downloadMusixmatchLanguageAuto": "Auto (original language)", + "@downloadMusixmatchLanguageAuto": { + "description": "Subtitle when no language is set" + }, + "downloadFilterContributing": "Filter Contributing Artists", + "@downloadFilterContributing": { + "description": "Setting to strip contributing artists from Album Artist folder name" + }, + "downloadFilterContributingEnabled": "Contributing artists removed from Album Artist folder name", + "@downloadFilterContributingEnabled": { + "description": "Subtitle when contributing artist filter is on" + }, + "downloadFilterContributingDisabled": "Full Album Artist string used", + "@downloadFilterContributingDisabled": { + "description": "Subtitle when contributing artist filter is off" + }, + "downloadProvidersNoneEnabled": "No providers enabled", + "@downloadProvidersNoneEnabled": { + "description": "Shown when no lyrics providers are active" + }, + "downloadMusixmatchLanguageCode": "Language code", + "@downloadMusixmatchLanguageCode": { + "description": "Label for Musixmatch language input field" + }, + "downloadMusixmatchLanguageHint": "e.g. en, de, ja", + "@downloadMusixmatchLanguageHint": { + "description": "Placeholder for Musixmatch language input" + }, + "downloadMusixmatchLanguageDesc": "Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.", + "@downloadMusixmatchLanguageDesc": { + "description": "Description in Musixmatch language picker" + }, + "downloadMusixmatchAuto": "Auto", + "@downloadMusixmatchAuto": { + "description": "Button to clear Musixmatch language (use auto)" + }, + "downloadNetworkAnySubtitle": "Use WiFi or mobile data", + "@downloadNetworkAnySubtitle": { + "description": "Subtitle for any-network option in picker" + }, + "downloadNetworkWifiOnlySubtitle": "Downloads pause when on mobile data", + "@downloadNetworkWifiOnlySubtitle": { + "description": "Subtitle for WiFi-only option in picker" + }, + "downloadSongLinkRegionDesc": "Region used when resolving track links via SongLink. Choose the country where your streaming services are available.", + "@downloadSongLinkRegionDesc": { + "description": "Description in SongLink region picker" + }, + "snackbarUnsupportedAudioFormat": "Unsupported audio format", + "@snackbarUnsupportedAudioFormat": { + "description": "Snackbar when the audio format is not supported for the requested operation" + }, + "cacheRefresh": "Refresh", + "@cacheRefresh": { + "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFill": "Auto-fill from online", + "@editMetadataAutoFill": { + "description": "Section title for selective online metadata auto-fill in the edit metadata sheet" + }, + "editMetadataAutoFillDesc": "Choose a metadata extension, select fields, then review its data before applying", + "@editMetadataAutoFillDesc": { + "description": "Description for the auto-fill section" + }, + "editMetadataAutoFillSource": "Metadata source", + "@editMetadataAutoFillSource": { + "description": "Label for the metadata extension selector in online auto-fill" + }, + "editMetadataAutoFillSourceAutomatic": "Automatic (provider priority)", + "@editMetadataAutoFillSourceAutomatic": { + "description": "Automatic source option that follows configured metadata provider priority" + }, + "editMetadataAutoFillFind": "Find metadata", + "@editMetadataAutoFillFind": { + "description": "Button label for finding an online metadata candidate" + }, + "editMetadataAutoFillPreview": "Data from {source}", + "@editMetadataAutoFillPreview": { + "description": "Title for the online metadata preview", + "placeholders": { + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillCoverAvailable": "Cover artwork available", + "@editMetadataAutoFillCoverAvailable": { + "description": "Preview value when the selected metadata source provides cover artwork" + }, + "editMetadataAutoFillApply": "Apply selected data", + "@editMetadataAutoFillApply": { + "description": "Button label for applying the previewed metadata" + }, + "editMetadataAutoFillDoneFromSource": "Filled {count} {count, plural, =1{field} other{fields}} from {source}", + "@editMetadataAutoFillDoneFromSource": { + "description": "Snackbar confirming fields applied from a selected metadata source", + "placeholders": { + "count": { + "type": "int" + }, + "source": { + "type": "String" + } + } + }, + "editMetadataAutoFillFetch": "Fetch & Fill", + "@editMetadataAutoFillFetch": { + "description": "Button label to fetch online metadata and fill selected fields" + }, + "editMetadataAutoFillSearching": "Searching online...", + "@editMetadataAutoFillSearching": { + "description": "Snackbar shown while searching for online metadata" + }, + "editMetadataAutoFillNoResults": "No matching metadata found online", + "@editMetadataAutoFillNoResults": { + "description": "Snackbar when online metadata search returns no results" + }, + "editMetadataAutoFillDone": "Filled {count} {count, plural, =1{field} other{fields}} from online metadata", + "@editMetadataAutoFillDone": { + "description": "Snackbar confirming how many fields were auto-filled", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "editMetadataAutoFillNoneSelected": "Select at least one field to auto-fill", + "@editMetadataAutoFillNoneSelected": { + "description": "Snackbar when user taps Fetch without selecting any fields" + }, + "editMetadataFieldTitle": "Title", + "@editMetadataFieldTitle": { + "description": "Chip label for title field in auto-fill selector" + }, + "editMetadataFieldArtist": "Artist", + "@editMetadataFieldArtist": { + "description": "Chip label for artist field in auto-fill selector" + }, + "editMetadataFieldAlbum": "Album", + "@editMetadataFieldAlbum": { + "description": "Chip label for album field in auto-fill selector" + }, + "editMetadataFieldAlbumArtist": "Album Artist", + "@editMetadataFieldAlbumArtist": { + "description": "Chip label for album artist field in auto-fill selector" + }, + "editMetadataFieldDate": "Date", + "@editMetadataFieldDate": { + "description": "Chip label for date field in auto-fill selector" + }, + "editMetadataFieldTrackNum": "Track #", + "@editMetadataFieldTrackNum": { + "description": "Chip label for track number field in auto-fill selector" + }, + "editMetadataFieldDiscNum": "Disc #", + "@editMetadataFieldDiscNum": { + "description": "Chip label for disc number field in auto-fill selector" + }, + "editMetadataFieldGenre": "Genre", + "@editMetadataFieldGenre": { + "description": "Chip label for genre field in auto-fill selector" + }, + "editMetadataFieldIsrc": "ISRC", + "@editMetadataFieldIsrc": { + "description": "Chip label for ISRC field in auto-fill selector" + }, + "editMetadataFieldLabel": "Label", + "@editMetadataFieldLabel": { + "description": "Chip label for label field in auto-fill selector" + }, + "editMetadataFieldCopyright": "Copyright", + "@editMetadataFieldCopyright": { + "description": "Chip label for copyright field in auto-fill selector" + }, + "editMetadataFieldCover": "Cover Art", + "@editMetadataFieldCover": { + "description": "Chip label for cover art field in auto-fill selector" + }, + "editMetadataSelectAll": "All", + "@editMetadataSelectAll": { + "description": "Button to select all fields for auto-fill" + }, + "editMetadataSelectEmpty": "Empty only", + "@editMetadataSelectEmpty": { + "description": "Button to select only fields that are currently empty" + }, + "queueDownloadingCount": "Downloading ({count})", + "@queueDownloadingCount": { + "description": "Header for active downloads section with count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueFilteringIndicator": "Filtering...", + "@queueFilteringIndicator": { + "description": "Shown while filter results are being computed" + }, + "queueTrackCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "@queueTrackCount": { + "description": "Track count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueAlbumCount": "{count, plural, =1{1 album} other{{count} albums}}", + "@queueAlbumCount": { + "description": "Album count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyAlbums": "No album downloads", + "@queueEmptyAlbums": { + "description": "Empty state title when no album downloads exist" + }, + "queueEmptyAlbumsSubtitle": "Download multiple tracks from an album to see them here", + "@queueEmptyAlbumsSubtitle": { + "description": "Empty state subtitle for album downloads" + }, + "queueEmptySingles": "No single downloads", + "@queueEmptySingles": { + "description": "Empty state title when no single track downloads exist" + }, + "queueEmptySinglesSubtitle": "Single track downloads will appear here", + "@queueEmptySinglesSubtitle": { + "description": "Empty state subtitle for single track downloads" + }, + "queuePlaylistCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@queuePlaylistCount": { + "description": "Playlist count label with plural support", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueEmptyPlaylistsSubtitle": "Create a playlist to organize your tracks", + "@queueEmptyPlaylistsSubtitle": { + "description": "Empty state subtitle for the playlists library view" + }, + "libraryDefaultView": "Default view", + "@libraryDefaultView": { + "description": "Setting title - which library view opens when switching to the Library tab" + }, + "libraryDefaultViewLastUsed": "Last used", + "@libraryDefaultViewLastUsed": { + "description": "Default view option - keep the last used library view" + }, + "queueEmptyHistory": "No download history", + "@queueEmptyHistory": { + "description": "Empty state title when download history is empty" + }, + "queueEmptyHistorySubtitle": "Downloaded tracks will appear here", + "@queueEmptyHistorySubtitle": { + "description": "Empty state subtitle for download history" + }, + "selectionAllPlaylistsSelected": "All playlists selected", + "@selectionAllPlaylistsSelected": { + "description": "Shown when all playlists are selected in selection mode" + }, + "selectionTapPlaylistsToSelect": "Tap playlists to select", + "@selectionTapPlaylistsToSelect": { + "description": "Hint shown in playlist selection mode" + }, + "selectionSelectPlaylistsToDelete": "Select playlists to delete", + "@selectionSelectPlaylistsToDelete": { + "description": "Hint shown when no playlists are selected for deletion" + }, + "audioAnalysisTitle": "Audio Quality Analysis", + "@audioAnalysisTitle": { + "description": "Title for audio analysis section" + }, + "audioAnalysisDescription": "Verify lossless quality with spectrum analysis", + "@audioAnalysisDescription": { + "description": "Description for audio analysis tap-to-analyze prompt" + }, + "audioAnalysisAnalyzing": "Analyzing audio...", + "@audioAnalysisAnalyzing": { + "description": "Loading text while analyzing audio" + }, + "audioAnalysisSampleRate": "Sample Rate", + "@audioAnalysisSampleRate": { + "description": "Sample rate metric label" + }, + "audioAnalysisCodec": "Codec", + "@audioAnalysisCodec": { + "description": "Audio codec metric label" + }, + "audioAnalysisContainer": "Container", + "@audioAnalysisContainer": { + "description": "Audio container metric label" + }, + "audioAnalysisDecodedFormat": "Decoded Format", + "@audioAnalysisDecodedFormat": { + "description": "Decoded sample format metric label" + }, + "audioAnalysisBitDepth": "Bit Depth", + "@audioAnalysisBitDepth": { + "description": "Bit depth metric label" + }, + "audioAnalysisChannels": "Channels", + "@audioAnalysisChannels": { + "description": "Channels metric label" + }, + "audioAnalysisDuration": "Duration", + "@audioAnalysisDuration": { + "description": "Duration metric label" + }, + "audioAnalysisNyquist": "Nyquist", + "@audioAnalysisNyquist": { + "description": "Nyquist frequency metric label" + }, + "audioAnalysisFileSize": "Size", + "@audioAnalysisFileSize": { + "description": "File size metric label" + }, + "audioAnalysisDynamicRange": "Dynamic Range", + "@audioAnalysisDynamicRange": { + "description": "Dynamic range metric label" + }, + "audioAnalysisPeak": "Peak", + "@audioAnalysisPeak": { + "description": "Peak amplitude metric label" + }, + "audioAnalysisRms": "RMS", + "@audioAnalysisRms": { + "description": "RMS level metric label" + }, + "audioAnalysisLufs": "LUFS", + "@audioAnalysisLufs": { + "description": "Integrated loudness metric label" + }, + "audioAnalysisTruePeak": "True Peak", + "@audioAnalysisTruePeak": { + "description": "True peak metric label" + }, + "audioAnalysisClipping": "Clipping", + "@audioAnalysisClipping": { + "description": "Clipping metric label" + }, + "audioAnalysisNoClipping": "No clipping", + "@audioAnalysisNoClipping": { + "description": "Displayed when no clipped samples were detected" + }, + "audioAnalysisSpectralCutoff": "Spectral Cutoff", + "@audioAnalysisSpectralCutoff": { + "description": "Estimated spectral cutoff metric label" + }, + "audioAnalysisCutoffNotDetected": "Not detected", + "@audioAnalysisCutoffNotDetected": { + "description": "Displayed when no reliable broadband spectral cutoff can be detected" + }, + "audioAnalysisChannelStats": "Per-channel Stats", + "@audioAnalysisChannelStats": { + "description": "Per-channel audio analysis section label" + }, + "audioAnalysisSamples": "Samples", + "@audioAnalysisSamples": { + "description": "Total samples metric label" + }, + "audioAnalysisRescan": "Re-analyze", + "@audioAnalysisRescan": { + "description": "Tooltip/label for the button that re-runs the audio analysis, discarding cached results" + }, + "audioAnalysisRescanning": "Re-analyzing audio...", + "@audioAnalysisRescanning": { + "description": "Loading text while audio is being re-analyzed after an explicit refresh" + }, + "extensionsHomeFeedProvider": "Home Feed Provider", + "@extensionsHomeFeedProvider": { + "description": "Extensions page - label for home feed provider selector" + }, + "extensionsHomeFeedDescription": "Choose which extension provides the home feed on the main screen", + "@extensionsHomeFeedDescription": { + "description": "Extensions page - description for home feed provider picker" + }, + "extensionsHomeFeedAuto": "Auto", + "@extensionsHomeFeedAuto": { + "description": "Label for auto-selected search provider" + }, + "extensionsHomeFeedAutoSubtitle": "Automatically select the best available", + "@extensionsHomeFeedAutoSubtitle": { + "description": "Extensions page - subtitle for auto home feed option" + }, + "extensionsHomeFeedOff": "Off", + "@extensionsHomeFeedOff": { + "description": "Extensions page - home feed provider option: off" + }, + "extensionsHomeFeedOffSubtitle": "Do not show the home feed on the main screen", + "@extensionsHomeFeedOffSubtitle": { + "description": "Extensions page - subtitle for off home feed option" + }, + "extensionsHomeFeedUse": "Use {extensionName} home feed", + "@extensionsHomeFeedUse": { + "description": "Extensions page - subtitle for a specific extension home feed option", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "extensionsNoHomeFeedExtensions": "No extensions with home feed", + "@extensionsNoHomeFeedExtensions": { + "description": "Extensions page - shown when no installed extension has home feed" + }, + "cancelDownloadTitle": "Cancel download?", + "@cancelDownloadTitle": { + "description": "Dialog title when confirming cancellation of an active download" + }, + "cancelDownloadContent": "This will cancel the active download for \"{trackName}\".", + "@cancelDownloadContent": { + "description": "Dialog body when confirming cancellation of an active download", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "cancelDownloadKeep": "Keep", + "@cancelDownloadKeep": { + "description": "Dialog button - keep the active download (do not cancel)" + }, + "queueCancelledTitle": "Download cancelled", + "@queueCancelledTitle": { + "description": "Dialog title when opening a cancelled queue item" + }, + "queueCancelledMessage": "This download was cancelled. Retry it or remove it from the queue.", + "@queueCancelledMessage": { + "description": "Dialog body when opening a cancelled queue item" + }, + "metadataSaveFailedFfmpeg": "Failed to save metadata via FFmpeg", + "@metadataSaveFailedFfmpeg": { + "description": "Snackbar error when FFmpeg fails to write metadata" + }, + "metadataSaveFailedStorage": "Failed to write metadata back to storage", + "@metadataSaveFailedStorage": { + "description": "Snackbar error when writing metadata file back to storage fails" + }, + "snackbarFolderPickerFailed": "Failed to open folder picker: {error}", + "@snackbarFolderPickerFailed": { + "description": "Snackbar shown when folder picker fails to open", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "notifDownloadingTrack": "Downloading {trackName}", + "@notifDownloadingTrack": { + "description": "Notification title while downloading a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifFinalizingTrack": "Finalizing {trackName}", + "@notifFinalizingTrack": { + "description": "Notification title while finalizing (embedding metadata) a track", + "placeholders": { + "trackName": { + "type": "String" + } + } + }, + "notifEmbeddingMetadata": "Embedding metadata...", + "@notifEmbeddingMetadata": { + "description": "Notification body while embedding metadata into a downloaded track" + }, + "notifAlreadyInLibraryCount": "Already in Library ({completed}/{total})", + "@notifAlreadyInLibraryCount": { + "description": "Notification title when track is already in library, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifAlreadyInLibrary": "Already in Library", + "@notifAlreadyInLibrary": { + "description": "Notification title when track is already in library" + }, + "notifDownloadCompleteCount": "Download Complete ({completed}/{total})", + "@notifDownloadCompleteCount": { + "description": "Notification title when download is complete, with count", + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "notifDownloadComplete": "Download Complete", + "@notifDownloadComplete": { + "description": "Notification title when a single download is complete" + }, + "notifDownloadsFinished": "Downloads Finished ({completed} done, {failed} failed)", + "@notifDownloadsFinished": { + "description": "Notification title when queue finishes with some failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "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" + }, + "notifTracksDownloadedSuccess": "{count, plural, =1{1 track downloaded successfully} other{{count} tracks downloaded successfully}}", + "@notifTracksDownloadedSuccess": { + "description": "Notification body for queue complete - how many tracks were downloaded", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifDownloadsFinishedBody": "{completed, plural, =1{1 track downloaded} other{{completed} tracks downloaded}}, {failed, plural, =1{1 failed} other{{failed} failed}}", + "@notifDownloadsFinishedBody": { + "description": "Notification body when queue finishes with failures", + "placeholders": { + "completed": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "notifDownloadsCanceledTitle": "Downloads canceled", + "@notifDownloadsCanceledTitle": { + "description": "Notification title when downloads are canceled by the user" + }, + "notifDownloadsCanceledBody": "{count, plural, =1{1 download canceled by user} other{{count} downloads canceled by user}}", + "@notifDownloadsCanceledBody": { + "description": "Notification body when downloads are canceled by the user", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifScanningLibrary": "Scanning local library", + "@notifScanningLibrary": { + "description": "Notification title while scanning local library" + }, + "notifLibraryScanProgressWithTotal": "{scanned}/{total} files • {percentage}%", + "@notifLibraryScanProgressWithTotal": { + "description": "Notification body for library scan progress when total is known", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanProgressNoTotal": "{scanned} files scanned • {percentage}%", + "@notifLibraryScanProgressNoTotal": { + "description": "Notification body for library scan progress when total is unknown", + "placeholders": { + "scanned": { + "type": "int" + }, + "percentage": { + "type": "int" + } + } + }, + "notifLibraryScanComplete": "Library scan complete", + "@notifLibraryScanComplete": { + "description": "Notification title when library scan finishes" + }, + "notifLibraryScanCompleteBody": "{count} tracks indexed", + "@notifLibraryScanCompleteBody": { + "description": "Notification body for library scan complete - number of indexed tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanExcluded": "{count} excluded", + "@notifLibraryScanExcluded": { + "description": "Library scan complete suffix - excluded track count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanErrors": "{count} errors", + "@notifLibraryScanErrors": { + "description": "Library scan complete suffix - error count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notifLibraryScanFailed": "Library scan failed", + "@notifLibraryScanFailed": { + "description": "Notification title when library scan fails" + }, + "notifLibraryScanCancelled": "Library scan cancelled", + "@notifLibraryScanCancelled": { + "description": "Notification title when library scan is cancelled by the user" + }, + "notifLibraryScanStopped": "Scan stopped before completion.", + "@notifLibraryScanStopped": { + "description": "Notification body when library scan is cancelled" + }, + "notifDownloadingUpdate": "Downloading SpotiFLAC Mobile v{version}", + "@notifDownloadingUpdate": { + "description": "Notification title while downloading an app update", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateProgress": "{received} / {total} MB • {percentage}%", + "@notifUpdateProgress": { + "description": "Notification body showing update download progress", + "placeholders": { + "received": { + "type": "String" + }, + "total": { + "type": "String" + }, + "percentage": { + "type": "int" + } + } + }, + "notifUpdateReady": "Update Ready", + "@notifUpdateReady": { + "description": "Notification title when app update download is complete" + }, + "notifUpdateReadyBody": "SpotiFLAC Mobile v{version} downloaded. Tap to install.", + "@notifUpdateReadyBody": { + "description": "Notification body when app update is ready to install", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "notifUpdateFailed": "Update Failed", + "@notifUpdateFailed": { + "description": "Notification title when app update download fails" + }, + "notifUpdateFailedBody": "Could not download update. Try again later.", + "@notifUpdateFailedBody": { + "description": "Notification body when app update download fails" + }, + "searchTracks": "Tracks", + "@searchTracks": { + "description": "Search filter label - tracks" + }, + "homeSearchHintDefault": "Paste supported URL or search...", + "@homeSearchHintDefault": { + "description": "Default placeholder for the main search field on Home" + }, + "homeSearchHintProvider": "Search with {providerName}...", + "@homeSearchHintProvider": { + "description": "Placeholder for the main search field when a provider is selected", + "placeholders": { + "providerName": { + "type": "String" + } + } + }, + "homeImportCsvTooltip": "Import playlist (CSV, M3U)", + "@homeImportCsvTooltip": { + "description": "Tooltip for importing a CSV or M3U playlist file into Home search" + }, + "homeChangeSearchProviderTooltip": "Change search provider", + "@homeChangeSearchProviderTooltip": { + "description": "Tooltip for the Home search provider picker" + }, + "actionPaste": "Paste", + "@actionPaste": { + "description": "Generic action - paste from clipboard" + }, + "tutorialSearchHint": "Paste or search...", + "@tutorialSearchHint": { + "description": "Placeholder shown in the tutorial search demo" + }, + "tutorialDownloadCompletedSemantics": "Download completed", + "@tutorialDownloadCompletedSemantics": { + "description": "Accessibility label for completed download state in tutorial demo" + }, + "tutorialDownloadInProgressSemantics": "Download in progress", + "@tutorialDownloadInProgressSemantics": { + "description": "Accessibility label for active download state in tutorial demo" + }, + "tutorialStartDownloadSemantics": "Start download", + "@tutorialStartDownloadSemantics": { + "description": "Accessibility label for idle download button in tutorial demo" + }, + "optionsEmbedMetadata": "Embed Metadata", + "@optionsEmbedMetadata": { + "description": "Settings toggle title for writing metadata into downloaded files" + }, + "optionsEmbedMetadataSubtitleOn": "Write metadata, cover art, and embedded lyrics to files", + "@optionsEmbedMetadataSubtitleOn": { + "description": "Subtitle when metadata embedding is enabled" + }, + "optionsEmbedMetadataSubtitleOff": "Disabled (advanced): skip all metadata embedding", + "@optionsEmbedMetadataSubtitleOff": { + "description": "Subtitle when metadata embedding is disabled" + }, + "trackCoverNoEmbeddedArt": "No embedded album art found", + "@trackCoverNoEmbeddedArt": { + "description": "Message shown when a track file has no embedded cover art" + }, + "trackCoverReplace": "Replace Cover", + "@trackCoverReplace": { + "description": "Button label for replacing selected cover art" + }, + "trackCoverPick": "Pick Cover", + "@trackCoverPick": { + "description": "Button label for selecting cover art" + }, + "trackCoverClearSelected": "Clear selected cover", + "@trackCoverClearSelected": { + "description": "Tooltip for clearing the newly selected cover art" + }, + "trackCoverCurrent": "Current cover", + "@trackCoverCurrent": { + "description": "Label for the currently embedded cover preview" + }, + "trackCoverSelected": "Selected cover", + "@trackCoverSelected": { + "description": "Label for the newly selected cover preview" + }, + "trackCoverReplaceNotice": "The selected cover will replace the current embedded cover when you tap Save.", + "@trackCoverReplaceNotice": { + "description": "Notice shown when a new cover has been selected but not saved yet" + }, + "trackCoverResolution": "Cover resolution", + "@trackCoverResolution": { + "description": "Label for selecting the embedded cover art resolution" + }, + "trackCoverResolutionHint": "Sets the longest edge when saved. Enlarging does not add image detail.", + "@trackCoverResolutionHint": { + "description": "Explanation below the embedded cover art resolution selector" + }, + "trackCoverResizeFailed": "The cover image could not be resized. Please try another size or image.", + "@trackCoverResizeFailed": { + "description": "Error shown when resizing cover art before saving metadata fails" + }, + "actionStop": "Stop", + "@actionStop": { + "description": "Generic action - stop" + }, + "queueFinalizingDownload": "Finalizing download", + "@queueFinalizingDownload": { + "description": "Accessibility label for a queue item that is finalizing" + }, + "queueDownloadNext": "Download next", + "@queueDownloadNext": { + "description": "Tooltip on a queued download row; moves the item to the front of the queue so the next free slot downloads it" + }, + "queueMoveUp": "Move up", + "@queueMoveUp": { + "description": "Queue item menu action - move the queued item one position earlier" + }, + "queueMoveDown": "Move down", + "@queueMoveDown": { + "description": "Queue item menu action - move the queued item one position later" + }, + "editMetadataMusicBrainzButton": "Fetch from MusicBrainz", + "@editMetadataMusicBrainzButton": { + "description": "Tag editor button that fills genre and album artist from MusicBrainz by ISRC" + }, + "editMetadataMusicBrainzFilled": "Updated from MusicBrainz", + "@editMetadataMusicBrainzFilled": { + "description": "Snackbar after MusicBrainz suggestions were applied to the tag editor fields" + }, + "editMetadataMusicBrainzNothing": "Nothing found on MusicBrainz", + "@editMetadataMusicBrainzNothing": { + "description": "Snackbar when the MusicBrainz lookup returns no data" + }, + "editMetadataMusicBrainzNeedsIsrc": "Requires an ISRC tag", + "@editMetadataMusicBrainzNeedsIsrc": { + "description": "Snackbar when the MusicBrainz lookup is tapped without an ISRC" + }, + "nowPlayingRepeatOff": "Repeat off", + "@nowPlayingRepeatOff": { + "description": "Repeat toggle tooltip when repeat is disabled" + }, + "nowPlayingRepeatAll": "Repeat all", + "@nowPlayingRepeatAll": { + "description": "Repeat toggle tooltip when the whole queue repeats" + }, + "nowPlayingRepeatOne": "Repeat one", + "@nowPlayingRepeatOne": { + "description": "Repeat toggle tooltip when the current track repeats" + }, + "queueNetworkFailedOffline": "{count} downloads failed while offline", + "@queueNetworkFailedOffline": { + "description": "Snackbar shown when connectivity returns and network-failed downloads can be retried", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadedFileMissing": "Downloaded file missing", + "@queueDownloadedFileMissing": { + "description": "Accessibility label when a downloaded file is missing from disk" + }, + "queueDownloadCompleted": "Download completed", + "@queueDownloadCompleted": { + "description": "Accessibility label for completed download state in queue" + }, + "queueRateLimitTitle": "Service rate limited", + "@queueRateLimitTitle": { + "description": "Title shown on a failed queue item when the download service rate limits requests" + }, + "queueRateLimitMessage": "This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.", + "@queueRateLimitMessage": { + "description": "Explanation shown on a failed queue item when the download service rate limits requests" + }, + "appearanceSelectAccentColor": "Select accent color {hex}", + "@appearanceSelectAccentColor": { + "description": "Accessibility label for picking an accent color", + "placeholders": { + "hex": { + "type": "String" + } + } + }, + "logAutoScrollOn": "Auto-scroll ON", + "@logAutoScrollOn": { + "description": "Tooltip when auto-scroll is enabled on the log screen" + }, + "logAutoScrollOff": "Auto-scroll OFF", + "@logAutoScrollOff": { + "description": "Tooltip when auto-scroll is disabled on the log screen" + }, + "logCopyLogs": "Copy logs", + "@logCopyLogs": { + "description": "Tooltip for copying logs" + }, + "logClearSearch": "Clear search", + "@logClearSearch": { + "description": "Tooltip for clearing the log search field" + }, + "logIssueIspBlockingLabel": "ISP BLOCKING DETECTED", + "@logIssueIspBlockingLabel": { + "description": "Diagnostic badge label when ISP blocking is detected" + }, + "logIssueIspBlockingDescription": "Your ISP may be blocking access to download services", + "@logIssueIspBlockingDescription": { + "description": "Diagnostic badge description for ISP blocking" + }, + "logIssueIspBlockingSuggestion": "Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8", + "@logIssueIspBlockingSuggestion": { + "description": "Diagnostic badge suggestion for ISP blocking" + }, + "logIssueRateLimitedLabel": "RATE LIMITED", + "@logIssueRateLimitedLabel": { + "description": "Diagnostic badge label when the service rate limits requests" + }, + "logIssueRateLimitedDescription": "Too many requests to the service", + "@logIssueRateLimitedDescription": { + "description": "Diagnostic badge description for rate limiting" + }, + "logIssueRateLimitedSuggestion": "Wait a few minutes before trying again", + "@logIssueRateLimitedSuggestion": { + "description": "Diagnostic badge suggestion for rate limiting" + }, + "logIssueNetworkErrorLabel": "NETWORK ERROR", + "@logIssueNetworkErrorLabel": { + "description": "Diagnostic badge label for generic network errors" + }, + "logIssueNetworkErrorDescription": "Connection issues detected", + "@logIssueNetworkErrorDescription": { + "description": "Diagnostic badge description for generic network errors" + }, + "logIssueNetworkErrorSuggestion": "Check your internet connection", + "@logIssueNetworkErrorSuggestion": { + "description": "Diagnostic badge suggestion for generic network errors" + }, + "logIssueTrackNotFoundLabel": "TRACK NOT FOUND", + "@logIssueTrackNotFoundLabel": { + "description": "Diagnostic badge label when a track is unavailable" + }, + "logIssueTrackNotFoundDescription": "Some tracks could not be found on download services", + "@logIssueTrackNotFoundDescription": { + "description": "Diagnostic badge description when a track is unavailable" + }, + "logIssueTrackNotFoundSuggestion": "The track may not be available in lossless quality", + "@logIssueTrackNotFoundSuggestion": { + "description": "Diagnostic badge suggestion when a track is unavailable" + }, + "clickableLookingUpArtist": "Looking up artist...", + "@clickableLookingUpArtist": { + "description": "Snackbar shown while clickable artist metadata is being resolved" + }, + "clickableInformationUnavailable": "{type} information not available", + "@clickableInformationUnavailable": { + "description": "Snackbar shown when clickable metadata cannot open a destination", + "placeholders": { + "type": { + "type": "String" + } + } + }, + "extensionDetailsTags": "Tags", + "@extensionDetailsTags": { + "description": "Section title for extension tags" + }, + "extensionDetailsInformation": "Information", + "@extensionDetailsInformation": { + "description": "Section title for extension metadata information" + }, + "extensionUtilityFunctions": "Utility Functions", + "@extensionUtilityFunctions": { + "description": "Capability label for utility-only extensions" + }, + "actionDismiss": "Dismiss", + "@actionDismiss": { + "description": "Generic action - dismiss" + }, + "setupChangeFolderTooltip": "Change folder", + "@setupChangeFolderTooltip": { + "description": "Tooltip for editing the selected download folder" + }, + "a11yOpenTrackByArtist": "Open track {trackName} by {artistName}", + "@a11yOpenTrackByArtist": { + "description": "Accessibility label for opening a track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11yOpenItem": "Open {itemType} {name}", + "@a11yOpenItem": { + "description": "Accessibility label for opening a generic item", + "placeholders": { + "itemType": { + "type": "String" + }, + "name": { + "type": "String" + } + } + }, + "a11yOpenItemCount": "Open {title}, {count} {count, plural, =1{item} other{items}}", + "@a11yOpenItemCount": { + "description": "Accessibility label for opening a grouped item with count", + "placeholders": { + "title": { + "type": "String" + }, + "count": { + "type": "int" + } + } + }, + "a11yOpenAlbumByArtistTrackCount": "Open album {albumName} by {artistName}, {trackCount} tracks", + "@a11yOpenAlbumByArtistTrackCount": { + "description": "Accessibility label for opening an album item with track count", + "placeholders": { + "albumName": { + "type": "String" + }, + "artistName": { + "type": "String" + }, + "trackCount": { + "type": "int" + } + } + }, + "a11yTrackByArtist": "{trackName} by {artistName}", + "@a11yTrackByArtist": { + "description": "Accessibility label for a queue or list track item", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "a11ySelectAlbum": "Select album {albumName}", + "@a11ySelectAlbum": { + "description": "Accessibility label for selecting an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "a11yOpenAlbum": "Open album {albumName}", + "@a11yOpenAlbum": { + "description": "Accessibility label for opening an album", + "placeholders": { + "albumName": { + "type": "String" + } + } + }, + "settingsFiles": "Files & Folders", + "@settingsFiles": { + "description": "Settings menu item - file and folder settings" + }, + "settingsFilesSubtitle": "Download location, filename, folder structure", + "@settingsFilesSubtitle": { + "description": "Subtitle for files & folders settings" + }, + "settingsMetadata": "Metadata", + "@settingsMetadata": { + "description": "Settings menu item - metadata settings" + }, + "settingsMetadataSubtitle": "Cover art, tags, ReplayGain, providers", + "@settingsMetadataSubtitle": { + "description": "Subtitle for metadata settings" + }, + "settingsLyrics": "Lyrics", + "@settingsLyrics": { + "description": "Settings menu item - lyrics settings" + }, + "settingsLyricsSubtitle": "Embed, mode, providers, language options", + "@settingsLyricsSubtitle": { + "description": "Subtitle for lyrics settings" + }, + "settingsApp": "App", + "@settingsApp": { + "description": "Settings menu item - app settings" + }, + "settingsAppSubtitle": "Updates, data, extension repo, debug", + "@settingsAppSubtitle": { + "description": "Subtitle for app settings" + }, + "sectionMetadataProviders": "Providers", + "@sectionMetadataProviders": { + "description": "Settings section header for metadata providers" + }, + "sectionDuplicates": "Duplicates", + "@sectionDuplicates": { + "description": "Settings section header for deduplication" + }, + "sectionLyricsProviderOptions": "Provider Options", + "@sectionLyricsProviderOptions": { + "description": "Settings section header for per-provider lyrics options" + }, + "metadataProvidersTitle": "Metadata Provider Priority", + "@metadataProvidersTitle": { + "description": "Settings item title for metadata provider order" + }, + "metadataProvidersSubtitle": "Drag to set search and metadata source order", + "@metadataProvidersSubtitle": { + "description": "Subtitle for metadata provider priority item" + }, + "downloadDeduplication": "Skip Duplicate Downloads", + "@downloadDeduplication": { + "description": "Setting - skip tracks already in download history" + }, + "downloadDeduplicationEnabled": "Already-downloaded tracks will be skipped", + "@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": "Keep every quality version; add its measured quality to the filename only when the name is already used", + "@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" + }, + "downloadFallbackExtensionsSubtitle": "Choose which extensions can be used as fallback", + "@downloadFallbackExtensionsSubtitle": { + "description": "Subtitle for fallback extensions item" + }, + "editMetadataFieldDateHint": "YYYY-MM-DD or YYYY", + "@editMetadataFieldDateHint": { + "description": "Hint text for the edit metadata date field" + }, + "editMetadataFieldTrackTotal": "Track Total", + "@editMetadataFieldTrackTotal": { + "description": "Label for total tracks field in the edit metadata sheet" + }, + "editMetadataFieldDiscTotal": "Disc Total", + "@editMetadataFieldDiscTotal": { + "description": "Label for total discs field in the edit metadata sheet" + }, + "editMetadataFieldComposer": "Composer", + "@editMetadataFieldComposer": { + "description": "Label for composer field in the edit metadata sheet" + }, + "editMetadataFieldComment": "Comment", + "@editMetadataFieldComment": { + "description": "Label for comment field in the edit metadata sheet" + }, + "editMetadataAdvanced": "Advanced", + "@editMetadataAdvanced": { + "description": "Expandable section label for advanced metadata fields" + }, + "libraryFilterMetadataMissingTrackNumber": "Missing track number", + "@libraryFilterMetadataMissingTrackNumber": { + "description": "Filter option - items missing track number" + }, + "libraryFilterMetadataMissingDiscNumber": "Missing disc number", + "@libraryFilterMetadataMissingDiscNumber": { + "description": "Filter option - items missing disc number" + }, + "libraryFilterMetadataMissingArtist": "Missing artist", + "@libraryFilterMetadataMissingArtist": { + "description": "Filter option - items missing artist" + }, + "libraryFilterMetadataIncorrectIsrcFormat": "Incorrect ISRC format", + "@libraryFilterMetadataIncorrectIsrcFormat": { + "description": "Filter option - items with an invalid ISRC format" + }, + "libraryFilterMetadataMissingIsrc": "Missing ISRC", + "@libraryFilterMetadataMissingIsrc": { + "description": "Filter option - items without any ISRC tag" + }, + "libraryFilterMetadataMissingLabel": "Missing label", + "@libraryFilterMetadataMissingLabel": { + "description": "Filter option - items missing record label" + }, + "collectionDeletePlaylistsMessage": "Delete {count} {count, plural, =1{playlist} other{playlists}}?", + "@collectionDeletePlaylistsMessage": { + "description": "Confirmation message for deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionPlaylistsDeleted": "{count} {count, plural, =1{playlist} other{playlists}} deleted", + "@collectionPlaylistsDeleted": { + "description": "Snackbar after deleting selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "collectionAddedTracksToPlaylist": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName}", + "@collectionAddedTracksToPlaylist": { + "description": "Snackbar after adding multiple tracks to a playlist", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + } + } + }, + "collectionAddedTracksToPlaylistWithExisting": "Added {count} {count, plural, =1{track} other{tracks}} to {playlistName} ({alreadyCount} already in playlist)", + "@collectionAddedTracksToPlaylistWithExisting": { + "description": "Snackbar after adding multiple tracks to a playlist when some were already present", + "placeholders": { + "count": { + "type": "int" + }, + "playlistName": { + "type": "String" + }, + "alreadyCount": { + "type": "int" + } + } + }, + "itemCount": "{count} {count, plural, =1{item} other{items}}", + "@itemCount": { + "description": "Generic item count label", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "trackReEnrichSuccessWithFailures": "Metadata re-enriched successfully ({successCount}/{total}) - Failed: {failedCount}", + "@trackReEnrichSuccessWithFailures": { + "description": "Snackbar summary after batch metadata re-enrichment finishes with failures", + "placeholders": { + "successCount": { + "type": "int" + }, + "total": { + "type": "int" + }, + "failedCount": { + "type": "int" + } + } + }, + "selectionDeleteTracksCount": "Delete {count} {count, plural, =1{track} other{tracks}}", + "@selectionDeleteTracksCount": { + "description": "Button label for deleting selected tracks", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "queueDownloadSpeedStatus": "Downloading - {speed} MB/s", + "@queueDownloadSpeedStatus": { + "description": "Queue status while downloading with speed", + "placeholders": { + "speed": { + "type": "String" + } + } + }, + "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" + }, + "a11ySelectTrack": "Select track", + "@a11ySelectTrack": { + "description": "Accessibility label for selecting a track" + }, + "a11yDeselectTrack": "Deselect track", + "@a11yDeselectTrack": { + "description": "Accessibility label for deselecting a track" + }, + "a11yPlayTrackByArtist": "Play {trackName} by {artistName}", + "@a11yPlayTrackByArtist": { + "description": "Accessibility label for playing a local library track", + "placeholders": { + "trackName": { + "type": "String" + }, + "artistName": { + "type": "String" + } + } + }, + "storeExtensionsCount": "{count} {count, plural, =1{extension} other{extensions}}", + "@storeExtensionsCount": { + "description": "Store extension result count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "storeRequiresVersion": "Requires v{version}+", + "@storeRequiresVersion": { + "description": "Store compatibility badge for minimum app version", + "placeholders": { + "version": { + "type": "String" + } + } + }, + "actionGo": "Go", + "@actionGo": { + "description": "Generic action button label" + }, + "logIssueSummary": "Issue Summary", + "@logIssueSummary": { + "description": "Header for log issue analysis summary" + }, + "logTotalErrors": "Total errors: {count}", + "@logTotalErrors": { + "description": "Total error count in log issue analysis", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "logAffectedDomains": "Affected: {domains}", + "@logAffectedDomains": { + "description": "Affected domains in log issue analysis", + "placeholders": { + "domains": { + "type": "String" + } + } + }, + "libraryScanCancelled": "Scan cancelled", + "@libraryScanCancelled": { + "description": "Library scan status when a scan was cancelled" + }, + "libraryScanCancelledSubtitle": "You can retry the scan when ready.", + "@libraryScanCancelledSubtitle": { + "description": "Library scan status subtitle after cancellation" + }, + "libraryDownloadsHistoryExcluded": "{count} from Downloads history (excluded from list)", + "@libraryDownloadsHistoryExcluded": { + "description": "Library count note for downloaded history items excluded from the local list", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "downloadNativeWorker": "Native download worker", + "@downloadNativeWorker": { + "description": "Setting title for Android native download worker" + }, + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "@downloadNativeWorkerSubtitle": { + "description": "Setting subtitle for Android native download worker" + }, + "extensionServiceStatus": "Service Status", + "@extensionServiceStatus": { + "description": "Extension detail section header for service status" + }, + "extensionServiceHealth": "Service health", + "@extensionServiceHealth": { + "description": "Extension capability label for service health checks" + }, + "extensionHealthChecksConfigured": "{count} {count, plural, =1{check} other{checks}} configured", + "@extensionHealthChecksConfigured": { + "description": "Extension service health check count", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionOauthConnectHint": "Tap Connect to Spotify to fill this field.", + "@extensionOauthConnectHint": { + "description": "Hint for an OAuth login link field before connecting Spotify" + }, + "extensionLastChecked": "Last checked {time}", + "@extensionLastChecked": { + "description": "Timestamp for the latest extension service health check", + "placeholders": { + "time": { + "type": "String" + } + } + }, + "extensionRefreshStatus": "Refresh status", + "@extensionRefreshStatus": { + "description": "Tooltip for refreshing extension service health status" + }, + "extensionCustomUrlHandling": "Custom URL Handling", + "@extensionCustomUrlHandling": { + "description": "Extension detail section title for custom URL handling" + }, + "extensionCustomUrlHandlingSubtitle": "This extension can handle links from these sites", + "@extensionCustomUrlHandlingSubtitle": { + "description": "Extension detail subtitle for custom URL handling" + }, + "extensionCustomUrlHandlingShareHint": "Share links from these sites to SpotiFLAC Mobile and this extension will handle them.", + "@extensionCustomUrlHandlingShareHint": { + "description": "Extension detail hint explaining share-to-app URL handling" + }, + "extensionSettingsCount": "{count} {count, plural, =1{setting} other{settings}}", + "@extensionSettingsCount": { + "description": "Count of settings exposed by an extension quality option", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "extensionHealthOnline": "Online", + "@extensionHealthOnline": { + "description": "Extension service health status - online" + }, + "extensionHealthDegraded": "Degraded", + "@extensionHealthDegraded": { + "description": "Extension service health status - degraded" + }, + "extensionHealthOffline": "Offline", + "@extensionHealthOffline": { + "description": "Extension service health status - offline" + }, + "extensionHealthNotConfigured": "Not configured", + "@extensionHealthNotConfigured": { + "description": "Extension service health status - not configured" + }, + "extensionHealthUnknown": "Unknown", + "@extensionHealthUnknown": { + "description": "Extension service health status - unknown" + }, + "extensionHealthRequired": "required", + "@extensionHealthRequired": { + "description": "Label for a required extension service health check" + }, + "extensionSettingNotSet": "Not set", + "@extensionSettingNotSet": { + "description": "Value shown when an extension setting has no value" + }, + "extensionActionFailed": "Action failed", + "@extensionActionFailed": { + "description": "Fallback error when an extension action fails without details" + }, + "extensionEnterValue": "Enter value", + "@extensionEnterValue": { + "description": "Hint for editing an extension setting value" + }, + "extensionHealthServiceOnline": "Service online", + "@extensionHealthServiceOnline": { + "description": "Tooltip for online extension service" + }, + "extensionHealthServiceDegraded": "Service degraded", + "@extensionHealthServiceDegraded": { + "description": "Tooltip for degraded extension service" + }, + "extensionHealthServiceOffline": "Service offline", + "@extensionHealthServiceOffline": { + "description": "Tooltip for offline extension service" + }, + "extensionHealthServiceUnknown": "Service status unknown", + "@extensionHealthServiceUnknown": { + "description": "Tooltip for unknown extension service health" + }, + "audioAnalysisStereo": "Stereo", + "@audioAnalysisStereo": { + "description": "Audio channel layout label - stereo" + }, + "audioAnalysisMono": "Mono", + "@audioAnalysisMono": { + "description": "Audio channel layout label - mono" + }, + "trackOpenInService": "Open in {serviceName}", + "@trackOpenInService": { + "description": "Button label to open a track in a named music service", + "placeholders": { + "serviceName": { + "type": "String" + } + } + }, + "trackLyricsEmbeddedSource": "Embedded", + "@trackLyricsEmbeddedSource": { + "description": "Lyrics source label for embedded lyrics" + }, + "unknownAlbum": "Unknown Album", + "@unknownAlbum": { + "description": "Fallback album name when metadata is missing" + }, + "unknownArtist": "Unknown Artist", + "@unknownArtist": { + "description": "Fallback artist name when metadata is missing" + }, + "permissionAudio": "Audio", + "@permissionAudio": { + "description": "Audio permission type label" + }, + "permissionStorage": "Storage", + "@permissionStorage": { + "description": "Storage permission type label" + }, + "permissionNotification": "Notification", + "@permissionNotification": { + "description": "Notification permission type label" + }, + "errorInvalidFolderSelected": "Invalid folder selected", + "@errorInvalidFolderSelected": { + "description": "Error when the selected folder is invalid" + }, + "storeAnyVersion": "Any", + "@storeAnyVersion": { + "description": "Store detail value when any app version is accepted" + }, + "storeCategoryMetadata": "Metadata", + "@storeCategoryMetadata": { + "description": "Store extension category - metadata" + }, + "storeCategoryDownload": "Download", + "@storeCategoryDownload": { + "description": "Store extension category - download" + }, + "storeCategoryUtility": "Utility", + "@storeCategoryUtility": { + "description": "Store extension category - utility" + }, + "storeCategoryLyrics": "Lyrics", + "@storeCategoryLyrics": { + "description": "Store extension category - lyrics" + }, + "storeCategoryIntegration": "Integration", + "@storeCategoryIntegration": { + "description": "Store extension category - integration" + }, + "artistReleases": "Releases", + "@artistReleases": { + "description": "Section header for all artist releases" + }, + "editMetadataSelectNone": "None", + "@editMetadataSelectNone": { + "description": "Button to clear selected fields for auto-fill" + }, + "queueRetryAllFailed": "Retry {count} failed", + "@queueRetryAllFailed": { + "description": "Button to retry every failed download in the queue", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "settingsSaveDownloadHistory": "Save download history", + "@settingsSaveDownloadHistory": { + "description": "Settings switch title for storing completed downloads in history" + }, + "settingsSaveDownloadHistorySubtitle": "Keep completed downloads in history and library views", + "@settingsSaveDownloadHistorySubtitle": { + "description": "Settings switch subtitle for storing completed downloads in history" + }, + "dialogDisableHistoryTitle": "Turn off download history?", + "@dialogDisableHistoryTitle": { + "description": "Confirmation dialog title shown before disabling download history" + }, + "dialogDisableHistoryMessage": "Existing history will be cleared. Downloaded files will not be deleted.", + "@dialogDisableHistoryMessage": { + "description": "Confirmation dialog message shown before disabling download history" + }, + "dialogDisableAndClear": "Turn off and clear", + "@dialogDisableAndClear": { + "description": "Confirmation action to disable download history and clear existing entries" + }, + "openInOtherServices": "Open in Other Services", + "@openInOtherServices": { + "description": "Title and tooltip for finding the current collection in other services" + }, + "shareSheetNoExtensions": "No other compatible services", + "@shareSheetNoExtensions": { + "description": "Empty state when no extensions can be searched for cross-service links" + }, + "shareSheetNotFound": "Not found", + "@shareSheetNotFound": { + "description": "Cross-service share sheet row subtitle when a service has no match" + }, + "shareSheetCopyLink": "Copy Link", + "@shareSheetCopyLink": { + "description": "Tooltip for copying a cross-service link" + }, + "shareSheetLinkCopied": "{service} link copied", + "@shareSheetLinkCopied": { + "description": "Snackbar after copying a cross-service link", + "placeholders": { + "service": {} + } + }, + "libraryPlayback": "Playback", + "@libraryPlayback": { + "description": "Section header for playback settings in library settings" + }, + "libraryExternalPlayer": "External player", + "@libraryExternalPlayer": { + "description": "Setting option to use an external music player" + }, + "libraryExternalPlayerSubtitle": "Recommended for listening, best quality, gapless playback, EQ, and wider format support", + "@libraryExternalPlayerSubtitle": { + "description": "Subtitle for external player option" + }, + "libraryBuiltInPreviewPlayer": "Built-in preview player", + "@libraryBuiltInPreviewPlayer": { + "description": "Setting option to use the built-in preview player" + }, + "libraryBuiltInPreviewPlayerSubtitle": "Only for quick local previews inside SpotiFLAC Mobile, not recommended for regular listening", + "@libraryBuiltInPreviewPlayerSubtitle": { + "description": "Subtitle for built-in preview player option" + }, + "libraryBuiltInPlayerInfo": "The built-in player is a preview tool for checking local tracks quickly. Use an external music player for actual listening.", + "@libraryBuiltInPlayerInfo": { + "description": "Info note explaining the built-in player is for previews only" + }, + "nowPlayingTitle": "Now Playing", + "@nowPlayingTitle": { + "description": "Title for the now playing screen" + }, + "nowPlayingNothingPlaying": "Nothing is playing", + "@nowPlayingNothingPlaying": { + "description": "Empty state when no track is currently playing" + }, + "nowPlayingMinimize": "Minimize", + "@nowPlayingMinimize": { + "description": "Tooltip for minimizing the now playing screen" + }, + "nowPlayingUpNext": "Up next", + "@nowPlayingUpNext": { + "description": "Title for the playback queue sheet" + }, + "nowPlayingDetails": "Details", + "@nowPlayingDetails": { + "description": "Menu item and section title for track metadata details" + }, + "nowPlayingOpenInExternalPlayer": "Open in external player", + "@nowPlayingOpenInExternalPlayer": { + "description": "Menu item to open the current track in an external player" + }, + "nowPlayingTabPlayer": "Player", + "@nowPlayingTabPlayer": { + "description": "Tab label for the player view" + }, + "nowPlayingTabLyrics": "Lyrics", + "@nowPlayingTabLyrics": { + "description": "Tab label for the lyrics view" + }, + "nowPlayingNoLyrics": "No lyrics in this file", + "@nowPlayingNoLyrics": { + "description": "Empty state when the playing file has no embedded lyrics" + }, + "nowPlayingLibraryEmpty": "Your library is empty", + "@nowPlayingLibraryEmpty": { + "description": "Snackbar when shuffle library is requested but library has no tracks" + }, + "nowPlayingShuffleLibraryFailed": "Could not shuffle library: {error}", + "@nowPlayingShuffleLibraryFailed": { + "description": "Snackbar when shuffling the library fails", + "placeholders": { + "error": { + "type": "String" + } + } + }, + "nowPlayingShuffleOn": "Shuffle on", + "@nowPlayingShuffleOn": { + "description": "Tooltip when shuffle mode is enabled" + }, + "nowPlayingPlayInOrder": "Play in order", + "@nowPlayingPlayInOrder": { + "description": "Tooltip when shuffle mode is disabled" + }, + "nowPlayingShuffleLibrary": "Shuffle library", + "@nowPlayingShuffleLibrary": { + "description": "Button label to shuffle and play the entire local library" + }, + "nowPlayingQueueEmpty": "Queue is empty", + "@nowPlayingQueueEmpty": { + "description": "Empty state when the playback queue has no items" + }, + "nowPlayingNoMetadata": "No metadata available", + "@nowPlayingNoMetadata": { + "description": "Empty state when track metadata cannot be loaded" + }, + "announcementUnableToOpenLink": "Unable to open link. Please try again.", + "@announcementUnableToOpenLink": { + "description": "Snackbar shown when an announcement CTA link cannot be opened" + }, + "trackConvertLosslessOutputWithCap": "Lossless output with {quality} cap", + "@trackConvertLosslessOutputWithCap": { + "description": "Hint shown when lossless conversion will cap bit depth or sample rate", + "placeholders": { + "quality": { + "type": "String" + } + } + }, + "trackConvertConfirmMessageLosslessCapped": "Convert from {sourceFormat} to {targetFormat} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original file will be deleted after conversion.", + "@trackConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless conversion of a single file", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "selectionBatchConvertConfirmMessageLosslessCapped": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} ({quality})?\n\nThe output stays in a lossless codec, but bit depth/sample rate will be capped. Original files will be deleted after conversion.", + "@selectionBatchConvertConfirmMessageLosslessCapped": { + "description": "Confirmation dialog message for capped lossless batch conversion", + "placeholders": { + "count": { + "type": "int" + }, + "format": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossless": "{sourceFormat} → {targetFormat} ({quality})", + "@trackConvertActionLabelLossless": { + "description": "Convert button label for lossless conversion with quality cap", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "quality": { + "type": "String" + } + } + }, + "trackConvertActionLabelLossy": "{sourceFormat} → {targetFormat} @ {bitrate}", + "@trackConvertActionLabelLossy": { + "description": "Convert button label for lossy conversion", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + }, + "bitrate": { + "type": "String" + } + } + }, + "aboutPaxsenixSubtitle": "Lyrics proxy for Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, and Genius", + "@aboutPaxsenixSubtitle": { + "description": "Subtitle for Paxsenix special thanks entry on the about page" + }, + "snackbarPlayingNext": "Playing next", + "@snackbarPlayingNext": { + "description": "Snackbar when a track is inserted as the next queue item" + }, + "snackbarAddedToQueueGeneric": "Added to queue", + "@snackbarAddedToQueueGeneric": { + "description": "Snackbar when a track is added to the playback queue without naming it" + }, + "selectionDeletePlaylistsCount": "Delete {count} {count, plural, =1{playlist} other{playlists}}", + "@selectionDeletePlaylistsCount": { + "description": "Button label for deleting multiple selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "actionShuffle": "Shuffle", + "@actionShuffle": { + "description": "Tooltip for shuffle playback action" + }, + "downloadPrimaryArtistOnlyOn": "Primary only: On", + "@downloadPrimaryArtistOnlyOn": { + "description": "Status label when primary-artist-only folder naming is enabled" + }, + "downloadPrimaryArtistOnlyOff": "Primary only: Off", + "@downloadPrimaryArtistOnlyOff": { + "description": "Status label when primary-artist-only folder naming is disabled" + }, + "downloadAlbumArtistMetadataPrimaryOnly": "Album Artist metadata: Primary only", + "@downloadAlbumArtistMetadataPrimaryOnly": { + "description": "Status label when album-artist folder filtering uses primary artist only" + }, + "downloadAlbumArtistMetadataFull": "Album Artist metadata: Full", + "@downloadAlbumArtistMetadataFull": { + "description": "Status label when album-artist folder filtering uses full metadata" + }, + "trackConvertOriginal": "Original", + "@trackConvertOriginal": { + "description": "Label for keeping original bit depth or sample rate during conversion" + }, + "trackConvertOriginalQuality": "Original quality", + "@trackConvertOriginalQuality": { + "description": "Label when no bit depth or sample rate cap is applied during lossless conversion" + }, + "trackConvertLosslessSuffix": "Lossless", + "@trackConvertLosslessSuffix": { + "description": "Suffix used in converted lossless quality labels" + }, + "trackConvertDithering": "Dithering", + "@trackConvertDithering": { + "description": "Section label for lossless conversion dithering options" + }, + "trackConvertResampler": "Resampler", + "@trackConvertResampler": { + "description": "Section label for lossless conversion resampler options" + }, + "trackConvertDitherNone": "None", + "@trackConvertDitherNone": { + "description": "Lossless conversion dither option with no dithering applied" + }, + "trackConvertDitherTriangular": "TPDF", + "@trackConvertDitherTriangular": { + "description": "Lossless conversion triangular probability density function dither option" + }, + "trackConvertDitherTriangularHp": "Triangular HP", + "@trackConvertDitherTriangularHp": { + "description": "Lossless conversion high-pass triangular dither option" + }, + "trackConvertResamplerSwr": "SWR", + "@trackConvertResamplerSwr": { + "description": "Lossless conversion default FFmpeg swresample resampler option" + }, + "trackConvertResamplerSoxr": "SoXr", + "@trackConvertResamplerSoxr": { + "description": "Lossless conversion SoX resampler option" + }, + "updateSeeReleaseNotes": "See release notes for details.", + "@updateSeeReleaseNotes": { + "description": "Fallback changelog text when release notes cannot be parsed" + }, + "unknownTitle": "Unknown title", + "@unknownTitle": { + "description": "Fallback track title when metadata is missing" + }, + "trackPlayNext": "Play next", + "@trackPlayNext": { + "description": "Menu action to play a track as the next queue item" + }, + "trackAddToQueue": "Add to queue", + "@trackAddToQueue": { + "description": "Menu action to add a track to the playback queue" + }, + "snackbarExtensionInstalledEnable": "{extensionName} installed. Enable it in Settings > Extensions", + "@snackbarExtensionInstalledEnable": { + "description": "Snackbar after installing an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarExtensionUpdatedVersion": "{extensionName} updated to v{version}", + "@snackbarExtensionUpdatedVersion": { + "description": "Snackbar after updating an extension from the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + }, + "version": { + "type": "String" + } + } + }, + "snackbarFailedToInstallNamed": "Failed to install {extensionName}", + "@snackbarFailedToInstallNamed": { + "description": "Snackbar when extension install fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "snackbarFailedToUpdateNamed": "Failed to update {extensionName}", + "@snackbarFailedToUpdateNamed": { + "description": "Snackbar when extension update fails in the repo tab", + "placeholders": { + "extensionName": { + "type": "String" + } + } + }, + "releaseTypeEp": "EP", + "@releaseTypeEp": { + "description": "Badge label for EP releases" + }, + "releaseTypeSingle": "Single", + "@releaseTypeSingle": { + "description": "Badge label for single releases" + }, + "trackCoverOnline": "Online cover", + "@trackCoverOnline": { + "description": "Label shown when metadata autofill downloaded cover art from the internet" + }, + "regionCountryUS": "United States", + "@regionCountryUS": { + "description": "Country name for SongLink region picker" + }, + "regionCountryGB": "United Kingdom", + "@regionCountryGB": { + "description": "Country name for SongLink region picker" + }, + "regionCountryFR": "France", + "@regionCountryFR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryDE": "Germany", + "@regionCountryDE": { + "description": "Country name for SongLink region picker" + }, + "regionCountryJP": "Japan", + "@regionCountryJP": { + "description": "Country name for SongLink region picker" + }, + "regionCountryKR": "South Korea", + "@regionCountryKR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryIN": "India", + "@regionCountryIN": { + "description": "Country name for SongLink region picker" + }, + "regionCountryID": "Indonesia", + "@regionCountryID": { + "description": "Country name for SongLink region picker" + }, + "regionCountryBR": "Brazil", + "@regionCountryBR": { + "description": "Country name for SongLink region picker" + }, + "regionCountryMX": "Mexico", + "@regionCountryMX": { + "description": "Country name for SongLink region picker" + }, + "regionCountryAU": "Australia", + "@regionCountryAU": { + "description": "Country name for SongLink region picker" + }, + "regionCountryCA": "Canada", + "@regionCountryCA": { + "description": "Country name for SongLink region picker" + }, + "regionCountryXK": "Kosovo", + "@regionCountryXK": { + "description": "Country name for SongLink region picker" + }, + "extensionVerificationBrowserTitle": "Verification browser", + "@extensionVerificationBrowserTitle": { + "description": "Settings option title for extension verification browser preference" + }, + "extensionVerificationBrowserSubtitleExternal": "Open challenges in the default browser first", + "@extensionVerificationBrowserSubtitleExternal": { + "description": "Subtitle when external browser is preferred for extension verification" + }, + "extensionVerificationBrowserSubtitleInApp": "Open challenges in the in-app browser first", + "@extensionVerificationBrowserSubtitleInApp": { + "description": "Subtitle when in-app browser is preferred for extension verification" + }, + "extensionVerificationBrowserExternal": "External", + "@extensionVerificationBrowserExternal": { + "description": "Chip label for external browser verification mode" + }, + "extensionVerificationBrowserInApp": "In-app", + "@extensionVerificationBrowserInApp": { + "description": "Chip label for in-app browser verification mode" + }, + "extensionVerificationHelpTitleManual": "Open verification manually", + "@extensionVerificationHelpTitleManual": { + "description": "Dialog title when automatic browser launch for verification fails" + }, + "extensionVerificationHelpTitleWaiting": "Verification still waiting", + "@extensionVerificationHelpTitleWaiting": { + "description": "Dialog title when verification is taking longer than expected" + }, + "extensionVerificationHelpMessageManual": "SpotiFLAC Mobile could not open the browser automatically. Open this link in your browser, or copy it manually.", + "@extensionVerificationHelpMessageManual": { + "description": "Dialog message when automatic browser launch for verification fails" + }, + "extensionVerificationHelpMessageWaiting": "If the browser did not open, or verification finished but did not return to SpotiFLAC Mobile, open this link again or copy it manually.", + "@extensionVerificationHelpMessageWaiting": { + "description": "Dialog message when verification may need manual browser help" + }, + "extensionVerificationClose": "Close", + "@extensionVerificationClose": { + "description": "Button to dismiss the extension verification help dialog" + }, + "extensionVerificationCopyLink": "Copy link", + "@extensionVerificationCopyLink": { + "description": "Button to copy the extension verification URL" + }, + "extensionVerificationLinkCopied": "Verification link copied", + "@extensionVerificationLinkCopied": { + "description": "Snackbar after copying the extension verification URL" + }, + "extensionVerificationOpenBrowser": "Open browser", + "@extensionVerificationOpenBrowser": { + "description": "Button to open the extension verification URL in a browser" + }, + "settingsSearchHint": "Search settings", + "@settingsSearchHint": { + "description": "Placeholder of the search field on the Settings tab" + }, + "settingsSearchNoResults": "No settings match \"{query}\"", + "@settingsSearchNoResults": { + "description": "Shown when a Settings search returns nothing", + "placeholders": { + "query": { + "type": "String" + } + } + }, + "settingsGroupInterface": "Extensions & appearance", + "@settingsGroupInterface": { + "description": "Settings group covering look and feel" + }, + "settingsGroupContent": "Content & metadata", + "@settingsGroupContent": { + "description": "Settings group covering the library, metadata and lyrics" + }, + "settingsGroupDownloads": "Downloads & files", + "@settingsGroupDownloads": { + "description": "Settings group covering download behaviour and storage" + }, + "settingsGroupSystem": "System", + "@settingsGroupSystem": { + "description": "Settings group covering app-level data, cache and logs" + }, + "settingsGroupHelp": "About & support", + "@settingsGroupHelp": { + "description": "Settings group covering the about page and donations" + } +} \ No newline at end of file From dbe60d7644e8e6b8029eba36c575c78bfa94645a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:15:45 +0700 Subject: [PATCH 41/72] New translations app_en.arb (Italian) [ci skip] --- lib/l10n/arb/app_it-IT.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/l10n/arb/app_it-IT.arb b/lib/l10n/arb/app_it-IT.arb index def7bad6..5fad819d 100644 --- a/lib/l10n/arb/app_it-IT.arb +++ b/lib/l10n/arb/app_it-IT.arb @@ -9,7 +9,7 @@ "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Library", + "navLibrary": "Libreria", "@navLibrary": { "description": "Bottom navigation - Library tab" }, @@ -25,7 +25,7 @@ "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "Incolla un URL supportato o cerca per nome", "@homeSubtitle": { "description": "Subtitle shown below search box" }, @@ -33,7 +33,7 @@ "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "Install an extension to continue.", + "homeEmptySubtitle": "Installa un'estensione per continuare.", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, From 8d525b1da6f55eb519ae25f20a0bc1b64ffc458c Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:35:26 +0700 Subject: [PATCH 42/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 93c8d290..f6c894be 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -4295,7 +4295,7 @@ "@editMetadataAutoFillSourceAutomatic": { "description": "Automatic source option that follows configured metadata provider priority" }, - "editMetadataAutoFillFind": "Find metadata", + "editMetadataAutoFillFind": "Buscar metadatos", "@editMetadataAutoFillFind": { "description": "Button label for finding an online metadata candidate" }, From 706ddbf083d4d771ce7276481877840a9dea94cf Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:35:28 +0700 Subject: [PATCH 43/72] New translations app_en.arb (Italian) [ci skip] --- lib/l10n/arb/app_it-IT.arb | 466 ++++++++++++++++++------------------- 1 file changed, 233 insertions(+), 233 deletions(-) diff --git a/lib/l10n/arb/app_it-IT.arb b/lib/l10n/arb/app_it-IT.arb index 5fad819d..9d3d9dca 100644 --- a/lib/l10n/arb/app_it-IT.arb +++ b/lib/l10n/arb/app_it-IT.arb @@ -13,11 +13,11 @@ "@navLibrary": { "description": "Bottom navigation - Library tab" }, - "navSettings": "Settings", + "navSettings": "Impostazioni", "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Repository", "@navStore": { "description": "Bottom navigation - Extension repo tab" }, @@ -29,7 +29,7 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "No search providers yet", + "homeEmptyTitle": "Nessun provider di ricerca presente", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, @@ -37,31 +37,31 @@ "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "homeSupports": "Supporta: Traccia, Album, Playlist, URL Artista", "@homeSupports": { "description": "Info text about supported URL types" }, - "homeRecent": "Recent", + "homeRecent": "Recenti", "@homeRecent": { "description": "Section header for recent searches" }, - "historyFilterAll": "All", + "historyFilterAll": "Tutti", "@historyFilterAll": { "description": "Filter chip - show all items" }, - "historyFilterAlbums": "Albums", + "historyFilterAlbums": "Album", "@historyFilterAlbums": { "description": "Filter chip - show albums only" }, - "historyFilterSingles": "Singles", + "historyFilterSingles": "Singoli", "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "historySearchHint": "Search history...", + "historySearchHint": "Cronologia ricerche...", "@historySearchHint": { "description": "Search bar placeholder in history" }, - "settingsTitle": "Settings", + "settingsTitle": "Impostazioni", "@settingsTitle": { "description": "Settings screen title" }, @@ -69,15 +69,15 @@ "@settingsDownload": { "description": "Settings section - download options" }, - "settingsAppearance": "Appearance", + "settingsAppearance": "Aspetto", "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsExtensions": "Extensions", + "settingsExtensions": "Estensioni", "@settingsExtensions": { "description": "Settings section - extension management" }, - "settingsAbout": "About", + "settingsAbout": "Info", "@settingsAbout": { "description": "Settings section - app info" }, @@ -85,7 +85,7 @@ "@downloadTitle": { "description": "Download settings page title" }, - "downloadAskQualitySubtitle": "Show quality picker for each download", + "downloadAskQualitySubtitle": "Mostra scelta qualità per ogni download", "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, @@ -101,55 +101,55 @@ "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Folder Organization", + "downloadFolderOrganization": "Organizzazione cartella", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, - "appearanceTitle": "Appearance", + "appearanceTitle": "Aspetto", "@appearanceTitle": { "description": "Appearance settings page title" }, - "appearanceThemeSystem": "System", + "appearanceThemeSystem": "Sistema", "@appearanceThemeSystem": { "description": "Follow system theme" }, - "appearanceThemeLight": "Light", + "appearanceThemeLight": "Chiaro", "@appearanceThemeLight": { "description": "Light theme" }, - "appearanceThemeDark": "Dark", + "appearanceThemeDark": "Scuro", "@appearanceThemeDark": { "description": "Dark theme" }, - "appearanceDynamicColor": "Dynamic Color", + "appearanceDynamicColor": "Colore dinamico", "@appearanceDynamicColor": { "description": "Material You dynamic colors" }, - "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", + "appearanceDynamicColorSubtitle": "Usa colori dal tuo sfondo", "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "History View", + "appearanceHistoryView": "Cronologia aspetto", "@appearanceHistoryView": { "description": "Layout style for history" }, - "appearanceHistoryViewList": "List", + "appearanceHistoryViewList": "Lista", "@appearanceHistoryViewList": { "description": "List layout option" }, - "appearanceHistoryViewGrid": "Grid", + "appearanceHistoryViewGrid": "Griglia", "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsPrimaryProvider": "Primary Provider", + "optionsPrimaryProvider": "Provider primario", "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "optionsPrimaryProviderSubtitle": "Servizio usato per la ricerca di brani o album", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "Using extension: {extensionName}", + "optionsUsingExtension": "Estensione usata: {extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -158,19 +158,19 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "Scheda di ricerca predefinita", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "Scegli la scheda da aprire per la ricerca di nuovi risultati.", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsAutoFallback": "Auto Fallback", + "optionsAutoFallback": "Fallback automatico", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", + "optionsAutoFallbackSubtitle": "Prova altri servizi se il download fallisce", "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, @@ -182,7 +182,7 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Max Quality Cover", + "optionsMaxQualityCover": "Copertina massima qualità", "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, @@ -288,15 +288,15 @@ "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension repo toggle" }, - "optionsCheckUpdates": "Check for Updates", + "optionsCheckUpdates": "Controlla aggiornamenti", "@optionsCheckUpdates": { "description": "Auto update check toggle" }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", + "optionsCheckUpdatesSubtitle": "Notifica quando una nuova versione è disponibile", "@optionsCheckUpdatesSubtitle": { "description": "Subtitle for update check" }, - "optionsUpdateChannel": "Update Channel", + "optionsUpdateChannel": "Aggiorna canale", "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, @@ -332,15 +332,15 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "extensionsTitle": "Extensions", + "extensionsTitle": "Estensioni", "@extensionsTitle": { "description": "Extensions page title" }, - "extensionsDisabled": "Disabled", + "extensionsDisabled": "Disabilitato", "@extensionsDisabled": { "description": "Extension status - inactive" }, - "extensionsVersion": "Version {version}", + "extensionsVersion": "Versione {version}", "@extensionsVersion": { "description": "Extension version display", "placeholders": { @@ -349,7 +349,7 @@ } } }, - "extensionsUninstall": "Uninstall", + "extensionsUninstall": "Disinstalla", "@extensionsUninstall": { "description": "Uninstall extension button" }, @@ -357,71 +357,71 @@ "@storeTitle": { "description": "Repo screen title" }, - "storeSearch": "Search extensions...", + "storeSearch": "Cerca estensioni...", "@storeSearch": { "description": "Repo search placeholder" }, - "storeInstall": "Install", + "storeInstall": "Installa", "@storeInstall": { "description": "Install extension button" }, - "storeInstalled": "Installed", + "storeInstalled": "Installata", "@storeInstalled": { "description": "Already installed badge" }, - "storeUpdate": "Update", + "storeUpdate": "Aggiorna", "@storeUpdate": { "description": "Update available button" }, - "aboutTitle": "About", + "aboutTitle": "Informazioni su...", "@aboutTitle": { "description": "About page title" }, - "aboutContributors": "Contributors", + "aboutContributors": "Collaboratori", "@aboutContributors": { "description": "Section for contributors" }, - "aboutMobileDeveloper": "Mobile version developer", + "aboutMobileDeveloper": "Sviluppatore versione mobile", "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", + "aboutOriginalCreator": "Creatore dello SpotiFLAC originale", "@aboutOriginalCreator": { "description": "Role description for original creator" }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", + "aboutLogoArtist": "Il talentuoso artista che ha creato il nostro bellissimo logo!", "@aboutLogoArtist": { "description": "Role description for logo artist" }, - "aboutTranslators": "Translators", + "aboutTranslators": "Traduttori", "@aboutTranslators": { "description": "Section for translators" }, - "aboutSpecialThanks": "Special Thanks", + "aboutSpecialThanks": "Ringraziamenti speciali", "@aboutSpecialThanks": { "description": "Section for special thanks" }, - "aboutLinks": "Links", + "aboutLinks": "Link", "@aboutLinks": { "description": "Section for external links" }, - "aboutMobileSource": "Mobile source code", + "aboutMobileSource": "Codice sorgente mobile", "@aboutMobileSource": { "description": "Link to mobile GitHub repo" }, - "aboutPCSource": "PC source code", + "aboutPCSource": "Codice sorgente PC", "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Mantieni android aperto", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, - "aboutReportIssue": "Report an issue", + "aboutReportIssue": "Segnala un problema", "@aboutReportIssue": { "description": "Link to report bugs" }, - "aboutReportIssueSubtitle": "Report any problems you encounter", + "aboutReportIssueSubtitle": "Segnala ogni problema che incontri", "@aboutReportIssueSubtitle": { "description": "Subtitle for report issue" }, @@ -433,19 +433,19 @@ "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, - "aboutTelegramChannel": "Telegram Channel", + "aboutTelegramChannel": "Canale Telegram", "@aboutTelegramChannel": { "description": "Link to Telegram channel" }, - "aboutTelegramChannelSubtitle": "Announcements and updates", + "aboutTelegramChannelSubtitle": "Annunci e aggiornamenti", "@aboutTelegramChannelSubtitle": { "description": "Subtitle for Telegram channel" }, - "aboutTelegramChat": "Telegram Community", + "aboutTelegramChat": "Comunità Telegram", "@aboutTelegramChat": { "description": "Link to Telegram chat group" }, - "aboutTelegramChatSubtitle": "Chat with other users", + "aboutTelegramChatSubtitle": "Parla con altri utenti", "@aboutTelegramChatSubtitle": { "description": "Subtitle for Telegram chat" }, @@ -453,35 +453,35 @@ "@aboutSocial": { "description": "Section for social links" }, - "aboutApp": "App", + "aboutApp": "Applicazione", "@aboutApp": { "description": "Section for app info" }, - "aboutVersion": "Version", + "aboutVersion": "Versione", "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "aboutBinimumDesc": "Il creatore di QQDL e HiFi API. Questo progetto ha aiutato a rifinire il supporto per i download lossless.", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "aboutSachinsenalDesc": "Il creatore originale del progetto HiFi. Fondazione per l'integrazione di sorgenti lossless.", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "aboutSjdonadoDesc": "Creatore di \"I Don't Have Spotify (IDHS)\". Il risolutore di link che ci salva la giornata!", "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "Cerca i metadati, gestisci le estensioni e organizza la tua libreria.", "@aboutAppDescription": { "description": "App description in header card" }, - "artistAlbums": "Albums", + "artistAlbums": "Album", "@artistAlbums": { "description": "Section header for artist albums" }, - "artistSingles": "Singles & EPs", + "artistSingles": "Singoli ed EP", "@artistSingles": { "description": "Section header for singles/EPs" }, @@ -489,11 +489,11 @@ "@artistCompilations": { "description": "Section header for compilations" }, - "artistPopular": "Popular", + "artistPopular": "Popolari", "@artistPopular": { "description": "Section header for popular/top tracks" }, - "artistMonthlyListeners": "{count} monthly listeners", + "artistMonthlyListeners": "{count} ascoltatori mensili", "@artistMonthlyListeners": { "description": "Monthly listener count display", "placeholders": { @@ -503,19 +503,19 @@ } } }, - "trackMetadataService": "Service", + "trackMetadataService": "Servizi", "@trackMetadataService": { "description": "Metadata field - download service used" }, - "trackMetadataPlay": "Play", + "trackMetadataPlay": "Riproduci", "@trackMetadataPlay": { "description": "Action button - play track" }, - "trackMetadataShare": "Share", + "trackMetadataShare": "Condividi", "@trackMetadataShare": { "description": "Action button - share track" }, - "trackMetadataDelete": "Delete", + "trackMetadataDelete": "Elimina", "@trackMetadataDelete": { "description": "Action button - delete track" }, @@ -523,27 +523,27 @@ "@setupGrantPermission": { "description": "Button to request permission" }, - "setupSkip": "Skip for now", + "setupSkip": "Salta per ora", "@setupSkip": { "description": "Skip current step button" }, - "setupStorageAccessRequired": "Storage Access Required", + "setupStorageAccessRequired": "Accesso alla memoria richiesto", "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", + "setupStorageAccessMessageAndroid11": "Android 11+ richiede il permesso \"Accesso a tutti i file\" per salvare i download nella cartella selezionata.", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, - "setupOpenSettings": "Open Settings", + "setupOpenSettings": "Apri impostazioni", "@setupOpenSettings": { "description": "Button to open system settings" }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", + "setupPermissionDeniedMessage": "Permesso negato. Per favore fornisci tutti i permessi per continuare.", "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "{permissionType} Permission Required", + "setupPermissionRequired": "{permissionType} Permesso richiesto", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -553,7 +553,7 @@ } } }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", + "setupPermissionRequiredMessage": "{permissionType} permesso richiesto per la migliore esperienza. Puoi cambiarlo in ogni momento nelle impostazioni.", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -562,23 +562,23 @@ } } }, - "setupUseDefaultFolder": "Use Default Folder?", + "setupUseDefaultFolder": "Usare la cartella predefinita?", "@setupUseDefaultFolder": { "description": "Dialog title for default folder" }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", + "setupNoFolderSelected": "Nessuna cartella selezionata. Vuoi usare la cartella Musica predefinita?", "@setupNoFolderSelected": { "description": "Prompt when no folder selected" }, - "setupUseDefault": "Use Default", + "setupUseDefault": "Usa predefinita", "@setupUseDefault": { "description": "Button to use default folder" }, - "setupDownloadLocationTitle": "Download Location", + "setupDownloadLocationTitle": "Posizione download", "@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": "Su iOS, i download sono salvati nella cartella dell'app in Documenti. Puoi accedervi tramite l'app File.", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, @@ -586,15 +586,15 @@ "@setupAppDocumentsFolder": { "description": "iOS documents folder option" }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", + "setupAppDocumentsFolderSubtitle": "Raccomandato - accessibile via app File", "@setupAppDocumentsFolderSubtitle": { "description": "Subtitle for documents folder" }, - "setupChooseFromFiles": "Choose from Files", + "setupChooseFromFiles": "Scegli dai file", "@setupChooseFromFiles": { "description": "iOS file picker option" }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", + "setupChooseFromFilesSubtitle": "Seleziona iCloud o altre posizioni", "@setupChooseFromFilesSubtitle": { "description": "Subtitle for file picker" }, @@ -638,127 +638,127 @@ "@setupFolderDescription": { "description": "Explanation for folder selection" }, - "setupSelectFolder": "Select Folder", + "setupSelectFolder": "Seleziona cartella", "@setupSelectFolder": { "description": "Button to select folder" }, - "setupEnableNotifications": "Enable Notifications", + "setupEnableNotifications": "Attiva notifiche", "@setupEnableNotifications": { "description": "Button to enable notifications" }, - "setupNotificationBackgroundDescription": "Get notified about download progress and completion. This helps you track downloads when the app is in background.", + "setupNotificationBackgroundDescription": "Ricevi notifiche sull'avanzamento e sul completamento dei download. Questo ti aiuta a monitorare i download quando l'app è in background.", "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, - "setupSkipForNow": "Skip for now", + "setupSkipForNow": "Salta per adesso", "@setupSkipForNow": { "description": "Skip button text" }, - "setupNext": "Next", + "setupNext": "Prossimo", "@setupNext": { "description": "Next button text" }, - "setupGetStarted": "Get Started", + "setupGetStarted": "Iniziamo", "@setupGetStarted": { "description": "Final setup button" }, - "setupAllowAccessToManageFiles": "Please enable \"Allow access to manage all files\" in the next screen.", + "setupAllowAccessToManageFiles": "Per favore, attiva \"Consenti accesso per gestire tutti i file\" nella prossima schermata.", "@setupAllowAccessToManageFiles": { "description": "Instruction for file access permission" }, - "setupLanguageTitle": "Choose Language", + "setupLanguageTitle": "Scegli lingua", "@setupLanguageTitle": { "description": "Title for the language selection step in setup" }, - "setupLanguageDescription": "Select your preferred language for the app. You can change this later in Settings.", + "setupLanguageDescription": "Seleziona la tua lingua preferita per l'applicazione. Puoi cambiarla in ogni momento nelle impostazioni.", "@setupLanguageDescription": { "description": "Description for the language selection step in setup" }, - "setupLanguageSystemDefault": "System Default", + "setupLanguageSystemDefault": "Sistema predefinito", "@setupLanguageSystemDefault": { "description": "Option to use the system language" }, - "dialogCancel": "Cancel", + "dialogCancel": "Cancella", "@dialogCancel": { "description": "Dialog button - cancel action" }, - "dialogSave": "Save", + "dialogSave": "Salva", "@dialogSave": { "description": "Dialog button - save changes" }, - "dialogDelete": "Delete", + "dialogDelete": "Elimina", "@dialogDelete": { "description": "Dialog button - delete item" }, - "dialogRetry": "Retry", + "dialogRetry": "Riprova", "@dialogRetry": { "description": "Dialog button - retry action" }, - "dialogClear": "Clear", + "dialogClear": "Cancella", "@dialogClear": { "description": "Dialog button - clear items" }, - "dialogDone": "Done", + "dialogDone": "Fatto", "@dialogDone": { "description": "Dialog button - action completed" }, - "dialogImport": "Import", + "dialogImport": "Importa", "@dialogImport": { "description": "Dialog button - import data" }, - "dialogDownload": "Download", + "dialogDownload": "Scarica", "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Play preview", + "previewPlay": "Riproduci anteprima", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Stop preview", + "previewStop": "Ferma anteprima", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "Preview unavailable", + "previewUnavailable": "Anteprima non disponibile", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, - "dialogDiscard": "Discard", + "dialogDiscard": "Scarta", "@dialogDiscard": { "description": "Dialog button - discard changes" }, - "dialogRemove": "Remove", + "dialogRemove": "Rimuovi", "@dialogRemove": { "description": "Dialog button - remove item" }, - "dialogUninstall": "Uninstall", + "dialogUninstall": "Disinstalla", "@dialogUninstall": { "description": "Dialog button - uninstall extension" }, - "dialogDiscardChanges": "Discard Changes?", + "dialogDiscardChanges": "Scartare i cambiamenti?", "@dialogDiscardChanges": { "description": "Dialog title - unsaved changes warning" }, - "dialogUnsavedChanges": "You have unsaved changes. Do you want to discard them?", + "dialogUnsavedChanges": "Hai dei cambiamenti non salvati. Vuoi scartarli?", "@dialogUnsavedChanges": { "description": "Dialog message - unsaved changes" }, - "dialogClearAll": "Clear All", + "dialogClearAll": "Pulisci tutto", "@dialogClearAll": { "description": "Dialog title - clear all items" }, - "dialogRemoveExtension": "Remove Extension", + "dialogRemoveExtension": "Rimuovi estensione", "@dialogRemoveExtension": { "description": "Dialog title - uninstall extension" }, - "dialogRemoveExtensionMessage": "Are you sure you want to remove this extension? This cannot be undone.", + "dialogRemoveExtensionMessage": "Sei sicuro di voler rimuovere l'estensione? Questa azione è irreversibile.", "@dialogRemoveExtensionMessage": { "description": "Dialog message - uninstall confirmation" }, - "dialogUninstallExtension": "Uninstall Extension?", + "dialogUninstallExtension": "Disinstallare l'estensione?", "@dialogUninstallExtension": { "description": "Dialog title - uninstall extension" }, - "dialogUninstallExtensionMessage": "Are you sure you want to remove {extensionName}?", + "dialogUninstallExtensionMessage": "Sei sicuro di voler rimuovere {extensionName}?", "@dialogUninstallExtensionMessage": { "description": "Dialog message - uninstall specific extension", "placeholders": { @@ -767,19 +767,19 @@ } } }, - "dialogClearHistoryTitle": "Clear History", + "dialogClearHistoryTitle": "Cancella la cronologia", "@dialogClearHistoryTitle": { "description": "Dialog title - clear download history" }, - "dialogClearHistoryMessage": "Are you sure you want to clear all download history? This cannot be undone.", + "dialogClearHistoryMessage": "Sei sicuro di voler cancellare la cronologia dei download? Questa azione è irreversibile.", "@dialogClearHistoryMessage": { "description": "Dialog message - clear history confirmation" }, - "dialogDeleteSelectedTitle": "Delete Selected", + "dialogDeleteSelectedTitle": "Elimina selezionato", "@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": "Elimina {count} {count, plural, one {}=1{traccia} other{tracce}} dalla cronologia?\n\nEliminerà anche i file dalla memoria.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -788,12 +788,12 @@ } } }, - "dialogImportPlaylistTitle": "Import Playlist", + "dialogImportPlaylistTitle": "Importa playlist", "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", - "csvImportTracks": "{count} tracks from CSV", + "dialogImportPlaylistMessage": "Trovate {count} nel file della playlist. Vuoi aggiungerle alla coda dei download?", + "csvImportTracks": "{count} tracce dal CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Esporta come M3U8", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "Esportate {exported} di {total} tracce", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,43 +818,43 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "Nessun file scaricato da esportare", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "Esportazione fallita", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Apri con...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "Nessun link trovato sulle piattaforme per questa traccia.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "Controlla i duplicati", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "Trovate tracce salvate più di una volta", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Duplicati", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "Non sono state trovate tracce duplicate.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Mantieni il migliore", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "Eliminare {count} copie con qualità minore di \"{trackName}\"?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -866,7 +866,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "Eliminare questa copia di \"{trackName}\"?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -883,7 +883,7 @@ } } }, - "snackbarAddedToQueue": "Added \"{trackName}\" to queue", + "snackbarAddedToQueue": "Aggiunta \"{trackName}\" alla coda", "@snackbarAddedToQueue": { "description": "Snackbar - track added to download queue", "placeholders": { @@ -892,7 +892,7 @@ } } }, - "snackbarAddedTracksToQueue": "Added {count} tracks to queue", + "snackbarAddedTracksToQueue": "Aggiunte {count} tracce alla coda", "@snackbarAddedTracksToQueue": { "description": "Snackbar - multiple tracks added to queue", "placeholders": { @@ -901,7 +901,7 @@ } } }, - "snackbarAlreadyDownloaded": "\"{trackName}\" already downloaded", + "snackbarAlreadyDownloaded": "\"{trackName}\" già scaricata", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -910,7 +910,7 @@ } } }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", + "snackbarAlreadyInLibrary": "\"{trackName}\" già esiste nella tua libreria", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -919,11 +919,11 @@ } } }, - "snackbarHistoryCleared": "History cleared", + "snackbarHistoryCleared": "Cronologia cancellata", "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", + "snackbarDeletedTracks": "Eliminate {count} {count, plural, one {}=1{traccia} other{tracce}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -932,7 +932,7 @@ } } }, - "snackbarCannotOpenFile": "Cannot open file: {error}", + "snackbarCannotOpenFile": "Impossibile aprire file: {error}", "@snackbarCannotOpenFile": { "description": "Snackbar - file open error", "placeholders": { @@ -941,11 +941,11 @@ } } }, - "snackbarViewQueue": "View Queue", + "snackbarViewQueue": "Vedi coda", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" }, - "snackbarUrlCopied": "{platform} URL copied to clipboard", + "snackbarUrlCopied": "{platform} URL copiato", "@snackbarUrlCopied": { "description": "Snackbar - URL copied", "placeholders": { @@ -955,23 +955,23 @@ } } }, - "snackbarFileNotFound": "File not found", + "snackbarFileNotFound": "File non trovato", "@snackbarFileNotFound": { "description": "Snackbar - file doesn't exist" }, - "snackbarSelectExtFile": "Please select a .spotiflac-ext file", + "snackbarSelectExtFile": "Per favore, seleziona un file .spotiflac-ext", "@snackbarSelectExtFile": { "description": "Snackbar - wrong file type selected" }, - "snackbarProviderPrioritySaved": "Provider priority saved", + "snackbarProviderPrioritySaved": "Priorità servizi salvata", "@snackbarProviderPrioritySaved": { "description": "Snackbar - provider order saved" }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", + "snackbarMetadataProviderSaved": "Priorità servizi metadati salvata", "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, - "snackbarExtensionInstalled": "{extensionName} installed.", + "snackbarExtensionInstalled": "{extensionName} installata.", "@snackbarExtensionInstalled": { "description": "Snackbar - extension installed successfully", "placeholders": { @@ -980,7 +980,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} updated.", + "snackbarExtensionUpdated": "{extensionName} aggiornata.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -989,43 +989,43 @@ } } }, - "snackbarFailedToInstall": "Failed to install extension", + "snackbarFailedToInstall": "Impossibile installare l'estensione", "@snackbarFailedToInstall": { "description": "Snackbar - extension install error" }, - "snackbarFailedToUpdate": "Failed to update extension", + "snackbarFailedToUpdate": "Impossibile aggiornare l'estensione", "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, - "errorRateLimited": "Rate Limited", + "errorRateLimited": "Limite di richieste superato", "@errorRateLimited": { "description": "Error title - too many requests" }, - "errorRateLimitedMessage": "Too many requests. Please wait a moment before searching again.", + "errorRateLimitedMessage": "Troppe richieste. Aspetta un momento prima di cercare nuovamente.", "@errorRateLimitedMessage": { "description": "Error message - rate limit explanation" }, - "errorNoTracksFound": "No tracks found", + "errorNoTracksFound": "Nessuna traccia trovata", "@errorNoTracksFound": { "description": "Error - search returned no results" }, - "searchEmptyResultSubtitle": "Try another keyword", + "searchEmptyResultSubtitle": "Prova un'altra parola chiave", "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, - "errorUrlNotRecognized": "Link not recognized", + "errorUrlNotRecognized": "Link non riconosciuto", "@errorUrlNotRecognized": { "description": "Error title - URL not handled by any extension or service" }, - "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "errorUrlNotRecognizedMessage": "Questo link non è supportato. Controlla che l'URL sia corretto e che un'estensione compatibile sia installata.", "@errorUrlNotRecognizedMessage": { "description": "Error message - URL not recognized explanation" }, - "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "errorUrlFetchFailed": "Impossibile caricare il contenuto da questo link. Per favore riprova.", "@errorUrlFetchFailed": { "description": "Error message - generic URL fetch failure" }, - "errorMissingExtensionSource": "Cannot load {item}: missing extension source", + "errorMissingExtensionSource": "Impossibile caricare {item}: sorgente dell'estensione mancante", "@errorMissingExtensionSource": { "description": "Error - extension source not available", "placeholders": { @@ -1034,27 +1034,27 @@ } } }, - "actionPause": "Pause", + "actionPause": "Pausa", "@actionPause": { "description": "Action button - pause download" }, - "actionResume": "Resume", + "actionResume": "Riprendi", "@actionResume": { "description": "Action button - resume download" }, - "actionCancel": "Cancel", + "actionCancel": "Cancella", "@actionCancel": { "description": "Action button - cancel operation" }, - "actionSelectAll": "Select All", + "actionSelectAll": "Seleziona tutto", "@actionSelectAll": { "description": "Action button - select all items" }, - "actionDeselect": "Deselect", + "actionDeselect": "Deseleziona", "@actionDeselect": { "description": "Action button - deselect all" }, - "selectionSelected": "{count} selected", + "selectionSelected": "{count} selezionati", "@selectionSelected": { "description": "Selection count indicator", "placeholders": { @@ -1063,15 +1063,15 @@ } } }, - "selectionAllSelected": "All tracks selected", + "selectionAllSelected": "Tutte le tracce selezionate", "@selectionAllSelected": { "description": "Status - all items selected" }, - "selectionSelectToDelete": "Select tracks to delete", + "selectionSelectToDelete": "Seleziona tracce da eliminare", "@selectionSelectToDelete": { "description": "Placeholder when nothing selected" }, - "progressFetchingMetadata": "Fetching metadata... {current}/{total}", + "progressFetchingMetadata": "Recupero metadata... {current}/{total}", "@progressFetchingMetadata": { "description": "Progress indicator - loading track info", "placeholders": { @@ -1083,63 +1083,63 @@ } } }, - "progressReadingCsv": "Reading CSV...", + "progressReadingCsv": "Leggendo CSV...", "@progressReadingCsv": { "description": "Progress indicator - parsing CSV file" }, - "searchSongs": "Songs", + "searchSongs": "Canzoni", "@searchSongs": { "description": "Search result category - songs" }, - "searchArtists": "Artists", + "searchArtists": "Artisti", "@searchArtists": { "description": "Search result category - artists" }, - "searchAlbums": "Albums", + "searchAlbums": "Album", "@searchAlbums": { "description": "Search result category - albums" }, - "searchPlaylists": "Playlists", + "searchPlaylists": "Playlist", "@searchPlaylists": { "description": "Search result category - playlists" }, - "searchSortTitle": "Sort Results", + "searchSortTitle": "Ordina i risultati", "@searchSortTitle": { "description": "Bottom sheet title for search sort options" }, - "searchSortDefault": "Default", + "searchSortDefault": "Predefinito", "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "Title (A-Z)", + "searchSortTitleAZ": "Titoli (A-Z)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "Title (Z-A)", + "searchSortTitleZA": "Titoli (Z-A)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "Artist (A-Z)", + "searchSortArtistAZ": "Artisti (A-Z)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "Artist (Z-A)", + "searchSortArtistZA": "Artisti (Z-A)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, - "searchSortDurationShort": "Duration (Shortest)", + "searchSortDurationShort": "Durata (Più breve)", "@searchSortDurationShort": { "description": "Sort option - shortest duration first" }, - "searchSortDurationLong": "Duration (Longest)", + "searchSortDurationLong": "Durata (Più lunga)", "@searchSortDurationLong": { "description": "Sort option - longest duration first" }, - "searchSortDateOldest": "Release Date (Oldest)", + "searchSortDateOldest": "Data di uscita (Più recente)", "@searchSortDateOldest": { "description": "Sort option - oldest release first" }, - "searchSortDateNewest": "Release Date (Newest)", + "searchSortDateNewest": "Data di uscita (Meno recente)", "@searchSortDateNewest": { "description": "Sort option - newest release first" }, @@ -1344,11 +1344,11 @@ "@logNoLogsYet": { "description": "Empty state title" }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", + "logNoLogsYetSubtitle": "I log appariranno qui man mano che usi l'app", "@logNoLogsYetSubtitle": { "description": "Empty state subtitle" }, - "logEntriesFiltered": "Entries ({count} filtered)", + "logEntriesFiltered": "Voci ({count} filtrate)", "@logEntriesFiltered": { "description": "Log count with filter active", "placeholders": { @@ -1357,7 +1357,7 @@ } } }, - "logEntries": "Entries ({count})", + "logEntries": "Voci ({count})", "@logEntries": { "description": "Total log count", "placeholders": { @@ -1366,15 +1366,15 @@ } } }, - "channelStable": "Stable", + "channelStable": "Stabile", "@channelStable": { "description": "Update channel - stable releases" }, - "channelPreview": "Preview", + "channelPreview": "Anteprima", "@channelPreview": { "description": "Update channel - beta/preview releases" }, - "sectionSearchSource": "Search Source", + "sectionSearchSource": "Cerca sorgente", "@sectionSearchSource": { "description": "Settings section header" }, @@ -1382,7 +1382,7 @@ "@sectionDownload": { "description": "Settings section header" }, - "sectionPerformance": "Performance", + "sectionPerformance": "Prestazioni", "@sectionPerformance": { "description": "Settings section header" }, @@ -1398,59 +1398,59 @@ "@sectionDebug": { "description": "Settings section header" }, - "sectionService": "Service", + "sectionService": "Servizio", "@sectionService": { "description": "Settings section header" }, - "sectionAudioQuality": "Audio Quality", + "sectionAudioQuality": "Qualità audio", "@sectionAudioQuality": { "description": "Settings section header" }, - "sectionFileSettings": "File Settings", + "sectionFileSettings": "Impostazioni file", "@sectionFileSettings": { "description": "Settings section header" }, - "sectionLyrics": "Lyrics", + "sectionLyrics": "Testi", "@sectionLyrics": { "description": "Settings section header" }, - "lyricsMode": "Lyrics Mode", + "lyricsMode": "Modalità testi", "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", + "lyricsModeDescription": "Scegli come i testi vengono salvati con i tuoi download", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, - "lyricsModeEmbed": "Embed in file", + "lyricsModeEmbed": "Incorpora nel file", "@lyricsModeEmbed": { "description": "Lyrics mode option - embed in audio file" }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", + "lyricsModeEmbedSubtitle": "Testi memorizzati nei metadata del FLAC", "@lyricsModeEmbedSubtitle": { "description": "Subtitle for embed option" }, - "lyricsModeExternal": "External .lrc file", + "lyricsModeExternal": "File .lrc esterno", "@lyricsModeExternal": { "description": "Lyrics mode option - separate LRC file" }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", + "lyricsModeExternalSubtitle": "Separa il file .lrc per riproduttori tipo Samsung Music", "@lyricsModeExternalSubtitle": { "description": "Subtitle for external option" }, - "lyricsModeBoth": "Both", + "lyricsModeBoth": "Entrambi", "@lyricsModeBoth": { "description": "Lyrics mode option - embed and external" }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", + "lyricsModeBothSubtitle": "Incorpora e salva file .lrc", "@lyricsModeBothSubtitle": { "description": "Subtitle for both option" }, - "sectionColor": "Color", + "sectionColor": "Colori", "@sectionColor": { "description": "Settings section header" }, - "sectionTheme": "Theme", + "sectionTheme": "Temi", "@sectionTheme": { "description": "Settings section header" }, @@ -1458,39 +1458,39 @@ "@sectionLayout": { "description": "Settings section header" }, - "sectionLanguage": "Language", + "sectionLanguage": "Lingua", "@sectionLanguage": { "description": "Settings section header for language" }, - "appearanceLanguage": "App Language", + "appearanceLanguage": "Lingua dell'applicazione", "@appearanceLanguage": { "description": "Language setting title" }, - "settingsAppearanceSubtitle": "Theme, colors, display", + "settingsAppearanceSubtitle": "Temi, colori e display", "@settingsAppearanceSubtitle": { "description": "Appearance settings description" }, - "settingsDownloadSubtitle": "Service, quality, fallback", + "settingsDownloadSubtitle": "Servizi, qualità, fallback", "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsExtensionsSubtitle": "Manage download providers", + "settingsExtensionsSubtitle": "Gestisci i provider di download", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" }, - "settingsLogsSubtitle": "View app logs for debugging", + "settingsLogsSubtitle": "Vedi i log dell'applicazione per debug", "@settingsLogsSubtitle": { "description": "Logs settings description" }, - "loadingSharedLink": "Loading shared link...", + "loadingSharedLink": "Caricando il link condiviso...", "@loadingSharedLink": { "description": "Status when opening shared URL" }, - "pressBackAgainToExit": "Press back again to exit", + "pressBackAgainToExit": "Premi ancora indietro per uscire", "@pressBackAgainToExit": { "description": "Exit confirmation message" }, - "downloadAllCount": "Download All ({count})", + "downloadAllCount": "Scarica tutti ({count})", "@downloadAllCount": { "description": "Download all button with count", "placeholders": { @@ -1499,7 +1499,7 @@ } } }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", + "tracksCount": "{count, plural, one {}=1{1 traccia} other{{count} tracce}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1508,51 +1508,51 @@ } } }, - "trackCopyFilePath": "Copy file path", + "trackCopyFilePath": "Copia il percorso del file", "@trackCopyFilePath": { "description": "Action - copy file path" }, - "trackRemoveFromDevice": "Remove from device", + "trackRemoveFromDevice": "Rimuovi dal dispositivo", "@trackRemoveFromDevice": { "description": "Action - delete downloaded file" }, - "trackLoadLyrics": "Load Lyrics", + "trackLoadLyrics": "Carica testi", "@trackLoadLyrics": { "description": "Action - fetch lyrics" }, - "trackMetadata": "Metadata", + "trackMetadata": "Metadati", "@trackMetadata": { "description": "Tab title - track metadata" }, - "trackFileInfo": "File Info", + "trackFileInfo": "Informazioni sul file", "@trackFileInfo": { "description": "Tab title - file information" }, - "trackLyrics": "Lyrics", + "trackLyrics": "Testi", "@trackLyrics": { "description": "Tab title - lyrics" }, - "trackFileNotFound": "File not found", + "trackFileNotFound": "File non trovato", "@trackFileNotFound": { "description": "Error - file doesn't exist" }, - "trackOpenInDeezer": "Open in Deezer", + "trackOpenInDeezer": "Apri su Deezer", "@trackOpenInDeezer": { "description": "Action - open track in Deezer app" }, - "trackOpenInSpotify": "Open in Spotify", + "trackOpenInSpotify": "Apri su Spotify", "@trackOpenInSpotify": { "description": "Action - open track in Spotify app" }, - "trackTrackName": "Track name", + "trackTrackName": "Nome della traccia", "@trackTrackName": { "description": "Metadata label - track title" }, - "trackArtist": "Artist", + "trackArtist": "Artista", "@trackArtist": { "description": "Metadata label - artist name" }, - "trackAlbumArtist": "Album artist", + "trackAlbumArtist": "Artista dell'album", "@trackAlbumArtist": { "description": "Metadata label - album artist" }, @@ -1560,7 +1560,7 @@ "@trackAlbum": { "description": "Metadata label - album name" }, - "trackTrackNumber": "Track number", + "trackTrackNumber": "Numero della traccia", "@trackTrackNumber": { "description": "Metadata label - track number" }, From ce7302082c9285763cc9b2b11846c0f2fd933b40 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Thu, 20 Aug 2026 21:35:50 +0700 Subject: [PATCH 44/72] New translations app_en.arb (Italian) [ci skip] --- lib/l10n/arb/app_it-IT.arb | 50 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_it-IT.arb b/lib/l10n/arb/app_it-IT.arb index 9d3d9dca..6e2026fd 100644 --- a/lib/l10n/arb/app_it-IT.arb +++ b/lib/l10n/arb/app_it-IT.arb @@ -89,15 +89,15 @@ "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, - "downloadFilenameFormat": "Filename Format", + "downloadFilenameFormat": "Formato nome file", "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "Formato nome file singolo", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "Modello di nome file per singoli ed EP. Utilizza gli stessi tag del formato album.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, @@ -174,11 +174,11 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsEmbedLyrics": "Embed Lyrics", + "optionsEmbedLyrics": "Incorpora Testo", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "optionsEmbedLyricsSubtitle": "Salva i testi sincronizzati accanto alle tracce scaricate", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -186,7 +186,7 @@ "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", + "optionsMaxQualityCoverSubtitle": "Scarica copertine con risoluzione più alta", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, @@ -300,27 +300,27 @@ "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Stable releases only", + "optionsUpdateChannelStable": "Solo versioni stabili", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, - "optionsUpdateChannelPreview": "Get preview releases", + "optionsUpdateChannelPreview": "Ottieni le versioni in anteprima", "@optionsUpdateChannelPreview": { "description": "Include beta/preview updates" }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", + "optionsUpdateChannelWarning": "L'anteprima può contenere bug o funzionalità incomplete", "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "Clear Download History", + "optionsClearHistory": "Svuota la cronologia dei download", "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", + "optionsClearHistorySubtitle": "Rimuovi tutte le tracce scaricate dalla cronologia", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, - "optionsDetailedLogging": "Detailed Logging", + "optionsDetailedLogging": "Log dettagliato", "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, @@ -425,11 +425,11 @@ "@aboutReportIssueSubtitle": { "description": "Subtitle for report issue" }, - "aboutFeatureRequest": "Feature request", + "aboutFeatureRequest": "Richiesta di nuove funzionalità", "@aboutFeatureRequest": { "description": "Link to suggest features" }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", + "aboutFeatureRequestSubtitle": "Suggerisci nuove funzionalità per l'applicazione", "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, @@ -485,7 +485,7 @@ "@artistSingles": { "description": "Section header for singles/EPs" }, - "artistCompilations": "Compilations", + "artistCompilations": "Compilation", "@artistCompilations": { "description": "Section header for compilations" }, @@ -598,43 +598,43 @@ "@setupChooseFromFilesSubtitle": { "description": "Subtitle for file picker" }, - "setupIosEmptyFolderWarning": "iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.", + "setupIosEmptyFolderWarning": "Limitazione iOS: Le cartelle vuote non possono essere selezionate. Scegli una cartella con almeno un file.", "@setupIosEmptyFolderWarning": { "description": "iOS folder selection warning" }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", + "setupIcloudNotSupported": "iCloud Drive non è supportato. Per favore, usa la cartella Documenti dell'app", "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "setupDownloadInFlac": "Scarica le tracce Spotify in FLAC", "@setupDownloadInFlac": { "description": "App tagline in setup" }, - "setupStorageGranted": "Storage Permission Granted!", + "setupStorageGranted": "Permesso di archiviazione concesso!", "@setupStorageGranted": { "description": "Success message for storage permission" }, - "setupStorageRequired": "Storage Permission Required", + "setupStorageRequired": "Permesso di archiviazione richiesto", "@setupStorageRequired": { "description": "Title when storage permission needed" }, - "setupStorageDescription": "SpotiFLAC needs storage permission to save your downloaded music files.", + "setupStorageDescription": "SpotiFLAC ha bisogno del permesso di archiviazione per salvare i file musicali scaricati.", "@setupStorageDescription": { "description": "Explanation for storage permission" }, - "setupNotificationGranted": "Notification Permission Granted!", + "setupNotificationGranted": "Permesso di notifica concesso!", "@setupNotificationGranted": { "description": "Success message for notification permission" }, - "setupNotificationEnable": "Enable Notifications", + "setupNotificationEnable": "Attiva notifiche", "@setupNotificationEnable": { "description": "Button to enable notifications" }, - "setupFolderChoose": "Choose Download Folder", + "setupFolderChoose": "Scegli la cartella di download", "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "Select a folder where your downloaded music will be saved.", + "setupFolderDescription": "Seleziona una cartella dove la musica scaricata verrà salvata.", "@setupFolderDescription": { "description": "Explanation for folder selection" }, From a0557cb31d3b42b8d87eef26fa2286e544e3fee6 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 21 Aug 2026 18:52:31 +0700 Subject: [PATCH 45/72] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 8257db4d..92279aee 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -792,7 +792,7 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Found {count} tracks in the playlist file. Add them to download queue?", + "dialogImportPlaylistMessage": "Menemukan {count} lagu di file playlist. Tambahkan ke antrean download?", "csvImportTracks": "{count} trek dari CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", @@ -802,11 +802,11 @@ } } }, - "collectionExportM3u": "Export as M3U8", + "collectionExportM3u": "Ekspor sebagai M3U8", "@collectionExportM3u": { "description": "Tooltip on the collection screen action that exports the track list as an M3U8 playlist file" }, - "collectionExportM3uDone": "Exported {exported} of {total} tracks", + "collectionExportM3uDone": "Mengekspor {exported} dari {total} lagu", "@collectionExportM3uDone": { "description": "Snackbar after M3U8 export; tracks without a local file are not exported", "placeholders": { @@ -818,43 +818,43 @@ } } }, - "collectionExportM3uNone": "No downloaded files to export", + "collectionExportM3uNone": "Tidak ada file terdownload untuk diekspor", "@collectionExportM3uNone": { "description": "Snackbar when an M3U8 export finds no local files" }, - "collectionExportM3uFailed": "Export failed", + "collectionExportM3uFailed": "Ekspor gagal", "@collectionExportM3uFailed": { "description": "Snackbar when writing or sharing the M3U8 export fails" }, - "trackOpenOn": "Open on...", + "trackOpenOn": "Buka di...", "@trackOpenOn": { "description": "Track option and sheet title listing streaming platforms where the track can be opened" }, - "trackOpenOnNoLinks": "No platform links found for this track.", + "trackOpenOnNoLinks": "Tidak menemukan link platform untuk lagu ini.", "@trackOpenOnNoLinks": { "description": "Shown in the Open on sheet when song.link returns no links" }, - "libraryReviewDuplicates": "Review duplicates", + "libraryReviewDuplicates": "Tinjau duplikat", "@libraryReviewDuplicates": { "description": "Library settings row opening the duplicate review sheet" }, - "libraryReviewDuplicatesSubtitle": "Find tracks stored more than once", + "libraryReviewDuplicatesSubtitle": "Telusuri lagu yang disimpan lebih dari sekali", "@libraryReviewDuplicatesSubtitle": { "description": "Subtitle for the duplicate review settings row" }, - "duplicatesTitle": "Duplicates", + "duplicatesTitle": "Duplikat", "@duplicatesTitle": { "description": "Title of the duplicate review sheet" }, - "duplicatesEmpty": "No duplicate tracks found.", + "duplicatesEmpty": "Tidak menemukan lagu duplikat.", "@duplicatesEmpty": { "description": "Shown when the duplicate review sheet finds nothing" }, - "duplicatesKeepBest": "Keep best", + "duplicatesKeepBest": "Simpan lagu kualitas terbaik", "@duplicatesKeepBest": { "description": "Button that deletes all but the highest-quality copy in a duplicate group" }, - "duplicatesKeepBestMessage": "Delete {count} lower-quality copies of \"{trackName}\"?", + "duplicatesKeepBestMessage": "Hapus {count} salinan kualitas rendah lagu \"{trackName}\"?", "@duplicatesKeepBestMessage": { "description": "Confirmation message for the keep-best action", "placeholders": { @@ -866,7 +866,7 @@ } } }, - "duplicatesDeleteCopyMessage": "Delete this copy of \"{trackName}\"?", + "duplicatesDeleteCopyMessage": "Hapus salinan lagu \"{trackName}\"?", "@duplicatesDeleteCopyMessage": { "description": "Confirmation message for deleting one duplicate copy", "placeholders": { @@ -1227,11 +1227,11 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateRequiredTitle": "Update required", + "updateRequiredTitle": "Harus update", "@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": "Versi yang Anda gunakan adalah {count} dan sudah tidak didukung. Update untuk terus menggunakan aplikasi.", "@updateRequiredNotice": { "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", "placeholders": { @@ -2083,7 +2083,7 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "Animasi hero", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, @@ -2091,7 +2091,7 @@ "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, - "appearanceForceBlur": "Always use blur effects", + "appearanceForceBlur": "Selalu gunakan efek blur", "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, From b3c3e2d756b3d2244e83a94b9d926615d368eed3 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 21 Aug 2026 21:13:23 +0700 Subject: [PATCH 46/72] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 92279aee..1f52030a 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -2095,7 +2095,7 @@ "@appearanceForceBlur": { "description": "Toggle that forces backdrop blur on even when the device profile disabled it" }, - "appearanceForceBlurSubtitle": "Enable the navigation bar blur even on devices where it is off by default. May cost performance.", + "appearanceForceBlurSubtitle": "Aktifkan efek buram bilah navigasi bahkan pada perangkat yang dinonaktifkan secara bawaan. Dapat memengaruhi performa.", "@appearanceForceBlurSubtitle": { "description": "Subtitle for the force-blur toggle" }, @@ -2131,19 +2131,19 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "settingsConcurrentDownloads": "Concurrent downloads", + "settingsConcurrentDownloads": "Unduhan bersamaan", "@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": "Mengunduh beberapa lagu sekaligus lebih cepat, tetapi beberapa penyedia mungkin membatasi permintaan paralel.", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "1 track at a time", + "concurrentDownloadsOne": "1 lagu dalam satu waktu", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "Up to {count} tracks at once", + "concurrentDownloadsCount": "Hingga {count} lagu dalam satu waktu", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2192,11 +2192,11 @@ "@albumFolderArtistAlbumSinglesSubtitle": { "description": "Folder structure example" }, - "albumFolderArtistAlbumFlat": "Artist / Album (Singles flat)", + "albumFolderArtistAlbumFlat": "Artis / Album (Single digabung)", "@albumFolderArtistAlbumFlat": { "description": "Album folder option with singles directly in artist folder" }, - "albumFolderArtistAlbumFlatSubtitle": "Artist/Album/ and Artist/song.flac", + "albumFolderArtistAlbumFlatSubtitle": "Artis/Album/ dan Artis/lagu.flac", "@albumFolderArtistAlbumFlatSubtitle": { "description": "Folder structure example for flat singles" }, From 505c87eda759c9dfbdd4007bde50c4ef6ec87e96 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 21 Aug 2026 22:59:09 +0700 Subject: [PATCH 47/72] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index 1f52030a..b213df0b 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -2291,7 +2291,7 @@ "@discographyDownloadAll": { "description": "Option - download entire discography" }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", + "discographyDownloadAllSubtitle": "{count} lagu dari {albumCount} rilisan", "@discographyDownloadAllSubtitle": { "description": "Subtitle showing total tracks and albums", "placeholders": { @@ -2303,11 +2303,11 @@ } } }, - "discographyAlbumsOnly": "Albums Only", + "discographyAlbumsOnly": "Hanya Album", "@discographyAlbumsOnly": { "description": "Option - download only albums" }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", + "discographyAlbumsOnlySubtitle": "{count} lagu dari {albumCount} album", "@discographyAlbumsOnlySubtitle": { "description": "Subtitle showing album tracks count", "placeholders": { @@ -2319,11 +2319,11 @@ } } }, - "discographySinglesOnly": "Singles & EPs Only", + "discographySinglesOnly": "Hanya Single & EP", "@discographySinglesOnly": { "description": "Option - download only singles" }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", + "discographySinglesOnlySubtitle": "​{count} lagu dari {albumCount} single", "@discographySinglesOnlySubtitle": { "description": "Subtitle showing singles tracks count", "placeholders": { @@ -2335,19 +2335,19 @@ } } }, - "discographySelectAlbums": "Select Albums...", + "discographySelectAlbums": "Pilih Album...", "@discographySelectAlbums": { "description": "Option - manually select albums to download" }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "discographySelectAlbumsSubtitle": "Pilih album atau single spesifik", "@discographySelectAlbumsSubtitle": { "description": "Subtitle for select albums option" }, - "discographyFetchingTracks": "Fetching tracks...", + "discographyFetchingTracks": "Memuat lagu...", "@discographyFetchingTracks": { "description": "Progress - fetching album tracks" }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", + "discographyFetchingAlbum": "Memuat {current} dari {total}...", "@discographyFetchingAlbum": { "description": "Progress - fetching specific album", "placeholders": { @@ -2359,7 +2359,7 @@ } } }, - "discographySelectedCount": "{count} selected", + "discographySelectedCount": "{count} dipilih", "@discographySelectedCount": { "description": "Selection count badge", "placeholders": { @@ -2368,11 +2368,11 @@ } } }, - "discographyDownloadSelected": "Download Selected", + "discographyDownloadSelected": "Unduh yang Dipilih", "@discographyDownloadSelected": { "description": "Button - download selected albums" }, - "discographyAddedToQueue": "Added {count} tracks to queue", + "discographyAddedToQueue": "{count} lagu ditambahkan ke antrean", "@discographyAddedToQueue": { "description": "Snackbar - tracks added from discography", "placeholders": { From c25083b84154a15cd1a50760b8bb86aa8f2f5d90 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 24 Aug 2026 08:58:38 +0700 Subject: [PATCH 48/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index 5e542598..bc3a6f00 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -1,43 +1,43 @@ { "@@locale": "zh-TW", "@@last_modified": "2026-04-28", - "appName": "SpotiFLAC Mobile", + "appName": "SpotiFLAC 行動版", "@appName": { "description": "App name - DO NOT TRANSLATE" }, - "navHome": "Home", + "navHome": "首頁", "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Library", + "navLibrary": "音樂庫", "@navLibrary": { "description": "Bottom navigation - Library tab" }, - "navSettings": "Settings", + "navSettings": "設定", "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "擴充庫", "@navStore": { "description": "Bottom navigation - Extension repo tab" }, - "homeTitle": "Home", + "homeTitle": "首頁", "@homeTitle": { "description": "Home screen title" }, - "homeSubtitle": "Paste a supported URL or search by name", + "homeSubtitle": "貼上支援的連結或是搜尋音樂名稱", "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "No search providers yet", + "homeEmptyTitle": "尚未有搜尋的提供者", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, - "homeEmptySubtitle": "Install an extension to continue.", + "homeEmptySubtitle": "確保你有安裝擴充功能。", "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, - "homeSupports": "Supports: Track, Album, Playlist, Artist URLs", + "homeSupports": "支援:單曲、專輯、播放清單或歌手連結", "@homeSupports": { "description": "Info text about supported URL types" }, @@ -45,55 +45,55 @@ "@homeRecent": { "description": "Section header for recent searches" }, - "historyFilterAll": "All", + "historyFilterAll": "全部", "@historyFilterAll": { "description": "Filter chip - show all items" }, - "historyFilterAlbums": "Albums", + "historyFilterAlbums": "專輯", "@historyFilterAlbums": { "description": "Filter chip - show albums only" }, - "historyFilterSingles": "Singles", + "historyFilterSingles": "單曲", "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "historySearchHint": "Search history...", + "historySearchHint": "搜尋紀錄……", "@historySearchHint": { "description": "Search bar placeholder in history" }, - "settingsTitle": "Settings", + "settingsTitle": "設定", "@settingsTitle": { "description": "Settings screen title" }, - "settingsDownload": "Download", + "settingsDownload": "下載", "@settingsDownload": { "description": "Settings section - download options" }, - "settingsAppearance": "Appearance", + "settingsAppearance": "外觀", "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsExtensions": "Extensions", + "settingsExtensions": "擴充套件", "@settingsExtensions": { "description": "Settings section - extension management" }, - "settingsAbout": "About", + "settingsAbout": "關於", "@settingsAbout": { "description": "Settings section - app info" }, - "downloadTitle": "Download", + "downloadTitle": "下載", "@downloadTitle": { "description": "Download settings page title" }, - "downloadAskQualitySubtitle": "Show quality picker for each download", + "downloadAskQualitySubtitle": "每次下載前詢問下載音質", "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, - "downloadFilenameFormat": "Filename Format", + "downloadFilenameFormat": "檔案名稱格式", "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Single Filename Format", + "downloadSingleFilenameFormat": "單一檔案名稱格式", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, From 4d1fcf649cfb939dae1ebfe6125f586dcac5da55 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 24 Aug 2026 10:00:08 +0700 Subject: [PATCH 49/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 84 +++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index bc3a6f00..b7a1b82b 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -89,67 +89,67 @@ "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, - "downloadFilenameFormat": "檔案名稱格式", + "downloadFilenameFormat": "音樂檔案名稱格式", "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "單一檔案名稱格式", + "downloadSingleFilenameFormat": "單曲音樂檔案名稱格式", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Filename pattern for singles and EPs. Uses the same tags as the album format.", + "downloadSingleFilenameFormatDescription": "單曲 與 小專輯 的檔名命名格式使用與專輯格式相同的標籤。", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Folder Organization", + "downloadFolderOrganization": "資料夾歸類方式", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, - "appearanceTitle": "Appearance", + "appearanceTitle": "外觀", "@appearanceTitle": { "description": "Appearance settings page title" }, - "appearanceThemeSystem": "System", + "appearanceThemeSystem": "遵循系統", "@appearanceThemeSystem": { "description": "Follow system theme" }, - "appearanceThemeLight": "Light", + "appearanceThemeLight": "明亮模式", "@appearanceThemeLight": { "description": "Light theme" }, - "appearanceThemeDark": "Dark", + "appearanceThemeDark": "深色模式", "@appearanceThemeDark": { "description": "Dark theme" }, - "appearanceDynamicColor": "Dynamic Color", + "appearanceDynamicColor": "動態配色", "@appearanceDynamicColor": { "description": "Material You dynamic colors" }, - "appearanceDynamicColorSubtitle": "Use colors from your wallpaper", + "appearanceDynamicColorSubtitle": "使用桌布配色", "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "History View", + "appearanceHistoryView": "檢視方式", "@appearanceHistoryView": { "description": "Layout style for history" }, - "appearanceHistoryViewList": "List", + "appearanceHistoryViewList": "清單", "@appearanceHistoryViewList": { "description": "List layout option" }, - "appearanceHistoryViewGrid": "Grid", + "appearanceHistoryViewGrid": "格狀", "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsPrimaryProvider": "Primary Provider", + "optionsPrimaryProvider": "主要資料來源", "@optionsPrimaryProvider": { "description": "Main search provider setting" }, - "optionsPrimaryProviderSubtitle": "Service used for searching by track or album name", + "optionsPrimaryProviderSubtitle": "依曲目或專輯名稱選擇音樂資料來源服務", "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "Using extension: {extensionName}", + "optionsUsingExtension": "使用中的擴充套件:{extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -158,67 +158,67 @@ } } }, - "optionsDefaultSearchTab": "Default Search Tab", + "optionsDefaultSearchTab": "預設搜尋標籤頁", "@optionsDefaultSearchTab": { "description": "Title for the preferred default search tab setting" }, - "optionsDefaultSearchTabSubtitle": "Choose which tab opens first for new search results.", + "optionsDefaultSearchTabSubtitle": "選擇搜尋結果優先打開的標籤頁。", "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsAutoFallback": "Auto Fallback", + "optionsAutoFallback": "自動切換備用服務", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, - "optionsAutoFallbackSubtitle": "Try other services if download fails", + "optionsAutoFallbackSubtitle": "下載失敗時自動改用其他服務搜尋", "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsEmbedLyrics": "Embed Lyrics", + "optionsEmbedLyrics": "嵌入歌詞", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Save synced lyrics alongside your downloaded tracks", + "optionsEmbedLyricsSubtitle": "將歌詞與曲目一併下載", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Max Quality Cover", + "optionsMaxQualityCover": "最高品質封面", "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "Download highest resolution cover art", + "optionsMaxQualityCoverSubtitle": "下載最高畫質的封面", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, - "optionsReplayGain": "ReplayGain", + "optionsReplayGain": "音量平衡", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" }, - "optionsReplayGainSubtitleOn": "Scan loudness and embed ReplayGain tags (EBU R128)", + "optionsReplayGainSubtitleOn": "分析音量響度並套用音量平衡標籤 (EBU R128)", "@optionsReplayGainSubtitleOn": { "description": "Subtitle when ReplayGain is enabled" }, - "optionsReplayGainSubtitleOff": "Disabled: no loudness normalization tags", + "optionsReplayGainSubtitleOff": "已停用:不套用音量標準化標籤", "@optionsReplayGainSubtitleOff": { "description": "Subtitle when ReplayGain is disabled" }, - "trackReplayGain": "Rescan ReplayGain", + "trackReplayGain": "重新分析音量響度", "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainScanning": "Analyzing loudness...", + "trackReplayGainScanning": "正在分析音量……", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" }, - "trackReplayGainSuccess": "ReplayGain tags added", + "trackReplayGainSuccess": "已添加音量平衡標籤", "@trackReplayGainSuccess": { "description": "Snackbar message after ReplayGain tags written for a single track" }, - "trackReplayGainFailed": "Failed to add ReplayGain tags", + "trackReplayGainFailed": "音量平衡標籤添加失敗", "@trackReplayGainFailed": { "description": "Snackbar message when ReplayGain scan/write fails" }, - "selectionReplayGainCount": "ReplayGain ({count})", + "selectionReplayGainCount": "音量平衡 ({count})", "@selectionReplayGainCount": { "description": "Batch selection action button label for ReplayGain", "placeholders": { @@ -227,11 +227,11 @@ } } }, - "replayGainBatchConfirmTitle": "Add ReplayGain", + "replayGainBatchConfirmTitle": "添加音量平衡", "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analyze loudness and write ReplayGain tags to {count} track(s)?", + "replayGainBatchConfirmMessage": "要分析併想 {count} 首歌添加音量平衡標籤嗎?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -240,11 +240,11 @@ } } }, - "replayGainBatchAnalyzing": "Analyzing ReplayGain...", + "replayGainBatchAnalyzing": "正在分析音量平衡……", "@replayGainBatchAnalyzing": { "description": "Progress dialog title while batch scanning ReplayGain" }, - "replayGainBatchSuccess": "ReplayGain added to {success} of {total} tracks", + "replayGainBatchSuccess": "已{success}為{total}首歌添加音量平衡", "@replayGainBatchSuccess": { "description": "Snackbar after batch ReplayGain completes", "placeholders": { @@ -256,27 +256,27 @@ } } }, - "optionsArtistTagMode": "Artist Tag Mode", + "optionsArtistTagMode": "演出者標籤模式", "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Choose how multiple artists are written into embedded tags.", + "optionsArtistTagModeDescription": "選擇將多位演出者寫入嵌入標籤的方式。", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Single joined value", + "optionsArtistTagModeJoined": "合併為一項", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Write one ARTIST value like \"Artist A, Artist B\" for maximum player compatibility.", + "optionsArtistTagModeJoinedSubtitle": "將演出者寫入為單一欄位值,如「Artist A, Artist B」,以提供最佳的相容性。", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Split tags for FLAC/Opus", + "optionsArtistTagModeSplitVorbis": "用於 FLAC/Opus的方式拆分", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Write one artist tag per artist for FLAC and Opus; MP3 and M4A stay joined.", + "optionsArtistTagModeSplitVorbisSubtitle": "FLAC 與 Opus 格式會為每位演出者單獨寫入一個標籤;MP3 與 M4A 則保持合併狀態。", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, From ff6b487c57bc85d28a2e6add91b805004d8c638c Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 24 Aug 2026 11:09:38 +0700 Subject: [PATCH 50/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 126 ++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index b7a1b82b..11d29255 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -280,67 +280,67 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "Extension Repo", + "optionsExtensionStore": "擴充資料庫", "@optionsExtensionStore": { "description": "Show/hide repo tab" }, - "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", + "optionsExtensionStoreSubtitle": "在導覽列中顯示儲存庫分頁", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension repo toggle" }, - "optionsCheckUpdates": "Check for Updates", + "optionsCheckUpdates": "檢查更新", "@optionsCheckUpdates": { "description": "Auto update check toggle" }, - "optionsCheckUpdatesSubtitle": "Notify when new version is available", + "optionsCheckUpdatesSubtitle": "當有新版本可用時通知", "@optionsCheckUpdatesSubtitle": { "description": "Subtitle for update check" }, - "optionsUpdateChannel": "Update Channel", + "optionsUpdateChannel": "選擇更新版本", "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Stable releases only", + "optionsUpdateChannelStable": "僅取得正式版更新", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, - "optionsUpdateChannelPreview": "Get preview releases", + "optionsUpdateChannelPreview": "取得預覽版更新", "@optionsUpdateChannelPreview": { "description": "Include beta/preview updates" }, - "optionsUpdateChannelWarning": "Preview may contain bugs or incomplete features", + "optionsUpdateChannelWarning": "預覽版本可能包含錯誤或未完成的功能", "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "Clear Download History", + "optionsClearHistory": "清除下載記錄", "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "Remove all downloaded tracks from history", + "optionsClearHistorySubtitle": "清除歷史紀錄中所有已下載的項目", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, - "optionsDetailedLogging": "Detailed Logging", + "optionsDetailedLogging": "詳細日誌", "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, - "optionsDetailedLoggingOn": "Detailed logs are being recorded", + "optionsDetailedLoggingOn": "詳細日誌將被記錄", "@optionsDetailedLoggingOn": { "description": "Status when logging enabled" }, - "optionsDetailedLoggingOff": "Enable for bug reports", + "optionsDetailedLoggingOff": "開啟以供錯誤回報使用", "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "extensionsTitle": "Extensions", + "extensionsTitle": "擴充套件", "@extensionsTitle": { "description": "Extensions page title" }, - "extensionsDisabled": "Disabled", + "extensionsDisabled": "已停用", "@extensionsDisabled": { "description": "Extension status - inactive" }, - "extensionsVersion": "Version {version}", + "extensionsVersion": "版本 {version}", "@extensionsVersion": { "description": "Extension version display", "placeholders": { @@ -349,151 +349,151 @@ } } }, - "extensionsUninstall": "Uninstall", + "extensionsUninstall": "解除安裝", "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Extension Repo", + "storeTitle": "擴充資料庫", "@storeTitle": { "description": "Repo screen title" }, - "storeSearch": "Search extensions...", + "storeSearch": "搜尋擴充套件……", "@storeSearch": { "description": "Repo search placeholder" }, - "storeInstall": "Install", + "storeInstall": "安裝", "@storeInstall": { "description": "Install extension button" }, - "storeInstalled": "Installed", + "storeInstalled": "已安裝", "@storeInstalled": { "description": "Already installed badge" }, - "storeUpdate": "Update", + "storeUpdate": "更新", "@storeUpdate": { "description": "Update available button" }, - "aboutTitle": "About", + "aboutTitle": "關於", "@aboutTitle": { "description": "About page title" }, - "aboutContributors": "Contributors", + "aboutContributors": "貢獻者", "@aboutContributors": { "description": "Section for contributors" }, - "aboutMobileDeveloper": "Mobile version developer", + "aboutMobileDeveloper": "行動版開發者", "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, - "aboutOriginalCreator": "Creator of the original SpotiFLAC", + "aboutOriginalCreator": "SpotiFLAC 原始作者", "@aboutOriginalCreator": { "description": "Role description for original creator" }, - "aboutLogoArtist": "The talented artist who created our beautiful app logo!", + "aboutLogoArtist": "設計我們應用程式 Logo 的優秀繪師!", "@aboutLogoArtist": { "description": "Role description for logo artist" }, - "aboutTranslators": "Translators", + "aboutTranslators": "譯者名單", "@aboutTranslators": { "description": "Section for translators" }, - "aboutSpecialThanks": "Special Thanks", + "aboutSpecialThanks": "特別感謝", "@aboutSpecialThanks": { "description": "Section for special thanks" }, - "aboutLinks": "Links", + "aboutLinks": "連結", "@aboutLinks": { "description": "Section for external links" }, - "aboutMobileSource": "Mobile source code", + "aboutMobileSource": "行動裝置版本開源碼", "@aboutMobileSource": { "description": "Link to mobile GitHub repo" }, - "aboutPCSource": "PC source code", + "aboutPCSource": "桌面版本開源碼", "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "響應 Keep Android Open 倡議", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, - "aboutReportIssue": "Report an issue", + "aboutReportIssue": "回報問題", "@aboutReportIssue": { "description": "Link to report bugs" }, - "aboutReportIssueSubtitle": "Report any problems you encounter", + "aboutReportIssueSubtitle": "回報您遇到的任何問題", "@aboutReportIssueSubtitle": { "description": "Subtitle for report issue" }, - "aboutFeatureRequest": "Feature request", + "aboutFeatureRequest": "功能建議", "@aboutFeatureRequest": { "description": "Link to suggest features" }, - "aboutFeatureRequestSubtitle": "Suggest new features for the app", + "aboutFeatureRequestSubtitle": "為應用程式提出新功能建議", "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, - "aboutTelegramChannel": "Telegram Channel", + "aboutTelegramChannel": "Telegram", "@aboutTelegramChannel": { "description": "Link to Telegram channel" }, - "aboutTelegramChannelSubtitle": "Announcements and updates", + "aboutTelegramChannelSubtitle": "公告與更新資訊", "@aboutTelegramChannelSubtitle": { "description": "Subtitle for Telegram channel" }, - "aboutTelegramChat": "Telegram Community", + "aboutTelegramChat": "Telegram 社群", "@aboutTelegramChat": { "description": "Link to Telegram chat group" }, - "aboutTelegramChatSubtitle": "Chat with other users", + "aboutTelegramChatSubtitle": "與其他使用者分享", "@aboutTelegramChatSubtitle": { "description": "Subtitle for Telegram chat" }, - "aboutSocial": "Social", + "aboutSocial": "社群平台", "@aboutSocial": { "description": "Section for social links" }, - "aboutApp": "App", + "aboutApp": "應用程式", "@aboutApp": { "description": "Section for app info" }, - "aboutVersion": "Version", + "aboutVersion": "版本", "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "The creator of QQDL & HiFi API. This project helped shape lossless download support.", + "aboutBinimumDesc": "QQDL 和 HiFi API 的創建者,幫助完善無損音質下載。", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "The original HiFi project creator. A foundation for lossless-source integration.", + "aboutSachinsenalDesc": "原 HiFi項目創建者,為無損音質來源奠定了基礎。", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", + "aboutSjdonadoDesc": "I Don't Have Spotify (IDHS) 的創建者。他的備用連結解析氣十分有幫助!", "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Search music metadata, manage extensions, and organize your library.", + "aboutAppDescription": "搜尋音樂元數據、管理擴充功能,並整理各個音樂庫。", "@aboutAppDescription": { "description": "App description in header card" }, - "artistAlbums": "Albums", + "artistAlbums": "專輯", "@artistAlbums": { "description": "Section header for artist albums" }, - "artistSingles": "Singles & EPs", + "artistSingles": "單曲 & 小專輯", "@artistSingles": { "description": "Section header for singles/EPs" }, - "artistCompilations": "Compilations", + "artistCompilations": "合輯", "@artistCompilations": { "description": "Section header for compilations" }, - "artistPopular": "Popular", + "artistPopular": "受歡迎", "@artistPopular": { "description": "Section header for popular/top tracks" }, - "artistMonthlyListeners": "{count} monthly listeners", + "artistMonthlyListeners": "每月聽眾人數 {count}", "@artistMonthlyListeners": { "description": "Monthly listener count display", "placeholders": { @@ -503,43 +503,43 @@ } } }, - "trackMetadataService": "Service", + "trackMetadataService": "服務", "@trackMetadataService": { "description": "Metadata field - download service used" }, - "trackMetadataPlay": "Play", + "trackMetadataPlay": "播放", "@trackMetadataPlay": { "description": "Action button - play track" }, - "trackMetadataShare": "Share", + "trackMetadataShare": "分享", "@trackMetadataShare": { "description": "Action button - share track" }, - "trackMetadataDelete": "Delete", + "trackMetadataDelete": "刪除", "@trackMetadataDelete": { "description": "Action button - delete track" }, - "setupGrantPermission": "Grant Permission", + "setupGrantPermission": "權限請求", "@setupGrantPermission": { "description": "Button to request permission" }, - "setupSkip": "Skip for now", + "setupSkip": "現在略過", "@setupSkip": { "description": "Skip current step button" }, - "setupStorageAccessRequired": "Storage Access Required", + "setupStorageAccessRequired": "需要存取儲存裝置權限", "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ requires \"All files access\" permission to save files to your chosen download folder.", + "setupStorageAccessMessageAndroid11": "Android 11(含)以上版本需要「所有檔案存取權限」,以將檔案儲存到您指定的下載資料夾。", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, - "setupOpenSettings": "Open Settings", + "setupOpenSettings": "開啟設定", "@setupOpenSettings": { "description": "Button to open system settings" }, - "setupPermissionDeniedMessage": "Permission denied. Please grant all permissions to continue.", + "setupPermissionDeniedMessage": "已拒絕權限。請允許所有權限以繼續。", "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, From b85798e59fd965df1525377f45a95b087f8dbee8 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 24 Aug 2026 12:36:06 +0700 Subject: [PATCH 51/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index 11d29255..4406bc7e 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -543,7 +543,7 @@ "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "{permissionType} Permission Required", + "setupPermissionRequired": "需要 {permissionType} 權限", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -553,7 +553,7 @@ } } }, - "setupPermissionRequiredMessage": "{permissionType} permission is required for the best experience. You can change this later in Settings.", + "setupPermissionRequiredMessage": "需要「{permissionType}」權限以獲得最佳使用體驗。您稍後隨時可以在「設定」中進行變更。", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { From 781fd289f165ceaf4add41e9bae9d1f372b8fea0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:30:39 +0700 Subject: [PATCH 52/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index 4406bc7e..4cb21131 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -562,39 +562,39 @@ } } }, - "setupUseDefaultFolder": "Use Default Folder?", + "setupUseDefaultFolder": "是否使用預設資料夾?", "@setupUseDefaultFolder": { "description": "Dialog title for default folder" }, - "setupNoFolderSelected": "No folder selected. Would you like to use the default Music folder?", + "setupNoFolderSelected": "尚未選擇資料夾。是否要使用預設資料夾?", "@setupNoFolderSelected": { "description": "Prompt when no folder selected" }, - "setupUseDefault": "Use Default", + "setupUseDefault": "使用預設資料夾", "@setupUseDefault": { "description": "Button to use default folder" }, - "setupDownloadLocationTitle": "Download Location", + "setupDownloadLocationTitle": "下載位置", "@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": "在 iOS 上,下載的檔案會儲存至此應用程式的「文件」資料夾。您可以透過「檔案」App 進行存取。", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, - "setupAppDocumentsFolder": "App Documents Folder", + "setupAppDocumentsFolder": "應用程式文件資料夾", "@setupAppDocumentsFolder": { "description": "iOS documents folder option" }, - "setupAppDocumentsFolderSubtitle": "Recommended - accessible via Files app", + "setupAppDocumentsFolderSubtitle": "推薦使用 — 可透過「檔案」存取", "@setupAppDocumentsFolderSubtitle": { "description": "Subtitle for documents folder" }, - "setupChooseFromFiles": "Choose from Files", + "setupChooseFromFiles": "從「檔案」選擇", "@setupChooseFromFiles": { "description": "iOS file picker option" }, - "setupChooseFromFilesSubtitle": "Select iCloud or other location", + "setupChooseFromFilesSubtitle": "選擇 iCloud 或是其他位置", "@setupChooseFromFilesSubtitle": { "description": "Subtitle for file picker" }, From 63286d1e035e2333fe0c3e11413dbf9d5c19bd46 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:29 +0700 Subject: [PATCH 53/72] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index f6c894be..2e51352a 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Máxima calidad de portada", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Descargar la portada en la mayor resolución", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Descargar pistas de Spotify en FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Formato con pérdida a 320 kbps", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Mostrar todas las descargas", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Mostrar indicador de duplicados", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Aprende cómo descargar tu música favorita en excelente calidad. Este tutorial te mostrará lo básico.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Busca música o pega un enlace desde cualquier fuente que soporte tus extensiones instaladas", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Obtén audio de calidad FLAC mediante las extensiones de descarga instaladas", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Información automática, portadas y letras integradas", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Hay dos maneras fáciles de encontrar la música que quieres descargar.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Descargar música es simple y rápido. Así es como funciona.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Toda tu música descargada está organizada en la pestaña Biblioteca.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Ver progreso de descarga y cola en la pestaña de biblioteca", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Pulsa cualquier pista para abrirla con tu reproductor multimedia", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Cambiar modo de vista entre modo lista y cuadrícula para mejorar navegación", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extiende las capacidades de la aplicación con extensiones creadas por la comunidad.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Añadir nuevos proveedores de descargas o fuentes de búsqueda", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Obtén letras, información mejorada y más características", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personaliza la aplicación en Ajustes según tus preferencias.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Configura la calidad de audio predeterminada y las preferencias de formato", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "¡Todo preparado!, puedes descargar tu música favorita.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Editar información", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Avanzado", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From ccc029ba03b5e43169278982c581912fd281adb6 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:31 +0700 Subject: [PATCH 54/72] New translations app_en.arb (Ukrainian) [ci skip] --- lib/l10n/arb/app_uk.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index 70928152..6b4754d5 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Максимальна якість обкладинки", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Завантажити обкладинку з найвищою роздільною здатністю", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "Нормалізація звуку", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Завантажити треки Spotify у форматі FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Формат із втратами 320 кбіт/с", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Показати всі завантаження", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Показати індикатор дублікатів", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Давайте дізнаємося, як завантажувати улюблену музику в якості без втрат. Цей короткий посібник покаже вам основи.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Автоматичне додавання метаданих, обкладинки та текстів пісень", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Існує два простих способи знайти музику, яку ви хочете завантажити.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Завантаження музики просте та швидке. Ось як це працює.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Вся завантажена музика організована на вкладці «Бібліотека».", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Перегляд стану завантаження та черги на вкладці «Бібліотека»", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Торкніться будь-якої композиції, щоб відтворити її за допомогою музичного плеєра", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Перемикання між списком та сіткою для кращого перегляду", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Розширте можливості програми за допомогою розширень спільноти.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Додавайте нових постачальників послуг завантаження або джерела пошуку", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Отримайте тексти пісень, розширені метадані та інші функції", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Персоналізуйте програму в налаштуваннях відповідно до ваших уподобань.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Встановіть параметри якості звуку та формату за замовчуванням", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "Готово! Почніть завантажувати свою улюблену музику прямо зараз.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Редагувати метадані", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From d3c59f7b9956fbd3864b2f5c16cf52f7128b4a96 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:33 +0700 Subject: [PATCH 55/72] New translations app_en.arb (Italian) [ci skip] --- lib/l10n/arb/app_it-IT.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_it-IT.arb b/lib/l10n/arb/app_it-IT.arb index 6e2026fd..71581dcf 100644 --- a/lib/l10n/arb/app_it-IT.arb +++ b/lib/l10n/arb/app_it-IT.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Copertina massima qualità", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Scarica copertine con risoluzione più alta", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Scarica le tracce Spotify in FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 683635b920ce8f33e8bc65cee56605ae4926324a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:35 +0700 Subject: [PATCH 56/72] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index b213df0b..b41d5624 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Cover Kualitas Maksimal", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Unduh cover art resolusi tertinggi", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Unduh lagu Spotify dalam format FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Format Lossy 320kbps", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Tampilkan Semua Unduhan", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Mari kita pelajari cara mengunduh musik favorit Anda dalam kualitas lossless. Tutorial singkat ini akan menunjukkan dasar-dasarnya.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Penyematan metadata, sampul album, dan lirik secara otomatis", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Ada dua cara mudah untuk menemukan musik yang ingin Anda unduh.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Mengunduh musik itu mudah dan cepat. Begini cara kerjanya.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Semua musik yang Anda unduh tersusun rapi di tab Perpustakaan.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From c890b57c0714c3af7ad3629f8de7def654df5274 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:36 +0700 Subject: [PATCH 57/72] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh-TW.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_zh-TW.arb b/lib/l10n/arb/app_zh-TW.arb index 4cb21131..748121f3 100644 --- a/lib/l10n/arb/app_zh-TW.arb +++ b/lib/l10n/arb/app_zh-TW.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "最高品質封面", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "下載最高畫質的封面", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "音量平衡", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From acfd4db6e6668f1813ba2d21e139550c9f49def4 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:38 +0700 Subject: [PATCH 58/72] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 29c76406..d29abb22 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Pochette de qualité supérieure", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Télécharger la pochette en haute résolution", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Télécharger des morceaux Spotify au format FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Format avec perte à 320 kbps", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Afficher tous les téléchargements", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Afficher l'indicateur de doublons", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Apprenons comment télécharger votre musique préférée en qualité sans perte. Ce petit tutoriel vous présentera les bases.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Recherchez de la musique ou collez un lien provenant de n'importe quelle source prise en charge par vos extensions installées", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Obtenez un son de qualité FLAC grâce aux extensions de téléchargement installées", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Intégration automatique des métadonnées, des pochettes d'album et des paroles", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Il existe deux façons simples de trouver la musique que vous souhaitez télécharger.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Télécharger de la musique, c'est simple et rapide. Voici comment ça marche.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Toute votre musique téléchargée est classée dans l'onglet « Bibliothèque ».", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Afficher la progression du téléchargement et la file d'attente dans l'onglet « Bibliothèque »", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Appuyez sur n'importe quel morceau pour l'écouter avec votre lecteur de musique", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Passez de l'affichage sous forme de liste à celui sous forme de grille pour faciliter la navigation", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Élargissez les fonctionnalités de l'application grâce aux extensions de la communauté.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Ajouter de nouveaux fournisseurs de téléchargement ou de nouvelles sources de recherche", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Accédez aux paroles, à des métadonnées enrichies et à bien d'autres fonctionnalités", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personnalisez l'application dans les Paramètres en fonction de vos préférences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Définir les préférences par défaut en matière de qualité et de format audio", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "C'est parti ! Commencez dès maintenant à télécharger votre musique préférée.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Modifier les métadonnées", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Avancé", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Détails", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 159aca96c702b5342d6117a18ef9e4d6e3235eeb Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:40 +0700 Subject: [PATCH 59/72] New translations app_en.arb (Arabic) [ci skip] --- lib/l10n/arb/app_ar-SA.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_ar-SA.arb b/lib/l10n/arb/app_ar-SA.arb index 8c4bf31a..e15071f5 100644 --- a/lib/l10n/arb/app_ar-SA.arb +++ b/lib/l10n/arb/app_ar-SA.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "اختيار أعلى جودة للغلاف", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "تنزيل أعلى دقة لغلاف الأغنية", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplyGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "تحميل اغاني Spotify بصيغة FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "تنسيق 320kbps مضغوط", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From cced476b80a9dc8b1205570d3301fbee10ae379a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:42 +0700 Subject: [PATCH 60/72] New translations app_en.arb (German) [ci skip] --- lib/l10n/arb/app_de.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 16c930f1..170c76f2 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Maximale Cover-Qualität", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Cover in höchster Auflösung herunterladen", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Spotify Titel in FLAC herunterladen", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Verlustbehaftetes 320kbps-Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Alle Downloads anzeigen", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Duplikat Indikator anzeigen", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Lass uns lernen, wie du deine Lieblingsmusik in verlustfreier Qualität herunterlädst. Dieses schnelle Tutorial zeigt dir die Grundlagen.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatische Metadaten, Cover und Lyrics einbetten", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Es gibt zwei einfache Möglichkeiten, Musik zu finden, die du herunterladen möchtest.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Das Herunterladen von Musik ist einfach und schnell. So funktioniert es.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Die gesamte heruntergeladene Musik ist in der Bibliothek organisiert.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Fortschritt und Warteschlange im Bibliothek‑Tab anzeigen", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tippe auf einen Titel, um ihn mit deinem Musikplayer abzuspielen", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Wechsle zwischen Listen- und Gitteransicht für ein besseres Surfen", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Erweitere die Fähigkeiten der App mit Community-Erweiterungen.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Neue Download- oder Suchanbieter hinzufügen", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Lyrics, erweiterte Metadaten und mehr Funktionen erhalten", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalisiere die App in den Einstellungen nach deiner Präferenz.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Standard Audioqualität und Formateinstellungen festlegen", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "Das ist alles! Lade jetzt deine Lieblingsmusik herunter.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Metadaten bearbeiten", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Erweitert", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 876b2bd0bfd241dc2578cfcfb1653aa1f5f95221 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:43 +0700 Subject: [PATCH 61/72] New translations app_en.arb (Japanese) [ci skip] --- lib/l10n/arb/app_ja.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index 66bd7586..326fe2d7 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "最大品質のカバー", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "最高解像度のカバーアートをダウンロード", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Spotify のトラックを FLAC でダウンロード", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "すべてのダウンロードを表示", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "メタデータを編集", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 9ec89286b1cb5e1078a9da92a7fcc078122d01a5 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:45 +0700 Subject: [PATCH 62/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 1aa32ac2..0603d4b1 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "고품질 앨범 커버", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "최고 해상도의 앨범 커버를 다운로드", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "리플레이게인", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Spotify 음악을 FLAC 형식으로 다운로드하세요", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "손실 압축 320kbps 형식", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "모든 다운로드 표시", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "중복 표시기 표시", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "좋아하는 음악을 무손실 음질로 다운로드하는 방법을 알아보겠습니다. 이 간단한 튜토리얼은 기본 사항을 보여줍니다", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "음악을 검색하거나, 설치된 확장 기능이 지원하는 출처의 링크를 붙여넣으세요", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "설치된 다운로드 확장 기능으로 FLAC 고음질 오디오를 다운로드할 수 있습니다", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "메타데이터, 앨범 커버 및 가사를 자동으로 추가할 수 있습니다", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "다운로드하고 싶은 음악을 찾는 두 가지 쉬운 방법이 있습니다", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다. 작동 방식은 다음과 같습니다", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "다운로드된 모든 음악은 라이브러리 탭에 정리되어 있습니다", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인할 수 있습니다", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "아무 트랙을 탭하여 음악 플레이어로 재생할 수 있습니다", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "리스트 보기 또는 그리드 보기로 전환하여 더 나은 탐색을 할 수 있습니다", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "커뮤니티 확장 기능을 사용하여 앱의 기능을 확장하세요", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "새 다운로드 제공자 또는 검색 출처를 추가할 수 있습니다", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "가사, 향상된 메타데이터 및 더 많은 기능을 사용할 수 있습니다", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "설정에서 앱을 원하는 대로 맞춤 설정하세요", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "기본 오디오 음질 및 형식 설정", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "모든 준비가 완료되었습니다! 지금 바로 좋아하는 음악을 다운로드하세요", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "메타데이터 편집", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "고급", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "트랙 세부 정보", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 2a67cd4ca202933a003537b82624b4be0646cdc0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:48 +0700 Subject: [PATCH 63/72] New translations app_en.arb (Dutch) [ci skip] --- lib/l10n/arb/app_nl-NL.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_nl-NL.arb b/lib/l10n/arb/app_nl-NL.arb index eede3112..4cd86a1b 100644 --- a/lib/l10n/arb/app_nl-NL.arb +++ b/lib/l10n/arb/app_nl-NL.arb @@ -182,14 +182,6 @@ "@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" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From c925e723193e30f5fa0e23662017ac9aa6ee030f Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:50 +0700 Subject: [PATCH 64/72] New translations app_en.arb (Portuguese) [ci skip] --- lib/l10n/arb/app_pt_PT.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index 61b54058..046515fd 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Capa de Qualidade Máxima", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Baixar capa do álbum com a mais alta resolução", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Baixar faixas do Spotify em FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From fad2856ef3e2639a1e11050cb3df47d86cd02cbf Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:52 +0700 Subject: [PATCH 65/72] New translations app_en.arb (Russian) [ci skip] --- lib/l10n/arb/app_ru.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index 2244a54e..c40d89f7 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "Максимальное качество обложки", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Скачивать обложку в макс. разрешении", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Скачать Spotify треки во FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Формат с потерями 320 кбит/с", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Показать все загрузки", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Показать индикатор дубликатов", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Давайте научимся скачивать свою любимую музыку в качестве без потерь. В этом кратком руководстве мы покажем вам основы.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Автоматическое встраивание метаданных, обложек и текстов песен", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Есть два простых способа найти музыку, которую вы хотите скачать.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Скачивание музыки просто и быстро. Вот как это работает.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Вся скачанная музыка организована во вкладке Библиотека.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Просмотр прогресса загрузки и очереди на вкладке Библиотека", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Нажмите на любой трек, чтобы воспроизвести его с помощью вашего музыкального плеера", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Переключение между списком и сеткой для лучшего просмотра", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Расширьте возможности приложения с расширениями от сообщества.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Добавить новых поставщиков загрузок или поиска", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Получайте тексты песен, улучшенные метаданные и другие возможности", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Персонализируйте приложение в Настройках, чтобы оно соответствовало вашим предпочтениям.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Настройте качество и формата аудиофайла по умолчанию", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "Всё готово! Начните загружать любимую музыку прямо сейчас.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Редактировать метаданные", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From ecbf730ad641d04f5d8de57c8da5ebdf769bf287 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:53 +0700 Subject: [PATCH 66/72] New translations app_en.arb (Turkish) [ci skip] --- lib/l10n/arb/app_tr.arb | 225 +++++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index 978ca665..2054d473 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "En Yüksek Kapak Kalitesi", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "En yüksek kalitedeki albüm kapaklarını indir", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Spotify şarkılarını FLAC olarak indirin", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Kayıplı 320kbps Formatı", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Tüm İndirmeleri Göster", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Kopya Belirtecini Göster", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "En sevdiğiniz müzikleri kayıpsız kalitede nasıl indirebileceğinizi öğrenelim. Bu kısa eğitim size temel bilgileri gösterecek.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Otomatik meta veri, kapak resmi ve şarkı sözü gömme", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "İndirmek istediğiniz müziği bulmanın iki kolay yolu vardır.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Müzik indirmek basit ve hızlıdır. İşte nasıl çalıştığı.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "İndirdiğiniz tüm müzikler Kitaplık sekmesinde düzenlenir.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Kitaplık sekmesinden indirme ilerlemesini ve kuyruğu görüntüleyin", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Müzik çalarınızla oynatmak için herhangi bir parçaya dokunun", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Daha iyi göz atmak için liste ve ızgara görünümü arasında geçiş yapın", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Topluluk uzantılarıyla uygulamanın yeteneklerini artırın.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Yeni indirme sağlayıcıları veya arama kaynakları ekleyin", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Şarkı sözleri, gelişmiş meta veriler ve daha fazla özellik edinin", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Uygulamayı Ayarlar'dan tercihlerinize göre kişiselleştirin.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Varsayılan ses kalitesi ve format tercihlerini ayarlayın", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "Her şey hazır! En sevdiğiniz müzikleri hemen indirmeye başlayın.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Gelişmiş", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 06390ce0b458e039e393812ff97de5b0d97c2dbf Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:55 +0700 Subject: [PATCH 67/72] New translations app_en.arb (Chinese Simplified) [ci skip] --- lib/l10n/arb/app_zh-CN.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_zh-CN.arb b/lib/l10n/arb/app_zh-CN.arb index 19087865..04db7fad 100644 --- a/lib/l10n/arb/app_zh-CN.arb +++ b/lib/l10n/arb/app_zh-CN.arb @@ -182,14 +182,6 @@ "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, - "optionsMaxQualityCover": "最高质量封面", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "下载最高分辨率封面", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, "optionsReplayGain": "回放增益", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "以 FLAC 下载 Spotify 曲目", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From 372886273a7c44675fcbeb86da84994f48ec3f9e Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 01:35:57 +0700 Subject: [PATCH 68/72] New translations app_en.arb (Hindi) [ci skip] --- lib/l10n/arb/app_hi-IN.arb | 225 ++++++++++++++++++++++++++++++++----- 1 file changed, 200 insertions(+), 25 deletions(-) diff --git a/lib/l10n/arb/app_hi-IN.arb b/lib/l10n/arb/app_hi-IN.arb index d7ffdc9b..f694576d 100644 --- a/lib/l10n/arb/app_hi-IN.arb +++ b/lib/l10n/arb/app_hi-IN.arb @@ -182,14 +182,6 @@ "@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" - }, "optionsReplayGain": "ReplayGain", "@optionsReplayGain": { "description": "Title for ReplayGain setting toggle" @@ -606,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download Spotify tracks in FLAC", + "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1991,6 +1983,42 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, + "downloadAutoConvert": "Auto-convert after download", + "@downloadAutoConvert": { + "description": "Toggle for automatic post-download audio conversion" + }, + "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "@downloadAutoConvertSubtitle": { + "description": "Explanation of safe automatic post-download conversion" + }, + "downloadAutoConvertFormat": "Output format", + "@downloadAutoConvertFormat": { + "description": "Automatic conversion output format setting" + }, + "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "@downloadAutoConvertFormatSubtitle": { + "description": "Automatic conversion format picker explanation" + }, + "downloadAutoConvertBitrate": "Output quality", + "@downloadAutoConvertBitrate": { + "description": "Automatic conversion bitrate setting" + }, + "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "@downloadAutoConvertBitrateSubtitle": { + "description": "Automatic conversion bitrate picker explanation" + }, + "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "@downloadAutoConvertMp3Subtitle": { + "description": "MP3 automatic conversion option description" + }, + "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "@downloadAutoConvertM4aSubtitle": { + "description": "M4A AAC automatic conversion option description" + }, + "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "@downloadAutoConvertOpusSubtitle": { + "description": "Opus automatic conversion option description" + }, "downloadLossy320Format": "Lossy 320kbps Format", "@downloadLossy320Format": { "description": "Title of the lossy format picker bottom sheet" @@ -2269,6 +2297,10 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, + "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "@recentClearAllMessage": { + "description": "Confirmation message before clearing all recent activity" + }, "recentShowAllDownloads": "Show All Downloads", "@recentShowAllDownloads": { "description": "Button label to unhide hidden downloads in recent access" @@ -2469,6 +2501,53 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, + "libraryAddFolder": "Add library folder", + "@libraryAddFolder": { + "description": "Action to add another local library source" + }, + "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "@libraryAddFolderSubtitle": { + "description": "Supported storage locations for local library sources" + }, + "librarySourceOnline": "Online", + "@librarySourceOnline": { + "description": "Library source is connected and accessible" + }, + "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "@librarySourceOffline": { + "description": "Library source is temporarily disconnected" + }, + "librarySourceDisabled": "Disabled", + "@librarySourceDisabled": { + "description": "Library source has been disabled by the user" + }, + "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "@librarySourceScanCount": { + "description": "Live progress for one library folder scan", + "placeholders": { + "scanned": { + "type": "int" + }, + "total": { + "type": "int" + }, + "progress": { + "type": "String" + } + } + }, + "libraryExternalStorage": "External storage", + "@libraryExternalStorage": { + "description": "Label for a removable or external library source" + }, + "libraryRemoveFolder": "Remove library folder", + "@libraryRemoveFolder": { + "description": "Action to remove one indexed library source" + }, + "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "@libraryRemoveFolderMessage": { + "description": "Confirmation shown before removing a library source" + }, "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" @@ -2763,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", + "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search music or paste a link from any source your installed extensions support", + "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Get FLAC quality audio from installed download extensions", + "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", + "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2783,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", + "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2791,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", + "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2799,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", + "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", + "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", + "tutorialLibraryTip2": "Tap a track to play it with the built-in player", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", + "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2819,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", + "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2827,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Add new download providers or search sources", + "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", + "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2839,7 +2918,7 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", + "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, @@ -2847,7 +2926,7 @@ "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", + "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, @@ -2855,7 +2934,7 @@ "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", + "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3125,6 +3204,66 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, + "trackReEnrichModeIsrc": "ISRC only", + "@trackReEnrichModeIsrc": { + "description": "Batch metadata mode that only writes ISRC" + }, + "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "@trackReEnrichModeIsrcSubtitle": { + "description": "Explanation for the ISRC-only batch metadata mode" + }, + "trackReEnrichModeMissing": "Fill missing tags", + "@trackReEnrichModeMissing": { + "description": "Batch metadata mode that fills only empty tags" + }, + "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "@trackReEnrichModeMissingSubtitle": { + "description": "Explanation for the fill-missing batch metadata mode" + }, + "trackReEnrichModeReplace": "Update selected tags", + "@trackReEnrichModeReplace": { + "description": "Batch metadata mode that replaces selected tag groups" + }, + "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "@trackReEnrichModeReplaceSubtitle": { + "description": "Explanation for the selected-tag batch metadata mode" + }, + "trackReEnrichFieldsTitle": "Tags to update", + "@trackReEnrichFieldsTitle": { + "description": "Heading above batch re-enrich field checkboxes" + }, + "trackReEnrichReview": "Review changes", + "@trackReEnrichReview": { + "description": "Button that searches metadata and opens the batch change review" + }, + "trackReEnrichReviewTitle": "Review metadata changes", + "@trackReEnrichReviewTitle": { + "description": "Title of the batch metadata review sheet" + }, + "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "@trackReEnrichReviewSubtitle": { + "description": "Summary shown above proposed batch metadata changes", + "placeholders": { + "changeCount": { + "type": "int" + }, + "trackCount": { + "type": "int" + } + } + }, + "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "@trackReEnrichNoChanges": { + "description": "Message when batch metadata preview has no proposed changes" + }, + "trackReEnrichApplyChanges": "Apply changes", + "@trackReEnrichApplyChanges": { + "description": "Confirmation button in the batch metadata review sheet" + }, + "trackReEnrichRefreshOnline": "Refresh from online", + "@trackReEnrichRefreshOnline": { + "description": "Proposed value when lyrics will be refreshed during re-enrich" + }, "trackEditMetadata": "Edit Metadata", "@trackEditMetadata": { "description": "Menu action - edit embedded metadata" @@ -5372,6 +5511,34 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, + "trackAlbumType": "Release Type", + "@trackAlbumType": { + "description": "Label for an album or release type metadata value" + }, + "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "@editMetadataFieldAlbumTypeHint": { + "description": "Hint for the release type metadata field" + }, + "editMetadataFieldExplicit": "Explicit", + "@editMetadataFieldExplicit": { + "description": "Label for the explicit content metadata field" + }, + "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "@editMetadataFieldExplicitHint": { + "description": "Description for the explicit content metadata switch" + }, + "metadataExplicitValue": "Explicit", + "@metadataExplicitValue": { + "description": "Displayed value when a track is marked explicit" + }, + "editMetadataFieldUpc": "UPC / Barcode", + "@editMetadataFieldUpc": { + "description": "Label for the release barcode metadata field" + }, + "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "@editMetadataFieldUpcHint": { + "description": "Hint for the release barcode metadata field" + }, "editMetadataAdvanced": "Advanced", "@editMetadataAdvanced": { "description": "Expandable section label for advanced metadata fields" @@ -5861,6 +6028,14 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, + "nowPlayingPreviousTrack": "Previous track", + "@nowPlayingPreviousTrack": { + "description": "Tooltip for the previous-track playback control" + }, + "nowPlayingNextTrack": "Next track", + "@nowPlayingNextTrack": { + "description": "Tooltip for the next-track playback control" + }, "nowPlayingDetails": "Details", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" From d1dc2f0fd8b6b4c68caa4106a2dd0964e808c5a7 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 08:15:06 +0700 Subject: [PATCH 69/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 0603d4b1..74f40554 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -598,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "Download music in lossless and Hi-Res quality", + "setupDownloadInFlac": "무손실 및 Hi-Res 음질으로 음악 다운로드", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1983,15 +1983,15 @@ "@downloadLossyFormat": { "description": "Setting title to pick output format for lossy downloads" }, - "downloadAutoConvert": "Auto-convert after download", + "downloadAutoConvert": "다운로드 후 자동 변환", "@downloadAutoConvert": { "description": "Toggle for automatic post-download audio conversion" }, - "downloadAutoConvertSubtitle": "Convert completed downloads to a smaller lossy format. The original is replaced only after conversion succeeds.", + "downloadAutoConvertSubtitle": "다운로드가 완료되면 더 작은 손실 압축 형식으로 변환합니다. 원본은 변환이 성공한 후에만 교체됩니다", "@downloadAutoConvertSubtitle": { "description": "Explanation of safe automatic post-download conversion" }, - "downloadAutoConvertFormat": "Output format", + "downloadAutoConvertFormat": "출력 형식", "@downloadAutoConvertFormat": { "description": "Automatic conversion output format setting" }, @@ -1999,7 +1999,7 @@ "@downloadAutoConvertFormatSubtitle": { "description": "Automatic conversion format picker explanation" }, - "downloadAutoConvertBitrate": "Output quality", + "downloadAutoConvertBitrate": "출력 음질", "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, From 856f70a00bce3e8d3c3fe5d3f4abce67175702dd Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 09:23:36 +0700 Subject: [PATCH 70/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 110 ++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 74f40554..46de6210 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1995,7 +1995,7 @@ "@downloadAutoConvertFormat": { "description": "Automatic conversion output format setting" }, - "downloadAutoConvertFormatSubtitle": "Choose the lossy format used for newly completed downloads.", + "downloadAutoConvertFormatSubtitle": "새로 완료된 다운로드에 사용되는 손실 압축 형식을 선택하세요", "@downloadAutoConvertFormatSubtitle": { "description": "Automatic conversion format picker explanation" }, @@ -2003,19 +2003,19 @@ "@downloadAutoConvertBitrate": { "description": "Automatic conversion bitrate setting" }, - "downloadAutoConvertBitrateSubtitle": "Higher bitrates preserve more detail but create larger files.", + "downloadAutoConvertBitrateSubtitle": "비트 전송률이 높을수록 더 많은 디테일을 보존하지만 파일 크기가 커집니다", "@downloadAutoConvertBitrateSubtitle": { "description": "Automatic conversion bitrate picker explanation" }, - "downloadAutoConvertMp3Subtitle": "Best compatibility across players and devices", + "downloadAutoConvertMp3Subtitle": "플레이어 및 기기 전반에 걸쳐 최상의 호환성", "@downloadAutoConvertMp3Subtitle": { "description": "MP3 automatic conversion option description" }, - "downloadAutoConvertM4aSubtitle": "Efficient AAC audio in an M4A container", + "downloadAutoConvertM4aSubtitle": "M4A 컨테이너의 효율적인 AAC 오디오", "@downloadAutoConvertM4aSubtitle": { "description": "M4A AAC automatic conversion option description" }, - "downloadAutoConvertOpusSubtitle": "Best efficiency for modern players", + "downloadAutoConvertOpusSubtitle": "최신 플레이어에 최적화된 효율성", "@downloadAutoConvertOpusSubtitle": { "description": "Opus automatic conversion option description" }, @@ -2297,7 +2297,7 @@ "@recentEmpty": { "description": "Empty state text for recent access list" }, - "recentClearAllMessage": "Clear all recent activity? Download history and music files will not be deleted.", + "recentClearAllMessage": "최근 활동을 모두 지우시겠습니까? 다운로드 기록 및 음악 파일은 삭제되지 않습니다", "@recentClearAllMessage": { "description": "Confirmation message before clearing all recent activity" }, @@ -2501,27 +2501,27 @@ "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryAddFolder": "Add library folder", + "libraryAddFolder": "라이브러리 폴더 추가", "@libraryAddFolder": { "description": "Action to add another local library source" }, - "libraryAddFolderSubtitle": "Internal storage, SD card, SSD, or another external drive", + "libraryAddFolderSubtitle": "내부 저장소, SD 카드, SSD 또는 다른 외부 드라이브", "@libraryAddFolderSubtitle": { "description": "Supported storage locations for local library sources" }, - "librarySourceOnline": "Online", + "librarySourceOnline": "온라인", "@librarySourceOnline": { "description": "Library source is connected and accessible" }, - "librarySourceOffline": "Offline. Reconnect the storage to restore these tracks", + "librarySourceOffline": "오프라인. 이 트랙을 복원하려면 저장소를 다시 연결하세요", "@librarySourceOffline": { "description": "Library source is temporarily disconnected" }, - "librarySourceDisabled": "Disabled", + "librarySourceDisabled": "비활성화됨", "@librarySourceDisabled": { "description": "Library source has been disabled by the user" }, - "librarySourceScanCount": "{scanned} of {total} files scanned ({progress}%)", + "librarySourceScanCount": "{total} 개의 파일 중 {scanned} 개 스캔 완료 ({progress}%)", "@librarySourceScanCount": { "description": "Live progress for one library folder scan", "placeholders": { @@ -2536,15 +2536,15 @@ } } }, - "libraryExternalStorage": "External storage", + "libraryExternalStorage": "외부 저장소", "@libraryExternalStorage": { "description": "Label for a removable or external library source" }, - "libraryRemoveFolder": "Remove library folder", + "libraryRemoveFolder": "라이브러리 폴더 제거", "@libraryRemoveFolder": { "description": "Action to remove one indexed library source" }, - "libraryRemoveFolderMessage": "Remove this folder and its indexed tracks from SpotiFLAC Mobile? Audio files on the storage will not be deleted.", + "libraryRemoveFolderMessage": "SpotiFLAC Mobile에서 이 폴더와 색인된 트랙을 제거하시겠습니까? 저장소의 오디오 파일은 삭제되지 않습니다", "@libraryRemoveFolderMessage": { "description": "Confirmation shown before removing a library source" }, @@ -2842,19 +2842,19 @@ "@tutorialWelcomeTitle": { "description": "Tutorial welcome page title" }, - "tutorialWelcomeDesc": "Learn how to find music with extensions, choose the quality you want, and manage downloads in SpotiFLAC Mobile.", + "tutorialWelcomeDesc": "SpotiFLAC Mobile에서 확장 기능을 사용하여 음악을 찾고, 원하는 음질을 선택하고, 다운로드를 관리하는 방법을 알아보세요", "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Search with an installed extension or paste a supported music link", + "tutorialWelcomeTip1": "설치된 확장 기능 또는 지원되는 음악 링크로 검색할 수 있습니다", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "Choose from the audio qualities offered by your download provider", + "tutorialWelcomeTip2": "다운로드 제공자에서 제공하는 오디오 음질 중에서 선택할 수 있습니다", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "Embed metadata, cover art, lyrics, and release information automatically", + "tutorialWelcomeTip3": "메타데이터, 앨범 커버, 가사 및 발매 정보를 자동으로 삽입할 수 있습니다", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2862,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "Search with your selected extension or paste a supported music link.", + "tutorialSearchDesc": "선택한 확장 프로그램으로 검색하거나 지원되는 음악 링크를 붙여넣어 검색하세요", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, @@ -2870,7 +2870,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "Pick an available quality, start the download, and follow its progress in the queue.", + "tutorialDownloadDesc": "사용 가능한 음질을 선택하고 다운로드를 시작한 다음 다운로드 목록에서 진행 상황을 확인하세요", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2878,19 +2878,19 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "Downloaded and locally scanned music is organized in your Library.", + "tutorialLibraryDesc": "다운로드하고 로컬에서 스캔한 음악은 라이브러리에 정리됩니다", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "Manage active, pending, and completed downloads from the Library queue", + "tutorialLibraryTip1": "라이브러리 다운로드 목록에서 진행 중이거나 대기 중인 다운로드와 완료된 다운로드를 관리할 수 있습니다", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "Tap a track to play it with the built-in player", + "tutorialLibraryTip2": "트랙을 탭하여 내부 플레이어로 재생할 수 있습니다", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "Browse tracks, albums, and playlists in list or grid views", + "tutorialLibraryTip3": "트랙, 앨범, 재생목록을 리스트 뷰 또는 그리드 뷰로 탐색할 수 있습니다", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2898,7 +2898,7 @@ "@tutorialExtensionsTitle": { "description": "Tutorial extensions page title" }, - "tutorialExtensionsDesc": "Extensions add search, download, metadata, lyrics, and other integrations.", + "tutorialExtensionsDesc": "확장 기능을 추가하면 검색, 다운로드, 메타데이터, 가사 및 기타 연동 기능을 사용할 수 있습니다", "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, @@ -2906,11 +2906,11 @@ "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "Choose providers for search, downloads, metadata, and fallbacks", + "tutorialExtensionsTip2": "검색, 다운로드, 메타데이터 및 대체 서비스에 사용할 제공자를 선택할 수 있습니다", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "Connect accounts when required and keep extensions up to date", + "tutorialExtensionsTip3": "필요한 경우 계정을 연결하고 확장 기능을 최신 상태로 유지할 수 있습니다", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -2918,23 +2918,23 @@ "@tutorialSettingsTitle": { "description": "Tutorial settings page title" }, - "tutorialSettingsDesc": "Fine-tune downloads, playback, Library behavior, appearance, and storage.", + "tutorialSettingsDesc": "다운로드, 재생, 라이브러리 동작, 디자인, 저장소 등을 세부적으로 설정할 수 있습니다", "@tutorialSettingsDesc": { "description": "Tutorial settings page description" }, - "tutorialSettingsTip1": "다운로드 위치 및 폴더 구성 변경", + "tutorialSettingsTip1": "다운로드 위치 및 폴더 구성을 변경할 수 있습니다", "@tutorialSettingsTip1": { "description": "Tutorial settings tip 1" }, - "tutorialSettingsTip2": "Set quality, concurrency, filenames, and conversion preferences", + "tutorialSettingsTip2": "음질, 동시 다운로드 수, 파일 이름 및 변환 설정을 지정할 수 있습니다", "@tutorialSettingsTip2": { "description": "Tutorial settings tip 2" }, - "tutorialSettingsTip3": "앱 테마 및 디자인 사용자 정의", + "tutorialSettingsTip3": "앱 테마 및 디자인을 꾸며볼 수 있습니다", "@tutorialSettingsTip3": { "description": "Tutorial settings tip 3" }, - "tutorialReadyMessage": "You're ready. Select your extensions, then search or paste a supported link.", + "tutorialReadyMessage": "준비되었습니다. 확장 기능을 선택한 다음 지원되는 링크를 검색하거나 붙여넣으세요", "@tutorialReadyMessage": { "description": "Tutorial completion message" }, @@ -3204,43 +3204,43 @@ "@trackReEnrichSelectAll": { "description": "Select all fields checkbox in re-enrich" }, - "trackReEnrichModeIsrc": "ISRC only", + "trackReEnrichModeIsrc": "ISRC만", "@trackReEnrichModeIsrc": { "description": "Batch metadata mode that only writes ISRC" }, - "trackReEnrichModeIsrcSubtitle": "Find and add the recording identifier without changing other tags", + "trackReEnrichModeIsrcSubtitle": "다른 태그를 변경하지 않고 녹화 식별자를 찾아 추가합니다", "@trackReEnrichModeIsrcSubtitle": { "description": "Explanation for the ISRC-only batch metadata mode" }, - "trackReEnrichModeMissing": "Fill missing tags", + "trackReEnrichModeMissing": "누락된 태그 채우기", "@trackReEnrichModeMissing": { "description": "Batch metadata mode that fills only empty tags" }, - "trackReEnrichModeMissingSubtitle": "Keep existing values and fill only fields that are empty", + "trackReEnrichModeMissingSubtitle": "기존 값을 유지하고 비어 있는 필드만 채웁니다", "@trackReEnrichModeMissingSubtitle": { "description": "Explanation for the fill-missing batch metadata mode" }, - "trackReEnrichModeReplace": "Update selected tags", + "trackReEnrichModeReplace": "선택된 태그 업데이트", "@trackReEnrichModeReplace": { "description": "Batch metadata mode that replaces selected tag groups" }, - "trackReEnrichModeReplaceSubtitle": "Choose which existing values may be replaced by online metadata", + "trackReEnrichModeReplaceSubtitle": "온라인 메타데이터로 대체할 기존 값을 선택하세요", "@trackReEnrichModeReplaceSubtitle": { "description": "Explanation for the selected-tag batch metadata mode" }, - "trackReEnrichFieldsTitle": "Tags to update", + "trackReEnrichFieldsTitle": "업데이트할 태그", "@trackReEnrichFieldsTitle": { "description": "Heading above batch re-enrich field checkboxes" }, - "trackReEnrichReview": "Review changes", + "trackReEnrichReview": "변경 사항 검토", "@trackReEnrichReview": { "description": "Button that searches metadata and opens the batch change review" }, - "trackReEnrichReviewTitle": "Review metadata changes", + "trackReEnrichReviewTitle": "메타데이터 변경 사항 검토", "@trackReEnrichReviewTitle": { "description": "Title of the batch metadata review sheet" }, - "trackReEnrichReviewSubtitle": "{changeCount} proposed changes across {trackCount} tracks", + "trackReEnrichReviewSubtitle": "{trackCount} 개의 트랙에 걸쳐 제안된 {changeCount} 개의 변경 사항", "@trackReEnrichReviewSubtitle": { "description": "Summary shown above proposed batch metadata changes", "placeholders": { @@ -3252,15 +3252,15 @@ } } }, - "trackReEnrichNoChanges": "No metadata changes were found for the selected tracks.", + "trackReEnrichNoChanges": "선택한 트랙에 대한 메타데이터 변경 사항이 없습니다", "@trackReEnrichNoChanges": { "description": "Message when batch metadata preview has no proposed changes" }, - "trackReEnrichApplyChanges": "Apply changes", + "trackReEnrichApplyChanges": "변경 사항 적용", "@trackReEnrichApplyChanges": { "description": "Confirmation button in the batch metadata review sheet" }, - "trackReEnrichRefreshOnline": "Refresh from online", + "trackReEnrichRefreshOnline": "온라인에서 새로고침", "@trackReEnrichRefreshOnline": { "description": "Proposed value when lyrics will be refreshed during re-enrich" }, @@ -5511,31 +5511,31 @@ "@editMetadataFieldComment": { "description": "Label for comment field in the edit metadata sheet" }, - "trackAlbumType": "Release Type", + "trackAlbumType": "발매 유형", "@trackAlbumType": { "description": "Label for an album or release type metadata value" }, - "editMetadataFieldAlbumTypeHint": "Album, single, EP, compilation...", + "editMetadataFieldAlbumTypeHint": "앨범, 싱글, EP, 컴필레이션...", "@editMetadataFieldAlbumTypeHint": { "description": "Hint for the release type metadata field" }, - "editMetadataFieldExplicit": "Explicit", + "editMetadataFieldExplicit": "성인용", "@editMetadataFieldExplicit": { "description": "Label for the explicit content metadata field" }, - "editMetadataFieldExplicitHint": "Mark this track as containing explicit content", + "editMetadataFieldExplicitHint": "이 트랙에 성인용 콘텐츠가 포함되어 있음을 표시합니다", "@editMetadataFieldExplicitHint": { "description": "Description for the explicit content metadata switch" }, - "metadataExplicitValue": "Explicit", + "metadataExplicitValue": "성인용", "@metadataExplicitValue": { "description": "Displayed value when a track is marked explicit" }, - "editMetadataFieldUpc": "UPC / Barcode", + "editMetadataFieldUpc": "UPC / 바코드", "@editMetadataFieldUpc": { "description": "Label for the release barcode metadata field" }, - "editMetadataFieldUpcHint": "Numeric UPC, EAN, or GTIN", + "editMetadataFieldUpcHint": "숫자 UPC, EAN, 또는 GTIN", "@editMetadataFieldUpcHint": { "description": "Hint for the release barcode metadata field" }, @@ -6028,11 +6028,11 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, - "nowPlayingPreviousTrack": "Previous track", + "nowPlayingPreviousTrack": "이전 트랙", "@nowPlayingPreviousTrack": { "description": "Tooltip for the previous-track playback control" }, - "nowPlayingNextTrack": "Next track", + "nowPlayingNextTrack": "다음 트랙", "@nowPlayingNextTrack": { "description": "Tooltip for the next-track playback control" }, From 8b749e6dd189c59b5f65bb7afd379fd3b093400b Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 10:34:39 +0700 Subject: [PATCH 71/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 46de6210..1791e43f 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -598,7 +598,7 @@ "@setupIcloudNotSupported": { "description": "Error when user selects iCloud Drive on iOS" }, - "setupDownloadInFlac": "무손실 및 Hi-Res 음질으로 음악 다운로드", + "setupDownloadInFlac": "무손실 및 Hi-Res 음질으로 음악을 다운로드하세요", "@setupDownloadInFlac": { "description": "App tagline in setup" }, @@ -1923,7 +1923,7 @@ "@extensionsMetadataPriority": { "description": "Setting - metadata provider order" }, - "extensionsMetadataPrioritySubtitle": "검색 & 메타데이터 출처 순서 설정", + "extensionsMetadataPrioritySubtitle": "검색 & 메타데이터 출처 순서를 설정하세요", "@extensionsMetadataPrioritySubtitle": { "description": "Subtitle for metadata priority" }, @@ -2846,7 +2846,7 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "설치된 확장 기능 또는 지원되는 음악 링크로 검색할 수 있습니다", + "tutorialWelcomeTip1": "설치된 확장 기능으로 검색하거나 지원되는 음악 링크를 붙여넣어 검색할 수 있습니다", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, @@ -2862,7 +2862,7 @@ "@tutorialSearchTitle": { "description": "Tutorial search page title" }, - "tutorialSearchDesc": "선택한 확장 프로그램으로 검색하거나 지원되는 음악 링크를 붙여넣어 검색하세요", + "tutorialSearchDesc": "선택한 확장 기능으로 검색하거나 지원되는 음악 링크를 붙여넣어 검색하세요", "@tutorialSearchDesc": { "description": "Tutorial search page description" }, From c70e18e5fd417240ca722939c6901e922796169f Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:40:47 +0700 Subject: [PATCH 72/72] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 1791e43f..8e126b65 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -6443,7 +6443,7 @@ "@settingsGroupSystem": { "description": "Settings group covering app-level data, cache and logs" }, - "settingsGroupHelp": "정보 & 지원", + "settingsGroupHelp": "정보 & 후원", "@settingsGroupHelp": { "description": "Settings group covering the about page and donations" }