From d1ede223cf98abca12993b26b08adf06e23ce666 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:04:22 +0700 Subject: [PATCH 01/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index e6830aac..3f237bd8 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -555,7 +555,7 @@ "@artistPopular": { "description": "Section header for popular/top tracks" }, - "artistMonthlyListeners": "월별 청취자: {count}", + "artistMonthlyListeners": "월별 청취자 {count}", "@artistMonthlyListeners": { "description": "Monthly listener count display", "placeholders": { @@ -2131,7 +2131,7 @@ "@downloadSelectQuality": { "description": "Dialog title - choose audio quality" }, - "downloadFrom": "다운로드 출처", + "downloadFrom": "다운로드 제공자", "@downloadFrom": { "description": "Label - download source" }, @@ -2318,7 +2318,7 @@ "@discographyDownloadAll": { "description": "Option - download entire discography" }, - "discographyDownloadAllSubtitle": "{albumCount} 개의 릴리스에서 {count} 개의 트랙", + "discographyDownloadAllSubtitle": "{albumCount} 개의 발매 음악에서 {count} 개의 트랙", "@discographyDownloadAllSubtitle": { "description": "Subtitle showing total tracks and albums", "placeholders": { @@ -2980,7 +2980,7 @@ "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" }, - "cacheExploreFeedDesc": "탐색 탭 콘텐츠(신규 발매, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다", + "cacheExploreFeedDesc": "탐색 탭 콘텐츠(최신 발매 음악, 인기 콘텐츠)는 다음 방문 시 새로 고쳐집니다", "@cacheExploreFeedDesc": { "description": "Description of what explore feed cache contains" }, @@ -3408,7 +3408,7 @@ "@collectionWishlist": { "description": "Custom folder for saved tracks to download later" }, - "collectionLoved": "좋아요 표시한 트랙", + "collectionLoved": "좋아요 표시한 음악", "@collectionLoved": { "description": "Custom folder for favorite tracks" }, @@ -3521,7 +3521,7 @@ "@collectionWishlistEmptySubtitle": { "description": "Wishlist empty state subtitle" }, - "collectionLovedEmptyTitle": "'좋아요 표시한 트랙' 폴더가 비어 있음", + "collectionLovedEmptyTitle": "'좋아요 표시한 음악' 폴더가 비어 있음", "@collectionLovedEmptyTitle": { "description": "Loved empty state title" }, @@ -3562,7 +3562,7 @@ } } }, - "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 트랙'에 추가됨", + "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 음악'에 추가됨", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", "placeholders": { @@ -3571,7 +3571,7 @@ } } }, - "collectionRemovedFromLoved": "''{trackName}''이 '좋아요 표시한 트랙'에서 제거됨", + "collectionRemovedFromLoved": "''{trackName}''이 '좋아요 표시한 음악'에서 제거됨", "@collectionRemovedFromLoved": { "description": "Snackbar after removing track from loved folder", "placeholders": { @@ -3616,11 +3616,11 @@ } } }, - "trackOptionAddToLoved": "좋아요 표시한 트랙에 추가", + "trackOptionAddToLoved": "좋아요 표시한 음악에 추가", "@trackOptionAddToLoved": { "description": "Bottom sheet action label - add track to loved folder" }, - "trackOptionRemoveFromLoved": "좋아요 표시한 트랙에서 제거", + "trackOptionRemoveFromLoved": "좋아요 표시한 음악에서 제거", "@trackOptionRemoveFromLoved": { "description": "Bottom sheet action label - remove track from loved folder" }, @@ -3859,7 +3859,7 @@ "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, - "backupExportSectionDescription": "설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다", + "backupExportSectionDescription": "설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트, 즐겨찾는 아티스트 및 재생목록을 하나의 파일로 저장하여 보관하거나 다른 휴대전화로 옮길 수 있습니다", "@backupExportSectionDescription": { "description": "Description of what a backup contains" }, @@ -3899,7 +3899,7 @@ "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" }, - "backupRestoreConfirmMessage": "현재 설정, 다운로드 기록, 좋아요 표시한 트랙, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다", + "backupRestoreConfirmMessage": "현재 설정, 다운로드 기록, 좋아요 표시한 음악, 위시리스트 및 재생목록이 백업 파일의 내용으로 대체됩니다. 이 작업은 되돌릴 수 없습니다", "@backupRestoreConfirmMessage": { "description": "Confirmation dialog message before restoring a backup" }, @@ -3944,7 +3944,7 @@ } } }, - "backupContentsLiked": "{count} 개의 좋아요 표시한 {count, plural, =1{트랙} other{트랙}}", + "backupContentsLiked": "{count} 개의 좋아요 표시한 {count, plural, =1{음악} other{음악}}", "@backupContentsLiked": { "description": "Backup contents row for liked tracks count", "placeholders": { @@ -4014,7 +4014,7 @@ "@tooltipAddToPlaylist": { "description": "Tooltip for the Add to Playlist button" }, - "snackbarRemovedTracksFromLoved": "'좋아요 표시한 트랙'에서 {count} 개의 트랙이 제거됨", + "snackbarRemovedTracksFromLoved": "'좋아요 표시한 음악'에서 {count} 개의 트랙이 제거됨", "@snackbarRemovedTracksFromLoved": { "description": "Snackbar after removing multiple tracks from Loved folder", "placeholders": { @@ -4023,7 +4023,7 @@ } } }, - "snackbarAddedTracksToLoved": "'좋아요 표시한 트랙'에 {count} 개의 트랙이 추가됨", + "snackbarAddedTracksToLoved": "'좋아요 표시한 음악'에 {count} 개의 트랙이 추가됨", "@snackbarAddedTracksToLoved": { "description": "Snackbar after adding multiple tracks to Loved folder", "placeholders": { @@ -5727,7 +5727,7 @@ "@storeCategoryIntegration": { "description": "Store extension category - integration" }, - "artistReleases": "릴리스", + "artistReleases": "발매 음악", "@artistReleases": { "description": "Section header for all artist releases" }, From 2cc2ac6efda5a3258547b7595897b8a877d3ee47 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:26:59 +0700 Subject: [PATCH 02/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 3f237bd8..4bf84b4f 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1120,19 +1120,19 @@ "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "제목 (오름차순)", + "searchSortTitleAZ": "제목 (A-Z)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "제목 (내림차순)", + "searchSortTitleZA": "제목 (Z-A)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "아티스트 (오름차순)", + "searchSortArtistAZ": "아티스트 (A-Z)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "아티스트 (내림차순)", + "searchSortArtistZA": "아티스트 (Z-A)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, @@ -2748,19 +2748,19 @@ "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "libraryFilterSortAlbumAsc": "앨범 (오름차순)", + "libraryFilterSortAlbumAsc": "앨범 (A-Z)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "앨범 (내림차순)", + "libraryFilterSortAlbumDesc": "앨범 (Z-A)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "장르 (오름차순)", + "libraryFilterSortGenreAsc": "장르 (A-Z)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "장르 (내림차순)", + "libraryFilterSortGenreDesc": "장르 (Z-A)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, @@ -4634,11 +4634,11 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "오름차순", + "sortAlphaAsc": "A-Z", "@sortAlphaAsc": { "description": "Sort option - alphabetical ascending" }, - "sortAlphaDesc": "내림차순", + "sortAlphaDesc": "Z-A", "@sortAlphaDesc": { "description": "Sort option - alphabetical descending" }, From 19fccde3a321f6ee80f36ee2d6cc6c679c72957b Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:24:34 +0700 Subject: [PATCH 03/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 4bf84b4f..7a11bba0 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -202,7 +202,7 @@ "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "다운로드한 트랙과 함께 동기화된 가사를 저장합니다", + "optionsEmbedLyricsSubtitle": "다운로드된 트랙과 함께 동기화된 가사를 저장합니다", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -344,7 +344,7 @@ "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "기록에서 모든 다운로드한 트랙을 제거합니다", + "optionsClearHistorySubtitle": "기록에서 모든 다운로드된 트랙을 제거합니다", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, @@ -640,7 +640,7 @@ "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, - "setupDownloadLocationIosMessage": "iOS에서는 다운로드한 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다", + "setupDownloadLocationIosMessage": "iOS에서는 다운로드된 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다", "@setupDownloadLocationIosMessage": { "description": "iOS-specific folder info" }, @@ -680,7 +680,7 @@ "@setupStorageRequired": { "description": "Title when storage permission needed" }, - "setupStorageDescription": "SpotiFLAC은 다운로드한 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다", + "setupStorageDescription": "SpotiFLAC은 다운로드된 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다", "@setupStorageDescription": { "description": "Explanation for storage permission" }, @@ -696,7 +696,7 @@ "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "다운로드한 음악 파일이 저장될 폴더를 선택하세요", + "setupFolderDescription": "다운로드된 음악 파일이 저장될 폴더를 선택하세요", "@setupFolderDescription": { "description": "Explanation for folder selection" }, @@ -1192,7 +1192,7 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "다운로드한 파일을 폴더로 정리", + "folderOrganizationDescription": "다운로드된 파일을 폴더로 정리", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, @@ -1454,7 +1454,7 @@ "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "다운로드한 파일에 가사를 저장하는 방법을 선택하세요", + "lyricsModeDescription": "다운로드된 파일에 가사를 저장하는 방법을 선택하세요", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, @@ -1689,7 +1689,7 @@ "@trackDeleteConfirmTitle": { "description": "Delete confirmation title" }, - "trackDeleteConfirmMessage": "이렇게 하면 다운로드한 파일이 영구적으로 삭제되고 기록에서 제거됩니다", + "trackDeleteConfirmMessage": "이렇게 하면 다운로드된 파일이 영구적으로 삭제되고 기록에서 제거됩니다", "@trackDeleteConfirmMessage": { "description": "Delete confirmation message" }, @@ -2826,7 +2826,7 @@ "@tutorialLibraryTitle": { "description": "Tutorial library page title" }, - "tutorialLibraryDesc": "다운로드한 모든 음악은 라이브러리 탭에 정리되어 있습니다", + "tutorialLibraryDesc": "다운로드된 모든 음악은 라이브러리 탭에 정리되어 있습니다", "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, @@ -2923,7 +2923,7 @@ "@cacheSummaryTitle": { "description": "Heading for cache summary card" }, - "cacheSummarySubtitle": "캐시를 지워도 다운로드한 음악 파일은 삭제되지 않습니다", + "cacheSummarySubtitle": "캐시를 지워도 다운로드된 음악 파일은 삭제되지 않습니다", "@cacheSummarySubtitle": { "description": "Helper text for cache summary card" }, @@ -3043,7 +3043,7 @@ "@cacheClearConfirmTitle": { "description": "Dialog title before clearing one cache category" }, - "cacheClearConfirmMessage": "''{target}''의 캐시된 데이터를 지웁니다. 다운로드한 음악 파일은 삭제되지 않습니다", + "cacheClearConfirmMessage": "''{target}''의 캐시된 데이터를 지웁니다. 다운로드된 음악 파일은 삭제되지 않습니다", "@cacheClearConfirmMessage": { "description": "Dialog message before clearing selected cache", "placeholders": { @@ -3056,7 +3056,7 @@ "@cacheClearAllConfirmTitle": { "description": "Dialog title before clearing all caches" }, - "cacheClearAllConfirmMessage": "이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드한 음악 파일은 삭제되지 않습니다", + "cacheClearAllConfirmMessage": "이 페이지의 모든 캐시 카테고리가 지워집니다. 다운로드된 음악 파일은 삭제되지 않습니다", "@cacheClearAllConfirmMessage": { "description": "Dialog message before clearing all caches" }, @@ -4045,7 +4045,7 @@ } } }, - "homeSkipAlreadyDownloaded": "이미 다운로드한 노래 건너뛰기", + "homeSkipAlreadyDownloaded": "이미 다운로드된 노래 건너뛰기", "@homeSkipAlreadyDownloaded": { "description": "Checkbox label in import dialog to skip already-downloaded songs" }, @@ -4090,7 +4090,7 @@ "@noTracksFoundForAlbum": { "description": "Empty state message when an album has no tracks" }, - "downloadLocationSubtitle": "다운로드한 트랙을 저장할 위치를 선택하세요", + "downloadLocationSubtitle": "다운로드된 트랙을 저장할 위치를 선택하세요", "@downloadLocationSubtitle": { "description": "Subtitle shown in the download location picker sheet" }, @@ -4476,7 +4476,7 @@ "@queueEmptyHistory": { "description": "Empty state title when download history is empty" }, - "queueEmptyHistorySubtitle": "다운로드한 트랙이 여기에 표시됩니다", + "queueEmptyHistorySubtitle": "다운로드된 트랙이 여기에 표시됩니다", "@queueEmptyHistorySubtitle": { "description": "Empty state subtitle for download history" }, @@ -5036,7 +5036,7 @@ "@queueFinalizingDownload": { "description": "Accessibility label for a queue item that is finalizing" }, - "queueDownloadedFileMissing": "다운로드한 파일이 없음", + "queueDownloadedFileMissing": "다운로드된 파일이 없음", "@queueDownloadedFileMissing": { "description": "Accessibility label when a downloaded file is missing from disk" }, @@ -5756,7 +5756,7 @@ "@dialogDisableHistoryTitle": { "description": "Confirmation dialog title shown before disabling download history" }, - "dialogDisableHistoryMessage": "기존 기록이 삭제됩니다. 다운로드한 파일은 삭제되지 않습니다", + "dialogDisableHistoryMessage": "기존 기록이 삭제됩니다. 다운로드된 파일은 삭제되지 않습니다", "@dialogDisableHistoryMessage": { "description": "Confirmation dialog message shown before disabling download history" }, From 7d3a6f9780e733e04d54df28f1a7292a35ef9c00 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 10 Jul 2026 18:47:47 +0700 Subject: [PATCH 04/37] New translations app_en.arb (German) [ci skip] --- lib/l10n/arb/app_de.arb | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index aef562c6..03a4d00c 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -190,11 +190,11 @@ "@optionsUseExtensionProviders": { "description": "Legacy setting label for extension download providers" }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", + "optionsUseExtensionProvidersOn": "Erweiterungsanbieter sind aktiviert", "@optionsUseExtensionProvidersOn": { "description": "Status when extension providers enabled" }, - "optionsUseExtensionProvidersOff": "Extension providers are required", + "optionsUseExtensionProvidersOff": "Erweiterungsanbieter sind erforderlich", "@optionsUseExtensionProvidersOff": { "description": "Legacy status when extension providers would be disabled" }, @@ -1312,7 +1312,7 @@ "@metadataMayRateLimit": { "description": "Spotify provider description" }, - "logTitle": "Logs", + "logTitle": "Protokolle", "@logTitle": { "description": "Logs screen title" }, @@ -4504,7 +4504,7 @@ "@audioAnalysisAnalyzing": { "description": "Loading text while analyzing audio" }, - "audioAnalysisSampleRate": "Sample Rate", + "audioAnalysisSampleRate": "Abtastrate", "@audioAnalysisSampleRate": { "description": "Sample rate metric label" }, @@ -5731,7 +5731,7 @@ "@artistReleases": { "description": "Section header for all artist releases" }, - "editMetadataSelectNone": "None", + "editMetadataSelectNone": "Keine", "@editMetadataSelectNone": { "description": "Button to clear selected fields for auto-fill" }, @@ -5811,7 +5811,7 @@ "@libraryBuiltInPlayerInfo": { "description": "Info note explaining the built-in player is for previews only" }, - "nowPlayingTitle": "Now Playing", + "nowPlayingTitle": "Jetzt läuft", "@nowPlayingTitle": { "description": "Title for the now playing screen" }, @@ -6014,7 +6014,7 @@ "@trackConvertResampler": { "description": "Section label for lossless conversion resampler options" }, - "trackConvertDitherNone": "None", + "trackConvertDitherNone": "Keine", "@trackConvertDitherNone": { "description": "Lossless conversion dither option with no dithering applied" }, @@ -6121,11 +6121,11 @@ "@regionCountryJP": { "description": "Country name for SongLink region picker" }, - "regionCountryKR": "South Korea", + "regionCountryKR": "Südkorea", "@regionCountryKR": { "description": "Country name for SongLink region picker" }, - "regionCountryIN": "India", + "regionCountryIN": "Indien", "@regionCountryIN": { "description": "Country name for SongLink region picker" }, @@ -6189,7 +6189,7 @@ "@extensionVerificationHelpMessageWaiting": { "description": "Dialog message when verification may need manual browser help" }, - "extensionVerificationClose": "Close", + "extensionVerificationClose": "Schließen", "@extensionVerificationClose": { "description": "Button to dismiss the extension verification help dialog" }, From bbfc724ceb366b68c71b2189ce78a6915f0f0d11 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:53:11 +0700 Subject: [PATCH 05/37] New translations app_en.arb (German) [ci skip] --- lib/l10n/arb/app_de.arb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 03a4d00c..8549059c 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -772,11 +772,11 @@ "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Play preview", + "previewPlay": "Vorschau abspielen", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Stop preview", + "previewStop": "Vorschau stoppen", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, @@ -3931,7 +3931,7 @@ "@backupContentsTitle": { "description": "Header above the list summarizing what the backup contains" }, - "backupContentsSettings": "App settings", + "backupContentsSettings": "Appeinstellungen", "@backupContentsSettings": { "description": "Backup contents row label for settings" }, @@ -5957,7 +5957,7 @@ "@aboutPaxsenixSubtitle": { "description": "Subtitle for Paxsenix special thanks entry on the about page" }, - "snackbarPlayingNext": "Playing next", + "snackbarPlayingNext": "Als nächstes", "@snackbarPlayingNext": { "description": "Snackbar when a track is inserted as the next queue item" }, From d6726f976a82ec6c7ab6beec31f7dea157adee1d Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 11 Jul 2026 20:36:39 +0700 Subject: [PATCH 06/37] 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 7a11bba0..a4e54e6b 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -5355,7 +5355,7 @@ "@libraryFilterMetadataMissingArtist": { "description": "Filter option - items missing artist" }, - "libraryFilterMetadataIncorrectIsrcFormat": "잘못된 ISRC 형식", + "libraryFilterMetadataIncorrectIsrcFormat": "ISRC 형식이 잘못됨", "@libraryFilterMetadataIncorrectIsrcFormat": { "description": "Filter option - items with an invalid ISRC format" }, From d9ceb8ac7890fc714c1c3459b51421c2994277c4 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 12 Jul 2026 22:54:50 +0700 Subject: [PATCH 07/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index a4e54e6b..8702d996 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -2131,7 +2131,7 @@ "@downloadSelectQuality": { "description": "Dialog title - choose audio quality" }, - "downloadFrom": "다운로드 제공자", + "downloadFrom": "다운로드 제공자 선택", "@downloadFrom": { "description": "Label - download source" }, @@ -2956,7 +2956,7 @@ "@cacheTempDirectory": { "description": "Cache item title for temporary files directory" }, - "cacheTempDirectoryDesc": "다운로드 및 오디오 변환으로 생성된 임시 파일", + "cacheTempDirectoryDesc": "다운로드 및 오디오 변환으로 만들어진 임시 파일", "@cacheTempDirectoryDesc": { "description": "Description of what temporary directory contains" }, @@ -3396,7 +3396,7 @@ "@cueSplitButton": { "description": "Button text to start CUE splitting" }, - "actionCreate": "생성", + "actionCreate": "만들기", "@actionCreate": { "description": "Generic action button - create" }, From 9a9152f7f84e2c46485e80a0a99fdabae060d7d4 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 13 Jul 2026 00:27:02 +0700 Subject: [PATCH 08/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 8702d996..39ecd8cf 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -3428,7 +3428,7 @@ "@collectionAddToPlaylist": { "description": "Action to add a track to user playlist" }, - "collectionCreatePlaylist": "재생목록 생성", + "collectionCreatePlaylist": "재생목록 만들기", "@collectionCreatePlaylist": { "description": "Action to create a new playlist" }, @@ -3476,7 +3476,7 @@ } } }, - "collectionPlaylistCreated": "재생목록 생성 완료", + "collectionPlaylistCreated": "재생목록 만들기 완료", "@collectionPlaylistCreated": { "description": "Snackbar after creating playlist" }, @@ -3855,7 +3855,7 @@ "@backupTitle": { "description": "App bar title for the backup and restore page" }, - "backupExportSectionTitle": "백업 생성", + "backupExportSectionTitle": "백업 만들기", "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, @@ -3863,7 +3863,7 @@ "@backupExportSectionDescription": { "description": "Description of what a backup contains" }, - "backupExportButton": "백업 파일 생성", + "backupExportButton": "백업 파일 만들기", "@backupExportButton": { "description": "Button to create and share a backup file" }, @@ -3879,15 +3879,15 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "백업을 생성하는 중...", + "backupCreating": "백업을 만드는 중...", "@backupCreating": { "description": "Progress text while a backup is being created" }, - "backupCreated": "백업 생성 완료", + "backupCreated": "백업 만들기 완료", "@backupCreated": { "description": "Snackbar after a backup file is created" }, - "backupCreateFailed": "백업 생성 실패", + "backupCreateFailed": "백업 만들기 실패", "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, From b5e5fb5cd2e057f6dd4e8a9d8de2e9d63dc51140 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 18 Jul 2026 20:10:22 +0700 Subject: [PATCH 09/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 39ecd8cf..4990b89b 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -17,7 +17,7 @@ "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "리포", + "navStore": "레포", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -308,11 +308,11 @@ "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "확장 프로그램 리포", + "optionsExtensionStore": "확장 프로그램 레포", "@optionsExtensionStore": { "description": "Show/hide store tab" }, - "optionsExtensionStoreSubtitle": "하단바에서 리포 탭 표시", + "optionsExtensionStoreSubtitle": "하단바에서 레포 탭 표시", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension store toggle" }, @@ -415,7 +415,7 @@ "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "확장 프로그램 리포", + "storeTitle": "확장 프로그램 레포", "@storeTitle": { "description": "Store screen title" }, @@ -1756,15 +1756,15 @@ "@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" }, - "storeRepoUrlLabel": "리포지토리 URL", + "storeRepoUrlLabel": "레포지토리 URL", "@storeRepoUrlLabel": { "description": "Label for the repository URL input field" }, @@ -1776,27 +1776,27 @@ "@storeRepoUrlHelper": { "description": "Helper text below the repository URL input field" }, - "storeAddRepoButton": "리포지토리 추가", + "storeAddRepoButton": "레포지토리 추가", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" }, - "storeChangeRepoTooltip": "리포지토리 변경", + "storeChangeRepoTooltip": "레포지토리 변경", "@storeChangeRepoTooltip": { "description": "Tooltip for the change-repository icon button in the app bar" }, - "storeRepoDialogTitle": "확장 프로그램 리포지토리", + "storeRepoDialogTitle": "확장 프로그램 레포지토리", "@storeRepoDialogTitle": { "description": "Title of the change/remove repository dialog" }, - "storeRepoDialogCurrent": "현재 리포지토리:", + "storeRepoDialogCurrent": "현재 레포지토리:", "@storeRepoDialogCurrent": { "description": "Label shown above the current repository URL in the dialog" }, - "storeNewRepoUrlLabel": "새 리포지토리 URL", + "storeNewRepoUrlLabel": "새 레포지토리 URL", "@storeNewRepoUrlLabel": { "description": "Label for the new repository URL field inside the dialog" }, - "storeLoadError": "리포지토리 불러오기 실패", + "storeLoadError": "레포지토리 불러오기 실패", "@storeLoadError": { "description": "Error heading when the store cannot be loaded" }, @@ -2850,7 +2850,7 @@ "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "유용한 확장 프로그램을 찾으려면 리포 탭을 탐색하세요", + "tutorialExtensionsTip1": "유용한 확장 프로그램을 찾으려면 레포 탭을 탐색하세요", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, @@ -5275,7 +5275,7 @@ "@settingsApp": { "description": "Settings menu item - app settings" }, - "settingsAppSubtitle": "업데이트, 데이터, 확장프로그램 리포, 디버그", + "settingsAppSubtitle": "업데이트, 데이터, 확장프로그램 레포, 디버그", "@settingsAppSubtitle": { "description": "Subtitle for app settings" }, From 57eef4311f0f6ea4905f67eb5f75df58083feec3 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 20 Jul 2026 02:32:54 +0700 Subject: [PATCH 10/37] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 428 ++++++++++++++++++++-------------------- 1 file changed, 214 insertions(+), 214 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index cc025719..c9b54b01 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -9,15 +9,15 @@ "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Pustaka", + "navLibrary": "Koleksi", "@navLibrary": { "description": "Bottom navigation - Library tab" }, - "navSettings": "Pengaturan", + "navSettings": "Setelan", "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repositori", + "navStore": "Repo", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -29,7 +29,7 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "Belum ada penyedia pencarian", + "homeEmptyTitle": "Tidak ada penyedia pencarian", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, @@ -37,11 +37,11 @@ "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, - "homeSupports": "Mendukung: URL Lagu, Album, Daftar Putar, dan Artis", + "homeSupports": "Mendukung: URL Lagu, Album, Playlist, dan Artis", "@homeSupports": { "description": "Info text about supported URL types" }, - "homeRecent": "Terbaru", + "homeRecent": "Baru-baru ini", "@homeRecent": { "description": "Section header for recent searches" }, @@ -57,15 +57,15 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "historySearchHint": "Cari riwayat...", + "historySearchHint": "Cari histori...", "@historySearchHint": { "description": "Search bar placeholder in history" }, - "settingsTitle": "Pengaturan", + "settingsTitle": "Setelah", "@settingsTitle": { "description": "Settings screen title" }, - "settingsDownload": "Unduhan", + "settingsDownload": "Download", "@settingsDownload": { "description": "Settings section - download options" }, @@ -85,11 +85,11 @@ "@settingsAbout": { "description": "Settings section - app info" }, - "downloadTitle": "Unduhan", + "downloadTitle": "Download", "@downloadTitle": { "description": "Download settings page title" }, - "downloadAskQualitySubtitle": "Tampilkan pemilih kualitas untuk setiap unduhan", + "downloadAskQualitySubtitle": "Tampilkan pemilih kualitas setiap mendownload", "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, @@ -97,15 +97,15 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Format Nama Berkas Tunggal", + "downloadSingleFilenameFormat": "Format Nama Format Single", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Pola nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.", + "downloadSingleFilenameFormatDescription": "Atur nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Organisasi Folder", + "downloadFolderOrganization": "Atur Folder", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, @@ -125,7 +125,7 @@ "@appearanceThemeDark": { "description": "Dark theme" }, - "appearanceDynamicColor": "Warna Dinamis", + "appearanceDynamicColor": "Dynamic Color", "@appearanceDynamicColor": { "description": "Material You dynamic colors" }, @@ -133,7 +133,7 @@ "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "Tampilan Riwayat", + "appearanceHistoryView": "Gaya Menu", "@appearanceHistoryView": { "description": "Layout style for history" }, @@ -149,7 +149,7 @@ "@optionsTitle": { "description": "Options settings page title" }, - "optionsPrimaryProvider": "Provider Utama", + "optionsPrimaryProvider": "Penyedia Utama", "@optionsPrimaryProvider": { "description": "Main search provider setting" }, @@ -157,7 +157,7 @@ "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "Menggunakan ekstensi: {extensionName}", + "optionsUsingExtension": "Menggunakan penyedia: {extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -178,15 +178,15 @@ "@optionsSwitchBack": { "description": "Hint to switch back from extension search" }, - "optionsAutoFallback": "Cadangan Otomatis", + "optionsAutoFallback": "Fallback Otomatis", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, - "optionsAutoFallbackSubtitle": "Coba layanan lain jika unduhan gagal", + "optionsAutoFallbackSubtitle": "Gunakan layanan lain jika download gagal", "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Gunakan Provider Ekstensi", + "optionsUseExtensionProviders": "Gunakan Penyedia Ekstensi", "@optionsUseExtensionProviders": { "description": "Legacy setting label for extension download providers" }, @@ -194,15 +194,15 @@ "@optionsUseExtensionProvidersOn": { "description": "Status when extension providers enabled" }, - "optionsUseExtensionProvidersOff": "Penyedia ekstensi diwajibkan", + "optionsUseExtensionProvidersOff": "Penyedia ekstensi belum dipilih", "@optionsUseExtensionProvidersOff": { "description": "Legacy status when extension providers would be disabled" }, - "optionsEmbedLyrics": "Sematkan Lirik", + "optionsEmbedLyrics": "Download Lirik", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Simpan lirik yang disinkronkan bersama dengan lagu yang Anda unduh", + "optionsEmbedLyricsSubtitle": "Download lirik saat mendownload lagu", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -210,7 +210,7 @@ "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "Unduh cover art resolusi tertinggi", + "optionsMaxQualityCoverSubtitle": "Unduh cover lagu dengan resolusi tertinggi", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, @@ -259,7 +259,7 @@ "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tulis tag ReplayGain ke {count} trek?", + "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tulis tag ReplayGain ke {count} lagu?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -288,75 +288,75 @@ "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Pilih bagaimana beberapa artis dicantumkan dalam tag yang disematkan.", + "optionsArtistTagModeDescription": "Pilih bagaimana cara mencantumkan beberapa artis dalam metadata lagu", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Nilai gabungan tunggal", + "optionsArtistTagModeJoined": "Satukan tag", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Tuliskan satu nilai ARTIS seperti \"Artis A, Artis B\" untuk kompatibilitas pemain maksimal.", + "optionsArtistTagModeJoinedSubtitle": "Tulis seluruh artis dalam satu tag seperti \"Artis A, Artis B\" agar mendukung lebih banyak pemutar audio.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Tag terpisah untuk FLAC/Opus", + "optionsArtistTagModeSplitVorbis": "Pisahkan tag (hanya file FLAC/Opus)", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Tulis satu tag artis per artis untuk FLAC dan Opus; MP3 dan M4A tetap tergabung.", + "optionsArtistTagModeSplitVorbisSubtitle": "Hanya menggunakan satu tag untuk satu nama artis (jika file tujuan adalah MP3 dan MP4, nama artis akan disatukan).", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "Repositori Ekstensi", + "optionsExtensionStore": "Repo", "@optionsExtensionStore": { "description": "Show/hide store tab" }, - "optionsExtensionStoreSubtitle": "Tampilkan tab Repo di navigasi", + "optionsExtensionStoreSubtitle": "Tampilkan tab Repo di bar navigasi", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension store toggle" }, - "optionsCheckUpdates": "Periksa Pembaruan", + "optionsCheckUpdates": "Periksa Update", "@optionsCheckUpdates": { "description": "Auto update check toggle" }, - "optionsCheckUpdatesSubtitle": "Beritahu saat versi baru tersedia", + "optionsCheckUpdatesSubtitle": "Beritahu saat ada versi baru", "@optionsCheckUpdatesSubtitle": { "description": "Subtitle for update check" }, - "optionsUpdateChannel": "Saluran Pembaruan", + "optionsUpdateChannel": "Versi Update", "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Hanya rilis stabil", + "optionsUpdateChannelStable": "Hanya mendapatkan update versi stabil", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, - "optionsUpdateChannelPreview": "Dapatkan rilis preview", + "optionsUpdateChannelPreview": "Mendapatkan update versi preview (beta)", "@optionsUpdateChannelPreview": { "description": "Include beta/preview updates" }, - "optionsUpdateChannelWarning": "Preview mungkin mengandung bug atau fitur belum lengkap", + "optionsUpdateChannelWarning": "Menggunakan versi preview mungkin ada lebih banyak bug dan banyak fitur yang masih diuji coba", "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "Hapus Riwayat Unduhan", + "optionsClearHistory": "Hapus Histori Download", "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "Hapus semua lagu dari riwayat", + "optionsClearHistorySubtitle": "Hapus semua lagu dari histor", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, - "optionsDetailedLogging": "Log Detail", + "optionsDetailedLogging": "Rekam Log", "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, - "optionsDetailedLoggingOn": "Log detail sedang direkam", + "optionsDetailedLoggingOn": "Log sedang direkam", "@optionsDetailedLoggingOn": { "description": "Status when logging enabled" }, - "optionsDetailedLoggingOff": "Aktifkan untuk laporan bug", + "optionsDetailedLoggingOff": "Aktifkan jika ingin melapor bug", "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, @@ -364,7 +364,7 @@ "@optionsSpotifyCredentials": { "description": "Spotify API credentials setting" }, - "optionsSpotifyCredentialsConfigured": "ID Klien: {clientId}...", + "optionsSpotifyCredentialsConfigured": "ID Client: {clientId}...", "@optionsSpotifyCredentialsConfigured": { "description": "Shows configured client ID preview", "placeholders": { @@ -377,7 +377,7 @@ "@optionsSpotifyCredentialsRequired": { "description": "Prompt to set up credentials" }, - "optionsSpotifyWarning": "Spotify memerlukan kredensial API Anda sendiri. Dapatkan gratis dari developer.spotify.com", + "optionsSpotifyWarning": "Anda membutuhkan kredensial API Spotify jika ingin menggunakan ini. Dapatkan gratis dari developer.spotify.com", "@optionsSpotifyWarning": { "description": "Info about Spotify API requirement" }, @@ -411,11 +411,11 @@ } } }, - "extensionsUninstall": "Copot", + "extensionsUninstall": "Uninstal", "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Repositori Ekstensi", + "storeTitle": "Repo", "@storeTitle": { "description": "Store screen title" }, @@ -423,15 +423,15 @@ "@storeSearch": { "description": "Store search placeholder" }, - "storeInstall": "Pasang", + "storeInstall": "Instal", "@storeInstall": { "description": "Install extension button" }, - "storeInstalled": "Terpasang", + "storeInstalled": "Terinstal", "@storeInstalled": { "description": "Already installed badge" }, - "storeUpdate": "Perbarui", + "storeUpdate": "Update", "@storeUpdate": { "description": "Update available button" }, @@ -443,7 +443,7 @@ "@aboutContributors": { "description": "Section for contributors" }, - "aboutMobileDeveloper": "Pengembang versi mobile", + "aboutMobileDeveloper": "Developer versi mobile", "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, @@ -451,7 +451,7 @@ "@aboutOriginalCreator": { "description": "Role description for original creator" }, - "aboutLogoArtist": "Seniman berbakat yang membuat logo aplikasi kita yang indah!", + "aboutLogoArtist": "Artist ter-goks yang membuat logo cantik untuk aplikasi!", "@aboutLogoArtist": { "description": "Role description for logo artist" }, @@ -463,19 +463,19 @@ "@aboutSpecialThanks": { "description": "Section for special thanks" }, - "aboutLinks": "Tautan", + "aboutLinks": "Link", "@aboutLinks": { "description": "Section for external links" }, - "aboutMobileSource": "Kode sumber mobile", + "aboutMobileSource": "Source code versi mobile", "@aboutMobileSource": { "description": "Link to mobile GitHub repo" }, - "aboutPCSource": "Kode sumber PC", + "aboutPCSource": "Source code versi PC", "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Biarkan Android tetap terbuka", + "aboutKeepAndroidOpen": "Keep Android Open", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -495,11 +495,11 @@ "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, - "aboutTelegramChannel": "Saluran Telegram", + "aboutTelegramChannel": "Channel Telegram", "@aboutTelegramChannel": { "description": "Link to Telegram channel" }, - "aboutTelegramChannelSubtitle": "Pengumuman dan pembaruan", + "aboutTelegramChannelSubtitle": "Pengumuman dan update", "@aboutTelegramChannelSubtitle": { "description": "Subtitle for Telegram channel" }, @@ -507,11 +507,11 @@ "@aboutTelegramChat": { "description": "Link to Telegram chat group" }, - "aboutTelegramChatSubtitle": "Berbincang dengan pengguna lain", + "aboutTelegramChatSubtitle": "Chat dengan sesama pengguna", "@aboutTelegramChatSubtitle": { "description": "Subtitle for Telegram chat" }, - "aboutSocial": "Sosial", + "aboutSocial": "Media Sosial", "@aboutSocial": { "description": "Section for social links" }, @@ -523,19 +523,19 @@ "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "Pencipta QQDL & HiFi API. Proyek ini membantu membentuk dukungan unduhan lossless.", + "aboutBinimumDesc": "Pembuat QQDL & HiFi API. Proyeknya membantu aplikasi ini mendukung download format lossless.", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "Pencipta proyek HiFi asli. Sebuah fondasi untuk integrasi sumber lossless.", + "aboutSachinsenalDesc": "Pembuat proyek HiFi. Sebuah fondasi untuk integrasi sumber lossless.", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutSjdonadoDesc": "Pencipta I Don't Have Spotify (IDHS). Penyelesai tautan cadangan yang menyelamatkan keadaan!", + "aboutSjdonadoDesc": "Pembuat I Don't Have Spotify (IDHS). Resolver link fallback yang menyelesaikan masalah Anda!", "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Cari metadata musik, kelola ekstensi, dan atur perpustakaan Anda.", + "aboutAppDescription": "Cari metadata lagu, kelola ekstensi, dan atur perpustakaan Anda.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -589,11 +589,11 @@ "@setupSkip": { "description": "Skip current step button" }, - "setupStorageAccessRequired": "Akses Penyimpanan Diperlukan", + "setupStorageAccessRequired": "Butuh Akses Penyimpanan", "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder unduhan pilihan Anda.", + "setupStorageAccessMessageAndroid11": "Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder download pilihan Anda.", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, @@ -605,7 +605,7 @@ "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "Izin {permissionType} Diperlukan", + "setupPermissionRequired": "Butuh izin {permissionType}", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -615,7 +615,7 @@ } } }, - "setupPermissionRequiredMessage": "Izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.", + "setupPermissionRequiredMessage": "Butuh izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -636,7 +636,7 @@ "@setupUseDefault": { "description": "Button to use default folder" }, - "setupDownloadLocationTitle": "Lokasi Unduhan", + "setupDownloadLocationTitle": "Lokasi Download", "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, @@ -676,7 +676,7 @@ "@setupStorageGranted": { "description": "Success message for storage permission" }, - "setupStorageRequired": "Izin Penyimpanan Diperlukan", + "setupStorageRequired": "Butuh Izin Penyimpanan", "@setupStorageRequired": { "description": "Title when storage permission needed" }, @@ -692,11 +692,11 @@ "@setupNotificationEnable": { "description": "Button to enable notifications" }, - "setupFolderChoose": "Pilih Folder Unduhan", + "setupFolderChoose": "Pilih Folder Download", "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "Pilih folder tempat musik yang diunduh akan disimpan.", + "setupFolderDescription": "Pilih folder tempat lagu yang di-download akan disimpan.", "@setupFolderDescription": { "description": "Explanation for folder selection" }, @@ -708,7 +708,7 @@ "@setupEnableNotifications": { "description": "Button to enable notifications" }, - "setupNotificationBackgroundDescription": "Dapatkan notifikasi tentang progres dan penyelesaian unduhan. Ini membantu Anda melacak unduhan saat aplikasi di latar belakang.", + "setupNotificationBackgroundDescription": "Dapatkan notifikasi tentang progres download. Ini membantu Anda mengetahui progres download Anda saat aplikasi di latar belakang.", "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, @@ -768,23 +768,23 @@ "@dialogImport": { "description": "Dialog button - import data" }, - "dialogDownload": "Unduh", + "dialogDownload": "Download", "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Putar pratinjau", + "previewPlay": "Putar preview", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Hentikan pratinjau", + "previewStop": "Hentikan preview", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "Pratinjau tidak tersedia", + "previewUnavailable": "preview tidak tersedia", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, - "dialogDiscard": "Buang", + "dialogDiscard": "Batal", "@dialogDiscard": { "description": "Dialog button - discard changes" }, @@ -792,15 +792,15 @@ "@dialogRemove": { "description": "Dialog button - remove item" }, - "dialogUninstall": "Copot", + "dialogUninstall": "Uninstal", "@dialogUninstall": { "description": "Dialog button - uninstall extension" }, - "dialogDiscardChanges": "Buang Perubahan?", + "dialogDiscardChanges": "Batalkan Perubahan?", "@dialogDiscardChanges": { "description": "Dialog title - unsaved changes warning" }, - "dialogUnsavedChanges": "Anda memiliki perubahan yang belum disimpan. Apakah Anda ingin membuangnya?", + "dialogUnsavedChanges": "Anda memiliki perubahan yang belum disimpan. Apakah Anda ingin membatalkannya?", "@dialogUnsavedChanges": { "description": "Dialog message - unsaved changes" }, @@ -816,7 +816,7 @@ "@dialogRemoveExtensionMessage": { "description": "Dialog message - uninstall confirmation" }, - "dialogUninstallExtension": "Copot Ekstensi?", + "dialogUninstallExtension": "Uninstal Ekstensi?", "@dialogUninstallExtension": { "description": "Dialog title - uninstall extension" }, @@ -829,11 +829,11 @@ } } }, - "dialogClearHistoryTitle": "Hapus Riwayat", + "dialogClearHistoryTitle": "Hapus Histori", "@dialogClearHistoryTitle": { "description": "Dialog title - clear download history" }, - "dialogClearHistoryMessage": "Apakah Anda yakin ingin menghapus semua riwayat unduhan? Ini tidak dapat dibatalkan.", + "dialogClearHistoryMessage": "Apakah Anda yakin ingin menghapus semua histori download? Ini tidak dapat dibatalkan.", "@dialogClearHistoryMessage": { "description": "Dialog message - clear history confirmation" }, @@ -841,7 +841,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Hapus {count} {count, plural, =1{lagu} other{lagu}} dari riwayat?\n\nIni juga akan menghapus file dari penyimpanan.", + "dialogDeleteSelectedMessage": "Hapus {count} {count, plural, =1{lagu} other{lagu}} dari histori?\n\nIni juga akan menghapus file dari penyimpanan.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -854,8 +854,8 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Ditemukan {count} lagu di CSV. Tambahkan ke antrian unduhan?", - "csvImportTracks": "{count} trek dari CSV", + "dialogImportPlaylistMessage": "Ditemukan {count} lagu di CSV. Tambahkan ke antrean download?", + "csvImportTracks": "{count} lagu dari CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -872,7 +872,7 @@ } } }, - "snackbarAddedToQueue": "Menambahkan \"{trackName}\" ke antrian", + "snackbarAddedToQueue": "Menambahkan \"{trackName}\" ke antrean", "@snackbarAddedToQueue": { "description": "Snackbar - track added to download queue", "placeholders": { @@ -881,7 +881,7 @@ } } }, - "snackbarAddedTracksToQueue": "Menambahkan {count} lagu ke antrian", + "snackbarAddedTracksToQueue": "Menambahkan {count} lagu ke antrean", "@snackbarAddedTracksToQueue": { "description": "Snackbar - multiple tracks added to queue", "placeholders": { @@ -890,7 +890,7 @@ } } }, - "snackbarAlreadyDownloaded": "\"{trackName}\" sudah diunduh", + "snackbarAlreadyDownloaded": "\"{trackName}\" sudah didownload", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -899,7 +899,7 @@ } } }, - "snackbarAlreadyInLibrary": "\"{trackName}\" sudah ada di perpustakaan Anda", + "snackbarAlreadyInLibrary": "\"{trackName}\" sudah ada di koleksi Anda", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -908,7 +908,7 @@ } } }, - "snackbarHistoryCleared": "Riwayat dihapus", + "snackbarHistoryCleared": "Histori dihapus", "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, @@ -938,11 +938,11 @@ } } }, - "snackbarFillAllFields": "Harap isi semua field", + "snackbarFillAllFields": "Harap isi seluruh kolom", "@snackbarFillAllFields": { "description": "Snackbar - validation error" }, - "snackbarViewQueue": "Lihat Antrian", + "snackbarViewQueue": "Lihat Antrean", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" }, @@ -964,15 +964,15 @@ "@snackbarSelectExtFile": { "description": "Snackbar - wrong file type selected" }, - "snackbarProviderPrioritySaved": "Prioritas provider disimpan", + "snackbarProviderPrioritySaved": "Prioritas penyedia disimpan", "@snackbarProviderPrioritySaved": { "description": "Snackbar - provider order saved" }, - "snackbarMetadataProviderSaved": "Prioritas provider metadata disimpan", + "snackbarMetadataProviderSaved": "Prioritas penyedia metadata disimpan", "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, - "snackbarExtensionInstalled": "{extensionName} terpasang.", + "snackbarExtensionInstalled": "{extensionName} terinstal.", "@snackbarExtensionInstalled": { "description": "Snackbar - extension installed successfully", "placeholders": { @@ -981,7 +981,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} diperbarui.", + "snackbarExtensionUpdated": "{extensionName} diupdate.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -990,11 +990,11 @@ } } }, - "snackbarFailedToInstall": "Gagal memasang ekstensi", + "snackbarFailedToInstall": "Gagal menginstal ekstensi", "@snackbarFailedToInstall": { "description": "Snackbar - extension install error" }, - "snackbarFailedToUpdate": "Gagal memperbarui ekstensi", + "snackbarFailedToUpdate": "Gagal mengupdate ekstensi", "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, @@ -1014,15 +1014,15 @@ "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, - "errorUrlNotRecognized": "Tautan tidak dikenali", + "errorUrlNotRecognized": "Link tidak dikenali", "@errorUrlNotRecognized": { "description": "Error title - URL not handled by any extension or service" }, - "errorUrlNotRecognizedMessage": "Tautan ini tidak didukung. Pastikan URL sudah benar dan ekstensi yang kompatibel telah terpasang.", + "errorUrlNotRecognizedMessage": "Link ini tidak didukung. Pastikan URL sudah benar dan ekstensi yang kompatibel telah terpasang.", "@errorUrlNotRecognizedMessage": { "description": "Error message - URL not recognized explanation" }, - "errorUrlFetchFailed": "Konten dari tautan ini gagal dimuat. Silakan coba lagi.", + "errorUrlFetchFailed": "Konten dari link ini gagal dimuat. Silakan coba lagi.", "@errorUrlFetchFailed": { "description": "Error message - generic URL fetch failure" }, @@ -1164,7 +1164,7 @@ "@filenameShowAdvancedTags": { "description": "Toggle label for showing advanced filename tags" }, - "filenameShowAdvancedTagsDescription": "Aktifkan tag yang diformat untuk padding trek dan pola tanggal", + "filenameShowAdvancedTagsDescription": "Aktifkan tag yang diformat untuk padding lagu dan pola tanggal", "@filenameShowAdvancedTagsDescription": { "description": "Description for advanced filename tag toggle" }, @@ -1172,7 +1172,7 @@ "@folderOrganizationNone": { "description": "Folder option - flat structure" }, - "folderOrganizationByPlaylist": "Berdasarkan Daftar Putar", + "folderOrganizationByPlaylist": "Berdasarkan Playlist", "@folderOrganizationByPlaylist": { "description": "Folder option - playlist folders" }, @@ -1192,11 +1192,11 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "Atur file yang diunduh ke dalam folder", + "folderOrganizationDescription": "Atur file yang didownload ke dalam folder", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, - "folderOrganizationNoneSubtitle": "Semua file di folder unduhan", + "folderOrganizationNoneSubtitle": "Semua file di folder download", "@folderOrganizationNoneSubtitle": { "description": "Subtitle for no organization option" }, @@ -1212,7 +1212,7 @@ "@folderOrganizationByArtistAlbumSubtitle": { "description": "Subtitle for nested folder option" }, - "updateAvailable": "Pembaruan Tersedia", + "updateAvailable": "Update Tersedia", "@updateAvailable": { "description": "Update dialog title" }, @@ -1220,15 +1220,15 @@ "@updateLater": { "description": "Update button - dismiss" }, - "updateStartingDownload": "Memulai unduhan...", + "updateStartingDownload": "Mendownload...", "@updateStartingDownload": { "description": "Update status - initializing" }, - "updateDownloadFailed": "Unduhan gagal", + "updateDownloadFailed": "Download gagal", "@updateDownloadFailed": { "description": "Update error title" }, - "updateFailedMessage": "Gagal mengunduh pembaruan", + "updateFailedMessage": "Gagal mendownload update", "@updateFailedMessage": { "description": "Update error message" }, @@ -1236,7 +1236,7 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateCurrent": "Saat ini", + "updateCurrent": "Sekarang", "@updateCurrent": { "description": "Label for current version" }, @@ -1244,15 +1244,15 @@ "@updateNew": { "description": "Label for new version" }, - "updateDownloading": "Mengunduh...", + "updateDownloading": "Mendownload...", "@updateDownloading": { "description": "Update status - downloading" }, - "updateWhatsNew": "Apa yang baru", + "updateWhatsNew": "Apa Yang Baru", "@updateWhatsNew": { "description": "Changelog section title" }, - "updateDownloadInstall": "Unduh & Pasang", + "updateDownloadInstall": "Download & Instal", "@updateDownloadInstall": { "description": "Update button - download and install" }, @@ -1260,15 +1260,15 @@ "@updateDontRemind": { "description": "Update button - skip this version" }, - "providerPriorityTitle": "Prioritas Provider", + "providerPriorityTitle": "Prioritas Penyedia", "@providerPriorityTitle": { "description": "Provider priority page title" }, - "providerPriorityDescription": "Seret untuk mengatur ulang urutan provider unduhan. Aplikasi akan mencoba provider dari atas ke bawah saat mengunduh lagu.", + "providerPriorityDescription": "Seret untuk mengatur ulang urutan penyedia download. Aplikasi akan mencoba penyedia dari atas ke bawah saat mengunduh lagu.", "@providerPriorityDescription": { "description": "Provider priority page description" }, - "providerPriorityInfo": "Jika lagu tidak tersedia di provider pertama, aplikasi akan otomatis mencoba yang berikutnya.", + "providerPriorityInfo": "Jika lagu tidak tersedia di penyedia pertama, aplikasi akan otomatis mencoba yang berikutnya.", "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, @@ -1276,15 +1276,15 @@ "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi unduhan terpasang mana yang dapat digunakan selama fallback otomatis.", + "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi download terinstal mana yang dapat digunakan selama fallback otomatis.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Hanya ekstensi yang diaktifkan dengan kemampuan penyedia unduhan yang tercantum di sini.", + "providerPriorityFallbackExtensionsHint": "Hanya ekstensi yang diaktifkan dengan kemampuan penyedia download yang tercantum di sini.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Warisan", + "providerBuiltIn": "Fitur Lama", "@providerBuiltIn": { "description": "Legacy label retained for old generated localization compatibility" }, @@ -1296,19 +1296,19 @@ "@metadataProviderPriorityTitle": { "description": "Metadata priority page title" }, - "metadataProviderPriorityDescription": "Seret untuk mengatur ulang urutan provider metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.", + "metadataProviderPriorityDescription": "Seret untuk mengatur ulang urutan penyedia metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.", "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, - "metadataProviderPriorityInfo": "Deezer tidak memiliki batas rate dan direkomendasikan sebagai utama. Spotify mungkin membatasi rate setelah banyak permintaan.", + "metadataProviderPriorityInfo": "Deezer tidak memiliki batas akses dan direkomendasikan sebagai utama. Spotify mungkin akan membatasi akses Anda jika menerima terlalu banyak permintaan.", "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Tidak ada batas rate", + "metadataNoRateLimits": "Tidak dibatasi aksesnya", "@metadataNoRateLimits": { "description": "Deezer provider description" }, - "metadataMayRateLimit": "Mungkin dibatasi rate", + "metadataMayRateLimit": "Mungkin dibatasi aksesnya", "@metadataMayRateLimit": { "description": "Spotify provider description" }, @@ -1394,7 +1394,7 @@ "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Rahasia Klien", + "credentialsClientSecret": "Client Secret", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, @@ -1406,7 +1406,7 @@ "@channelStable": { "description": "Update channel - stable releases" }, - "channelPreview": "Pratinjau", + "channelPreview": "Preview", "@channelPreview": { "description": "Update channel - beta/preview releases" }, @@ -1414,7 +1414,7 @@ "@sectionSearchSource": { "description": "Settings section header" }, - "sectionDownload": "Unduhan", + "sectionDownload": "Download", "@sectionDownload": { "description": "Settings section header" }, @@ -1442,7 +1442,7 @@ "@sectionAudioQuality": { "description": "Settings section header" }, - "sectionFileSettings": "Pengaturan File", + "sectionFileSettings": "Setelan File", "@sectionFileSettings": { "description": "Settings section header" }, @@ -1454,23 +1454,23 @@ "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "Pilih cara lirik disimpan bersama unduhan Anda", + "lyricsModeDescription": "Pilih cara lirik disimpan bersama lagu yang Anda download", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, - "lyricsModeEmbed": "Sematkan dalam file", + "lyricsModeEmbed": "Jadikan metadata", "@lyricsModeEmbed": { "description": "Lyrics mode option - embed in audio file" }, - "lyricsModeEmbedSubtitle": "Lirik tersimpan di dalam metadata FLAC", + "lyricsModeEmbedSubtitle": "Simpan di dalam metadata FLAC", "@lyricsModeEmbedSubtitle": { "description": "Subtitle for embed option" }, - "lyricsModeExternal": "File .lrc eksternal", + "lyricsModeExternal": "Jadikan file .lrc", "@lyricsModeExternal": { "description": "Lyrics mode option - separate LRC file" }, - "lyricsModeExternalSubtitle": "File .lrc terpisah untuk pemutar musik seperti Samsung Music", + "lyricsModeExternalSubtitle": "Pisahkan menjadi file .lrc untuk digunakan di pemutar musik seperti Samsung Music", "@lyricsModeExternalSubtitle": { "description": "Subtitle for external option" }, @@ -1478,7 +1478,7 @@ "@lyricsModeBoth": { "description": "Lyrics mode option - embed and external" }, - "lyricsModeBothSubtitle": "Sematkan dan simpan file .lrc", + "lyricsModeBothSubtitle": "Simpan di dalam metadata dan simpan file .lrc", "@lyricsModeBothSubtitle": { "description": "Subtitle for both option" }, @@ -1510,11 +1510,11 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Cadangan, metadata, lirik, sampul album", + "settingsOptionsSubtitle": "Cadangan, metadata, lirik, cover album", "@settingsOptionsSubtitle": { "description": "Options settings description" }, - "settingsExtensionsSubtitle": "Kelola provider unduhan", + "settingsExtensionsSubtitle": "Kelola penyedia download", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" }, @@ -1530,7 +1530,7 @@ "@pressBackAgainToExit": { "description": "Exit confirmation message" }, - "downloadAllCount": "Unduh Semua ({count})", + "downloadAllCount": "Download Semua ({count})", "@downloadAllCount": { "description": "Download all button with count", "placeholders": { @@ -1632,7 +1632,7 @@ "@trackCopyright": { "description": "Metadata label - copyright information" }, - "trackDownloaded": "Diunduh", + "trackDownloaded": "Terdownload", "@trackDownloaded": { "description": "Metadata label - download date" }, @@ -2318,7 +2318,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": { @@ -2330,11 +2330,11 @@ } } }, - "discographyAlbumsOnly": "Albums Only", + "discographyAlbumsOnly": "Album Saja", "@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": { @@ -2346,11 +2346,11 @@ } } }, - "discographySinglesOnly": "Singles & EPs Only", + "discographySinglesOnly": "Single & EP Saja", "@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": { @@ -2362,19 +2362,19 @@ } } }, - "discographySelectAlbums": "Select Albums...", + "discographySelectAlbums": "Pilih Album", "@discographySelectAlbums": { "description": "Option - manually select albums to download" }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", + "discographySelectAlbumsSubtitle": "Pilih salah satu album atau single", "@discographySelectAlbumsSubtitle": { "description": "Subtitle for select albums option" }, - "discographyFetchingTracks": "Fetching tracks...", + "discographyFetchingTracks": "Mendapatkan informasi lagu...", "@discographyFetchingTracks": { "description": "Progress - fetching album tracks" }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", + "discographyFetchingAlbum": "Mendapatkan {current} dari {total} informasi lagu...", "@discographyFetchingAlbum": { "description": "Progress - fetching specific album", "placeholders": { @@ -2386,7 +2386,7 @@ } } }, - "discographySelectedCount": "{count} selected", + "discographySelectedCount": "{count} dipilih", "@discographySelectedCount": { "description": "Selection count badge", "placeholders": { @@ -2395,11 +2395,11 @@ } } }, - "discographyDownloadSelected": "Download Selected", + "discographyDownloadSelected": "Download Dipilih", "@discographyDownloadSelected": { "description": "Button - download selected albums" }, - "discographyAddedToQueue": "Added {count} tracks to queue", + "discographyAddedToQueue": "Menambahkan {count} lagu ke antrean", "@discographyAddedToQueue": { "description": "Snackbar - tracks added from discography", "placeholders": { @@ -2408,7 +2408,7 @@ } } }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", + "discographySkippedDownloaded": "{added} ditambahkan, {skipped} sudah di-download", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2420,155 +2420,155 @@ } } }, - "discographyNoAlbums": "No albums available", + "discographyNoAlbums": "Tidak ada album tersedia", "@discographyNoAlbums": { "description": "Error - no albums found for artist" }, - "discographyFailedToFetch": "Failed to fetch some albums", + "discographyFailedToFetch": "Gagal mendapatkan info beberapa album", "@discographyFailedToFetch": { "description": "Error - some albums failed to load" }, - "sectionStorageAccess": "Storage Access", + "sectionStorageAccess": "Akses Penyimpanan", "@sectionStorageAccess": { "description": "Section header for storage access settings" }, - "allFilesAccess": "All Files Access", + "allFilesAccess": "Akses Semua File", "@allFilesAccess": { "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", + "allFilesAccessEnabledSubtitle": "Boleh menyimpan di folder manapun", "@allFilesAccessEnabledSubtitle": { "description": "Subtitle when all files access is enabled" }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", + "allFilesAccessDisabledSubtitle": "Hanya ke folder media", "@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": "Hidupkan ini jika Anda mengalami eror saat mencoba menyimpan ke folder pilihan.", "@allFilesAccessDescription": { "description": "Description explaining when to enable all files access" }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", + "allFilesAccessDeniedMessage": "Izin ditolak. Harap hidupkan 'Akses semua file' secara manual lewat setelan", "@allFilesAccessDeniedMessage": { "description": "Message when permission is permanently denied" }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", + "allFilesAccessDisabledMessage": "Akses semua file dimatikan. Aplikasi menggunakan akses penyimpanan terbatas.", "@allFilesAccessDisabledMessage": { "description": "Snackbar message when user disables all files access" }, - "settingsLocalLibrary": "Local Library", + "settingsLocalLibrary": "File Lokal", "@settingsLocalLibrary": { "description": "Settings menu item - local library" }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", + "settingsLocalLibrarySubtitle": "Pindai lagu & cari duplikat", "@settingsLocalLibrarySubtitle": { "description": "Subtitle for local library settings" }, - "settingsCache": "Storage & Cache", + "settingsCache": "Penyimpanan & Cache", "@settingsCache": { "description": "Settings menu item - cache management" }, - "settingsCacheSubtitle": "View size and clear cached data", + "settingsCacheSubtitle": "Lihat penggunaan dan bersihkan cache", "@settingsCacheSubtitle": { "description": "Subtitle for cache management menu" }, - "libraryTitle": "Local Library", + "libraryTitle": "File Lokal", "@libraryTitle": { "description": "Library settings page title" }, - "libraryScanSettings": "Scan Settings", + "libraryScanSettings": "Setelan Pemindaian", "@libraryScanSettings": { "description": "Section header for scan settings" }, - "libraryEnableLocalLibrary": "Enable Local Library", + "libraryEnableLocalLibrary": "Hidupkan File Lokal", "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", + "libraryEnableLocalLibrarySubtitle": "Pindai lagu yang ada di perangkat Anda", "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Library Folder", + "libraryFolder": "Folder Koleksi", "@libraryFolder": { "description": "Folder selection setting" }, - "libraryFolderHint": "Tap to select folder", + "libraryFolderHint": "Ketuk untuk memilih folder", "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", + "libraryShowDuplicateIndicator": "Tampilkan Indikator Duplikat", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", + "libraryShowDuplicateIndicatorSubtitle": "Tampilkan saat mencari lagu yang ada", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Auto Scan", + "libraryAutoScan": "Pindai Otomatis", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Automatically scan your library for new files", + "libraryAutoScanSubtitle": "Otomatis memindai perangkat Anda untuk mencari lagu baru", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, - "libraryAutoScanOff": "Off", + "libraryAutoScanOff": "Mati", "@libraryAutoScanOff": { "description": "Auto scan disabled" }, - "libraryAutoScanOnOpen": "Every app open", + "libraryAutoScanOnOpen": "Setiap aplikasi dibuka", "@libraryAutoScanOnOpen": { "description": "Auto scan when app opens" }, - "libraryAutoScanDaily": "Daily", + "libraryAutoScanDaily": "Harian", "@libraryAutoScanDaily": { "description": "Auto scan once per day" }, - "libraryAutoScanWeekly": "Weekly", + "libraryAutoScanWeekly": "Mingguan", "@libraryAutoScanWeekly": { "description": "Auto scan once per week" }, - "libraryActions": "Actions", + "libraryActions": "Tindakan", "@libraryActions": { "description": "Section header for library actions" }, - "libraryScan": "Scan Library", + "libraryScan": "Pindai Koleksi", "@libraryScan": { "description": "Button to start library scan" }, - "libraryScanSubtitle": "Scan for audio files", + "libraryScanSubtitle": "Pindai file audio", "@libraryScanSubtitle": { "description": "Subtitle for scan button" }, - "libraryScanSelectFolderFirst": "Select a folder first", + "libraryScanSelectFolderFirst": "Pilih folder terlebih dahulu", "@libraryScanSelectFolderFirst": { "description": "Message when trying to scan without folder" }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", + "libraryCleanupMissingFiles": "Bersihkan File Yang Hilang", "@libraryCleanupMissingFiles": { "description": "Button to remove entries for missing files" }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", + "libraryCleanupMissingFilesSubtitle": "Hapus file yang sudah tidak ada", "@libraryCleanupMissingFilesSubtitle": { "description": "Subtitle for cleanup button" }, - "libraryClear": "Clear Library", + "libraryClear": "Bersihkan Koleksi", "@libraryClear": { "description": "Button to clear all library entries" }, - "libraryClearSubtitle": "Remove all scanned tracks", + "libraryClearSubtitle": "Hapus semua lagu yang dipindai", "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, - "libraryClearConfirmTitle": "Clear Library", + "libraryClearConfirmTitle": "Bersihkan Koleksi", "@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": "Tindakan akan menghapus seluruh lagu yang dipindai dari koleksi Anda. File asli tidak akan terhapus.", "@libraryClearConfirmMessage": { "description": "Dialog message for clear confirmation" }, - "libraryAbout": "About Local Library", + "libraryAbout": "Tentang File Lokal", "@libraryAbout": { "description": "Section header for about info" }, @@ -2576,7 +2576,7 @@ "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", + "libraryTracksUnit": "{count, plural,=1{lagu} other{lagu}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2585,7 +2585,7 @@ } } }, - "libraryFilesUnit": "{count, plural, =1{file} other{files}}", + "libraryFilesUnit": "{count, plural,=1{file} other{file}}", "@libraryFilesUnit": { "description": "Unit label for files count during library scanning", "placeholders": { @@ -2594,7 +2594,7 @@ } } }, - "libraryLastScanned": "Last scanned: {time}", + "libraryLastScanned": "Terakhir dipindai: {time}", "@libraryLastScanned": { "description": "Last scan time display", "placeholders": { @@ -2603,19 +2603,19 @@ } } }, - "libraryLastScannedNever": "Never", + "libraryLastScannedNever": "Tidak pernah", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, - "libraryScanning": "Scanning...", + "libraryScanning": "Memindai...", "@libraryScanning": { "description": "Status during scan" }, - "libraryScanFinalizing": "Finalizing library...", + "libraryScanFinalizing": "Menyelesaikan pemindaian...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryScanProgress": "{progress}% of {total} files", + "libraryScanProgress": "{progress}% dari {total} file", "@libraryScanProgress": { "description": "Scan progress display", "placeholders": { @@ -2627,11 +2627,11 @@ } } }, - "libraryInLibrary": "In Library", + "libraryInLibrary": "Di Koleksi", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", + "libraryRemovedMissingFiles": "{count} file yang hilang dihapus dari koleksi", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2640,59 +2640,59 @@ } } }, - "libraryCleared": "Library cleared", + "libraryCleared": "Koleksi dibersihkan", "@libraryCleared": { "description": "Snackbar after clearing library" }, - "libraryStorageAccessRequired": "Storage Access Required", + "libraryStorageAccessRequired": "Butuh Akses Penyimpanan", "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", + "libraryStorageAccessMessage": "SpotiFLAC membutuhkan akses penyimpanan untuk memindai koleksi musik Anda. Harap berikan izin di setelan.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Selected folder does not exist", + "libraryFolderNotExist": "Folder yang dipilih tidak ada", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Downloaded", + "librarySourceDownloaded": "Terdownload", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, - "librarySourceLocal": "Local", + "librarySourceLocal": "Lokal", "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, - "libraryFilterAll": "All", + "libraryFilterAll": "Semua", "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Downloaded", + "libraryFilterDownloaded": "Terdownload", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, - "libraryFilterLocal": "Local", + "libraryFilterLocal": "Lokal", "@libraryFilterLocal": { "description": "Filter chip - show only local library items" }, - "libraryFilterTitle": "Filters", + "libraryFilterTitle": "Filter", "@libraryFilterTitle": { "description": "Filter bottom sheet title" }, - "libraryFilterReset": "Reset", + "libraryFilterReset": "Hapus", "@libraryFilterReset": { "description": "Reset all filters button" }, - "libraryFilterApply": "Apply", + "libraryFilterApply": "Terapkan", "@libraryFilterApply": { "description": "Apply filters button" }, - "libraryFilterSource": "Source", + "libraryFilterSource": "Sumber", "@libraryFilterSource": { "description": "Filter section - source type" }, - "libraryFilterQuality": "Quality", + "libraryFilterQuality": "Kualitas", "@libraryFilterQuality": { "description": "Filter section - audio quality" }, From 297cddf31dc7dd69b340e862dde47ab87eec80fa Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 20 Jul 2026 03:46:10 +0700 Subject: [PATCH 11/37] New translations app_en.arb (Portuguese) [ci skip] --- lib/l10n/arb/app_pt_PT.arb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index 81adf54b..ebfdea2e 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -3537,11 +3537,11 @@ "@collectionFavoriteArtistsEmptySubtitle": { "description": "Favorite artists empty state subtitle" }, - "collectionPlaylistEmptyTitle": "Playlist is empty", + "collectionPlaylistEmptyTitle": "A lista de reprodução está vazia", "@collectionPlaylistEmptyTitle": { "description": "Playlist empty state title" }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", + "collectionPlaylistEmptySubtitle": "", "@collectionPlaylistEmptySubtitle": { "description": "Playlist empty state subtitle" }, @@ -4102,11 +4102,11 @@ "@storageModeAppFolderSubtitle": { "description": "Subtitle for app folder storage mode" }, - "storageModeSaf": "Custom Folder (SAF)", + "storageModeSaf": "", "@storageModeSaf": { "description": "Storage mode option - Storage Access Framework" }, - "storageModeSafSubtitle": "Pick any folder, including SD card", + "storageModeSafSubtitle": "Escolha qualquer pasta, incluindo o cartão SD", "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, @@ -4839,7 +4839,7 @@ } } }, - "notifLibraryScanComplete": "Library scan complete", + "notifLibraryScanComplete": "", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, From 71c08501e79c4f3cbba0cbf6b126738f3ab0c5ea Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 20 Jul 2026 04:45:34 +0700 Subject: [PATCH 12/37] New translations app_en.arb (Portuguese) [ci skip] --- lib/l10n/arb/app_pt_PT.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index ebfdea2e..a9619c2a 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -4839,7 +4839,7 @@ } } }, - "notifLibraryScanComplete": "", + "notifLibraryScanComplete": "Library scan complete", "@notifLibraryScanComplete": { "description": "Notification title when library scan finishes" }, @@ -4874,11 +4874,11 @@ "@notifLibraryScanFailed": { "description": "Notification title when library scan fails" }, - "notifLibraryScanCancelled": "Library scan cancelled", + "notifLibraryScanCancelled": "Escaneamento de biblioteca cancelado", "@notifLibraryScanCancelled": { "description": "Notification title when library scan is cancelled by the user" }, - "notifLibraryScanStopped": "Scan stopped before completion.", + "notifLibraryScanStopped": "", "@notifLibraryScanStopped": { "description": "Notification body when library scan is cancelled" }, From 16b44d2d3a00b119d7b4a08f093f2398af251ced Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Mon, 20 Jul 2026 16:58:51 +0700 Subject: [PATCH 13/37] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 428 ++++++++++++++++++++-------------------- 1 file changed, 214 insertions(+), 214 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index c9b54b01..fdb99863 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -9,15 +9,15 @@ "@navHome": { "description": "Bottom navigation - Home tab" }, - "navLibrary": "Koleksi", + "navLibrary": "Pustaka", "@navLibrary": { "description": "Bottom navigation - Library tab" }, - "navSettings": "Setelan", + "navSettings": "Pengaturan", "@navSettings": { "description": "Bottom navigation - Settings tab" }, - "navStore": "Repo", + "navStore": "Repositori", "@navStore": { "description": "Bottom navigation - Extension store tab" }, @@ -29,7 +29,7 @@ "@homeSubtitle": { "description": "Subtitle shown below search box" }, - "homeEmptyTitle": "Tidak ada penyedia pencarian", + "homeEmptyTitle": "Belum ada penyedia pencarian", "@homeEmptyTitle": { "description": "Title shown on home when no providers are available yet" }, @@ -37,11 +37,11 @@ "@homeEmptySubtitle": { "description": "Subtitle shown on home when no providers are available yet" }, - "homeSupports": "Mendukung: URL Lagu, Album, Playlist, dan Artis", + "homeSupports": "Mendukung: URL Lagu, Album, Daftar Putar, dan Artis", "@homeSupports": { "description": "Info text about supported URL types" }, - "homeRecent": "Baru-baru ini", + "homeRecent": "Terbaru", "@homeRecent": { "description": "Section header for recent searches" }, @@ -57,15 +57,15 @@ "@historyFilterSingles": { "description": "Filter chip - show singles only" }, - "historySearchHint": "Cari histori...", + "historySearchHint": "Cari riwayat...", "@historySearchHint": { "description": "Search bar placeholder in history" }, - "settingsTitle": "Setelah", + "settingsTitle": "Pengaturan", "@settingsTitle": { "description": "Settings screen title" }, - "settingsDownload": "Download", + "settingsDownload": "Unduhan", "@settingsDownload": { "description": "Settings section - download options" }, @@ -85,11 +85,11 @@ "@settingsAbout": { "description": "Settings section - app info" }, - "downloadTitle": "Download", + "downloadTitle": "Unduhan", "@downloadTitle": { "description": "Download settings page title" }, - "downloadAskQualitySubtitle": "Tampilkan pemilih kualitas setiap mendownload", + "downloadAskQualitySubtitle": "Tampilkan pemilih kualitas untuk setiap unduhan", "@downloadAskQualitySubtitle": { "description": "Subtitle for ask quality toggle" }, @@ -97,15 +97,15 @@ "@downloadFilenameFormat": { "description": "Setting for output filename pattern" }, - "downloadSingleFilenameFormat": "Format Nama Format Single", + "downloadSingleFilenameFormat": "Format Nama Berkas Tunggal", "@downloadSingleFilenameFormat": { "description": "Setting for output filename pattern for singles/EPs" }, - "downloadSingleFilenameFormatDescription": "Atur nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.", + "downloadSingleFilenameFormatDescription": "Pola nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.", "@downloadSingleFilenameFormatDescription": { "description": "Subtitle description for single filename format setting" }, - "downloadFolderOrganization": "Atur Folder", + "downloadFolderOrganization": "Organisasi Folder", "@downloadFolderOrganization": { "description": "Title of the folder organization picker bottom sheet" }, @@ -125,7 +125,7 @@ "@appearanceThemeDark": { "description": "Dark theme" }, - "appearanceDynamicColor": "Dynamic Color", + "appearanceDynamicColor": "Warna Dinamis", "@appearanceDynamicColor": { "description": "Material You dynamic colors" }, @@ -133,7 +133,7 @@ "@appearanceDynamicColorSubtitle": { "description": "Subtitle for dynamic color" }, - "appearanceHistoryView": "Gaya Menu", + "appearanceHistoryView": "Gaya Tampilan Histori", "@appearanceHistoryView": { "description": "Layout style for history" }, @@ -149,7 +149,7 @@ "@optionsTitle": { "description": "Options settings page title" }, - "optionsPrimaryProvider": "Penyedia Utama", + "optionsPrimaryProvider": "Provider Utama", "@optionsPrimaryProvider": { "description": "Main search provider setting" }, @@ -157,7 +157,7 @@ "@optionsPrimaryProviderSubtitle": { "description": "Subtitle for primary provider" }, - "optionsUsingExtension": "Menggunakan penyedia: {extensionName}", + "optionsUsingExtension": "Menggunakan ekstensi: {extensionName}", "@optionsUsingExtension": { "description": "Shows active extension name", "placeholders": { @@ -178,15 +178,15 @@ "@optionsSwitchBack": { "description": "Hint to switch back from extension search" }, - "optionsAutoFallback": "Fallback Otomatis", + "optionsAutoFallback": "Layanan Cadangan", "@optionsAutoFallback": { "description": "Auto-retry with other services" }, - "optionsAutoFallbackSubtitle": "Gunakan layanan lain jika download gagal", + "optionsAutoFallbackSubtitle": "Coba layanan lain jika unduhan gagal", "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Gunakan Penyedia Ekstensi", + "optionsUseExtensionProviders": "Gunakan Provider Ekstensi", "@optionsUseExtensionProviders": { "description": "Legacy setting label for extension download providers" }, @@ -194,15 +194,15 @@ "@optionsUseExtensionProvidersOn": { "description": "Status when extension providers enabled" }, - "optionsUseExtensionProvidersOff": "Penyedia ekstensi belum dipilih", + "optionsUseExtensionProvidersOff": "Penyedia ekstensi diwajibkan", "@optionsUseExtensionProvidersOff": { "description": "Legacy status when extension providers would be disabled" }, - "optionsEmbedLyrics": "Download Lirik", + "optionsEmbedLyrics": "Sematkan Lirik", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" }, - "optionsEmbedLyricsSubtitle": "Download lirik saat mendownload lagu", + "optionsEmbedLyricsSubtitle": "Simpan lirik yang disinkronkan bersama dengan lagu yang Anda unduh", "@optionsEmbedLyricsSubtitle": { "description": "Subtitle for embed lyrics" }, @@ -210,7 +210,7 @@ "@optionsMaxQualityCover": { "description": "Download highest quality album art" }, - "optionsMaxQualityCoverSubtitle": "Unduh cover lagu dengan resolusi tertinggi", + "optionsMaxQualityCoverSubtitle": "Unduh cover art resolusi tertinggi", "@optionsMaxQualityCoverSubtitle": { "description": "Subtitle for max quality cover" }, @@ -259,7 +259,7 @@ "@replayGainBatchConfirmTitle": { "description": "Title of the batch ReplayGain confirmation dialog" }, - "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tulis tag ReplayGain ke {count} lagu?", + "replayGainBatchConfirmMessage": "Analisis kenyaringan dan tulis tag ReplayGain ke {count} trek?", "@replayGainBatchConfirmMessage": { "description": "Message of the batch ReplayGain confirmation dialog", "placeholders": { @@ -288,75 +288,75 @@ "@optionsArtistTagMode": { "description": "Setting title for how artist metadata is written into files" }, - "optionsArtistTagModeDescription": "Pilih bagaimana cara mencantumkan beberapa artis dalam metadata lagu", + "optionsArtistTagModeDescription": "Pilih bagaimana beberapa artis dicantumkan dalam tag yang disematkan.", "@optionsArtistTagModeDescription": { "description": "Bottom-sheet description for artist tag mode setting" }, - "optionsArtistTagModeJoined": "Satukan tag", + "optionsArtistTagModeJoined": "Nilai gabungan tunggal", "@optionsArtistTagModeJoined": { "description": "Artist tag mode option that joins multiple artists into one value" }, - "optionsArtistTagModeJoinedSubtitle": "Tulis seluruh artis dalam satu tag seperti \"Artis A, Artis B\" agar mendukung lebih banyak pemutar audio.", + "optionsArtistTagModeJoinedSubtitle": "Tuliskan satu nilai ARTIS seperti \"Artis A, Artis B\" untuk kompatibilitas pemain maksimal.", "@optionsArtistTagModeJoinedSubtitle": { "description": "Subtitle for joined artist tag mode" }, - "optionsArtistTagModeSplitVorbis": "Pisahkan tag (hanya file FLAC/Opus)", + "optionsArtistTagModeSplitVorbis": "Tag terpisah untuk FLAC/Opus", "@optionsArtistTagModeSplitVorbis": { "description": "Artist tag mode option that writes repeated ARTIST tags for Vorbis formats" }, - "optionsArtistTagModeSplitVorbisSubtitle": "Hanya menggunakan satu tag untuk satu nama artis (jika file tujuan adalah MP3 dan MP4, nama artis akan disatukan).", + "optionsArtistTagModeSplitVorbisSubtitle": "Tulis satu tag artis per artis untuk FLAC dan Opus; MP3 dan M4A tetap tergabung.", "@optionsArtistTagModeSplitVorbisSubtitle": { "description": "Subtitle for split Vorbis artist tag mode" }, - "optionsExtensionStore": "Repo", + "optionsExtensionStore": "Repositori Ekstensi", "@optionsExtensionStore": { "description": "Show/hide store tab" }, - "optionsExtensionStoreSubtitle": "Tampilkan tab Repo di bar navigasi", + "optionsExtensionStoreSubtitle": "Tampilkan tab Repo di navigasi", "@optionsExtensionStoreSubtitle": { "description": "Subtitle for extension store toggle" }, - "optionsCheckUpdates": "Periksa Update", + "optionsCheckUpdates": "Periksa Pembaruan", "@optionsCheckUpdates": { "description": "Auto update check toggle" }, - "optionsCheckUpdatesSubtitle": "Beritahu saat ada versi baru", + "optionsCheckUpdatesSubtitle": "Beritahu saat versi baru tersedia", "@optionsCheckUpdatesSubtitle": { "description": "Subtitle for update check" }, - "optionsUpdateChannel": "Versi Update", + "optionsUpdateChannel": "Saluran Pembaruan", "@optionsUpdateChannel": { "description": "Stable vs preview releases" }, - "optionsUpdateChannelStable": "Hanya mendapatkan update versi stabil", + "optionsUpdateChannelStable": "Hanya rilis stabil", "@optionsUpdateChannelStable": { "description": "Only stable updates" }, - "optionsUpdateChannelPreview": "Mendapatkan update versi preview (beta)", + "optionsUpdateChannelPreview": "Dapatkan rilis preview", "@optionsUpdateChannelPreview": { "description": "Include beta/preview updates" }, - "optionsUpdateChannelWarning": "Menggunakan versi preview mungkin ada lebih banyak bug dan banyak fitur yang masih diuji coba", + "optionsUpdateChannelWarning": "Preview mungkin mengandung bug atau fitur belum lengkap", "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "Hapus Histori Download", + "optionsClearHistory": "Hapus Riwayat Unduhan", "@optionsClearHistory": { "description": "Delete all download history" }, - "optionsClearHistorySubtitle": "Hapus semua lagu dari histor", + "optionsClearHistorySubtitle": "Hapus semua lagu dari riwayat", "@optionsClearHistorySubtitle": { "description": "Subtitle for clear history" }, - "optionsDetailedLogging": "Rekam Log", + "optionsDetailedLogging": "Log Detail", "@optionsDetailedLogging": { "description": "Enable verbose logs for debugging" }, - "optionsDetailedLoggingOn": "Log sedang direkam", + "optionsDetailedLoggingOn": "Log detail sedang direkam", "@optionsDetailedLoggingOn": { "description": "Status when logging enabled" }, - "optionsDetailedLoggingOff": "Aktifkan jika ingin melapor bug", + "optionsDetailedLoggingOff": "Aktifkan untuk laporan bug", "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, @@ -364,7 +364,7 @@ "@optionsSpotifyCredentials": { "description": "Spotify API credentials setting" }, - "optionsSpotifyCredentialsConfigured": "ID Client: {clientId}...", + "optionsSpotifyCredentialsConfigured": "ID Klien: {clientId}...", "@optionsSpotifyCredentialsConfigured": { "description": "Shows configured client ID preview", "placeholders": { @@ -377,7 +377,7 @@ "@optionsSpotifyCredentialsRequired": { "description": "Prompt to set up credentials" }, - "optionsSpotifyWarning": "Anda membutuhkan kredensial API Spotify jika ingin menggunakan ini. Dapatkan gratis dari developer.spotify.com", + "optionsSpotifyWarning": "Spotify memerlukan kredensial API Anda sendiri. Dapatkan gratis dari developer.spotify.com", "@optionsSpotifyWarning": { "description": "Info about Spotify API requirement" }, @@ -411,11 +411,11 @@ } } }, - "extensionsUninstall": "Uninstal", + "extensionsUninstall": "Copot", "@extensionsUninstall": { "description": "Uninstall extension button" }, - "storeTitle": "Repo", + "storeTitle": "Repositori Ekstensi", "@storeTitle": { "description": "Store screen title" }, @@ -423,15 +423,15 @@ "@storeSearch": { "description": "Store search placeholder" }, - "storeInstall": "Instal", + "storeInstall": "Pasang", "@storeInstall": { "description": "Install extension button" }, - "storeInstalled": "Terinstal", + "storeInstalled": "Terpasang", "@storeInstalled": { "description": "Already installed badge" }, - "storeUpdate": "Update", + "storeUpdate": "Perbarui", "@storeUpdate": { "description": "Update available button" }, @@ -443,7 +443,7 @@ "@aboutContributors": { "description": "Section for contributors" }, - "aboutMobileDeveloper": "Developer versi mobile", + "aboutMobileDeveloper": "Pengembang versi mobile", "@aboutMobileDeveloper": { "description": "Role description for mobile dev" }, @@ -451,7 +451,7 @@ "@aboutOriginalCreator": { "description": "Role description for original creator" }, - "aboutLogoArtist": "Artist ter-goks yang membuat logo cantik untuk aplikasi!", + "aboutLogoArtist": "Seniman berbakat yang membuat logo aplikasi kita yang indah!", "@aboutLogoArtist": { "description": "Role description for logo artist" }, @@ -463,19 +463,19 @@ "@aboutSpecialThanks": { "description": "Section for special thanks" }, - "aboutLinks": "Link", + "aboutLinks": "Tautan", "@aboutLinks": { "description": "Section for external links" }, - "aboutMobileSource": "Source code versi mobile", + "aboutMobileSource": "Kode sumber mobile", "@aboutMobileSource": { "description": "Link to mobile GitHub repo" }, - "aboutPCSource": "Source code versi PC", + "aboutPCSource": "Kode sumber PC", "@aboutPCSource": { "description": "Link to PC GitHub repo" }, - "aboutKeepAndroidOpen": "Keep Android Open", + "aboutKeepAndroidOpen": "Biarkan Android tetap terbuka", "@aboutKeepAndroidOpen": { "description": "Link to Keep Android Open campaign website" }, @@ -495,11 +495,11 @@ "@aboutFeatureRequestSubtitle": { "description": "Subtitle for feature request" }, - "aboutTelegramChannel": "Channel Telegram", + "aboutTelegramChannel": "Saluran Telegram", "@aboutTelegramChannel": { "description": "Link to Telegram channel" }, - "aboutTelegramChannelSubtitle": "Pengumuman dan update", + "aboutTelegramChannelSubtitle": "Pengumuman dan pembaruan", "@aboutTelegramChannelSubtitle": { "description": "Subtitle for Telegram channel" }, @@ -507,11 +507,11 @@ "@aboutTelegramChat": { "description": "Link to Telegram chat group" }, - "aboutTelegramChatSubtitle": "Chat dengan sesama pengguna", + "aboutTelegramChatSubtitle": "Berbincang dengan pengguna lain", "@aboutTelegramChatSubtitle": { "description": "Subtitle for Telegram chat" }, - "aboutSocial": "Media Sosial", + "aboutSocial": "Sosial", "@aboutSocial": { "description": "Section for social links" }, @@ -523,19 +523,19 @@ "@aboutVersion": { "description": "Version info label" }, - "aboutBinimumDesc": "Pembuat QQDL & HiFi API. Proyeknya membantu aplikasi ini mendukung download format lossless.", + "aboutBinimumDesc": "Pencipta QQDL & HiFi API. Proyek ini membantu membentuk dukungan unduhan lossless.", "@aboutBinimumDesc": { "description": "Credit description for binimum" }, - "aboutSachinsenalDesc": "Pembuat proyek HiFi. Sebuah fondasi untuk integrasi sumber lossless.", + "aboutSachinsenalDesc": "Pencipta proyek HiFi asli. Sebuah fondasi untuk integrasi sumber lossless.", "@aboutSachinsenalDesc": { "description": "Credit description for sachinsenal0x64" }, - "aboutSjdonadoDesc": "Pembuat I Don't Have Spotify (IDHS). Resolver link fallback yang menyelesaikan masalah Anda!", + "aboutSjdonadoDesc": "Pencipta I Don't Have Spotify (IDHS). Penyelesai tautan cadangan yang menyelamatkan keadaan!", "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "Cari metadata lagu, kelola ekstensi, dan atur perpustakaan Anda.", + "aboutAppDescription": "Cari metadata musik, kelola ekstensi, dan atur perpustakaan Anda.", "@aboutAppDescription": { "description": "App description in header card" }, @@ -589,11 +589,11 @@ "@setupSkip": { "description": "Skip current step button" }, - "setupStorageAccessRequired": "Butuh Akses Penyimpanan", + "setupStorageAccessRequired": "Akses Penyimpanan Diperlukan", "@setupStorageAccessRequired": { "description": "Title when storage access needed" }, - "setupStorageAccessMessageAndroid11": "Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder download pilihan Anda.", + "setupStorageAccessMessageAndroid11": "Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder unduhan pilihan Anda.", "@setupStorageAccessMessageAndroid11": { "description": "Android 11+ specific explanation" }, @@ -605,7 +605,7 @@ "@setupPermissionDeniedMessage": { "description": "Error when permission denied" }, - "setupPermissionRequired": "Butuh izin {permissionType}", + "setupPermissionRequired": "Izin {permissionType} Diperlukan", "@setupPermissionRequired": { "description": "Generic permission required title", "placeholders": { @@ -615,7 +615,7 @@ } } }, - "setupPermissionRequiredMessage": "Butuh izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.", + "setupPermissionRequiredMessage": "Izin {permissionType} diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.", "@setupPermissionRequiredMessage": { "description": "Generic permission required message", "placeholders": { @@ -636,7 +636,7 @@ "@setupUseDefault": { "description": "Button to use default folder" }, - "setupDownloadLocationTitle": "Lokasi Download", + "setupDownloadLocationTitle": "Lokasi Unduhan", "@setupDownloadLocationTitle": { "description": "Download location dialog title" }, @@ -676,7 +676,7 @@ "@setupStorageGranted": { "description": "Success message for storage permission" }, - "setupStorageRequired": "Butuh Izin Penyimpanan", + "setupStorageRequired": "Izin Penyimpanan Diperlukan", "@setupStorageRequired": { "description": "Title when storage permission needed" }, @@ -692,11 +692,11 @@ "@setupNotificationEnable": { "description": "Button to enable notifications" }, - "setupFolderChoose": "Pilih Folder Download", + "setupFolderChoose": "Pilih Folder Unduhan", "@setupFolderChoose": { "description": "Button to choose folder" }, - "setupFolderDescription": "Pilih folder tempat lagu yang di-download akan disimpan.", + "setupFolderDescription": "Pilih folder tempat musik yang diunduh akan disimpan.", "@setupFolderDescription": { "description": "Explanation for folder selection" }, @@ -708,7 +708,7 @@ "@setupEnableNotifications": { "description": "Button to enable notifications" }, - "setupNotificationBackgroundDescription": "Dapatkan notifikasi tentang progres download. Ini membantu Anda mengetahui progres download Anda saat aplikasi di latar belakang.", + "setupNotificationBackgroundDescription": "Dapatkan notifikasi tentang progres dan penyelesaian unduhan. Ini membantu Anda melacak unduhan saat aplikasi di latar belakang.", "@setupNotificationBackgroundDescription": { "description": "Detailed notification explanation" }, @@ -768,23 +768,23 @@ "@dialogImport": { "description": "Dialog button - import data" }, - "dialogDownload": "Download", + "dialogDownload": "Unduh", "@dialogDownload": { "description": "Confirm button in Download All dialog" }, - "previewPlay": "Putar preview", + "previewPlay": "Putar pratinjau", "@previewPlay": { "description": "Tooltip for the button that plays a short track preview snippet" }, - "previewStop": "Hentikan preview", + "previewStop": "Hentikan pratinjau", "@previewStop": { "description": "Tooltip for the button that stops the playing track preview snippet" }, - "previewUnavailable": "preview tidak tersedia", + "previewUnavailable": "Pratinjau tidak tersedia", "@previewUnavailable": { "description": "Snackbar shown when a track preview snippet cannot be played" }, - "dialogDiscard": "Batal", + "dialogDiscard": "Buang", "@dialogDiscard": { "description": "Dialog button - discard changes" }, @@ -792,15 +792,15 @@ "@dialogRemove": { "description": "Dialog button - remove item" }, - "dialogUninstall": "Uninstal", + "dialogUninstall": "Copot", "@dialogUninstall": { "description": "Dialog button - uninstall extension" }, - "dialogDiscardChanges": "Batalkan Perubahan?", + "dialogDiscardChanges": "Buang Perubahan?", "@dialogDiscardChanges": { "description": "Dialog title - unsaved changes warning" }, - "dialogUnsavedChanges": "Anda memiliki perubahan yang belum disimpan. Apakah Anda ingin membatalkannya?", + "dialogUnsavedChanges": "Anda memiliki perubahan yang belum disimpan. Apakah Anda ingin membuangnya?", "@dialogUnsavedChanges": { "description": "Dialog message - unsaved changes" }, @@ -816,7 +816,7 @@ "@dialogRemoveExtensionMessage": { "description": "Dialog message - uninstall confirmation" }, - "dialogUninstallExtension": "Uninstal Ekstensi?", + "dialogUninstallExtension": "Copot Ekstensi?", "@dialogUninstallExtension": { "description": "Dialog title - uninstall extension" }, @@ -829,11 +829,11 @@ } } }, - "dialogClearHistoryTitle": "Hapus Histori", + "dialogClearHistoryTitle": "Hapus Riwayat", "@dialogClearHistoryTitle": { "description": "Dialog title - clear download history" }, - "dialogClearHistoryMessage": "Apakah Anda yakin ingin menghapus semua histori download? Ini tidak dapat dibatalkan.", + "dialogClearHistoryMessage": "Apakah Anda yakin ingin menghapus semua riwayat unduhan? Ini tidak dapat dibatalkan.", "@dialogClearHistoryMessage": { "description": "Dialog message - clear history confirmation" }, @@ -841,7 +841,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Hapus {count} {count, plural, =1{lagu} other{lagu}} dari histori?\n\nIni juga akan menghapus file dari penyimpanan.", + "dialogDeleteSelectedMessage": "Hapus {count} {count, plural, =1{lagu} other{lagu}} dari riwayat?\n\nIni juga akan menghapus file dari penyimpanan.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -854,8 +854,8 @@ "@dialogImportPlaylistTitle": { "description": "Dialog title - import CSV playlist" }, - "dialogImportPlaylistMessage": "Ditemukan {count} lagu di CSV. Tambahkan ke antrean download?", - "csvImportTracks": "{count} lagu dari CSV", + "dialogImportPlaylistMessage": "Ditemukan {count} lagu di CSV. Tambahkan ke antrian unduhan?", + "csvImportTracks": "{count} trek dari CSV", "@csvImportTracks": { "description": "Label shown in quality picker for CSV import", "placeholders": { @@ -872,7 +872,7 @@ } } }, - "snackbarAddedToQueue": "Menambahkan \"{trackName}\" ke antrean", + "snackbarAddedToQueue": "Menambahkan \"{trackName}\" ke antrian", "@snackbarAddedToQueue": { "description": "Snackbar - track added to download queue", "placeholders": { @@ -881,7 +881,7 @@ } } }, - "snackbarAddedTracksToQueue": "Menambahkan {count} lagu ke antrean", + "snackbarAddedTracksToQueue": "Menambahkan {count} lagu ke antrian", "@snackbarAddedTracksToQueue": { "description": "Snackbar - multiple tracks added to queue", "placeholders": { @@ -890,7 +890,7 @@ } } }, - "snackbarAlreadyDownloaded": "\"{trackName}\" sudah didownload", + "snackbarAlreadyDownloaded": "\"{trackName}\" sudah diunduh", "@snackbarAlreadyDownloaded": { "description": "Snackbar - track already exists", "placeholders": { @@ -899,7 +899,7 @@ } } }, - "snackbarAlreadyInLibrary": "\"{trackName}\" sudah ada di koleksi Anda", + "snackbarAlreadyInLibrary": "\"{trackName}\" sudah ada di perpustakaan Anda", "@snackbarAlreadyInLibrary": { "description": "Snackbar - track already exists in local library", "placeholders": { @@ -908,7 +908,7 @@ } } }, - "snackbarHistoryCleared": "Histori dihapus", + "snackbarHistoryCleared": "Riwayat dihapus", "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, @@ -938,11 +938,11 @@ } } }, - "snackbarFillAllFields": "Harap isi seluruh kolom", + "snackbarFillAllFields": "Harap isi semua field", "@snackbarFillAllFields": { "description": "Snackbar - validation error" }, - "snackbarViewQueue": "Lihat Antrean", + "snackbarViewQueue": "Lihat Antrian", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" }, @@ -964,15 +964,15 @@ "@snackbarSelectExtFile": { "description": "Snackbar - wrong file type selected" }, - "snackbarProviderPrioritySaved": "Prioritas penyedia disimpan", + "snackbarProviderPrioritySaved": "Prioritas provider disimpan", "@snackbarProviderPrioritySaved": { "description": "Snackbar - provider order saved" }, - "snackbarMetadataProviderSaved": "Prioritas penyedia metadata disimpan", + "snackbarMetadataProviderSaved": "Prioritas provider metadata disimpan", "@snackbarMetadataProviderSaved": { "description": "Snackbar - metadata provider order saved" }, - "snackbarExtensionInstalled": "{extensionName} terinstal.", + "snackbarExtensionInstalled": "{extensionName} terpasang.", "@snackbarExtensionInstalled": { "description": "Snackbar - extension installed successfully", "placeholders": { @@ -981,7 +981,7 @@ } } }, - "snackbarExtensionUpdated": "{extensionName} diupdate.", + "snackbarExtensionUpdated": "{extensionName} diperbarui.", "@snackbarExtensionUpdated": { "description": "Snackbar - extension updated successfully", "placeholders": { @@ -990,11 +990,11 @@ } } }, - "snackbarFailedToInstall": "Gagal menginstal ekstensi", + "snackbarFailedToInstall": "Gagal memasang ekstensi", "@snackbarFailedToInstall": { "description": "Snackbar - extension install error" }, - "snackbarFailedToUpdate": "Gagal mengupdate ekstensi", + "snackbarFailedToUpdate": "Gagal memperbarui ekstensi", "@snackbarFailedToUpdate": { "description": "Snackbar - extension update error" }, @@ -1014,15 +1014,15 @@ "@searchEmptyResultSubtitle": { "description": "Subtitle shown under the empty search result state on the home screen" }, - "errorUrlNotRecognized": "Link tidak dikenali", + "errorUrlNotRecognized": "Tautan tidak dikenali", "@errorUrlNotRecognized": { "description": "Error title - URL not handled by any extension or service" }, - "errorUrlNotRecognizedMessage": "Link ini tidak didukung. Pastikan URL sudah benar dan ekstensi yang kompatibel telah terpasang.", + "errorUrlNotRecognizedMessage": "Tautan ini tidak didukung. Pastikan URL sudah benar dan ekstensi yang kompatibel telah terpasang.", "@errorUrlNotRecognizedMessage": { "description": "Error message - URL not recognized explanation" }, - "errorUrlFetchFailed": "Konten dari link ini gagal dimuat. Silakan coba lagi.", + "errorUrlFetchFailed": "Konten dari tautan ini gagal dimuat. Silakan coba lagi.", "@errorUrlFetchFailed": { "description": "Error message - generic URL fetch failure" }, @@ -1164,7 +1164,7 @@ "@filenameShowAdvancedTags": { "description": "Toggle label for showing advanced filename tags" }, - "filenameShowAdvancedTagsDescription": "Aktifkan tag yang diformat untuk padding lagu dan pola tanggal", + "filenameShowAdvancedTagsDescription": "Aktifkan tag yang diformat untuk padding trek dan pola tanggal", "@filenameShowAdvancedTagsDescription": { "description": "Description for advanced filename tag toggle" }, @@ -1172,7 +1172,7 @@ "@folderOrganizationNone": { "description": "Folder option - flat structure" }, - "folderOrganizationByPlaylist": "Berdasarkan Playlist", + "folderOrganizationByPlaylist": "Berdasarkan Daftar Putar", "@folderOrganizationByPlaylist": { "description": "Folder option - playlist folders" }, @@ -1192,11 +1192,11 @@ "@folderOrganizationByArtistAlbum": { "description": "Folder option - nested folders" }, - "folderOrganizationDescription": "Atur file yang didownload ke dalam folder", + "folderOrganizationDescription": "Atur file yang diunduh ke dalam folder", "@folderOrganizationDescription": { "description": "Folder organization sheet description" }, - "folderOrganizationNoneSubtitle": "Semua file di folder download", + "folderOrganizationNoneSubtitle": "Semua file di folder unduhan", "@folderOrganizationNoneSubtitle": { "description": "Subtitle for no organization option" }, @@ -1212,7 +1212,7 @@ "@folderOrganizationByArtistAlbumSubtitle": { "description": "Subtitle for nested folder option" }, - "updateAvailable": "Update Tersedia", + "updateAvailable": "Pembaruan Tersedia", "@updateAvailable": { "description": "Update dialog title" }, @@ -1220,15 +1220,15 @@ "@updateLater": { "description": "Update button - dismiss" }, - "updateStartingDownload": "Mendownload...", + "updateStartingDownload": "Memulai unduhan...", "@updateStartingDownload": { "description": "Update status - initializing" }, - "updateDownloadFailed": "Download gagal", + "updateDownloadFailed": "Unduhan gagal", "@updateDownloadFailed": { "description": "Update error title" }, - "updateFailedMessage": "Gagal mendownload update", + "updateFailedMessage": "Gagal mengunduh pembaruan", "@updateFailedMessage": { "description": "Update error message" }, @@ -1236,7 +1236,7 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateCurrent": "Sekarang", + "updateCurrent": "Saat ini", "@updateCurrent": { "description": "Label for current version" }, @@ -1244,15 +1244,15 @@ "@updateNew": { "description": "Label for new version" }, - "updateDownloading": "Mendownload...", + "updateDownloading": "Mengunduh...", "@updateDownloading": { "description": "Update status - downloading" }, - "updateWhatsNew": "Apa Yang Baru", + "updateWhatsNew": "Apa yang baru", "@updateWhatsNew": { "description": "Changelog section title" }, - "updateDownloadInstall": "Download & Instal", + "updateDownloadInstall": "Unduh & Pasang", "@updateDownloadInstall": { "description": "Update button - download and install" }, @@ -1260,15 +1260,15 @@ "@updateDontRemind": { "description": "Update button - skip this version" }, - "providerPriorityTitle": "Prioritas Penyedia", + "providerPriorityTitle": "Prioritas Provider", "@providerPriorityTitle": { "description": "Provider priority page title" }, - "providerPriorityDescription": "Seret untuk mengatur ulang urutan penyedia download. Aplikasi akan mencoba penyedia dari atas ke bawah saat mengunduh lagu.", + "providerPriorityDescription": "Seret untuk mengatur ulang urutan provider unduhan. Aplikasi akan mencoba provider dari atas ke bawah saat mengunduh lagu.", "@providerPriorityDescription": { "description": "Provider priority page description" }, - "providerPriorityInfo": "Jika lagu tidak tersedia di penyedia pertama, aplikasi akan otomatis mencoba yang berikutnya.", + "providerPriorityInfo": "Jika lagu tidak tersedia di provider pertama, aplikasi akan otomatis mencoba yang berikutnya.", "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, @@ -1276,15 +1276,15 @@ "@providerPriorityFallbackExtensionsTitle": { "description": "Section title for choosing which download extensions can be used as fallback providers" }, - "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi download terinstal mana yang dapat digunakan selama fallback otomatis.", + "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi unduhan terpasang mana yang dapat digunakan selama fallback otomatis.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" }, - "providerPriorityFallbackExtensionsHint": "Hanya ekstensi yang diaktifkan dengan kemampuan penyedia download yang tercantum di sini.", + "providerPriorityFallbackExtensionsHint": "Hanya ekstensi yang diaktifkan dengan kemampuan penyedia unduhan yang tercantum di sini.", "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Fitur Lama", + "providerBuiltIn": "Warisan", "@providerBuiltIn": { "description": "Legacy label retained for old generated localization compatibility" }, @@ -1296,19 +1296,19 @@ "@metadataProviderPriorityTitle": { "description": "Metadata priority page title" }, - "metadataProviderPriorityDescription": "Seret untuk mengatur ulang urutan penyedia metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.", + "metadataProviderPriorityDescription": "Seret untuk mengatur ulang urutan provider metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.", "@metadataProviderPriorityDescription": { "description": "Metadata priority page description" }, - "metadataProviderPriorityInfo": "Deezer tidak memiliki batas akses dan direkomendasikan sebagai utama. Spotify mungkin akan membatasi akses Anda jika menerima terlalu banyak permintaan.", + "metadataProviderPriorityInfo": "Deezer tidak memiliki batas rate dan direkomendasikan sebagai utama. Spotify mungkin membatasi rate setelah banyak permintaan.", "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Tidak dibatasi aksesnya", + "metadataNoRateLimits": "Tidak ada batas rate", "@metadataNoRateLimits": { "description": "Deezer provider description" }, - "metadataMayRateLimit": "Mungkin dibatasi aksesnya", + "metadataMayRateLimit": "Mungkin dibatasi rate", "@metadataMayRateLimit": { "description": "Spotify provider description" }, @@ -1394,7 +1394,7 @@ "@credentialsClientIdHint": { "description": "Client ID placeholder" }, - "credentialsClientSecret": "Client Secret", + "credentialsClientSecret": "Rahasia Klien", "@credentialsClientSecret": { "description": "Client Secret field label - DO NOT TRANSLATE" }, @@ -1406,7 +1406,7 @@ "@channelStable": { "description": "Update channel - stable releases" }, - "channelPreview": "Preview", + "channelPreview": "Pratinjau", "@channelPreview": { "description": "Update channel - beta/preview releases" }, @@ -1414,7 +1414,7 @@ "@sectionSearchSource": { "description": "Settings section header" }, - "sectionDownload": "Download", + "sectionDownload": "Unduhan", "@sectionDownload": { "description": "Settings section header" }, @@ -1442,7 +1442,7 @@ "@sectionAudioQuality": { "description": "Settings section header" }, - "sectionFileSettings": "Setelan File", + "sectionFileSettings": "Pengaturan File", "@sectionFileSettings": { "description": "Settings section header" }, @@ -1454,23 +1454,23 @@ "@lyricsMode": { "description": "Setting - how to save lyrics" }, - "lyricsModeDescription": "Pilih cara lirik disimpan bersama lagu yang Anda download", + "lyricsModeDescription": "Pilih cara lirik disimpan bersama unduhan Anda", "@lyricsModeDescription": { "description": "Lyrics mode picker description" }, - "lyricsModeEmbed": "Jadikan metadata", + "lyricsModeEmbed": "Sematkan dalam file", "@lyricsModeEmbed": { "description": "Lyrics mode option - embed in audio file" }, - "lyricsModeEmbedSubtitle": "Simpan di dalam metadata FLAC", + "lyricsModeEmbedSubtitle": "Lirik tersimpan di dalam metadata FLAC", "@lyricsModeEmbedSubtitle": { "description": "Subtitle for embed option" }, - "lyricsModeExternal": "Jadikan file .lrc", + "lyricsModeExternal": "File .lrc eksternal", "@lyricsModeExternal": { "description": "Lyrics mode option - separate LRC file" }, - "lyricsModeExternalSubtitle": "Pisahkan menjadi file .lrc untuk digunakan di pemutar musik seperti Samsung Music", + "lyricsModeExternalSubtitle": "File .lrc terpisah untuk pemutar musik seperti Samsung Music", "@lyricsModeExternalSubtitle": { "description": "Subtitle for external option" }, @@ -1478,7 +1478,7 @@ "@lyricsModeBoth": { "description": "Lyrics mode option - embed and external" }, - "lyricsModeBothSubtitle": "Simpan di dalam metadata dan simpan file .lrc", + "lyricsModeBothSubtitle": "Sematkan dan simpan file .lrc", "@lyricsModeBothSubtitle": { "description": "Subtitle for both option" }, @@ -1510,11 +1510,11 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Cadangan, metadata, lirik, cover album", + "settingsOptionsSubtitle": "Cadangan, metadata, lirik, sampul album", "@settingsOptionsSubtitle": { "description": "Options settings description" }, - "settingsExtensionsSubtitle": "Kelola penyedia download", + "settingsExtensionsSubtitle": "Kelola provider unduhan", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" }, @@ -1530,7 +1530,7 @@ "@pressBackAgainToExit": { "description": "Exit confirmation message" }, - "downloadAllCount": "Download Semua ({count})", + "downloadAllCount": "Unduh Semua ({count})", "@downloadAllCount": { "description": "Download all button with count", "placeholders": { @@ -1632,7 +1632,7 @@ "@trackCopyright": { "description": "Metadata label - copyright information" }, - "trackDownloaded": "Terdownload", + "trackDownloaded": "Diunduh", "@trackDownloaded": { "description": "Metadata label - download date" }, @@ -2318,7 +2318,7 @@ "@discographyDownloadAll": { "description": "Option - download entire discography" }, - "discographyDownloadAllSubtitle": "{count} lagu dari {albumCount} rilisan", + "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", "@discographyDownloadAllSubtitle": { "description": "Subtitle showing total tracks and albums", "placeholders": { @@ -2330,11 +2330,11 @@ } } }, - "discographyAlbumsOnly": "Album Saja", + "discographyAlbumsOnly": "Albums Only", "@discographyAlbumsOnly": { "description": "Option - download only albums" }, - "discographyAlbumsOnlySubtitle": "{count} lagu dari {albumCount} album", + "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", "@discographyAlbumsOnlySubtitle": { "description": "Subtitle showing album tracks count", "placeholders": { @@ -2346,11 +2346,11 @@ } } }, - "discographySinglesOnly": "Single & EP Saja", + "discographySinglesOnly": "Singles & EPs Only", "@discographySinglesOnly": { "description": "Option - download only singles" }, - "discographySinglesOnlySubtitle": "{count} lagu dari {albumCount} single", + "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", "@discographySinglesOnlySubtitle": { "description": "Subtitle showing singles tracks count", "placeholders": { @@ -2362,19 +2362,19 @@ } } }, - "discographySelectAlbums": "Pilih Album", + "discographySelectAlbums": "Select Albums...", "@discographySelectAlbums": { "description": "Option - manually select albums to download" }, - "discographySelectAlbumsSubtitle": "Pilih salah satu album atau single", + "discographySelectAlbumsSubtitle": "Choose specific albums or singles", "@discographySelectAlbumsSubtitle": { "description": "Subtitle for select albums option" }, - "discographyFetchingTracks": "Mendapatkan informasi lagu...", + "discographyFetchingTracks": "Fetching tracks...", "@discographyFetchingTracks": { "description": "Progress - fetching album tracks" }, - "discographyFetchingAlbum": "Mendapatkan {current} dari {total} informasi lagu...", + "discographyFetchingAlbum": "Fetching {current} of {total}...", "@discographyFetchingAlbum": { "description": "Progress - fetching specific album", "placeholders": { @@ -2386,7 +2386,7 @@ } } }, - "discographySelectedCount": "{count} dipilih", + "discographySelectedCount": "{count} selected", "@discographySelectedCount": { "description": "Selection count badge", "placeholders": { @@ -2395,11 +2395,11 @@ } } }, - "discographyDownloadSelected": "Download Dipilih", + "discographyDownloadSelected": "Download Selected", "@discographyDownloadSelected": { "description": "Button - download selected albums" }, - "discographyAddedToQueue": "Menambahkan {count} lagu ke antrean", + "discographyAddedToQueue": "Added {count} tracks to queue", "@discographyAddedToQueue": { "description": "Snackbar - tracks added from discography", "placeholders": { @@ -2408,7 +2408,7 @@ } } }, - "discographySkippedDownloaded": "{added} ditambahkan, {skipped} sudah di-download", + "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", "@discographySkippedDownloaded": { "description": "Snackbar - with skipped tracks count", "placeholders": { @@ -2420,155 +2420,155 @@ } } }, - "discographyNoAlbums": "Tidak ada album tersedia", + "discographyNoAlbums": "No albums available", "@discographyNoAlbums": { "description": "Error - no albums found for artist" }, - "discographyFailedToFetch": "Gagal mendapatkan info beberapa album", + "discographyFailedToFetch": "Failed to fetch some albums", "@discographyFailedToFetch": { "description": "Error - some albums failed to load" }, - "sectionStorageAccess": "Akses Penyimpanan", + "sectionStorageAccess": "Storage Access", "@sectionStorageAccess": { "description": "Section header for storage access settings" }, - "allFilesAccess": "Akses Semua File", + "allFilesAccess": "All Files Access", "@allFilesAccess": { "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" }, - "allFilesAccessEnabledSubtitle": "Boleh menyimpan di folder manapun", + "allFilesAccessEnabledSubtitle": "Can write to any folder", "@allFilesAccessEnabledSubtitle": { "description": "Subtitle when all files access is enabled" }, - "allFilesAccessDisabledSubtitle": "Hanya ke folder media", + "allFilesAccessDisabledSubtitle": "Limited to media folders only", "@allFilesAccessDisabledSubtitle": { "description": "Subtitle when all files access is disabled" }, - "allFilesAccessDescription": "Hidupkan ini jika Anda mengalami eror saat mencoba menyimpan ke folder pilihan.", + "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": "Izin ditolak. Harap hidupkan 'Akses semua file' secara manual lewat setelan", + "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", "@allFilesAccessDeniedMessage": { "description": "Message when permission is permanently denied" }, - "allFilesAccessDisabledMessage": "Akses semua file dimatikan. Aplikasi menggunakan akses penyimpanan terbatas.", + "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", "@allFilesAccessDisabledMessage": { "description": "Snackbar message when user disables all files access" }, - "settingsLocalLibrary": "File Lokal", + "settingsLocalLibrary": "Local Library", "@settingsLocalLibrary": { "description": "Settings menu item - local library" }, - "settingsLocalLibrarySubtitle": "Pindai lagu & cari duplikat", + "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", "@settingsLocalLibrarySubtitle": { "description": "Subtitle for local library settings" }, - "settingsCache": "Penyimpanan & Cache", + "settingsCache": "Storage & Cache", "@settingsCache": { "description": "Settings menu item - cache management" }, - "settingsCacheSubtitle": "Lihat penggunaan dan bersihkan cache", + "settingsCacheSubtitle": "View size and clear cached data", "@settingsCacheSubtitle": { "description": "Subtitle for cache management menu" }, - "libraryTitle": "File Lokal", + "libraryTitle": "Local Library", "@libraryTitle": { "description": "Library settings page title" }, - "libraryScanSettings": "Setelan Pemindaian", + "libraryScanSettings": "Scan Settings", "@libraryScanSettings": { "description": "Section header for scan settings" }, - "libraryEnableLocalLibrary": "Hidupkan File Lokal", + "libraryEnableLocalLibrary": "Enable Local Library", "@libraryEnableLocalLibrary": { "description": "Toggle to enable library scanning" }, - "libraryEnableLocalLibrarySubtitle": "Pindai lagu yang ada di perangkat Anda", + "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", "@libraryEnableLocalLibrarySubtitle": { "description": "Subtitle for enable toggle" }, - "libraryFolder": "Folder Koleksi", + "libraryFolder": "Library Folder", "@libraryFolder": { "description": "Folder selection setting" }, - "libraryFolderHint": "Ketuk untuk memilih folder", + "libraryFolderHint": "Tap to select folder", "@libraryFolderHint": { "description": "Placeholder when no folder selected" }, - "libraryShowDuplicateIndicator": "Tampilkan Indikator Duplikat", + "libraryShowDuplicateIndicator": "Show Duplicate Indicator", "@libraryShowDuplicateIndicator": { "description": "Toggle for duplicate indicator in search" }, - "libraryShowDuplicateIndicatorSubtitle": "Tampilkan saat mencari lagu yang ada", + "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", "@libraryShowDuplicateIndicatorSubtitle": { "description": "Subtitle for duplicate indicator toggle" }, - "libraryAutoScan": "Pindai Otomatis", + "libraryAutoScan": "Auto Scan", "@libraryAutoScan": { "description": "Setting for automatic library scanning" }, - "libraryAutoScanSubtitle": "Otomatis memindai perangkat Anda untuk mencari lagu baru", + "libraryAutoScanSubtitle": "Automatically scan your library for new files", "@libraryAutoScanSubtitle": { "description": "Subtitle for auto scan setting" }, - "libraryAutoScanOff": "Mati", + "libraryAutoScanOff": "Off", "@libraryAutoScanOff": { "description": "Auto scan disabled" }, - "libraryAutoScanOnOpen": "Setiap aplikasi dibuka", + "libraryAutoScanOnOpen": "Every app open", "@libraryAutoScanOnOpen": { "description": "Auto scan when app opens" }, - "libraryAutoScanDaily": "Harian", + "libraryAutoScanDaily": "Daily", "@libraryAutoScanDaily": { "description": "Auto scan once per day" }, - "libraryAutoScanWeekly": "Mingguan", + "libraryAutoScanWeekly": "Weekly", "@libraryAutoScanWeekly": { "description": "Auto scan once per week" }, - "libraryActions": "Tindakan", + "libraryActions": "Actions", "@libraryActions": { "description": "Section header for library actions" }, - "libraryScan": "Pindai Koleksi", + "libraryScan": "Scan Library", "@libraryScan": { "description": "Button to start library scan" }, - "libraryScanSubtitle": "Pindai file audio", + "libraryScanSubtitle": "Scan for audio files", "@libraryScanSubtitle": { "description": "Subtitle for scan button" }, - "libraryScanSelectFolderFirst": "Pilih folder terlebih dahulu", + "libraryScanSelectFolderFirst": "Select a folder first", "@libraryScanSelectFolderFirst": { "description": "Message when trying to scan without folder" }, - "libraryCleanupMissingFiles": "Bersihkan File Yang Hilang", + "libraryCleanupMissingFiles": "Cleanup Missing Files", "@libraryCleanupMissingFiles": { "description": "Button to remove entries for missing files" }, - "libraryCleanupMissingFilesSubtitle": "Hapus file yang sudah tidak ada", + "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", "@libraryCleanupMissingFilesSubtitle": { "description": "Subtitle for cleanup button" }, - "libraryClear": "Bersihkan Koleksi", + "libraryClear": "Clear Library", "@libraryClear": { "description": "Button to clear all library entries" }, - "libraryClearSubtitle": "Hapus semua lagu yang dipindai", + "libraryClearSubtitle": "Remove all scanned tracks", "@libraryClearSubtitle": { "description": "Subtitle for clear button" }, - "libraryClearConfirmTitle": "Bersihkan Koleksi", + "libraryClearConfirmTitle": "Clear Library", "@libraryClearConfirmTitle": { "description": "Dialog title for clear confirmation" }, - "libraryClearConfirmMessage": "Tindakan akan menghapus seluruh lagu yang dipindai dari koleksi Anda. File asli tidak akan terhapus.", + "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": "Tentang File Lokal", + "libraryAbout": "About Local Library", "@libraryAbout": { "description": "Section header for about info" }, @@ -2576,7 +2576,7 @@ "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural,=1{lagu} other{lagu}}", + "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2585,7 +2585,7 @@ } } }, - "libraryFilesUnit": "{count, plural,=1{file} other{file}}", + "libraryFilesUnit": "{count, plural, =1{file} other{files}}", "@libraryFilesUnit": { "description": "Unit label for files count during library scanning", "placeholders": { @@ -2594,7 +2594,7 @@ } } }, - "libraryLastScanned": "Terakhir dipindai: {time}", + "libraryLastScanned": "Last scanned: {time}", "@libraryLastScanned": { "description": "Last scan time display", "placeholders": { @@ -2603,19 +2603,19 @@ } } }, - "libraryLastScannedNever": "Tidak pernah", + "libraryLastScannedNever": "Never", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, - "libraryScanning": "Memindai...", + "libraryScanning": "Scanning...", "@libraryScanning": { "description": "Status during scan" }, - "libraryScanFinalizing": "Menyelesaikan pemindaian...", + "libraryScanFinalizing": "Finalizing library...", "@libraryScanFinalizing": { "description": "Status shown after file scanning finishes but library persistence is still running" }, - "libraryScanProgress": "{progress}% dari {total} file", + "libraryScanProgress": "{progress}% of {total} files", "@libraryScanProgress": { "description": "Scan progress display", "placeholders": { @@ -2627,11 +2627,11 @@ } } }, - "libraryInLibrary": "Di Koleksi", + "libraryInLibrary": "In Library", "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "{count} file yang hilang dihapus dari koleksi", + "libraryRemovedMissingFiles": "Removed {count} missing files from library", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2640,59 +2640,59 @@ } } }, - "libraryCleared": "Koleksi dibersihkan", + "libraryCleared": "Library cleared", "@libraryCleared": { "description": "Snackbar after clearing library" }, - "libraryStorageAccessRequired": "Butuh Akses Penyimpanan", + "libraryStorageAccessRequired": "Storage Access Required", "@libraryStorageAccessRequired": { "description": "Dialog title for storage permission" }, - "libraryStorageAccessMessage": "SpotiFLAC membutuhkan akses penyimpanan untuk memindai koleksi musik Anda. Harap berikan izin di setelan.", + "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", "@libraryStorageAccessMessage": { "description": "Dialog message for storage permission" }, - "libraryFolderNotExist": "Folder yang dipilih tidak ada", + "libraryFolderNotExist": "Selected folder does not exist", "@libraryFolderNotExist": { "description": "Error when folder doesn't exist" }, - "librarySourceDownloaded": "Terdownload", + "librarySourceDownloaded": "Downloaded", "@librarySourceDownloaded": { "description": "Badge for tracks downloaded via SpotiFLAC" }, - "librarySourceLocal": "Lokal", + "librarySourceLocal": "Local", "@librarySourceLocal": { "description": "Badge for tracks from local library scan" }, - "libraryFilterAll": "Semua", + "libraryFilterAll": "All", "@libraryFilterAll": { "description": "Filter chip - show all library items" }, - "libraryFilterDownloaded": "Terdownload", + "libraryFilterDownloaded": "Downloaded", "@libraryFilterDownloaded": { "description": "Filter chip - show only downloaded items" }, - "libraryFilterLocal": "Lokal", + "libraryFilterLocal": "Local", "@libraryFilterLocal": { "description": "Filter chip - show only local library items" }, - "libraryFilterTitle": "Filter", + "libraryFilterTitle": "Filters", "@libraryFilterTitle": { "description": "Filter bottom sheet title" }, - "libraryFilterReset": "Hapus", + "libraryFilterReset": "Reset", "@libraryFilterReset": { "description": "Reset all filters button" }, - "libraryFilterApply": "Terapkan", + "libraryFilterApply": "Apply", "@libraryFilterApply": { "description": "Apply filters button" }, - "libraryFilterSource": "Sumber", + "libraryFilterSource": "Source", "@libraryFilterSource": { "description": "Filter section - source type" }, - "libraryFilterQuality": "Kualitas", + "libraryFilterQuality": "Quality", "@libraryFilterQuality": { "description": "Filter section - audio quality" }, From a4f7360336005e633916f8dffe057ba3615ebf60 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:38 +0700 Subject: [PATCH 14/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 4990b89b..c9372153 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -19,7 +19,7 @@ }, "navStore": "레포", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "홈", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "옵션", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "확장 프로그램", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "옵션", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "기본 제공자", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "확장 프로그램에서 기본 검색 제공자로 전환하려면 기본 검색 제공자를 선택하세요", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "자동 대체", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "확장 프로그램 사용", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "확장 프로그램 제공자가 활성화됨", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "확장 프로그램 제공자가 필요함", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "가사 삽입", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "음량 분석 및 리플레이게인 태그 작성", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "음량을 분석하는 중...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "확장 프로그램 레포", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "하단바에서 레포 탭 표시", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "업데이트 확인", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify 자격 증명", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "클라이언트 ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "필수 - 탭하여 설정", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify는 사용자 고유의 API 자격 증명을 요구합니다. 'developer.spotify.com'에서 무료로 발급받으세요", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify API 변경으로 인해 Spotify 검색 기능은 2026년 3월 3일부터 더 이상 지원되지 않습니다. Deezer로 전환해 주세요", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "확장 프로그램", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "작성자: {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "제거", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "확장 프로그램 레포", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "확장 프로그램 검색...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "설치", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "자격 증명이 저장됨", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "자격 증명이 삭제됨", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "{count} 개의 {count, plural, =1{트랙} other{트랙}}이 제거됨", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "모든 항목을 입력해 주세요", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "다운로드 목록 보기", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "자격 증명 제거", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "자격 증명 저장", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} 개 선택됨", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "현재 버전", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "확장 프로그램 대체", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "자동 대체 중에 사용할 수 있는 설치된 다운로드 확장 프로그램을 선택하세요", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "레거시", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "확장 프로그램", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "사용 제한 없음", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "사용 제한이 있을 수 있음", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "로그", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify 자격 증명", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Spotify 애플리케이션 할당량을 사용하려면 클라이언트 ID와 비밀키를 입력하세요", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "클라이언트 ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "클라이언트 ID를 붙여넣으세요", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "클라이언트 비밀키", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "클라이언트 비밀키를 붙여넣으세요", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "안정", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "대체, 메타데이터, 가사, 표지 이미지", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "다운로드 제공자 관리", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "모두", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "메타데이터", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "다운로드", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "유틸리티", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "가사", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "연동", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "필터 지우기", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "예시: https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "레포지토리 추가", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "기본 검색", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "기본 메타데이터 검색 사용", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "작성자", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "실제 음질은 서비스의 트랙 가용성에 따라 달라집니다", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "다운로드 전 확인", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "모두 지우기", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "아티스트 / 앨범", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "모든 트랙 선택됨", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "트랙을 탭하여 선택하세요", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "탐색 피드 캐시", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "표지 이미지를 .jpg 파일로 저장", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "가사 (.lrc) 저장", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "가사를 .Irc 파일로 가져와서 저장", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "가사를 저장하는 중...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "업데이트할 필드", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "표지 이미지", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "FLAC 일치 항목을 찾는 중... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "선택한 항목에 대한 신뢰할 수 있는 온라인 일치 항목을 찾을 수 없음", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "AAC/M4A, MP3, Opus, ALAC 또는 FLAC으로 변환", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "오디오 변환", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "변환 확인", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "무손실 변환 — 음질 손실 없음", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "CUE+FLAC을 개별 트랙으로 분할", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "앨범: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "재생목록", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "재생목록", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "트랙 분류를 시작하려면 재생목록을 만드세요", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 개의 트랙} other{{count} 개의 트랙}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "재생목록 만들기 완료", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "재생목록 이름", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "''{playlistName}''과 그 안에 있는 모든 트랙을 삭제하시겠습니까?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "재생목록 삭제 완료", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "재생목록 이름 변경 완료", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "''{trackName}'' 제거 완료", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "''{trackName}''이 '좋아요 표시한 음악'에 추가됨", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "{total} 개 중 {current} 개를 변환하는 중...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "백업을 만드는 중...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "백업 만들기 완료", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "아직 백업할 내용이 없습니다", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "이 백업을 복원하시겠습니까?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "백업을 복원하는 중...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "백업 복원 성공", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}을 다시 설치할 수 없습니다. 스토어에서 수동으로 설치하세요", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "''{artist}'', ''{title}'', ''{album}'', ''{track}'', ''{year}'', ''{date}'', ''{disc}''를 자리표시자로 사용하세요", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "음질을 선택하려면 음질 옵션이 있는 제공자를 선택하세요", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "먼저 메타데이터 삽입을 활성화하세요", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "다운로드됨", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "필터링하는 중...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "{providerName}으로 검색", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "홈 피드 제공자", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "다운로드를 취소하시겠습니까?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "앨범 불러오기 실패", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "재생목록 불러오기 실패", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "아티스트 불러오기 실패", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "다운로드 진행률", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "트랙 다운로드 진행률 표시", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "라이브러리 스캔", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "로컬 라이브러리 스캔 진행률을 표시합니다", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "''{trackName}''를 다운로드하는 중", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "모든 다운로드 완료", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "트랙 검색...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "트랙 검색", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "붙여넣기 또는 검색...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "메타데이터 삽입이 꺼져 있을 때 비활성화됨", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "내장된 표지 이미지가 없음", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "앨범", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "트랙", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "파일 & 폴더", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "기록과 관계없이 모든 트랙이 다운로드됩니다", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "대체 확장 프로그램", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "시작하는 중...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "확장 프로그램용 베타 Android 서비스 워커", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "선택한 폴더에 대한 접근 권한을 유지할 수 없습니다", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "모든", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 18584ab81fc22d17db8eeee919675a476ae1b953 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:39 +0700 Subject: [PATCH 15/37] New translations app_en.arb (Portuguese) [ci skip] --- lib/l10n/arb/app_pt_PT.arb | 474 ++++++++++++------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_pt_PT.arb b/lib/l10n/arb/app_pt_PT.arb index a9619c2a..d486bf51 100644 --- a/lib/l10n/arb/app_pt_PT.arb +++ b/lib/l10n/arb/app_pt_PT.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Início", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Opções", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensões", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Opções", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Provedor Primário", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Escolha o provedor de pesquisa padrão para retornar após sair de uma extensão", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Fallback Automático", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Usar Provedores de Extensão", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Provedores de extensão estão habilitados", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Provedores de extensão são necessários", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Incorporar Letras", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analisar o volume e gravar etiquetas ReplayGain", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analisando o volume...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Repositório de extensões", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Mostrar aba de repositório na navegação", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Procurar Atualizações", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Credenciais do Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "ID do cliente: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Obrigatório - toque para configurar", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "O Spotify requer as suas próprias credenciais de API. Consiga gratuitamente em developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "A busca do Spotify será descontinuada em 3 de março de 2026 devido a mudanças na API do Spotify. Por favor, mude para o Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensões", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "por {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Desinstalar", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Repositório de extensões", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Pesquisar extensões...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Instalar", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credenciais salvas", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Credenciais limpas", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "{count} {count, plural, =1{faixa apagada} other{faixas apagadas}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Por favor, preencha todos os campos", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Ver Fila", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remover Credenciais", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Salvar Credenciais", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selecionado(s)", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Atual", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Alternativa de extensão", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Escolha quais extensões de download instaladas podem ser usadas durante a alternativa automática.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legado", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extensão", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Sem limites de taxa", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Pode ter limites de taxa", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Registros", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Credenciais do Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Digite a sua Client ID e Secret para usar a sua própria cota de aplicativo do Spotify.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "ID do cliente", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Colar Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Segredo do cliente", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Colar Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Estável", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Alternativa, metadados, letras, capa do álbum", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Gerenciar provedores de download", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Tudo", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadados", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Baixar", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utilidade", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Letras", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integração", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Limpar filtros", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/usuario/repositorio-extensao", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Adicionar repositório", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Pesquisa padrão", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Usar a pesquisa padrão de metadados", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Autor", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "A qualidade real depende da faixa que estiver disponível no serviço", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Perguntar qualidade antes de baixar", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Limpar Tudo", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artista / Álbum", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Todas as faixas selecionadas", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Toque nas faixas para selecionar", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From e4b99dd44b9c72196c3eddfb5e9f00ea39b0170a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:41 +0700 Subject: [PATCH 16/37] New translations app_en.arb (Indonesian) [ci skip] --- lib/l10n/arb/app_id.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index fdb99863..6f583e89 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -19,7 +19,7 @@ }, "navStore": "Repositori", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Beranda", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Opsi", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Ekstensi", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Opsi", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Provider Utama", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Pilih penyedia pencarian default untuk beralih kembali dari ekstensi", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Layanan Cadangan", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Gunakan Provider Ekstensi", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Penyedia ekstensi diaktifkan", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Penyedia ekstensi diwajibkan", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Sematkan Lirik", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analisis kenyaringan dan tulis tag ReplayGain", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Menganalisis kenyaringan...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Repositori Ekstensi", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Tampilkan tab Repo di navigasi", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Periksa Pembaruan", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Kredensial Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "ID Klien: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Diperlukan - ketuk untuk mengatur", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify memerlukan kredensial API Anda sendiri. Dapatkan gratis dari developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Pencarian Spotify akan dihentikan pada 3 Maret 2026 karena perubahan API Spotify. Silakan beralih ke Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Ekstensi", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "oleh {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Copot", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Repositori Ekstensi", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Cari ekstensi...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Pasang", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Kredensial disimpan", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Kredensial dihapus", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Menghapus {count} {count, plural, =1{lagu} other{lagu}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Harap isi semua field", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Lihat Antrian", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Hapus Kredensial", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Simpan Kredensial", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} dipilih", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Saat ini", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Ekstensi Cadangan", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Pilih ekstensi unduhan terpasang mana yang dapat digunakan selama fallback otomatis.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Warisan", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Ekstensi", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Tidak ada batas rate", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Mungkin dibatasi rate", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Log", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Kredensial Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Masukkan Client ID dan Secret Anda untuk menggunakan kuota aplikasi Spotify Anda sendiri.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "ID Klien", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Tempel Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Rahasia Klien", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Tempel Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stabil", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Cadangan, metadata, lirik, sampul album", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Kelola provider unduhan", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Semua", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Unduhan", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utilitas", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lirik", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integrasi", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Hapus filter", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "misalnya https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Tambahkan Repositori", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Pencarian default", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Gunakan pencarian metadata default", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Pembuat", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Kualitas sebenarnya tergantung ketersediaan lagu dari layanan", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Tanya Sebelum Unduh", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Hapus Semua", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artis / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Semua lagu dipilih", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Ketuk lagu untuk memilih", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 2a050f113ba5d65aaddfdc809e6c44a8ff437f33 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:43 +0700 Subject: [PATCH 17/37] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index a39b9bd2..845bcfe8 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -19,7 +19,7 @@ }, "navStore": "Dépôt", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Accueil", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Options", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensions", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Options", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Fournisseur principal", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choisissez le moteur de recherche par défaut pour revenir à la configuration d'origine après avoir utilisé une extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Récupération automatique", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Utiliser des fournisseurs d'extension", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Les fournisseurs d'extensions sont activés", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Les fournisseurs d'extensions sont requis", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Intégrer les paroles", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyser le niveau sonore et créer des balises ReplayGain", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyse du volume sonore...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Référentiel d'extensions", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Afficher l'onglet « Dépôt » dans le menu de navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Vérifier les mises à jour", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Identifiants Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Identifiant client : {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Obligatoire - appuyez pour configurer", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify nécessite vos propres identifiants API. Vous pouvez les obtenir gratuitement sur developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "La fonction de recherche Spotify sera supprimée le 3 mars 2026 en raison de modifications apportées à l'API Spotify. Veuillez passer à Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensions", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "par {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Désinstaller", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Répertoire des extensions", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Recherche d'extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Installer", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Identifiants enregistrés", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Identifiants validés", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Supprimé {count} {count, plural, =1{titre} other{titres}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Veuillez remplir tous les champs", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Afficher la file d'attente", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Supprimer les identifiants", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Enregistrer les identifiants", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} sélectionnés", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Actuel", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Solution de secours pour les extensions", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Sélectionnez les extensions de téléchargement installées qui peuvent être utilisées lors du basculement automatique.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Héritage", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Pas de limite de débit", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Limite de taux de métadonnées", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Journaux", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Identifiants Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Saisissez votre identifiant client et votre clé secrète pour utiliser votre propre quota d'application Spotify.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Identifiant client", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Coller l'identifiant client", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Clé secrète du client", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Coller la clé secrète du client", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fichier de secours, métadonnées, paroles, pochette", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Gérez les fournisseurs de téléchargement", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Tout", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Métadonnées", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Télécharger", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utilitaire", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Paroles", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Intégration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Effacer les filtres", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "par exemple : https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Ajouter un dépôt", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Recherche par défaut", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Utiliser la recherche par métadonnées par défaut", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Auteur", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "Identifiant", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "La qualité réelle dépend de la disponibilité des pistes sur le service", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Demander avant de télécharger", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Tout effacer", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artiste / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Tous les titres sélectionnés", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Appuyez sur les titres pour les sélectionner", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explorer le cache des flux", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Enregistrez la pochette de l'album au format .jpg", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Enregistrer les paroles (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Récupérez et enregistrez les paroles sous forme de fichier .lrc", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Enregistrement des paroles...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Champs à mettre à jour", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Illustration de couverture", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Recherche de fichiers FLAC... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "Aucun résultat pertinent n'a été trouvé en ligne pour cette sélection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convertir au format AAC/M4A, MP3, Opus, ALAC ou FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convertir un fichier audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirmer la conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Conversion sans perte — aucune perte de qualité", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Diviser un fichier CUE+FLAC en pistes individuelles", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album : {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Créez une playlist pour commencer à classer vos morceaux", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 titre} other{{count} titres}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist créée", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Nom de la playlist", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Supprimer « {playlistName} » et tous les morceaux qu'elle contient ?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist supprimée", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renommée", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "« {trackName} » supprimé", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" ajouté aux Favoris", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Conversion de {current} sur {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Création d'une sauvegarde...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Sauvegarde créée", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "Il n'y a encore rien à sauvegarder", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restaurer cette sauvegarde ?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restauration de la sauvegarde...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "La sauvegarde a été restaurée avec succès", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, one {}=1{extension} other{extensions}} n'ont pas pu être réinstallées. Installez-les manuellement depuis la boutique.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Utilisez {artist}, {title}, {album}, {track}, {year}, {date} et {disc} comme variables de remplacement.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Choisissez un fournisseur proposant différentes options pour sélectionner la qualité audio", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Activez d'abord l'intégration des métadonnées", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Téléchargé", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtrage...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Rechercher avec {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Fournisseur de flux RSS", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Annuler le téléchargement ?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Impossible de charger l'album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Impossible de charger la playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Impossible de charger l'artiste", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Progression du téléchargement", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Affiche la progression du téléchargement des morceaux", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Analyse de la bibliothèque", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Affiche la progression de la numérisation dans la bibliothèque locale", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Téléchargement de {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "Tous les téléchargements sont terminés", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Rechercher des morceaux...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Rechercher des morceaux", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Collez ou effectuez une recherche...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Désactivé lorsque l'intégration des métadonnées est désactivée", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "Aucune pochette d'album n'a été trouvée", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Titres", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Fichiers & Dossiers", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "Tous les morceaux seront téléchargés, quel que soit l'historique", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Extensions de secours", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "C'est parti...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Service worker Android en version bêta pour le téléchargement d'extensions", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Impossible de conserver l'accès au dossier sélectionné", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "N'importe lequel", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 49a824c171de81687ed252145db0c2ca542ccd79 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:44 +0700 Subject: [PATCH 18/37] New translations app_en.arb (Spanish) [ci skip] --- lib/l10n/arb/app_es_ES.arb | 474 ++++++++++++------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_es_ES.arb b/lib/l10n/arb/app_es_ES.arb index 4c49a2c8..60298371 100644 --- a/lib/l10n/arb/app_es_ES.arb +++ b/lib/l10n/arb/app_es_ES.arb @@ -19,7 +19,7 @@ }, "navStore": "Repositorio", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Inicio", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Opciones", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensiones", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Opciones", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Proveedor Principal", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Elija el proveedor de búsqueda por defecto para volver de una extensión", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Cambio automático", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Usar proveedores de extensiones", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Proveedores de extensiones habilitados", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Proveedores de extensiones habilitados", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Incrustar letras", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analizar el volumen y guardar las etiquetas ReplayGain", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analizando el nivel de volumen...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Repositorio de extensiones", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Mostrar la pestaña del repositorio en la navegación", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Buscar actualizaciones", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Credenciales de Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "ID de cliente: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Requerido: toca para configurar", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify requiere tus propias credenciales de API. Consíguelas gratis en developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "La búsqueda de Spotify quedará obsoleta el 3 de marzo de 2026 debido a cambios en la API de Spotify. Por favor, cambia a Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensiones", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "por {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Desinstalar", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Repositorio de extensiones", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Buscar extensiones...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Instalar", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credenciales guardadas", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Credenciales borradas", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Eliminado {count} {count, plural, =1{pista} other{pistas}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Por favor, completa todos los campos", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Ver cola", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Eliminar credenciales", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Guardar credenciales", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} seleccionado", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Actual", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Respaldo de extensión", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Elija las extensiones de descarga que se usarán como respaldo automático.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Heredado", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extensión", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Sin límites de tasa", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Sin límites de tasa", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Registros", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Credenciales de Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Introduzca su ID de cliente y secreto para utilizar su propia cuota de aplicación de Spotify.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "ID del cliente", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Pegar ID de cliente", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Cliente Secreto", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Pegar Cliente Secreto", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Estable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Respaldo, meta datos, letras, portada", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Administrar proveedores de descarga", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Todo", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Información", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Descargar", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utilidad", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Letras", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integración", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Limpiar filtros", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.j. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Añadir repositorio", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Búsqueda predeterminada", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Usar la búsqueda de metadatos predeterminada", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Autor/a", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "La calidad real depende de la disponibilidad de la pista del servicio", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Preguntar antes de descargar", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Eliminar todo", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artista / Álbum", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Todas las pistas seleccionadas", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Toca las pistas para seleccionar", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explorar caché de inicio", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Guardar imagen del álbum como archivo .jpg", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Guardar letra (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Buscar y guardar letras como archivo .lrc", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Guardando letra...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Campos a actualizar", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Carátula", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Buscando coincidencias FLAC", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "Sin coincidencias en línea de confianza", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convertir a AAC/M4A, MP3, Opus, ALAC, o FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convertir audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirmar conversión", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Conversión sin pérdidas — sin pérdida de calidad", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Dividir CUE + FLAC en pistas individuales", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Álbum: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Listas de reproducción", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Lista de reproducción", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Crear una lista de reproducción para empezar a categorizar pistas", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 pista} other{{count} pistas}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Lista de reproducción creada", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Nombre de la lista de reproducción", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "¿Eliminar \"{playlistName}\" y todas las pistas que contiene?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Lista de reproducción eliminada", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Lista de reproducción renombrada", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "Se eliminó \"{trackName}\"", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" se agregó a «Me gusta»", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Convirtiendo {current} de {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creando copia de seguridad...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Copia de seguridad creada", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "Aún no hay nada que respaldar", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "¿Restaurar esta copia de seguridad?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restaurando copia de seguridad...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Copia de seguridad restaurada correctamente", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Usa {artist}, {title}, {album}, {track}, {year}, {date}, {disc} como marcadores de posición.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Descargadas", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtrando...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Buscar con {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "¿Cancelar descarga?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Muestra el progreso de la descarga para las pistas", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Escaneo de biblioteca", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "Todas las descargas completadas", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Buscar canciones...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Buscar pistas", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Pegar o buscar...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Álbumes", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Pistas", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Archivos y carpetas", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "Todas las pistas se descargarán independientemente del historial", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Reslpado de extensiones", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Comenzando...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Operador de servicios beta android para descargas de extensión", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "No se puede obtener acceso al directorio seleccionado", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Cualquier", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From bcb3729fa91a4235d6f180ac8886c1914baeee1e Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:46 +0700 Subject: [PATCH 19/37] New translations app_en.arb (Arabic) [ci skip] --- lib/l10n/arb/app_ar.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_ar.arb b/lib/l10n/arb/app_ar.arb index 50127c47..6f6a0c2a 100644 --- a/lib/l10n/arb/app_ar.arb +++ b/lib/l10n/arb/app_ar.arb @@ -19,7 +19,7 @@ }, "navStore": "المستودع", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "الصفحة الرئيسية", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "الخيارات", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "الإضافات", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "خيارات", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "المزود الرئيسي", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "اختر مزود البحث الافتراضي للتبديل من مكون إضافي", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "التراجع التلقائي", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "استخدام مزودي الإضافات", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "مزودي الإضافات مفعلين", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "مزودي الإضافات مطلوبين", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "تضمين كلمات الأغنية", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "تحليل ارتفاع الصوت وكتابة وسوم ReplayGain", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "تحليل الصوت...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "مستودع الإضافات", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "إظهار صفحة المستودع في شريط التنقل", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "التحقق من وجود تحديثات", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "بيانات اعتماد Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "معرف العميل: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "مطلوب - انقر للتهيئة", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify يتطلب بيانات اعتماد API الخاصة بك. احصل عليها مجاناً من developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "سيتم إلغاء البحث في Spotify في 3 مارس 2026 بسبب تغييرات API Spotify. الرجاء التبديل إلى Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "الإضافات", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "من قِبل {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "إلغاء التثبيت", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "مستودع الإضافات", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "البحث في الإضافات...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "تثبيت", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "تم حفظ بيانات الاعتماد", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "تم مسح بيانات الاعتماد", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "تم حذف {count} {count, plural, zero {} one {أغنيتين} two {أغنيتين} few {أغانٍ} many {أغنية}=1{أغنية} other{أغانٍ}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "من فضلك قم بإدخال جميع البيانات", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "عرض قائمة الانتظار", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "إزالة بيانات الاعتماد", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "حفظ بيانات الاعتماد", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "تم تحديد {count}", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "الحالي", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "المكون الإضافي الاحتياطي", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "اختر إضافات التحميل المثبتة التي يمكن استخدامها أثناء الرجوع التلقائي للمزود الاحتياطي.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "قديم", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "الإضافة", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "لا حدود للطلبات", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "قد يفرض حدودا للطلب", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "السجلات", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "بيانات اعتماد Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "أدخل معرف العميل الخاص بك و الكود السري لاستخدام حصة تطبيق Spotify الخاصة بك.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "لصق Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "لصق Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "مستقر", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "الإحتياطات، البيانات الوصفية (metadata)، كلمات الأغاني، غلاف الأغنية", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "إدارة موفري التحميل", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "الكل", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "البيانات الوصفية (Metadata)", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "التحميل", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "الأدوات", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "كلمات الأغنية", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "التكامل", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "حذف الفلاتر", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "مثال: https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "أضف مستودعًا", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "البحث الافتراضي", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "استخدام البحث الافتراضي عن البيانات الوصفية", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "المؤلف", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "الجودة الفعلية تعتمد على المسار المتوفر من الخدمة", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "اسأل قبل التحميل", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "مسح الكل", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "ألبوم / الفنان", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 76765796592fe10b05ec94a68780a018451cee24 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:47 +0700 Subject: [PATCH 20/37] New translations app_en.arb (German) [ci skip] --- lib/l10n/arb/app_de.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 8549059c..a6b5a6b6 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Startseite", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Optionen", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Erweiterungen", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Optionen", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Primärer Anbieter", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Automatischer Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Erweiterungsanbieter verwenden", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Erweiterungsanbieter sind aktiviert", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Erweiterungsanbieter sind erforderlich", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Liedtexte einbetten", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Erweiterungs-Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Repo-Tab in der Navigation anzeigen", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Nach Updates suchen", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify-Anmeldedaten", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client-ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Erforderlich - zum Konfigurieren tippen", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify erfordert eigene API-Anmeldedaten. Kostenlos erhältlich auf developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify-Suche wird am 3. März 2026 aufgrund von Änderungen der Spotify-API entfernt. Bitte wechsel vorher zu Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Erweiterungen", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "von {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Deinstallieren", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Erweiterungs-Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Erweiterungen suchen...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Installieren", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Anmeldedaten gespeichert", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Anmeldedaten gelöscht", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "{count} {count, plural, =1{Titel} other{Titel}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Bitte fülle alle Felder aus", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Warteschlange anzeigen", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Anmeldedaten entfernen", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Anmeldedaten speichern", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} ausgewählt", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Aktuell", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Erweiterungs-Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Wähle aus, welche installierten Download-Erweiterungen beim automatischen Fallback verwendet werden sollen.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Erweiterung", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Keine Limitierungen", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Hat vielleicht Limitierungen", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Protokolle", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify-Anmeldedaten", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Gebe deine Client-ID und Secret ein, um dein eigenes Spotify Anwendungs Limit zu haben.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Client ID einfügen", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Client Secret einfügen", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stabil", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, Metadaten, Lyrics, Cover-Art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Download-Anbieter verwalten", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Alle", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadaten", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Herunterladen", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Filter entfernen", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "z.B. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Repository hinzufügen", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Entwickler", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Die eigentliche Qualität hängt von der Verfügbarkeit des Dienstes ab", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Qualität vor Download fragen", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Alles löschen", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Künstler/Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Alle Titel sind ausgewählt", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tippe auf Titel zum Auswählen", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Feed-Cache entdecken", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Albumcover als .jpg Datei speichern", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Lyrics als .lrc speichern", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Lade Lyrics als .lrc Datei", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Speichere Lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Felder zum Aktualisieren", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover-Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Suche nach FLAC-Übereinstimmungen... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "Keine zuverlässigen Online-Übereinstimmungen für die Auswahl gefunden", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Zu AAC/M4A, MP3, Opus, ALAC oder FLAC konvertieren", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Audio konvertieren", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Konvertierung bestätigen", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Verlustfreie Konvertierung kein Qualitätsverlust", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "CUE+FLAC in einzelne Titel aufteilen", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Playlist erstellen, um Titel zu kategorisieren", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 Titel} other{{count} Titel}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist erstellt", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist-Name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Willst du \"{playlistName}\" und alle darin enthaltenen Titel löschen?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist gelöscht", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist umbenannt", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" entfernt", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" zu Lieblingssongs hinzugefügt", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Konvertiere {current} von {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Verwende {artist}, {title}, {album}, {track}, {year}, {date}, {disc} als Platzhalter.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Metadaten-Einbettung zuerst aktivieren", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Heruntergeladen", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtere...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Mit {providerName} suchen", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Anbieter", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Download abbrechen?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Fehler beim Laden des Albums", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Fehler beim Laden der Playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Fehler beim Laden des Interpreten", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Fortschritt", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Zeigt Download-Fortschritt für Titel an", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Bibliotheksscan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Zeigt den Fortschritt des lokalen Bibliotheksscans an", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "{trackName} wird heruntergeladen", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "Alle Downloads abgeschlossen", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Titel suchen...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Nach Titel suchen", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Einfügen oder suchen...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Deaktiviert, wenn Metadateneinbettung aus ist", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "Kein eingebettetes Albumcover gefunden", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Alben", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Titel", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Dateien & Ordner", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "Alle Titel werden unabhängig vom Verlauf heruntergeladen", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback-Erweiterungen", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starte...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android Dienst für Downloads von Erweiterungen", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Konnte nicht auf den ausgewählten Ordner zugreifen", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Alle", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From a3feb39e20b50434fda8f2199e1644e2f61e2e69 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:49 +0700 Subject: [PATCH 21/37] New translations app_en.arb (Japanese) [ci skip] --- lib/l10n/arb/app_ja.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_ja.arb b/lib/l10n/arb/app_ja.arb index ceb5ca05..6e74b9f6 100644 --- a/lib/l10n/arb/app_ja.arb +++ b/lib/l10n/arb/app_ja.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "ホーム", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "オプション", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "拡張", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "オプション", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "プライマリーのプロバイダー", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Auto Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "拡張のプロバイダーを使用する", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "歌詞を埋め込む", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "更新を確認", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify の認証情報", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "クライアント ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "必須 - タップで設定", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify は独自の API 認証情報が必要です。developer.spotify.com から取得できます。", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "拡張", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "作者 {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "アンインストール", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "拡張を検索...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "インストール", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "認証情報を保存しました", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "認証情報を消去しました", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "{count} {count, plural, =1{個のトラック} other{個のトラック}}を削除", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "すべての項目を入力してください", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "キューを表示", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "認証情報を削除", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "認証情報を保存", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} 個を選択済み", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "現在", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "拡張", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "レート制限はありません", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "ログ", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify の認証情報", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "クライアント ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "クライアント ID を貼り付け", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "クライアントシークレット", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "クライアントシークレットを貼り付け", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "安定版", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "ダウンロードプロバイダーを管理", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "すべて", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "メタデータ", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "ダウンロード", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "ユーティリティ", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "歌詞", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "統合", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "フィルターを消去", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "作者", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "実際の品質はサービスからのトラックの可用性に依存します", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "ダウンロード前に確認する", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "すべて消去", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "アーティスト / アルバム", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "すべてのトラックを選択済み", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "トラックをタップで選択", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "歌詞を保存 (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "オーディオを変換", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "変換を確認", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From cc1ad1552c3ad7b21cb0c834192a7d8a4114999d Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:50 +0700 Subject: [PATCH 22/37] New translations app_en.arb (Dutch) [ci skip] --- lib/l10n/arb/app_nl.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_nl.arb b/lib/l10n/arb/app_nl.arb index af3706f9..451ea235 100644 --- a/lib/l10n/arb/app_nl.arb +++ b/lib/l10n/arb/app_nl.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Home", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Options", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensions", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Options", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Primary Provider", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Auto Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Use Extension Providers", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Embed Lyrics", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Check for Updates", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify Credentials", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Required - tap to configure", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensions", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "by {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Uninstall", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Search extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Install", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credentials saved", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Credentials cleared", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Please fill all fields", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "View Queue", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Save Credentials", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selected", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Current", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "No rate limits", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Logs", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify Credentials", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Paste Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Paste Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Manage download providers", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "All", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Download", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Clear filters", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Actual quality depends on track availability from the service", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Ask Before Download", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Clear All", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artist / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From d9dc7ddf3a07ddf0315f0ecdd1cf5c95b68c80ad Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:52 +0700 Subject: [PATCH 23/37] New translations app_en.arb (Russian) [ci skip] --- lib/l10n/arb/app_ru.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index c162c8bb..b2a768c2 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -19,7 +19,7 @@ }, "navStore": "Репозиторий", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Главная", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Опции", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Расширения", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Опции", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Основной провайдер", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Автоматический переход", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Использовать провайдера расширений", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Вписать текст песни", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Репозиторий расширения", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Проверить обновления", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Учётные данные Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Необходимо - нажмите для настройки", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify требует ваши собственные учетные данные API. Получите их бесплатно на сайте developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Поиск Spotify устареет 3 марта 2026 года из-за изменений Spotify API. Пожалуйста, перейдите на Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Расширения", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "от {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Удалить", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Репозиторий расширения", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Поиск расширений...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Установить", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Учётные данные сохранены", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Учётные данные очищены", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Пожалуйста, заполните все поля", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Просмотр очереди", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Удалить учётные данные", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Сохранить учётные данные", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} выбрано", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Текущая", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Резервное расширение", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Расширение", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Без ограничений по скорости", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Есть ограничения по скорости", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Логи", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Учётные данные Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Введите свой Client ID и Secret, чтобы использовать собственные квоты в Spotify.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Вставьте Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Секретный код клиента", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Вставьте Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Стабильный", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Управление провайдерами скачивания", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Все", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Метаданные", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Скачивание", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Утилиты", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Тексты песен", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Интеграция", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Очистить фильтры", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "например, https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Добавить репозиторий", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Автор", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Фактическое качество зависит от доступности треков в сервисе", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Спрашивать перед скачиванием", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Очистить всё", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Исполнитель / Альбом", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Все треки выбраны", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Нажмите на треки для выбора", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Просмотреть кэш ленты", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Сохранить обложку как файл .jpg", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Сохранить текст (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Получить и сохранить текст песни в формате .lrc", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Сохранение текста...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Поля для обновления", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Обложка", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Поиск совпадений FLAC... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Конвертировать аудио", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Подтвердить конвертацию", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Конвертация без потери качества", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Разделить файл CUE+FLAC на отдельные треки", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Альбом: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Плейлисты", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Плейлист", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Создайте плейлист, чтобы начать классифицировать треки", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Плейлист создан", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Название плейлиста", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Удалить \"{playlistName}\" и все треки внутри него?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Плейлист удалён", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Плейлист переименован", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" удалён", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" добавлен в Любимые", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Конвертация {current} из {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Скачано", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Фильтрация...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Искать с помощью {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "А-Я", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Я-А", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Отменить скачивание?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Не удалось загрузить альбом", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Не удалось загрузить плейлист", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Не удалось загрузить исполнителя", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Прогресс скачивания", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Сканирование библиотеки", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "Все загрузки завершены", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Альбомы", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Треки", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 58249d6a13d66d11560da50b4f0517f35e34a38d Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:53 +0700 Subject: [PATCH 24/37] New translations app_en.arb (Turkish) [ci skip] --- lib/l10n/arb/app_tr.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_tr.arb b/lib/l10n/arb/app_tr.arb index 0b308c02..6a9a882b 100644 --- a/lib/l10n/arb/app_tr.arb +++ b/lib/l10n/arb/app_tr.arb @@ -19,7 +19,7 @@ }, "navStore": "Depo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Ana sayfa", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Seçenekler", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Eklentiler", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Seçenekler", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Ana Kaynek", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Diğerlerini dene", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Eklenti sağlayıcılarını kullan", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Şarkı Sözlerini Göm", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Eklenti Deposu", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Gezinme menüsünde Depo sekmesini göster", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Güncelleştirmeleri Denetle", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify Kimlik Bilgileri", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Müşteri Kimliği: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Zorunlu - değiştirmek için tıkla", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify'ın senin API kimlik bilgilerine ihtiyacı var. Onları developer.spotify.com'dan alabilirsin", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify API değişiklikleri nedeniyle Spotify araması 3 Mart 2026 tarihinde kullanımdan kaldırılacaktır. Lütfen Deezer'a geçiş yapın.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Eklentiler", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "{author} tarafından", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Kaldır", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Uzantı Deposu", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Eklenti ara...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Kur", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Kimlik bilgileri kaydedildi", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Kimlik bilgileri temizlendi", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "{count} {count, plural, =1{şarkı} other{şarkı}} silindi", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Lütfen tüm alanları doldurun", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Kuyruğu Görüntüle", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Özellikleri kaldır", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Özellikleri kaydet", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} seçildi", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Şimdiki", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Uzantı Yedeği", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Otomatik geri dönüş sırasında hangi yüklü indirme uzantılarının kullanılabileceğini seçin.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Eklenti", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "İstek sınırı yok", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Hız sınırlaması uygulanabilir", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Kayıtlar", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify Kimlik Bilgileri", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Kendi Spotify uygulama kotanızı kullanmak için Client ID ve Secret girin.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Müşteri Kimliği", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Client ID yapıştır", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Müşteri Sırrı", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Client Secret yapıştır", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Kararlı", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Yedek plan, meta veriler, şarkı sözleri, kapak resmi", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "İndirme sağlayıcılarını yönet", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Tümü", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Meta Veri", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "İndir", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Araç", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Şarkı Sözleri", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Entegrasyon", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Filtreleri temizle", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "örn. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Depo Ekle", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Oluşturan", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "Kimlik", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Gerçek kalite, parçanın servisteki uygunluğuna bağlıdır", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "İndirmeden Önce Sor", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Tümünü Temizle", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Sanatçı / Albüm", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Tüm parçalar seçildi", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Seçmek için parçalara dokunun", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Besleme önbelleğini keşfedin", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Dönüştürmeyi Onayla", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Kayıpsız dönüştürme — kalite kaybı yok", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "CUE+FLAC dosyalarını ayrı parçalara bölün", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Çalma listeleri", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Çalma listesi", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Parçaları kategorize etmeye başlamak için bir çalma listesi oluşturun", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 parça} other{{count} parça}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "\"{playlistName}\" ve içindeki tüm parçaları silmek mi istiyorsunuz?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Çalma listesinin adı değiştirildi", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Yer tutucu olarak {artist}, {title}, {album}, {track}, {year}, {date}, {disc} ifadelerini kullanın.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albümler", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From f0a7a043ec30cd0a908598be86c9a51b4004b697 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:55 +0700 Subject: [PATCH 25/37] New translations app_en.arb (Ukrainian) [ci skip] --- lib/l10n/arb/app_uk.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_uk.arb b/lib/l10n/arb/app_uk.arb index 2a6b5c25..37f4e4bf 100644 --- a/lib/l10n/arb/app_uk.arb +++ b/lib/l10n/arb/app_uk.arb @@ -19,7 +19,7 @@ }, "navStore": "Репозиторій", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Головна", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Опції", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Розширення", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Опції", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Основний постачальник", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Автоматичний резервний варіант", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Використати постачальників розширень", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Вбудований текст пісні", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Репозиторій розширень", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Показати вкладку «Репозиторій» у навігації", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Перевірити наявність оновлень", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Облікові дані Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Ідентифікатор клієнта: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Обов'язковий – торкніться, щоб налаштувати", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify вимагає ваших власних облікових даних API. Отримайте їх безкоштовно на сайті developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Пошук Spotify буде припинено 3 березня 2026 року через зміни в API Spotify. Будь ласка, перейдіть на Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Розширення", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "від {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Видалити", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Репозиторій розширень", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Розширення пошуку...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Встановити", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Облікові дані збережено", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Облікові дані очищено", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Видалено {count} {count, plural, =1{трек} other{треків}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Будь ласка, заповніть усі поля", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "Переглянути чергу", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Видалити облікові дані", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Зберегти облікові дані", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "Вибрано {count}", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Поточна", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Резервне розширення", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Розширення", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "Без обмежень щодо швидкості", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "Травневе обмеження ставок", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Журнали", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Облікові дані Spotify", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Введіть свій ідентифікатор клієнта та секретний код, щоб використовувати власну квоту програми Spotify.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Ідентифікатор клієнта", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Вставити ідентифікатор клієнта", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Секретний код клієнта", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Вставити секретний код клієнта", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Стабільний", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Керування постачальниками послуг завантаження", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "Усі", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Метадані", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Завантажити", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Утиліта", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Тексти пісень", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Інтеграція", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Очистити фільтри", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "наприклад https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Додати репозиторій", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Автор", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "Ідентифікатор", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Фактична якість залежить від наявності треку в сервісі", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Запитувати перед завантаженням", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Усі", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Артист / Альбом", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "Усі треки вибрано", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Натисніть на треки, щоб вибрати", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Огляд кешу стрічки", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Зберегти обкладинку альбому як файл .jpg", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Зберегти текст пісні (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Отримати та зберегти текст пісні у форматі .lrc", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Збереження тексту пісні...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Поля для оновлення", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Обкладинка", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Пошук FLAC-збігів... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "Не знайдено надійних онлайн-відповідей для вибраного запиту", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Конвертувати аудіо", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Підтвердити конверсію", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless конвертація — без втрати якості", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Розділення CUE+FLAC на окремі треки", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Альбом: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Списки відтворення", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Список відтворення", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Створіть список відтворення, щоб розпочати категоризацію треків", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 трек} other{{count} треків}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Список відтворення створено", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Назва списку відтворення", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Видалити \"{playlistName}\" та всі треки в ньому?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Список відтворення видалено", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Список відтворення перейменовано", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" видалено", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" додано до списку улюблених", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Конвертування {current} з {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Завантажено", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Фільтрування...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Пошук за допомогою{providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Постачальник оновлень домашньої стрічки", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "А-Я", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Я-А", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Скасувати завантаження?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Не вдалося завантажити альбом", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Не вдалося завантажити список відтворення", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Не вдалося завантажити артиста", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Прогрес завантаження", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Показує прогрес завантаження треків", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Сканування бібліотеки", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Показує перебіг сканування локальної бібліотеки", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Завантаження {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "Усі завантаження завершено", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From a5f96b57e6bc13622bb707d2441abc16fbfc258a Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:56 +0700 Subject: [PATCH 26/37] New translations app_en.arb (Chinese Simplified) [ci skip] --- lib/l10n/arb/app_zh_CN.arb | 474 ++++++++++++------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb index 1d6c96fd..4c2a40f8 100644 --- a/lib/l10n/arb/app_zh_CN.arb +++ b/lib/l10n/arb/app_zh_CN.arb @@ -19,7 +19,7 @@ }, "navStore": "仓库", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "主页", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "选项", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "扩展", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "选项", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "主要提供者", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "选择要从扩展中返回的默认搜索服务器", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "自动回退", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "使用扩展提供商", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "扩展提供商已启用", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "需要扩展提供商", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "内嵌歌词", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "分析响度并写入ReplayGain标签", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "正在分析声音……", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "扩展仓库", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "在导航中显示仓库标签页", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "检查更新", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify 凭据", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "客户端 ID:{clientId}……", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "必填 - 点击配置", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify 需要您自己的 API 凭据。在 developer.spotify.com 免费获取", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify 搜索将在 2026 年 3 月 3 日因 Spotify API 更改而被废弃。请切换到 Deezer。", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "扩展", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "来自 {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "卸载", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "扩展仓库地址", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "搜索扩展……", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "安装", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "凭据已保存", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "凭据已清除", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "已删除 {count} {count, plural, =1{首歌曲} other{首歌曲}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "请填写所有字段", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "查看队列", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Save Credentials", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selected", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Current", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "No rate limits", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Logs", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify Credentials", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Paste Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Paste Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Manage download providers", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "All", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Download", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Clear filters", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Actual quality depends on track availability from the service", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Ask Before Download", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Clear All", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artist / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 13fe8b45935ef1e0aee040a55648344ef9908603 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:12:58 +0700 Subject: [PATCH 27/37] New translations app_en.arb (Chinese Traditional) [ci skip] --- lib/l10n/arb/app_zh_TW.arb | 474 ++++++++++++------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb index cb5a6bbe..6c7aeeca 100644 --- a/lib/l10n/arb/app_zh_TW.arb +++ b/lib/l10n/arb/app_zh_TW.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Home", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Options", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensions", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Options", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Primary Provider", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Auto Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Use Extension Providers", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Embed Lyrics", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Check for Updates", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify Credentials", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Required - tap to configure", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensions", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "by {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Uninstall", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Search extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Install", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credentials saved", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Credentials cleared", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Please fill all fields", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "View Queue", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Save Credentials", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selected", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Current", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "No rate limits", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Logs", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify Credentials", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Paste Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Paste Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Manage download providers", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "All", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Download", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Clear filters", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Actual quality depends on track availability from the service", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Ask Before Download", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Clear All", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artist / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 37db310157dd3f602334dfd886243129af9899e9 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 10:13:00 +0700 Subject: [PATCH 28/37] New translations app_en.arb (Hindi) [ci skip] --- lib/l10n/arb/app_hi.arb | 474 +++++++++++++--------------------------- 1 file changed, 146 insertions(+), 328 deletions(-) diff --git a/lib/l10n/arb/app_hi.arb b/lib/l10n/arb/app_hi.arb index 1350fc51..70ced75a 100644 --- a/lib/l10n/arb/app_hi.arb +++ b/lib/l10n/arb/app_hi.arb @@ -19,7 +19,7 @@ }, "navStore": "Repo", "@navStore": { - "description": "Bottom navigation - Extension store tab" + "description": "Bottom navigation - Extension repo tab" }, "homeTitle": "Home", "@homeTitle": { @@ -73,10 +73,6 @@ "@settingsAppearance": { "description": "Settings section - visual customization" }, - "settingsOptions": "Options", - "@settingsOptions": { - "description": "Settings section - app options" - }, "settingsExtensions": "Extensions", "@settingsExtensions": { "description": "Settings section - extension management" @@ -145,10 +141,6 @@ "@appearanceHistoryViewGrid": { "description": "Grid layout option" }, - "optionsTitle": "Options", - "@optionsTitle": { - "description": "Options settings page title" - }, "optionsPrimaryProvider": "Primary Provider", "@optionsPrimaryProvider": { "description": "Main search provider setting" @@ -174,10 +166,6 @@ "@optionsDefaultSearchTabSubtitle": { "description": "Subtitle for the preferred default search tab setting" }, - "optionsSwitchBack": "Choose the default search provider to switch back from an extension", - "@optionsSwitchBack": { - "description": "Hint to switch back from extension search" - }, "optionsAutoFallback": "Auto Fallback", "@optionsAutoFallback": { "description": "Auto-retry with other services" @@ -186,18 +174,6 @@ "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, - "optionsUseExtensionProviders": "Use Extension Providers", - "@optionsUseExtensionProviders": { - "description": "Legacy setting label for extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extension providers are enabled", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Extension providers are required", - "@optionsUseExtensionProvidersOff": { - "description": "Legacy status when extension providers would be disabled" - }, "optionsEmbedLyrics": "Embed Lyrics", "@optionsEmbedLyrics": { "description": "Embed lyrics in audio files" @@ -230,10 +206,6 @@ "@trackReplayGain": { "description": "Three-dot menu option to scan loudness and write ReplayGain tags" }, - "trackReplayGainSubtitle": "Analyze loudness and write ReplayGain tags", - "@trackReplayGainSubtitle": { - "description": "Subtitle for the rescan ReplayGain menu option" - }, "trackReplayGainScanning": "Analyzing loudness...", "@trackReplayGainScanning": { "description": "Snackbar/progress message while scanning ReplayGain for a single track" @@ -310,11 +282,11 @@ }, "optionsExtensionStore": "Extension Repo", "@optionsExtensionStore": { - "description": "Show/hide store tab" + "description": "Show/hide repo tab" }, "optionsExtensionStoreSubtitle": "Show Repo tab in navigation", "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" + "description": "Subtitle for extension repo toggle" }, "optionsCheckUpdates": "Check for Updates", "@optionsCheckUpdates": { @@ -360,31 +332,6 @@ "@optionsDetailedLoggingOff": { "description": "Status when logging disabled" }, - "optionsSpotifyCredentials": "Spotify Credentials", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {clientId}...", - "@optionsSpotifyCredentialsConfigured": { - "description": "Shows configured client ID preview", - "placeholders": { - "clientId": { - "type": "String" - } - } - }, - "optionsSpotifyCredentialsRequired": "Required - tap to configure", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify requires your own API credentials. Get them free from developer.spotify.com", - "@optionsSpotifyWarning": { - "description": "Info about Spotify API requirement" - }, - "optionsSpotifyDeprecationWarning": "Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.", - "@optionsSpotifyDeprecationWarning": { - "description": "Warning about Spotify API deprecation" - }, "extensionsTitle": "Extensions", "@extensionsTitle": { "description": "Extensions page title" @@ -402,26 +349,17 @@ } } }, - "extensionsAuthor": "by {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, "extensionsUninstall": "Uninstall", "@extensionsUninstall": { "description": "Uninstall extension button" }, "storeTitle": "Extension Repo", "@storeTitle": { - "description": "Store screen title" + "description": "Repo screen title" }, "storeSearch": "Search extensions...", "@storeSearch": { - "description": "Store search placeholder" + "description": "Repo search placeholder" }, "storeInstall": "Install", "@storeInstall": { @@ -912,14 +850,6 @@ "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarCredentialsSaved": "Credentials saved", - "@snackbarCredentialsSaved": { - "description": "Snackbar - Spotify credentials saved" - }, - "snackbarCredentialsCleared": "Credentials cleared", - "@snackbarCredentialsCleared": { - "description": "Snackbar - Spotify credentials removed" - }, "snackbarDeletedTracks": "Deleted {count} {count, plural, =1{track} other{tracks}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", @@ -938,10 +868,6 @@ } } }, - "snackbarFillAllFields": "Please fill all fields", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, "snackbarViewQueue": "View Queue", "@snackbarViewQueue": { "description": "Snackbar action - view download queue" @@ -1055,14 +981,6 @@ "@actionDeselect": { "description": "Action button - deselect all" }, - "actionRemoveCredentials": "Remove Credentials", - "@actionRemoveCredentials": { - "description": "Action button - delete Spotify credentials" - }, - "actionSaveCredentials": "Save Credentials", - "@actionSaveCredentials": { - "description": "Action button - save Spotify credentials" - }, "selectionSelected": "{count} selected", "@selectionSelected": { "description": "Selection count indicator", @@ -1236,6 +1154,19 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, + "updateRequiredTitle": "Update required", + "@updateRequiredTitle": { + "description": "Title of the mandatory update dialog shown when the installed version is too old" + }, + "updateRequiredNotice": "This version is {count} releases behind and is no longer supported. Update to keep using the app.", + "@updateRequiredNotice": { + "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", + "placeholders": { + "count": { + "type": "int" + } + } + }, "updateCurrent": "Current", "@updateCurrent": { "description": "Label for current version" @@ -1272,10 +1203,6 @@ "@providerPriorityInfo": { "description": "Info tip about fallback behavior" }, - "providerPriorityFallbackExtensionsTitle": "Extension Fallback", - "@providerPriorityFallbackExtensionsTitle": { - "description": "Section title for choosing which download extensions can be used as fallback providers" - }, "providerPriorityFallbackExtensionsDescription": "Choose which installed download extensions can be used during automatic fallback.", "@providerPriorityFallbackExtensionsDescription": { "description": "Section description for extension fallback selection" @@ -1284,10 +1211,6 @@ "@providerPriorityFallbackExtensionsHint": { "description": "Hint below the extension fallback selection list" }, - "providerBuiltIn": "Legacy", - "@providerBuiltIn": { - "description": "Legacy label retained for old generated localization compatibility" - }, "providerExtension": "Extension", "@providerExtension": { "description": "Label for extension-provided providers" @@ -1304,14 +1227,6 @@ "@metadataProviderPriorityInfo": { "description": "Info tip about rate limits" }, - "metadataNoRateLimits": "No rate limits", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, "logTitle": "Logs", "@logTitle": { "description": "Logs screen title" @@ -1378,30 +1293,6 @@ } } }, - "credentialsTitle": "Spotify Credentials", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Paste Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Paste Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, "channelStable": "Stable", "@channelStable": { "description": "Update channel - stable releases" @@ -1510,10 +1401,6 @@ "@settingsDownloadSubtitle": { "description": "Download settings description" }, - "settingsOptionsSubtitle": "Fallback, metadata, lyrics, cover art", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, "settingsExtensionsSubtitle": "Manage download providers", "@settingsExtensionsSubtitle": { "description": "Extensions settings description" @@ -1730,27 +1617,27 @@ }, "storeFilterAll": "All", "@storeFilterAll": { - "description": "Store filter - all extensions" + "description": "Repo filter - all extensions" }, "storeFilterMetadata": "Metadata", "@storeFilterMetadata": { - "description": "Store filter - metadata providers" + "description": "Repo filter - metadata providers" }, "storeFilterDownload": "Download", "@storeFilterDownload": { - "description": "Store filter - download providers" + "description": "Repo filter - download providers" }, "storeFilterUtility": "Utility", "@storeFilterUtility": { - "description": "Store filter - utility extensions" + "description": "Repo filter - utility extensions" }, "storeFilterLyrics": "Lyrics", "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" + "description": "Repo filter - lyrics providers" }, "storeFilterIntegration": "Integration", "@storeFilterIntegration": { - "description": "Store filter - integrations" + "description": "Repo filter - integrations" }, "storeClearFilters": "Clear filters", "@storeClearFilters": { @@ -1772,10 +1659,6 @@ "@storeRepoUrlHint": { "description": "Hint/placeholder for the repository URL input field" }, - "storeRepoUrlHelper": "e.g. https://github.com/user/extensions-repo", - "@storeRepoUrlHelper": { - "description": "Helper text below the repository URL input field" - }, "storeAddRepoButton": "Add Repository", "@storeAddRepoButton": { "description": "Button to submit a new repository URL" @@ -1808,18 +1691,6 @@ "@storeEmptyNoResults": { "description": "Message when search/filter returns no results" }, - "extensionDefaultProvider": "Default Search", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use the default metadata search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, "extensionId": "ID", "@extensionId": { "description": "Extension detail - unique ID" @@ -2087,10 +1958,6 @@ "@downloadLossyOpus128Subtitle": { "description": "Subtitle for Opus 128kbps lossy option" }, - "qualityNote": "Actual quality depends on track availability from the service", - "@qualityNote": { - "description": "Note about quality availability" - }, "downloadAskBeforeDownload": "Ask Before Download", "@downloadAskBeforeDownload": { "description": "Setting - show quality picker" @@ -2143,6 +2010,14 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, + "appearanceHeroAnimations": "Hero animations", + "@appearanceHeroAnimations": { + "description": "Toggle for shared-element (Hero) transitions" + }, + "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "@appearanceHeroAnimationsSubtitle": { + "description": "Subtitle for the Hero animations toggle" + }, "queueClearAll": "Clear All", "@queueClearAll": { "description": "Button - clear all queue items" @@ -2175,6 +2050,27 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, + "settingsConcurrentDownloads": "Concurrent downloads", + "@settingsConcurrentDownloads": { + "description": "Setting title - how many tracks download at the same time" + }, + "settingsConcurrentDownloadsSubtitle": "Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.", + "@settingsConcurrentDownloadsSubtitle": { + "description": "Subtitle explaining the concurrent downloads picker" + }, + "concurrentDownloadsOne": "1 track at a time", + "@concurrentDownloadsOne": { + "description": "Concurrent downloads option - sequential" + }, + "concurrentDownloadsCount": "Up to {count} tracks at once", + "@concurrentDownloadsCount": { + "description": "Concurrent downloads option - parallel", + "placeholders": { + "count": { + "type": "int" + } + } + }, "albumFolderArtistAlbum": "Artist / Album", "@albumFolderArtistAlbum": { "description": "Album folder option" @@ -2245,10 +2141,6 @@ } } }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, "downloadedAlbumTapToSelect": "Tap tracks to select", "@downloadedAlbumTapToSelect": { "description": "Selection hint" @@ -2976,6 +2868,22 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, + "libraryPlaybackNormalization": "Volume normalization", + "@libraryPlaybackNormalization": { + "description": "Toggle title for ReplayGain playback normalization in the built-in player" + }, + "libraryPlaybackNormalizationSubtitle": "Even out loudness between tracks using their ReplayGain or R128 tags, when present", + "@libraryPlaybackNormalizationSubtitle": { + "description": "Subtitle explaining playback volume normalization" + }, + "cacheAudioAnalysis": "Audio analysis cache", + "@cacheAudioAnalysis": { + "description": "Cache item title for saved audio analysis results" + }, + "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "@cacheAudioAnalysisDesc": { + "description": "Description of what audio analysis cache contains" + }, "cacheExploreFeed": "Explore feed cache", "@cacheExploreFeed": { "description": "Cache item title for explore home feed cache" @@ -3092,18 +3000,10 @@ "@trackSaveCoverArt": { "description": "Menu action - save album cover art as file" }, - "trackSaveCoverArtSubtitle": "Save album art as .jpg file", - "@trackSaveCoverArtSubtitle": { - "description": "Subtitle for save cover art action" - }, "trackSaveLyrics": "Save Lyrics (.lrc)", "@trackSaveLyrics": { "description": "Menu action - save lyrics as .lrc file" }, - "trackSaveLyricsSubtitle": "Fetch and save lyrics as .lrc file", - "@trackSaveLyricsSubtitle": { - "description": "Subtitle for save lyrics action" - }, "trackSaveLyricsProgress": "Saving lyrics...", "@trackSaveLyricsProgress": { "description": "Snackbar while saving lyrics to file" @@ -3116,10 +3016,6 @@ "@trackReEnrichOnlineSubtitle": { "description": "Subtitle for re-enrich metadata action for local items" }, - "trackReEnrichFieldsTitle": "Fields to update", - "@trackReEnrichFieldsTitle": { - "description": "Section title for field selection in re-enrich dialog" - }, "trackReEnrichFieldCover": "Cover Art", "@trackReEnrichFieldCover": { "description": "Checkbox label for cover art field in re-enrich" @@ -3203,18 +3099,6 @@ } } }, - "queueFlacFindingProgress": "Finding FLAC matches... ({current}/{total})", - "@queueFlacFindingProgress": { - "description": "Snackbar while resolving remote matches for local FLAC redownloads", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, "queueFlacNoReliableMatches": "No reliable online matches found for the selection", "@queueFlacNoReliableMatches": { "description": "Snackbar when no safe FLAC redownload matches were found" @@ -3244,10 +3128,6 @@ "@trackConvertFormat": { "description": "Menu item - convert audio format" }, - "trackConvertFormatSubtitle": "Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, "trackConvertTitle": "Convert Audio", "@trackConvertTitle": { "description": "Title of convert bottom sheet" @@ -3260,6 +3140,14 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, + "trackConvertKeepOriginal": "Keep original file", + "@trackConvertKeepOriginal": { + "description": "Toggle to preserve the source file during conversion" + }, + "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "@trackConvertKeepOriginalDescription": { + "description": "Description for preserving the source file during conversion" + }, "trackConvertConfirmTitle": "Confirm Conversion", "@trackConvertConfirmTitle": { "description": "Confirmation dialog title" @@ -3291,6 +3179,18 @@ } } }, + "trackConvertConfirmKeepOriginal": "Convert from {sourceFormat} to {targetFormat}?\n\nThe original file will be kept and the converted file will be added as a separate library entry.", + "@trackConvertConfirmKeepOriginal": { + "description": "Confirmation message when the source file will be preserved", + "placeholders": { + "sourceFormat": { + "type": "String" + }, + "targetFormat": { + "type": "String" + } + } + }, "trackConvertLosslessHint": "Lossless conversion — no quality loss", "@trackConvertLosslessHint": { "description": "Hint shown when converting between lossless formats" @@ -3316,10 +3216,6 @@ "@cueSplitTitle": { "description": "Title for CUE split bottom sheet" }, - "cueSplitSubtitle": "Split CUE+FLAC into individual tracks", - "@cueSplitSubtitle": { - "description": "Subtitle for CUE split menu item" - }, "cueSplitAlbum": "Album: {album}", "@cueSplitAlbum": { "description": "Album name in CUE split sheet", @@ -3416,10 +3312,6 @@ "@collectionFavoriteArtists": { "description": "Custom folder for favorite artists" }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, "collectionPlaylist": "Playlist", "@collectionPlaylist": { "description": "Single playlist label" @@ -3436,10 +3328,6 @@ "@collectionNoPlaylistsYet": { "description": "Empty state title when user has no playlists" }, - "collectionNoPlaylistsSubtitle": "Create a playlist to start categorizing tracks", - "@collectionNoPlaylistsSubtitle": { - "description": "Empty state subtitle when user has no playlists" - }, "collectionPlaylistTracks": "{count, plural, =1{1 track} other{{count} tracks}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", @@ -3476,10 +3364,6 @@ } } }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, "collectionPlaylistNameHint": "Playlist name", "@collectionPlaylistNameHint": { "description": "Hint text for playlist name input" @@ -3496,19 +3380,6 @@ "@collectionDeletePlaylist": { "description": "Action to delete playlist" }, - "collectionDeletePlaylistMessage": "Delete \"{playlistName}\" and all tracks inside it?", - "@collectionDeletePlaylistMessage": { - "description": "Confirmation message for deleting playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistDeleted": "Playlist deleted", - "@collectionPlaylistDeleted": { - "description": "Snackbar after deleting playlist" - }, "collectionPlaylistRenamed": "Playlist renamed", "@collectionPlaylistRenamed": { "description": "Snackbar after renaming playlist" @@ -3553,15 +3424,6 @@ "@collectionRemoveFromFolder": { "description": "Tooltip for removing track from wishlist/loved folder" }, - "collectionRemoved": "\"{trackName}\" removed", - "@collectionRemoved": { - "description": "Snackbar after removing a track from a collection", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, "collectionAddedToLoved": "\"{trackName}\" added to Loved", "@collectionAddedToLoved": { "description": "Snackbar after adding track to loved folder", @@ -3705,15 +3567,15 @@ } } }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", + "selectionBatchConvertConfirmKeepOriginal": "Convert {count} {count, plural, =1{track} other{tracks}} to {format}?\n\nOriginal files will be kept and converted files will be added as separate library entries.", + "@selectionBatchConvertConfirmKeepOriginal": { + "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { - "current": { + "count": { "type": "int" }, - "total": { - "type": "int" + "format": { + "type": "String" } } }, @@ -3879,10 +3741,6 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreating": "Creating backup...", - "@backupCreating": { - "description": "Progress text while a backup is being created" - }, "backupCreated": "Backup created", "@backupCreated": { "description": "Snackbar after a backup file is created" @@ -3891,10 +3749,6 @@ "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, - "backupEmpty": "There is nothing to back up yet", - "@backupEmpty": { - "description": "Snackbar when there is no data to back up" - }, "backupRestoreConfirmTitle": "Restore this backup?", "@backupRestoreConfirmTitle": { "description": "Confirmation dialog title before restoring a backup" @@ -3907,10 +3761,6 @@ "@backupRestoreConfirmButton": { "description": "Confirm button to proceed with restore" }, - "backupRestoring": "Restoring backup...", - "@backupRestoring": { - "description": "Progress text while restoring a backup" - }, "backupRestored": "Backup restored successfully", "@backupRestored": { "description": "Snackbar after a successful restore" @@ -3997,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the store.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -4110,6 +3960,26 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, + "downloadFolderAccessLostTitle": "Download folder access lost", + "@downloadFolderAccessLostTitle": { + "description": "Title of the warning banner shown in Files settings when the saved SAF folder grant is no longer valid" + }, + "downloadFolderAccessLostSubtitle": "Downloads will fail until you re-select the folder", + "@downloadFolderAccessLostSubtitle": { + "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" + }, + "downloadFolderReselect": "Re-select folder", + "@downloadFolderReselect": { + "description": "Button that reopens the folder picker to restore download folder access" + }, + "downloadErrorSafPermissionLost": "SAF permission invalid or revoked. Please reconfigure download location in Settings.", + "@downloadErrorSafPermissionLost": { + "description": "Error shown on downloads that failed because the persisted Android SAF folder grant is no longer valid" + }, + "downloadErrorFolderAccessLost": "Download folder access lost. Please re-select your download folder in Settings.", + "@downloadErrorFolderAccessLost": { + "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" + }, "downloadFilenameDescription": "Use {artist}, {title}, {album}, {track}, {year}, {date}, {disc} as placeholders.", "@downloadFilenameDescription": { "description": "Description shown in filename format editor" @@ -4178,10 +4048,6 @@ "@downloadSelectServiceToEnable": { "description": "Subtitle when quality picker is disabled due to extension service" }, - "downloadSelectTidalQobuz": "Select a provider with quality options to choose audio quality", - "@downloadSelectTidalQobuz": { - "description": "Legacy info shown when a provider does not expose quality options" - }, "downloadEmbedLyricsDisabled": "Enable metadata embedding first", "@downloadEmbedLyricsDisabled": { "description": "Subtitle when lyrics embedding is blocked by metadata toggle" @@ -4430,10 +4296,6 @@ } } }, - "queueDownloadedHeader": "Downloaded", - "@queueDownloadedHeader": { - "description": "Header label for downloaded items section in library" - }, "queueFilteringIndicator": "Filtering...", "@queueFilteringIndicator": { "description": "Shown while filter results are being computed" @@ -4588,15 +4450,6 @@ "@audioAnalysisRescanning": { "description": "Loading text while audio is being re-analyzed after an explicit refresh" }, - "extensionsSearchWith": "Search with {providerName}", - "@extensionsSearchWith": { - "description": "Extensions page - subtitle for default metadata search provider option", - "placeholders": { - "providerName": { - "type": "String" - } - } - }, "extensionsHomeFeedProvider": "Home Feed Provider", "@extensionsHomeFeedProvider": { "description": "Extensions page - label for home feed provider selector" @@ -4634,14 +4487,6 @@ "@extensionsNoHomeFeedExtensions": { "description": "Extensions page - shown when no installed extension has home feed" }, - "sortAlphaAsc": "A-Z", - "@sortAlphaAsc": { - "description": "Sort option - alphabetical ascending" - }, - "sortAlphaDesc": "Z-A", - "@sortAlphaDesc": { - "description": "Sort option - alphabetical descending" - }, "cancelDownloadTitle": "Cancel download?", "@cancelDownloadTitle": { "description": "Dialog title when confirming cancellation of an active download" @@ -4676,34 +4521,6 @@ } } }, - "errorLoadAlbum": "Failed to load album", - "@errorLoadAlbum": { - "description": "Error state shown when album fails to load" - }, - "errorLoadPlaylist": "Failed to load playlist", - "@errorLoadPlaylist": { - "description": "Error state shown when playlist fails to load" - }, - "errorLoadArtist": "Failed to load artist", - "@errorLoadArtist": { - "description": "Error state shown when artist fails to load" - }, - "notifChannelDownloadName": "Download Progress", - "@notifChannelDownloadName": { - "description": "Android notification channel name for download progress" - }, - "notifChannelDownloadDesc": "Shows download progress for tracks", - "@notifChannelDownloadDesc": { - "description": "Android notification channel description for download progress" - }, - "notifChannelLibraryScanName": "Library Scan", - "@notifChannelLibraryScanName": { - "description": "Android notification channel name for library scan" - }, - "notifChannelLibraryScanDesc": "Shows local library scan progress", - "@notifChannelLibraryScanDesc": { - "description": "Android notification channel description for library scan" - }, "notifDownloadingTrack": "Downloading {trackName}", "@notifDownloadingTrack": { "description": "Notification title while downloading a track", @@ -4770,6 +4587,14 @@ } } }, + "notifVerificationRequiredTitle": "Verification required", + "@notifVerificationRequiredTitle": { + "description": "Notification title shown when a download needs the user to complete a verification challenge but the app is in the background" + }, + "notifVerificationRequiredBody": "Open the app to complete verification and resume downloads", + "@notifVerificationRequiredBody": { + "description": "Notification body prompting the user to return to the app to solve a verification challenge" + }, "notifAllDownloadsComplete": "All Downloads Complete", "@notifAllDownloadsComplete": { "description": "Notification title when all downloads finish successfully" @@ -4956,14 +4781,6 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "searchTracksHint": "Search tracks...", - "@searchTracksHint": { - "description": "Placeholder for the search screen input" - }, - "searchTracksEmptyPrompt": "Search for tracks", - "@searchTracksEmptyPrompt": { - "description": "Empty-state prompt on the search screen" - }, "tutorialSearchHint": "Paste or search...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" @@ -4992,14 +4809,6 @@ "@optionsEmbedMetadataSubtitleOff": { "description": "Subtitle when metadata embedding is disabled" }, - "optionsMaxQualityCoverSubtitleDisabled": "Disabled when metadata embedding is off", - "@optionsMaxQualityCoverSubtitleDisabled": { - "description": "Subtitle for max quality cover when metadata embedding is disabled" - }, - "downloadFilenameHintExample": "{artist} - {title}", - "@downloadFilenameHintExample": { - "description": "Example placeholder for the download filename format input" - }, "trackCoverNoEmbeddedArt": "No embedded album art found", "@trackCoverNoEmbeddedArt": { "description": "Message shown when a track file has no embedded cover art" @@ -5239,14 +5048,6 @@ } } }, - "optionsDefaultSearchTabAlbums": "Albums", - "@optionsDefaultSearchTabAlbums": { - "description": "Default search tab option - Albums tab" - }, - "optionsDefaultSearchTabTracks": "Tracks", - "@optionsDefaultSearchTabTracks": { - "description": "Default search tab option - Tracks tab" - }, "settingsFiles": "Files & Folders", "@settingsFiles": { "description": "Settings menu item - file and folder settings" @@ -5307,10 +5108,26 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, + "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "@downloadDeduplicationWithQualityVariants": { + "description": "Deduplication subtitle when separate quality versions are allowed" + }, "downloadDeduplicationDisabled": "All tracks will be downloaded regardless of history", "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, + "downloadQualityVariants": "Allow different quality versions", + "@downloadQualityVariants": { + "description": "Setting to retain multiple quality versions of the same track" + }, + "downloadQualityVariantsDescription": "Add the selected quality to the filename and keep each version in download history", + "@downloadQualityVariantsDescription": { + "description": "Description for retaining multiple quality versions" + }, + "trackOptionDownloadQualityVariant": "Download another quality", + "@trackOptionDownloadQualityVariant": { + "description": "Track menu action to download another quality version" + }, "downloadFallbackExtensions": "Fallback Extensions", "@downloadFallbackExtensions": { "description": "Settings item for configuring fallback extension providers" @@ -5451,6 +5268,11 @@ } }, "queueDownloadStarting": "Starting...", + "queueCheckingDownloadSession": "Checking download session...", + "queueResolvingDownloadMetadata": "Resolving track metadata...", + "queueResolvingDownloadStream": "Preparing audio stream...", + "queueWaitingForVerification": "Waiting for verification...", + "queueResumingAfterVerification": "Resuming after verification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5539,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Beta Android service worker for extension downloads", + "downloadNativeWorkerSubtitle": "Android background service for extension downloads", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, @@ -5699,10 +5521,6 @@ "@errorInvalidFolderSelected": { "description": "Error when the selected folder is invalid" }, - "errorCouldNotKeepFolderAccess": "Could not keep access to the selected folder", - "@errorCouldNotKeepFolderAccess": { - "description": "Error when persistent folder access cannot be saved" - }, "storeAnyVersion": "Any", "@storeAnyVersion": { "description": "Store detail value when any app version is accepted" From 66cf998fb2358ea9667edee1bb6b6699375adf2e Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 12:55:14 +0700 Subject: [PATCH 29/37] 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 c9372153..54194ed4 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -3717,7 +3717,7 @@ "@backupTitle": { "description": "App bar title for the backup and restore page" }, - "backupExportSectionTitle": "백업 만들기", + "backupExportSectionTitle": "백업 생성", "@backupExportSectionTitle": { "description": "Section title for the export/backup card" }, @@ -3725,7 +3725,7 @@ "@backupExportSectionDescription": { "description": "Description of what a backup contains" }, - "backupExportButton": "백업 파일 만들기", + "backupExportButton": "백업 파일 생성", "@backupExportButton": { "description": "Button to create and share a backup file" }, @@ -3741,11 +3741,11 @@ "@backupImportButton": { "description": "Button to pick a backup file to restore" }, - "backupCreated": "백업 만들기 완료", + "backupCreated": "백업 생성 완료", "@backupCreated": { "description": "Snackbar after a backup file is created" }, - "backupCreateFailed": "백업 만들기 실패", + "backupCreateFailed": "백업 생성 실패", "@backupCreateFailed": { "description": "Snackbar when backup creation fails" }, @@ -5645,7 +5645,7 @@ "@nowPlayingUpNext": { "description": "Title for the playback queue sheet" }, - "nowPlayingDetails": "자세히", + "nowPlayingDetails": "트랙 세부 정보", "@nowPlayingDetails": { "description": "Menu item and section title for track metadata details" }, From 927ca6e4caca67c6589a943c5faa95dc32d0f994 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:00:32 +0700 Subject: [PATCH 30/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 54194ed4..aced3e15 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -312,7 +312,7 @@ "@optionsUpdateChannelWarning": { "description": "Warning about preview channel" }, - "optionsClearHistory": "다운로드 기록 삭제", + "optionsClearHistory": "다운로드 기록 지우기", "@optionsClearHistory": { "description": "Delete all download history" }, @@ -846,11 +846,11 @@ } } }, - "snackbarHistoryCleared": "기록 삭제됨", + "snackbarHistoryCleared": "기록 지워짐", "@snackbarHistoryCleared": { "description": "Snackbar - history deleted" }, - "snackbarDeletedTracks": "{count} 개의 {count, plural, =1{트랙} other{트랙}}이 제거됨", + "snackbarDeletedTracks": "{count} 개의 {count, plural, =1{트랙} other{트랙}}이 삭제됨", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1235,7 +1235,7 @@ "@logCopied": { "description": "Snackbar - logs copied" }, - "logSearchHint": "로그를 검색하는 중...", + "logSearchHint": "로그 검색...", "@logSearchHint": { "description": "Log search placeholder" }, @@ -1251,15 +1251,15 @@ "@logShareLogs": { "description": "Share button tooltip" }, - "logClearLogs": "로그 삭제", + "logClearLogs": "로그 지우기", "@logClearLogs": { "description": "Clear button tooltip" }, - "logClearLogsTitle": "로그 삭제", + "logClearLogsTitle": "로그 지우기", "@logClearLogsTitle": { "description": "Clear logs dialog title" }, - "logClearLogsMessage": "모든 로그를 삭제하시겠습니까?", + "logClearLogsMessage": "모든 로그를 지우시겠습니까?", "@logClearLogsMessage": { "description": "Clear logs confirmation message" }, @@ -2523,7 +2523,7 @@ "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "라이브러리에서 누락된 파일 {count} 개가 제거됨", + "libraryRemovedMissingFiles": "라이브러리에서 누락된 파일 {count} 개가 삭제됨", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { From bb127d1cc22a97a83a6d5c211242af1581451feb Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 14:00:34 +0700 Subject: [PATCH 31/37] New translations app_en.arb (French) [ci skip] --- lib/l10n/arb/app_fr.arb | 68 ++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/l10n/arb/app_fr.arb b/lib/l10n/arb/app_fr.arb index 845bcfe8..86f92e0a 100644 --- a/lib/l10n/arb/app_fr.arb +++ b/lib/l10n/arb/app_fr.arb @@ -1154,11 +1154,11 @@ "@updateNewVersionReady": { "description": "Update subtitle" }, - "updateRequiredTitle": "Update required", + "updateRequiredTitle": "Mise à jour requise", "@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": "Cette version a {count} versions de retard et n'est plus prise en charge. Effectuez la mise à jour pour continuer à utiliser l'application.", "@updateRequiredNotice": { "description": "Subtitle of the mandatory update dialog; explains why the dialog cannot be dismissed", "placeholders": { @@ -2010,11 +2010,11 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "Animations des héros", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "appearanceHeroAnimationsSubtitle": "Des fenêtres contextuelles apparaissent entre les écrans, par exemple lors de l'ouverture du lecteur", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, @@ -2050,19 +2050,19 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "settingsConcurrentDownloads": "Concurrent downloads", + "settingsConcurrentDownloads": "Téléchargements simultanés", "@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": "Le téléchargement simultané de plusieurs titres est plus rapide, mais certains fournisseurs peuvent limiter le débit des requêtes parallèles.", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "1 track at a time", + "concurrentDownloadsOne": "1 titre à la fois", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "Up to {count} tracks at once", + "concurrentDownloadsCount": "Jusqu'à {count} titres à la fois", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2868,19 +2868,19 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "libraryPlaybackNormalization": "Volume normalization", + "libraryPlaybackNormalization": "Normalisation du volume", "@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": "Équilibrer le volume entre les morceaux à l'aide des balises ReplayGain ou R128, lorsqu'elles sont présentes", "@libraryPlaybackNormalizationSubtitle": { "description": "Subtitle explaining playback volume normalization" }, - "cacheAudioAnalysis": "Audio analysis cache", + "cacheAudioAnalysis": "Cache d'analyse audio", "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "cacheAudioAnalysisDesc": "Spectrogrammes et résultats d'analyse enregistrés. Réanalyse prévue lors de la prochaine ouverture.", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -3140,11 +3140,11 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertKeepOriginal": "Keep original file", + "trackConvertKeepOriginal": "Conserver le fichier d'origine", "@trackConvertKeepOriginal": { "description": "Toggle to preserve the source file during conversion" }, - "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "trackConvertKeepOriginalDescription": "Ajoutez le fichier converti en tant qu'entrée distincte dans la bibliothèque", "@trackConvertKeepOriginalDescription": { "description": "Description for preserving the source file during conversion" }, @@ -3179,7 +3179,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 du format {sourceFormat} au format {targetFormat} ?\n\nLe fichier d'origine sera conservé et le fichier converti sera ajouté en tant qu'entrée distincte dans la bibliothèque.", "@trackConvertConfirmKeepOriginal": { "description": "Confirmation message when the source file will be preserved", "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": "Convertir {count} {count, plural, =1{titre} other{titres}} au format {format} ?\n\nLes fichiers d'origine seront conservés et les fichiers convertis seront ajoutés sous forme d'entrées distinctes dans la bibliothèque.", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3847,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", + "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} n'ont pas pu être réinstallées. Installez-les manuellement à partir du dépôt.", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -3960,23 +3960,23 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFolderAccessLostTitle": "Download folder access lost", + "downloadFolderAccessLostTitle": "Accès au dossier de téléchargement perdu", "@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": "Les téléchargements échoueront tant que vous n'aurez pas resélectionné le dossier", "@downloadFolderAccessLostSubtitle": { "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" }, - "downloadFolderReselect": "Re-select folder", + "downloadFolderReselect": "Sélectionner à nouveau le dossier", "@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": "Autorisation SAF non valide ou révoquée. Veuillez reconfigurer l'emplacement de téléchargement dans les Paramètres.", "@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": "Accès au dossier de téléchargement perdu. Veuillez sélectionner à nouveau votre dossier de téléchargement dans les Paramètres.", "@downloadErrorFolderAccessLost": { "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" }, @@ -4587,11 +4587,11 @@ } } }, - "notifVerificationRequiredTitle": "Verification required", + "notifVerificationRequiredTitle": "Vérification requise", "@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": "Ouvrez l'application pour terminer la vérification et reprendre les téléchargements", "@notifVerificationRequiredBody": { "description": "Notification body prompting the user to return to the app to solve a verification challenge" }, @@ -5108,7 +5108,7 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "downloadDeduplicationWithQualityVariants": "Les fichiers existants correspondant à la qualité sélectionnée seront ignorés", "@downloadDeduplicationWithQualityVariants": { "description": "Deduplication subtitle when separate quality versions are allowed" }, @@ -5116,15 +5116,15 @@ "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadQualityVariants": "Allow different quality versions", + "downloadQualityVariants": "Autoriser différentes versions de qualité", "@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": "Ajouter la qualité sélectionnée au nom du fichier et conserver chaque version dans l'historique des téléchargements", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, - "trackOptionDownloadQualityVariant": "Download another quality", + "trackOptionDownloadQualityVariant": "Télécharger une autre version de qualité", "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, @@ -5268,11 +5268,11 @@ } }, "queueDownloadStarting": "C'est parti...", - "queueCheckingDownloadSession": "Checking download session...", - "queueResolvingDownloadMetadata": "Resolving track metadata...", - "queueResolvingDownloadStream": "Preparing audio stream...", - "queueWaitingForVerification": "Waiting for verification...", - "queueResumingAfterVerification": "Resuming after verification...", + "queueCheckingDownloadSession": "Vérification de la session de téléchargement...", + "queueResolvingDownloadMetadata": "Récupération des métadonnées du morceau...", + "queueResolvingDownloadStream": "Préparation du flux audio...", + "queueWaitingForVerification": "En attente de vérification...", + "queueResumingAfterVerification": "Reprise après vérification...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5361,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "downloadNativeWorkerSubtitle": "Service d'arrière-plan Android pour le téléchargement d'extensions", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, From a7069a8f919f097d17d9d36cb0e339404950c567 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 15:34:01 +0700 Subject: [PATCH 32/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index aced3e15..ad059ff8 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1038,19 +1038,19 @@ "@searchSortDefault": { "description": "Sort option - default API order" }, - "searchSortTitleAZ": "제목 (A-Z)", + "searchSortTitleAZ": "제목 (오름차순)", "@searchSortTitleAZ": { "description": "Sort option - title ascending" }, - "searchSortTitleZA": "제목 (Z-A)", + "searchSortTitleZA": "제목 (내림차순)", "@searchSortTitleZA": { "description": "Sort option - title descending" }, - "searchSortArtistAZ": "아티스트 (A-Z)", + "searchSortArtistAZ": "아티스트 (오름차순)", "@searchSortArtistAZ": { "description": "Sort option - artist ascending" }, - "searchSortArtistZA": "아티스트 (Z-A)", + "searchSortArtistZA": "아티스트 (내림차순)", "@searchSortArtistZA": { "description": "Sort option - artist descending" }, @@ -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": { @@ -2010,7 +2010,7 @@ "@appearanceAmoledDarkSubtitle": { "description": "Subtitle for AMOLED dark" }, - "appearanceHeroAnimations": "Hero animations", + "appearanceHeroAnimations": "히어로 애니메이션", "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, @@ -2640,19 +2640,19 @@ "@libraryFilterSortOldest": { "description": "Sort option - oldest first" }, - "libraryFilterSortAlbumAsc": "앨범 (A-Z)", + "libraryFilterSortAlbumAsc": "앨범 (오름차순)", "@libraryFilterSortAlbumAsc": { "description": "Sort option - album ascending" }, - "libraryFilterSortAlbumDesc": "앨범 (Z-A)", + "libraryFilterSortAlbumDesc": "앨범 (내림차순)", "@libraryFilterSortAlbumDesc": { "description": "Sort option - album descending" }, - "libraryFilterSortGenreAsc": "장르 (A-Z)", + "libraryFilterSortGenreAsc": "장르 (오름차순)", "@libraryFilterSortGenreAsc": { "description": "Sort option - genre ascending" }, - "libraryFilterSortGenreDesc": "장르 (Z-A)", + "libraryFilterSortGenreDesc": "장르 (내림차순)", "@libraryFilterSortGenreDesc": { "description": "Sort option - genre descending" }, From c19477a4f4e288003b4514fbab89d54b540aced0 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 16:41:28 +0700 Subject: [PATCH 33/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 68 ++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index ad059ff8..801aadae 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -1329,7 +1329,7 @@ "@sectionService": { "description": "Settings section header" }, - "sectionAudioQuality": "오디오 품질", + "sectionAudioQuality": "오디오 음질", "@sectionAudioQuality": { "description": "Settings section header" }, @@ -2014,7 +2014,7 @@ "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "Fly covers between screens, e.g. when opening the player", + "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 표지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우에)", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, @@ -2050,19 +2050,19 @@ "@settingsDownloadNetworkSubtitle": { "description": "Subtitle explaining network preference" }, - "settingsConcurrentDownloads": "Concurrent downloads", + "settingsConcurrentDownloads": "동시 다운로드", "@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": "여러 트랙을 동시에 다운로드하면 속도는 빨라지지만, 일부 제공자는 동시 요청을 제한할 수 있습니다", "@settingsConcurrentDownloadsSubtitle": { "description": "Subtitle explaining the concurrent downloads picker" }, - "concurrentDownloadsOne": "1 track at a time", + "concurrentDownloadsOne": "한 번에 1개의 트랙", "@concurrentDownloadsOne": { "description": "Concurrent downloads option - sequential" }, - "concurrentDownloadsCount": "Up to {count} tracks at once", + "concurrentDownloadsCount": "한 번에 최대 {count} 개의 트랙", "@concurrentDownloadsCount": { "description": "Concurrent downloads option - parallel", "placeholders": { @@ -2523,7 +2523,7 @@ "@libraryInLibrary": { "description": "Badge shown on tracks that exist in local library" }, - "libraryRemovedMissingFiles": "라이브러리에서 누락된 파일 {count} 개가 삭제됨", + "libraryRemovedMissingFiles": "라이브러리에서 {count} 개의 누락된 파일이 삭제됨", "@libraryRemovedMissingFiles": { "description": "Snackbar after cleanup", "placeholders": { @@ -2868,19 +2868,19 @@ "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, - "libraryPlaybackNormalization": "Volume normalization", + "libraryPlaybackNormalization": "볼륨 정규화", "@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": "트랙에 ReplayGain 또는 R128 태그가 있는 경우에 이를 사용하여 트랙 간 음량을 일정하게 맞춥니다", "@libraryPlaybackNormalizationSubtitle": { "description": "Subtitle explaining playback volume normalization" }, - "cacheAudioAnalysis": "Audio analysis cache", + "cacheAudioAnalysis": "오디오 분석 캐시", "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "Saved spectrograms and analysis results. Will re-analyze on next open.", + "cacheAudioAnalysisDesc": "스펙트로그램과 분석 결과를 저장하였습니다. 다음에 실행할 경우에 다시 분석합니다", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -3140,11 +3140,11 @@ "@trackConvertBitrate": { "description": "Label for bitrate selection" }, - "trackConvertKeepOriginal": "Keep original file", + "trackConvertKeepOriginal": "원본 파일 유지", "@trackConvertKeepOriginal": { "description": "Toggle to preserve the source file during conversion" }, - "trackConvertKeepOriginalDescription": "Add the converted file as a separate library entry", + "trackConvertKeepOriginalDescription": "변환된 파일을 별도의 라이브러리 항목으로 추가합니다", "@trackConvertKeepOriginalDescription": { "description": "Description for preserving the source file during conversion" }, @@ -3179,7 +3179,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": "{sourceFormat}에서 {targetFormat}으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다", "@trackConvertConfirmKeepOriginal": { "description": "Confirmation message when the source file will be preserved", "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, =1{트랙} other{트랙}}을 {format}으로 변환하시겠습니까?\n\n원본 파일은 유지되고 변환된 파일은 별도의 라이브러리 항목으로 추가됩니다", "@selectionBatchConvertConfirmKeepOriginal": { "description": "Batch conversion confirmation when source files will be preserved", "placeholders": { @@ -3847,7 +3847,7 @@ "@backupIncludeSecretsDescription": { "description": "Explanation for the include-credentials toggle" }, - "backupExtensionsRestoreFailed": "{count} {count, plural, =1{extension} other{extensions}} could not be reinstalled. Install them manually from the repo.", + "backupExtensionsRestoreFailed": "{count} 개의 {count, plural, =1{확장 프로그램} other{확장 프로그램}}을 다시 설치할 수 없습니다. 레포에서 수동으로 설치하세요", "@backupExtensionsRestoreFailed": { "description": "Snackbar/hint when some extensions failed to reinstall during restore", "placeholders": { @@ -3960,23 +3960,23 @@ "@storageModeSafSubtitle": { "description": "Subtitle for SAF storage mode" }, - "downloadFolderAccessLostTitle": "Download folder access lost", + "downloadFolderAccessLostTitle": "다운로드 폴더 접근 손실", "@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": "폴더를 다시 선택할 때까지 다운로드할 수 없습니다", "@downloadFolderAccessLostSubtitle": { "description": "Subtitle of the warning banner shown when the saved SAF folder grant is no longer valid" }, - "downloadFolderReselect": "Re-select folder", + "downloadFolderReselect": "폴더 다시 선택", "@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": "SAF 권한이 잘못되었거나 취소되었습니다. 설정에서 다운로드 위치를 다시 설정하세요", "@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": "다운로드 폴더 접근 권한이 없습니다. 설정에서 다운로드 폴더를 다시 설정하세요", "@downloadErrorFolderAccessLost": { "description": "Error shown on downloads that failed because the iOS download folder bookmark could not be opened" }, @@ -4132,7 +4132,7 @@ "@downloadMusixmatchLanguageHint": { "description": "Placeholder for Musixmatch language input" }, - "downloadMusixmatchLanguageDesc": "Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: en, de, ja)", + "downloadMusixmatchLanguageDesc": "Musixmatch에서 번역된 가사를 요청하려면 BCP-47 언어 코드를 입력하세요 (예시: ko, en, ja)", "@downloadMusixmatchLanguageDesc": { "description": "Description in Musixmatch language picker" }, @@ -4587,11 +4587,11 @@ } } }, - "notifVerificationRequiredTitle": "Verification required", + "notifVerificationRequiredTitle": "인증 필요", "@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": "앱을 실행하여 인증을 완료하고 다운로드를 재개하세요", "@notifVerificationRequiredBody": { "description": "Notification body prompting the user to return to the app to solve a verification challenge" }, @@ -5108,7 +5108,7 @@ "@downloadDeduplicationEnabled": { "description": "Subtitle when deduplication is on" }, - "downloadDeduplicationWithQualityVariants": "Existing files at the selected quality will be skipped", + "downloadDeduplicationWithQualityVariants": "선택된 음질의 기존 파일은 건너뜁니다", "@downloadDeduplicationWithQualityVariants": { "description": "Deduplication subtitle when separate quality versions are allowed" }, @@ -5116,15 +5116,15 @@ "@downloadDeduplicationDisabled": { "description": "Subtitle when deduplication is off" }, - "downloadQualityVariants": "Allow different quality versions", + "downloadQualityVariants": "다양한 음질 버전 허용", "@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": "선택된 음질을 파일 이름에 추가하고, 각 버전을 다운로드 기록에 유지합니다", "@downloadQualityVariantsDescription": { "description": "Description for retaining multiple quality versions" }, - "trackOptionDownloadQualityVariant": "Download another quality", + "trackOptionDownloadQualityVariant": "다른 음질 다운로드", "@trackOptionDownloadQualityVariant": { "description": "Track menu action to download another quality version" }, @@ -5268,11 +5268,11 @@ } }, "queueDownloadStarting": "시작하는 중...", - "queueCheckingDownloadSession": "Checking download session...", - "queueResolvingDownloadMetadata": "Resolving track metadata...", - "queueResolvingDownloadStream": "Preparing audio stream...", - "queueWaitingForVerification": "Waiting for verification...", - "queueResumingAfterVerification": "Resuming after verification...", + "queueCheckingDownloadSession": "다운로드 세션을 확인하는 중...", + "queueResolvingDownloadMetadata": "트랙 메타데이터를 확인하는 중...", + "queueResolvingDownloadStream": "오디오 스트림을 준비하는 중...", + "queueWaitingForVerification": "확인을 기다리는 중...", + "queueResumingAfterVerification": "확인 후 재개하는 중...", "@queueDownloadStarting": { "description": "Queue status before download progress is available" }, @@ -5361,7 +5361,7 @@ "@downloadNativeWorker": { "description": "Setting title for Android native download worker" }, - "downloadNativeWorkerSubtitle": "Android background service for extension downloads", + "downloadNativeWorkerSubtitle": "확장 프로그램 다운로드를 위한 Android 백그라운드 서비스", "@downloadNativeWorkerSubtitle": { "description": "Setting subtitle for Android native download worker" }, From c681b891ebc82eb25f917477c38b5f9dfafeeeab Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 17:44:57 +0700 Subject: [PATCH 34/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index 801aadae..fe33cd04 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -670,7 +670,7 @@ "@setupLanguageTitle": { "description": "Title for the language selection step in setup" }, - "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요. 나중에 설정에서 변경할 수 있습니다", + "setupLanguageDescription": "앱에서 사용할 언어를 선택하세요\\n나중에 설정에서 변경할 수 있습니다", "@setupLanguageDescription": { "description": "Description for the language selection step in setup" }, @@ -2686,15 +2686,15 @@ "@tutorialWelcomeDesc": { "description": "Tutorial welcome page description" }, - "tutorialWelcomeTip1": "Spotify, Deezer에서 음악을 다운로드하거나 지원되는 URL을 붙여넣으세요", + "tutorialWelcomeTip1": "Spotify, Deezer 또는 지원되는 URL에서 음악을 다운로드할 수 있습니다", "@tutorialWelcomeTip1": { "description": "Tutorial welcome tip 1" }, - "tutorialWelcomeTip2": "설치된 다운로드 확장 프로그램에서 FLAC 음질 오디오를 받으세요", + "tutorialWelcomeTip2": "설치된 다운로드 확장 프로그램으로 FLAC 고음질 오디오를 다운로드할 수 있습니다", "@tutorialWelcomeTip2": { "description": "Tutorial welcome tip 2" }, - "tutorialWelcomeTip3": "메타데이터, 표지 이미지 및 가사 자동 삽입", + "tutorialWelcomeTip3": "메타데이터, 표지 이미지 및 가사를 자동으로 추가할 수 있습니다", "@tutorialWelcomeTip3": { "description": "Tutorial welcome tip 3" }, @@ -2710,7 +2710,7 @@ "@tutorialDownloadTitle": { "description": "Tutorial download page title" }, - "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다. 작동 방식은 다음과 같습니다", + "tutorialDownloadDesc": "음악 다운로드는 간단하고 빠릅니다\\n작동 방식은 다음과 같습니다", "@tutorialDownloadDesc": { "description": "Tutorial download page description" }, @@ -2722,15 +2722,15 @@ "@tutorialLibraryDesc": { "description": "Tutorial library page description" }, - "tutorialLibraryTip1": "라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인하세요", + "tutorialLibraryTip1": "라이브러리 탭에서 다운로드 진행 상황과 다운로드 목록을 확인할 수 있습니다", "@tutorialLibraryTip1": { "description": "Tutorial library tip 1" }, - "tutorialLibraryTip2": "음악 플레이어로 재생하려면 아무 트랙이나 탭하세요", + "tutorialLibraryTip2": "아무 트랙을 탭하여 음악 플레이어로 재생할 수 있습니다", "@tutorialLibraryTip2": { "description": "Tutorial library tip 2" }, - "tutorialLibraryTip3": "더 나은 탐색을 위해 리스트 보기와 그리드 보기 사이를 전환하세요", + "tutorialLibraryTip3": "리스트 보기 또는 그리드 보기로 전환하여 더 나은 탐색을 할 수 있습니다", "@tutorialLibraryTip3": { "description": "Tutorial library tip 3" }, @@ -2742,15 +2742,15 @@ "@tutorialExtensionsDesc": { "description": "Tutorial extensions page description" }, - "tutorialExtensionsTip1": "유용한 확장 프로그램을 찾으려면 레포 탭을 탐색하세요", + "tutorialExtensionsTip1": "레포 탭을 탐색하여 유용한 확장 프로그램을 찾을 수 있습니다", "@tutorialExtensionsTip1": { "description": "Tutorial extensions tip 1" }, - "tutorialExtensionsTip2": "새 다운로드 제공자 또는 검색 출처를 추가하세요", + "tutorialExtensionsTip2": "새 다운로드 제공자 또는 검색 출처를 추가할 수 있습니다", "@tutorialExtensionsTip2": { "description": "Tutorial extensions tip 2" }, - "tutorialExtensionsTip3": "가사, 향상된 메타데이터 및 더 많은 기능을 이용하세요", + "tutorialExtensionsTip3": "가사, 향상된 메타데이터 및 더 많은 기능을 사용할 수 있습니다", "@tutorialExtensionsTip3": { "description": "Tutorial extensions tip 3" }, @@ -4781,7 +4781,7 @@ "@actionPaste": { "description": "Generic action - paste from clipboard" }, - "tutorialSearchHint": "붙여넣기 또는 검색...", + "tutorialSearchHint": "붙여넣기 또는 검색하기...", "@tutorialSearchHint": { "description": "Placeholder shown in the tutorial search demo" }, From d4c38b75509d84a42390fdb7fea25b9836c9b480 Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sat, 25 Jul 2026 18:41:06 +0700 Subject: [PATCH 35/37] 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 fe33cd04..4713c9f1 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -170,7 +170,7 @@ "@optionsAutoFallback": { "description": "Auto-retry with other services" }, - "optionsAutoFallbackSubtitle": "다운로드가 실패한 경우에 다른 서비스를 이용해 보세요", + "optionsAutoFallbackSubtitle": "다운로드가 실패한 경우에 다른 서비스를 사용합니다", "@optionsAutoFallbackSubtitle": { "description": "Subtitle for auto fallback" }, @@ -473,7 +473,7 @@ "@aboutSjdonadoDesc": { "description": "Credit description for sjdonado" }, - "aboutAppDescription": "음악 메타데이터를 검색하고, 확장 프로그램을 관리하고, 라이브러리를 정리하세요", + "aboutAppDescription": "음악 메타데이터를 검색하고\\n확장 프로그램을 관리하고\\n라이브러리를 정리하세요", "@aboutAppDescription": { "description": "App description in header card" }, @@ -2495,7 +2495,7 @@ } } }, - "libraryLastScannedNever": "절대 안 함", + "libraryLastScannedNever": "스캔한 적 없음", "@libraryLastScannedNever": { "description": "Shown when library has never been scanned" }, @@ -2840,7 +2840,7 @@ "@cacheAppDirectory": { "description": "Cache item title for app cache directory" }, - "cacheAppDirectoryDesc": "HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터", + "cacheAppDirectoryDesc": "HTTP 응답, WebView 데이터 및 기타 임시 앱 데이터입니다", "@cacheAppDirectoryDesc": { "description": "Description of what app cache directory contains" }, @@ -2864,7 +2864,7 @@ "@cacheLibraryCover": { "description": "Cache item title for local library cover art images" }, - "cacheLibraryCoverDesc": "로컬 음악 파일에서 표지 이미지를 추출하였습니다. 다음 스캔 시 다시 추출합니다", + "cacheLibraryCoverDesc": "로컬 음악 파일에서 추출된 표지 이미지입니다. 다음 스캔 시 다시 추출됩니다", "@cacheLibraryCoverDesc": { "description": "Description of what library cover cache contains" }, @@ -2880,7 +2880,7 @@ "@cacheAudioAnalysis": { "description": "Cache item title for saved audio analysis results" }, - "cacheAudioAnalysisDesc": "스펙트로그램과 분석 결과를 저장하였습니다. 다음에 실행할 경우에 다시 분석합니다", + "cacheAudioAnalysisDesc": "저장된 스펙트로그램과 분석 결과입니다. 다음에 실행할 경우에 다시 분석합니다", "@cacheAudioAnalysisDesc": { "description": "Description of what audio analysis cache contains" }, @@ -2896,7 +2896,7 @@ "@cacheTrackLookup": { "description": "Cache item title for track ID lookup cache" }, - "cacheTrackLookupDesc": "Spotify/Deezer 트랙 ID을 조회합니다. 지우면 속도가 느려질 수 있습니다", + "cacheTrackLookupDesc": "조회된 Spotify/Deezer 트랙 ID입니다. 지우면 속도가 느려질 수 있습니다", "@cacheTrackLookupDesc": { "description": "Description of what track lookup cache contains" }, @@ -3615,7 +3615,7 @@ "@lyricsProvidersTitle": { "description": "Settings item title for lyrics provider order" }, - "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬합니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다", + "lyricsProvidersDescription": "가사 출처를 활성화, 비활성화 및 재정렬할 수 있습니다. 가사가 발견될 때까지 위에서 아래로 제공자를 시도합니다", "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, @@ -3697,7 +3697,7 @@ "@safMigrationSuccess": { "description": "Snackbar after successfully migrating to SAF" }, - "settingsDonate": "개발 지원", + "settingsDonate": "개발 후원", "@settingsDonate": { "description": "Settings menu item - donate page" }, From 1c95109b7b2f9d68d7751076144e8c9fd976dfee Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 26 Jul 2026 04:15:24 +0700 Subject: [PATCH 36/37] 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 4713c9f1..e86f2b03 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -2014,7 +2014,7 @@ "@appearanceHeroAnimations": { "description": "Toggle for shared-element (Hero) transitions" }, - "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 표지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우에)", + "appearanceHeroAnimationsSubtitle": "화면 간 이동 시 표지 이미지가 날아가는 애니메이션을 표시합니다 (예시: 플레이어를 실행할 경우)", "@appearanceHeroAnimationsSubtitle": { "description": "Subtitle for the Hero animations toggle" }, @@ -2460,7 +2460,7 @@ "@libraryClearConfirmMessage": { "description": "Dialog message for clear confirmation" }, - "libraryAbout": "로컬 저장소에 대한 정보", + "libraryAbout": "로컬 라이브러리에 대한 정보", "@libraryAbout": { "description": "Section header for about info" }, From 9b35c6dc4254894b9a8b072b9a9b6f5cef5bb79c Mon Sep 17 00:00:00 2001 From: Zarz Eleutherius <42882290+zarzet@users.noreply.github.com> Date: Sun, 26 Jul 2026 05:38:10 +0700 Subject: [PATCH 37/37] New translations app_en.arb (Korean) [ci skip] --- lib/l10n/arb/app_ko.arb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/l10n/arb/app_ko.arb b/lib/l10n/arb/app_ko.arb index e86f2b03..92cb565f 100644 --- a/lib/l10n/arb/app_ko.arb +++ b/lib/l10n/arb/app_ko.arb @@ -3619,7 +3619,7 @@ "@lyricsProvidersDescription": { "description": "Description on the lyrics provider priority page" }, - "lyricsProvidersInfoText": "확장 프로그램 가사 제공자는 내장 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", + "lyricsProvidersInfoText": "확장 프로그램 가사 제공자는 내부 가사 제공자보다 먼저 실행됩니다. 하나 이상의 제공자가 활성화되어 있어야 합니다", "@lyricsProvidersInfoText": { "description": "Info tip on lyrics provider priority page" }, @@ -5617,7 +5617,7 @@ "@libraryExternalPlayerSubtitle": { "description": "Subtitle for external player option" }, - "libraryBuiltInPreviewPlayer": "내장 미리듣기 플레이어", + "libraryBuiltInPreviewPlayer": "내부 미리듣기 플레이어", "@libraryBuiltInPreviewPlayer": { "description": "Setting option to use the built-in preview player" }, @@ -5625,7 +5625,7 @@ "@libraryBuiltInPreviewPlayerSubtitle": { "description": "Subtitle for built-in preview player option" }, - "libraryBuiltInPlayerInfo": "내장 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다", + "libraryBuiltInPlayerInfo": "내부 플레이어는 로컬 트랙을 빠르게 미리듣기 위한 도구입니다. 실제 음악 감상은 외부 음악 플레이어를 이용하는 것을 권장합니다", "@libraryBuiltInPlayerInfo": { "description": "Info note explaining the built-in player is for previews only" },