From a4899144c51bf8818ff59a82961d397545ed87d1 Mon Sep 17 00:00:00 2001 From: zarzet Date: Sun, 8 Mar 2026 23:12:48 +0700 Subject: [PATCH] fix: show error feedback for unrecognized URLs and fix l10n warnings --- lib/l10n/app_localizations.dart | 18 + lib/l10n/app_localizations_de.dart | 714 +++---- lib/l10n/app_localizations_en.dart | 11 + lib/l10n/app_localizations_es.dart | 11 + lib/l10n/app_localizations_fr.dart | 15 +- lib/l10n/app_localizations_hi.dart | 15 +- lib/l10n/app_localizations_id.dart | 166 +- lib/l10n/app_localizations_ja.dart | 174 +- lib/l10n/app_localizations_ko.dart | 471 +++-- lib/l10n/app_localizations_nl.dart | 15 +- lib/l10n/app_localizations_pt.dart | 11 + lib/l10n/app_localizations_ru.dart | 239 ++- lib/l10n/app_localizations_tr.dart | 11 + lib/l10n/app_localizations_zh.dart | 477 ++++- lib/l10n/arb/app_de.arb | 18 +- lib/l10n/arb/app_en.arb | 12 + lib/l10n/arb/app_es-ES.arb | 3105 ---------------------------- lib/l10n/arb/app_id.arb | 12 + lib/l10n/arb/app_pt-PT.arb | 3105 ---------------------------- lib/l10n/arb/app_ru.arb | 22 +- lib/l10n/arb/app_tr-TR.arb | 3105 ---------------------------- lib/l10n/arb/app_zh_CN.arb | 2 +- lib/l10n/arb/app_zh_TW.arb | 2 +- lib/providers/track_provider.dart | 13 + lib/screens/home_tab.dart | 74 +- lib/screens/main_shell.dart | 18 +- 26 files changed, 1630 insertions(+), 10206 deletions(-) delete mode 100644 lib/l10n/arb/app_es-ES.arb delete mode 100644 lib/l10n/arb/app_pt-PT.arb delete mode 100644 lib/l10n/arb/app_tr-TR.arb diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 822982eb..c059621b 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -1306,6 +1306,24 @@ abstract class AppLocalizations { /// **'No tracks found'** String get errorNoTracksFound; + /// Error title - URL not handled by any extension or service + /// + /// In en, this message translates to: + /// **'Link not recognized'** + String get errorUrlNotRecognized; + + /// Error message - URL not recognized explanation + /// + /// In en, this message translates to: + /// **'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'** + String get errorUrlNotRecognizedMessage; + + /// Error message - generic URL fetch failure + /// + /// In en, this message translates to: + /// **'Failed to load content from this link. Please try again.'** + String get errorUrlFetchFailed; + /// Error - extension source not available /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index af8f7b73..246f5314 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -15,7 +15,7 @@ class AppLocalizationsDe extends AppLocalizations { String get navHome => 'Startseite'; @override - String get navLibrary => 'Archiv'; + String get navLibrary => 'Bibliothek'; @override String get navSettings => 'Einstellungen'; @@ -365,7 +365,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get aboutAppDescription => - 'Lade Spotify-Titel in verlustfreier Qualität von Tidal und Qobuz herunter.'; + 'Lade Spotify-Titel in verlustfreier Qualität von Tidal, Qobuz und Amazon Music herunter.'; @override String get artistAlbums => 'Alben'; @@ -500,7 +500,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get setupNotificationBackgroundDescription => - 'Werde benachrichtigt über Download-Fortschritt und -Fertigstellung. Dies hilft Ihnen, Downloads zu verfolgen, wenn die App im Hintergrund ist.'; + 'Erhalte Benachrichtigungen über den Fortschritt und die Fertigstellung deiner Downloads, selbst wenn die App im Hintergrund läuft.'; @override String get setupSkipForNow => 'Vorerst überspringen'; @@ -592,11 +592,11 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get dialogImportPlaylistTitle => 'Wiedergabeliste importieren'; + String get dialogImportPlaylistTitle => 'Playlist importieren'; @override String dialogImportPlaylistMessage(int count) { - return '$count Titel in CSV gefunden. Zur Warteschlange hinzufügen?'; + return '$count Titel gefunden hinzufügen?'; } @override @@ -606,12 +606,12 @@ class AppLocalizationsDe extends AppLocalizations { @override String snackbarAddedToQueue(String trackName) { - return '\"$trackName\" zur Warteschlange hinzugefügt'; + return '\"$trackName\" hinzugefügt'; } @override String snackbarAddedTracksToQueue(int count) { - return '$count Titel zur Warteschlange hinzugefügt'; + return '$count Titel hinzugefügt'; } @override @@ -701,6 +701,17 @@ class AppLocalizationsDe extends AppLocalizations { @override String get errorNoTracksFound => 'Keine Titel gefunden'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Kann $item nicht lade wegen fehlender Erweiterungsquelle'; @@ -765,11 +776,11 @@ class AppLocalizationsDe extends AppLocalizations { String get filenameFormat => 'Dateinamenformat'; @override - String get filenameShowAdvancedTags => 'Show advanced tags'; + String get filenameShowAdvancedTags => 'Erweiterte Tags anzeigen'; @override String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; + 'Formatierte Tags für Track-Padding und Datumsmuster aktivieren'; @override String get folderOrganizationNone => 'Keine Organisation'; @@ -918,11 +929,11 @@ class AppLocalizationsDe extends AppLocalizations { @override String logEntries(int count) { - return 'Entries ($count)'; + return '$count Einträge'; } @override - String get credentialsTitle => 'Spotify Credentials'; + String get credentialsTitle => 'Spotify-Anmeldedaten'; @override String get credentialsDescription => @@ -984,7 +995,7 @@ class AppLocalizationsDe extends AppLocalizations { 'Wähle wie Songtexte mit deinen Downloads gespeichert werden'; @override - String get lyricsModeEmbed => 'In Datei einbinden'; + String get lyricsModeEmbed => 'In Datei einbetten'; @override String get lyricsModeEmbedSubtitle => 'Lyrics in FLAC Metadaten gespeichert'; @@ -1001,7 +1012,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get lyricsModeBothSubtitle => - 'Lyrics einbinden und als .lrc speichern'; + 'Lyrics einbetten und als .lrc speichern'; @override String get sectionColor => 'Farbe'; @@ -1019,29 +1030,30 @@ class AppLocalizationsDe extends AppLocalizations { String get appearanceLanguage => 'App Sprache'; @override - String get settingsAppearanceSubtitle => 'Theme, colors, display'; + String get settingsAppearanceSubtitle => 'Design, Farben, Anzeige'; @override - String get settingsDownloadSubtitle => 'Service, quality, filename format'; + String get settingsDownloadSubtitle => 'Dienst, Qualität, Dateinamen-Format'; @override - String get settingsOptionsSubtitle => 'Fallback, lyrics, cover art, updates'; + String get settingsOptionsSubtitle => 'Fallback, Lyrics, Covers, Updates'; @override - String get settingsExtensionsSubtitle => 'Manage download providers'; + String get settingsExtensionsSubtitle => 'Download-Anbieter verwalten'; @override - String get settingsLogsSubtitle => 'View app logs for debugging'; + String get settingsLogsSubtitle => 'App-Logs zum Debuggen anzeigen'; @override - String get loadingSharedLink => 'Loading shared link...'; + String get loadingSharedLink => 'Link wird geladen...'; @override - String get pressBackAgainToExit => 'Press back again to exit'; + String get pressBackAgainToExit => + 'Drücke wieder \"zurück\" um die App zu beenden'; @override String downloadAllCount(int count) { - return 'Download All ($count)'; + return 'Alle $count Titel herunterladen'; } @override @@ -1049,65 +1061,65 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count Titel', + one: '1 Titel', ); return '$_temp0'; } @override - String get trackCopyFilePath => 'Copy file path'; + String get trackCopyFilePath => 'Dateipfad kopieren'; @override - String get trackRemoveFromDevice => 'Remove from device'; + String get trackRemoveFromDevice => 'Vom Gerät entfernen'; @override - String get trackLoadLyrics => 'Load Lyrics'; + String get trackLoadLyrics => 'Lade Lyrics'; @override - String get trackMetadata => 'Metadata'; + String get trackMetadata => 'Metadaten'; @override - String get trackFileInfo => 'File Info'; + String get trackFileInfo => 'Datei-Info'; @override String get trackLyrics => 'Lyrics'; @override - String get trackFileNotFound => 'File not found'; + String get trackFileNotFound => 'Datei nicht gefunden'; @override - String get trackOpenInDeezer => 'Open in Deezer'; + String get trackOpenInDeezer => 'In Deezer öffnen'; @override - String get trackOpenInSpotify => 'Open in Spotify'; + String get trackOpenInSpotify => 'In Spotify öffnen'; @override - String get trackTrackName => 'Track name'; + String get trackTrackName => 'Name des Titels'; @override - String get trackArtist => 'Artist'; + String get trackArtist => 'Künstler'; @override - String get trackAlbumArtist => 'Album artist'; + String get trackAlbumArtist => 'Album Künstler'; @override String get trackAlbum => 'Album'; @override - String get trackTrackNumber => 'Track number'; + String get trackTrackNumber => 'Titelnummer'; @override - String get trackDiscNumber => 'Disc number'; + String get trackDiscNumber => 'CD-Nummer'; @override - String get trackDuration => 'Duration'; + String get trackDuration => 'Länge'; @override - String get trackAudioQuality => 'Audio quality'; + String get trackAudioQuality => 'Audioqualität'; @override - String get trackReleaseDate => 'Release date'; + String get trackReleaseDate => 'Erscheinungsdatum'; @override String get trackGenre => 'Genre'; @@ -1116,71 +1128,73 @@ class AppLocalizationsDe extends AppLocalizations { String get trackLabel => 'Label'; @override - String get trackCopyright => 'Copyright'; + String get trackCopyright => 'Urheberrecht'; @override - String get trackDownloaded => 'Downloaded'; + String get trackDownloaded => 'Heruntergeladen'; @override - String get trackCopyLyrics => 'Copy lyrics'; + String get trackCopyLyrics => 'Lyrics kopieren'; @override - String get trackLyricsNotAvailable => 'Lyrics not available for this track'; + String get trackLyricsNotAvailable => + 'Lyrics sind für diesen Titel nicht verfügbar'; @override - String get trackLyricsTimeout => 'Request timed out. Try again later.'; + String get trackLyricsTimeout => + 'Anfrage Timeout. Versuche es später erneut.'; @override - String get trackLyricsLoadFailed => 'Failed to load lyrics'; + String get trackLyricsLoadFailed => 'Fehler beim Laden der Lyrics'; @override - String get trackEmbedLyrics => 'Embed Lyrics'; + String get trackEmbedLyrics => 'Lyrics einbetten'; @override - String get trackLyricsEmbedded => 'Lyrics embedded successfully'; + String get trackLyricsEmbedded => 'Lyrics erfolgreich eingebettet'; @override - String get trackInstrumental => 'Instrumental track'; + String get trackInstrumental => 'Instrumentalspur'; @override - String get trackCopiedToClipboard => 'Copied to clipboard'; + String get trackCopiedToClipboard => 'In Zwischenablage kopiert'; @override - String get trackDeleteConfirmTitle => 'Remove from device?'; + String get trackDeleteConfirmTitle => 'Vom Gerät entfernen?'; @override String get trackDeleteConfirmMessage => - 'This will permanently delete the downloaded file and remove it from your history.'; + 'Dies wird die heruntergeladene Datei dauerhaft löschen und sie aus deinem Verlauf entfernen.'; @override - String get dateToday => 'Today'; + String get dateToday => 'Heute'; @override - String get dateYesterday => 'Yesterday'; + String get dateYesterday => 'Gestern'; @override String dateDaysAgo(int count) { - return '$count days ago'; + return 'Vor $count Tagen'; } @override String dateWeeksAgo(int count) { - return '$count weeks ago'; + return 'Vor $count Wochen'; } @override String dateMonthsAgo(int count) { - return '$count months ago'; + return 'Vor $count Monaten'; } @override - String get storeFilterAll => 'All'; + String get storeFilterAll => 'Alle'; @override - String get storeFilterMetadata => 'Metadata'; + String get storeFilterMetadata => 'Metadaten'; @override - String get storeFilterDownload => 'Download'; + String get storeFilterDownload => 'Herunterladen'; @override String get storeFilterUtility => 'Utility'; @@ -1192,142 +1206,146 @@ class AppLocalizationsDe extends AppLocalizations { String get storeFilterIntegration => 'Integration'; @override - String get storeClearFilters => 'Clear filters'; + String get storeClearFilters => 'Filter entfernen'; @override - String get extensionDefaultProvider => 'Default (Deezer/Spotify)'; + String get extensionDefaultProvider => 'Standard (Deezer/Spotify)'; @override - String get extensionDefaultProviderSubtitle => 'Use built-in search'; + String get extensionDefaultProviderSubtitle => 'Eingebaute Suche verwenden'; @override - String get extensionAuthor => 'Author'; + String get extensionAuthor => 'Entwickler'; @override String get extensionId => 'ID'; @override - String get extensionError => 'Error'; + String get extensionError => 'Fehler'; @override - String get extensionCapabilities => 'Capabilities'; + String get extensionCapabilities => 'Eigenschaften'; @override - String get extensionMetadataProvider => 'Metadata Provider'; + String get extensionMetadataProvider => 'Metadaten-Anbieter'; @override - String get extensionDownloadProvider => 'Download Provider'; + String get extensionDownloadProvider => 'Download-Anbieter'; @override - String get extensionLyricsProvider => 'Lyrics Provider'; + String get extensionLyricsProvider => 'Lyrics-Anbieter'; @override String get extensionUrlHandler => 'URL Handler'; @override - String get extensionQualityOptions => 'Quality Options'; + String get extensionQualityOptions => 'Qualitätsoptionen'; @override String get extensionPostProcessingHooks => 'Post-Processing Hooks'; @override - String get extensionPermissions => 'Permissions'; + String get extensionPermissions => 'Berechtigungen'; @override - String get extensionSettings => 'Settings'; + String get extensionSettings => 'Einstellungen'; @override - String get extensionRemoveButton => 'Remove Extension'; + String get extensionRemoveButton => 'Erweiterung entfernen'; @override - String get extensionUpdated => 'Updated'; + String get extensionUpdated => 'Aktualisiert'; @override - String get extensionMinAppVersion => 'Min App Version'; + String get extensionMinAppVersion => 'Min App-Version'; @override - String get extensionCustomTrackMatching => 'Custom Track Matching'; + String get extensionCustomTrackMatching => + 'Benutzerdefiniertes Track-Matching'; @override - String get extensionPostProcessing => 'Post-Processing'; + String get extensionPostProcessing => 'Post-processing'; @override String extensionHooksAvailable(int count) { - return '$count hook(s) available'; + return '$count Hook(s) verfügbar'; } @override String extensionPatternsCount(int count) { - return '$count pattern(s)'; + return '$count Muster'; } @override String extensionStrategy(String strategy) { - return 'Strategy: $strategy'; + return 'Strategie: $strategy'; } @override - String get extensionsProviderPrioritySection => 'Provider Priority'; + String get extensionsProviderPrioritySection => 'Provider-Priorität'; @override - String get extensionsInstalledSection => 'Installed Extensions'; + String get extensionsInstalledSection => 'Installierte Erweiterungen'; @override - String get extensionsNoExtensions => 'No extensions installed'; + String get extensionsNoExtensions => 'Keine Erweiterungen installiert'; @override String get extensionsNoExtensionsSubtitle => - 'Install .spotiflac-ext files to add new providers'; + 'Installiere .spotiflac-ext Dateien um neue Anbieter hinzuzufügen'; @override - String get extensionsInstallButton => 'Install Extension'; + String get extensionsInstallButton => 'Erweiterung installieren'; @override String get extensionsInfoTip => - 'Extensions can add new metadata and download providers. Only install extensions from trusted sources.'; + 'Erweiterungen können neue Metadaten und Download-Anbieter hinzufügen. Installiere nur Erweiterungen von vertrauenswürdigen Quellen.'; @override - String get extensionsInstalledSuccess => 'Extension installed successfully'; + String get extensionsInstalledSuccess => + 'Erweiterung erfolgreich installiert'; @override - String get extensionsDownloadPriority => 'Download Priority'; + String get extensionsDownloadPriority => 'Download-Priorität'; @override - String get extensionsDownloadPrioritySubtitle => 'Set download service order'; + String get extensionsDownloadPrioritySubtitle => + 'Download-Service-Reihenfolge festlegen'; @override String get extensionsNoDownloadProvider => - 'No extensions with download provider'; + 'Keine Erweiterungen mit Download-Provider'; @override - String get extensionsMetadataPriority => 'Metadata Priority'; + String get extensionsMetadataPriority => 'Metadaten Priorität'; @override String get extensionsMetadataPrioritySubtitle => - 'Set search & metadata source order'; + 'Reihenfolge der Such- und Metadaten quellen festlegen'; @override String get extensionsNoMetadataProvider => - 'No extensions with metadata provider'; + 'Keine Erweiterungen mit Metadaten-Anbieter'; @override - String get extensionsSearchProvider => 'Search Provider'; + String get extensionsSearchProvider => 'Such-Provider'; @override - String get extensionsNoCustomSearch => 'No extensions with custom search'; + String get extensionsNoCustomSearch => + 'Keine Erweiterungen mit benutzerdefinierter Suche'; @override String get extensionsSearchProviderDescription => - 'Choose which service to use for searching tracks'; + 'Wähle den Dienst für die Suche von Titel'; @override - String get extensionsCustomSearch => 'Custom search'; + String get extensionsCustomSearch => 'Benutzerdefinierte Suche'; @override - String get extensionsErrorLoading => 'Error loading extension'; + String get extensionsErrorLoading => 'Fehler beim Laden der Erweiterung'; @override - String get qualityFlacLossless => 'FLAC Lossless'; + String get qualityFlacLossless => 'FLAC Verlustfrei'; @override String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz'; @@ -1336,21 +1354,21 @@ class AppLocalizationsDe extends AppLocalizations { String get qualityHiResFlac => 'Hi-Res FLAC'; @override - String get qualityHiResFlacSubtitle => '24-bit / up to 96kHz'; + String get qualityHiResFlacSubtitle => '24-Bit / bis 96kHz'; @override String get qualityHiResFlacMax => 'Hi-Res FLAC Max'; @override - String get qualityHiResFlacMaxSubtitle => '24-bit / up to 192kHz'; + String get qualityHiResFlacMaxSubtitle => '24-Bit / bis 192kHz'; @override String get qualityNote => - 'Actual quality depends on track availability from the service'; + 'Die eigentliche Qualität hängt von der Verfügbarkeit des Dienstes ab'; @override String get youtubeQualityNote => - 'YouTube provides lossy audio only. Not part of lossless fallback.'; + 'YouTube bietet nur verlustbehaftete Audioqualität. Deswegen ist es kein Teil des verlustfreien Fallbacks.'; @override String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; @@ -1359,13 +1377,13 @@ class AppLocalizationsDe extends AppLocalizations { String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; @override - String get downloadAskBeforeDownload => 'Ask Before Download'; + String get downloadAskBeforeDownload => 'Qualität vor Download fragen'; @override - String get downloadDirectory => 'Download Directory'; + String get downloadDirectory => 'Downloadverzeichnis'; @override - String get downloadSeparateSinglesFolder => 'Separate Singles Folder'; + String get downloadSeparateSinglesFolder => 'Singles Ordner trennen'; @override String get downloadAlbumFolderStructure => 'Album Folder Structure'; @@ -1378,53 +1396,53 @@ class AppLocalizationsDe extends AppLocalizations { @override String get downloadUsePrimaryArtistOnlyEnabled => - 'Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)'; + 'Vorgestellte Künstler aus dem Ordnernamen entfernt (z.B. Justin Bieber, Quavo → Justin Bieber)'; @override String get downloadUsePrimaryArtistOnlyDisabled => 'Full artist string used for folder name'; @override - String get downloadSelectQuality => 'Select Quality'; + String get downloadSelectQuality => 'Qualität wählen'; @override - String get downloadFrom => 'Download From'; + String get downloadFrom => 'Herunterladen von'; @override - String get appearanceAmoledDark => 'AMOLED Dark'; + String get appearanceAmoledDark => 'AMOLED Schwarz'; @override - String get appearanceAmoledDarkSubtitle => 'Pure black background'; + String get appearanceAmoledDarkSubtitle => 'AMOLED Hintergrund'; @override - String get queueClearAll => 'Clear All'; + String get queueClearAll => 'Alles löschen'; @override String get queueClearAllMessage => - 'Are you sure you want to clear all downloads?'; + 'Bist du dir sicher, dass du alle Downloads löschen möchten?'; @override String get settingsAutoExportFailed => 'Auto-export failed downloads'; @override String get settingsAutoExportFailedSubtitle => - 'Save failed downloads to TXT file automatically'; + 'Fehlgeschlagene Downloads automatisch in eine TXT-Datei speichern'; @override - String get settingsDownloadNetwork => 'Download Network'; + String get settingsDownloadNetwork => 'Download Netzwerk'; @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; + String get settingsDownloadNetworkAny => 'WLAN + Mobile Daten'; @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; + String get settingsDownloadNetworkWifiOnly => 'Nur WLAN'; @override String get settingsDownloadNetworkSubtitle => - 'Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.'; + 'Wähle aus, welches Netzwerk für Downloads verwendet werden soll. Wenn nur WLAN aktiviert wird, werden Downloads auf mobilen Daten angehalten.'; @override - String get albumFolderArtistAlbum => 'Artist / Album'; + String get albumFolderArtistAlbum => 'Künstler/Album'; @override String get albumFolderArtistAlbumSubtitle => 'Albums/Artist Name/Album Name/'; @@ -1434,13 +1452,13 @@ class AppLocalizationsDe extends AppLocalizations { @override String get albumFolderArtistYearAlbumSubtitle => - 'Albums/Artist Name/[2005] Album Name/'; + 'Albums/Künster Name/[2005] Album Name/'; @override - String get albumFolderAlbumOnly => 'Album Only'; + String get albumFolderAlbumOnly => 'Nur Alben'; @override - String get albumFolderAlbumOnlySubtitle => 'Albums/Album Name/'; + String get albumFolderAlbumOnlySubtitle => 'Alben/Album Name/'; @override String get albumFolderYearAlbum => '[Year] Album'; @@ -1456,39 +1474,39 @@ class AppLocalizationsDe extends AppLocalizations { 'Artist/Album/ and Artist/Singles/'; @override - String get downloadedAlbumDeleteSelected => 'Delete Selected'; + String get downloadedAlbumDeleteSelected => 'Ausgewählte löschen'; @override String downloadedAlbumDeleteMessage(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Delete $count $_temp0 from this album?\n\nThis will also delete the files from storage.'; + return '$count $_temp0 aus diesem Album löschen?\n\nDadurch werden auch die Dateien aus dem Speicher gelöscht.'; } @override String downloadedAlbumSelectedCount(int count) { - return '$count selected'; + return '$count ausgewählt'; } @override - String get downloadedAlbumAllSelected => 'All tracks selected'; + String get downloadedAlbumAllSelected => 'Alle Titel sind ausgewählt'; @override - String get downloadedAlbumTapToSelect => 'Tap tracks to select'; + String get downloadedAlbumTapToSelect => 'Tippe auf Titel zum Auswählen'; @override String downloadedAlbumDeleteCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Delete $count $_temp0'; + return 'Lösche $count $_temp0'; } @override @@ -1500,22 +1518,22 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get recentTypeArtist => 'Artist'; + String get recentTypeArtist => 'Künstler'; @override String get recentTypeAlbum => 'Album'; @override - String get recentTypeSong => 'Song'; + String get recentTypeSong => 'Titel'; @override String get recentTypePlaylist => 'Playlist'; @override - String get recentEmpty => 'No recent items yet'; + String get recentEmpty => 'Noch keine aktuellen Einträge'; @override - String get recentShowAllDownloads => 'Show All Downloads'; + String get recentShowAllDownloads => 'Alle Downloads anzeigen'; @override String recentPlaylistInfo(String name) { @@ -1523,41 +1541,41 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get discographyDownload => 'Download Discography'; + String get discographyDownload => 'Diskographie herunterladen'; @override - String get discographyDownloadAll => 'Download All'; + String get discographyDownloadAll => 'Alle Herunterladen'; @override String discographyDownloadAllSubtitle(int count, int albumCount) { - return '$count tracks from $albumCount releases'; + return '$count Titel von $albumCount Releases'; } @override - String get discographyAlbumsOnly => 'Albums Only'; + String get discographyAlbumsOnly => 'Nur Alben'; @override String discographyAlbumsOnlySubtitle(int count, int albumCount) { - return '$count tracks from $albumCount albums'; + return '$count Titel von $albumCount Albums'; } @override - String get discographySinglesOnly => 'Singles & EPs Only'; + String get discographySinglesOnly => 'Nur Singles & EPs'; @override String discographySinglesOnlySubtitle(int count, int albumCount) { - return '$count tracks from $albumCount singles'; + return '$count Titel von $albumCount Singles'; } @override - String get discographySelectAlbums => 'Select Albums...'; + String get discographySelectAlbums => 'Alben auswählen...'; @override String get discographySelectAlbumsSubtitle => 'Choose specific albums or singles'; @override - String get discographyFetchingTracks => 'Fetching tracks...'; + String get discographyFetchingTracks => 'Lade Titel...'; @override String discographyFetchingAlbum(int current, int total) { @@ -1566,11 +1584,11 @@ class AppLocalizationsDe extends AppLocalizations { @override String discographySelectedCount(int count) { - return '$count selected'; + return '$count ausgewählt'; } @override - String get discographyDownloadSelected => 'Download Selected'; + String get discographyDownloadSelected => 'Auswahl herunterladen'; @override String discographyAddedToQueue(int count) { @@ -1579,20 +1597,20 @@ class AppLocalizationsDe extends AppLocalizations { @override String discographySkippedDownloaded(int added, int skipped) { - return '$added added, $skipped already downloaded'; + return '$added hinzugefügt, $skipped bereits heruntergeladen'; } @override - String get discographyNoAlbums => 'No albums available'; + String get discographyNoAlbums => 'Es sind keine Alben verfügbar'; @override String get discographyFailedToFetch => 'Failed to fetch some albums'; @override - String get sectionStorageAccess => 'Storage Access'; + String get sectionStorageAccess => 'Speicherzugriff'; @override - String get allFilesAccess => 'All Files Access'; + String get allFilesAccess => 'Zugriff auf alle Dateien'; @override String get allFilesAccessEnabledSubtitle => 'Can write to any folder'; @@ -1602,170 +1620,170 @@ class AppLocalizationsDe extends AppLocalizations { @override String get allFilesAccessDescription => - 'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.'; + 'Aktiviere die Option, wenn beim Speichern in benutzerdefinierten Ordnern Schreibfehler auftreten. Weil Android 13+ standardmäßig den Zugriff auf bestimmte Verzeichnisse einschränkt.'; @override String get allFilesAccessDeniedMessage => - 'Permission was denied. Please enable \'All files access\' manually in system settings.'; + 'Zugriff verweigert. Bitte aktiviere \"Zugriff auf alle Dateien\" manuell in den Systemeinstellungen.'; @override String get allFilesAccessDisabledMessage => - 'All Files Access disabled. The app will use limited storage access.'; + 'Zugriff auf alle Dateien ist deaktiviert. Die App verwendet nur begrenzten Zugriff auf den Speicher.'; @override - String get settingsLocalLibrary => 'Local Library'; + String get settingsLocalLibrary => 'Lokale Bibliothek'; @override String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates'; @override - String get settingsCache => 'Storage & Cache'; + String get settingsCache => 'Speicher & Cache'; @override String get settingsCacheSubtitle => 'View size and clear cached data'; @override - String get libraryTitle => 'Local Library'; + String get libraryTitle => 'Lokale Bibliothek'; @override - String get libraryScanSettings => 'Scan Settings'; + String get libraryScanSettings => 'Scan Einstellungen'; @override - String get libraryEnableLocalLibrary => 'Enable Local Library'; + String get libraryEnableLocalLibrary => 'Lokale Bibliothek aktivieren'; @override String get libraryEnableLocalLibrarySubtitle => 'Scan and track your existing music'; @override - String get libraryFolder => 'Library Folder'; + String get libraryFolder => 'Bibliotheksordner'; @override - String get libraryFolderHint => 'Tap to select folder'; + String get libraryFolderHint => 'Tippe um Ordner auszuwählen'; @override String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator'; @override String get libraryShowDuplicateIndicatorSubtitle => - 'Show when searching for existing tracks'; + 'Bei der Suche nach vorhandenen Titeln anzeigen'; @override - String get libraryActions => 'Actions'; + String get libraryActions => 'Aktionen'; @override - String get libraryScan => 'Scan Library'; + String get libraryScan => 'Bibliothek scannen'; @override - String get libraryScanSubtitle => 'Scan for audio files'; + String get libraryScanSubtitle => 'Suche nach Audiodateien'; @override - String get libraryScanSelectFolderFirst => 'Select a folder first'; + String get libraryScanSelectFolderFirst => 'Wähle zuerst einen Ordner'; @override - String get libraryCleanupMissingFiles => 'Cleanup Missing Files'; + String get libraryCleanupMissingFiles => 'Fehlende Dateien bereinigen'; @override String get libraryCleanupMissingFilesSubtitle => - 'Remove entries for files that no longer exist'; + 'Verlaufseinträge für Dateien löschen, die nicht mehr existieren'; @override - String get libraryClear => 'Clear Library'; + String get libraryClear => 'Bibliothek löschen'; @override - String get libraryClearSubtitle => 'Remove all scanned tracks'; + String get libraryClearSubtitle => 'Alle gescannten Titel entfernen'; @override - String get libraryClearConfirmTitle => 'Clear Library'; + String get libraryClearConfirmTitle => 'Bibliothek löschen'; @override String get libraryClearConfirmMessage => - 'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'; + 'Dadurch werden alle gescannten Titel aus Ihrer Bibliothek entfernt. Ihre eigentlichen Musikdateien werden nicht gelöscht.'; @override - String get libraryAbout => 'About Local Library'; + String get libraryAbout => 'Über die lokale Bibliothek'; @override String get libraryAboutDescription => - 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + 'Durchsucht deine bestehende Musiksammlung, um Duplikate beim Herunterladen zu erkennen. Unterstützt die Formate FLAC, M4A, MP3, Opus und OGG. Metadaten werden, sofern verfügbar, aus den Dateitags gelesen.'; @override String libraryTracksUnit(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: '$count Titel', + one: '1 Titel', ); return '$_temp0'; } @override String libraryLastScanned(String time) { - return 'Last scanned: $time'; + return 'Zuletzt gescannt: $time'; } @override - String get libraryLastScannedNever => 'Never'; + String get libraryLastScannedNever => 'Nie'; @override - String get libraryScanning => 'Scanning...'; + String get libraryScanning => 'Scannen...'; @override String libraryScanProgress(String progress, int total) { - return '$progress% of $total files'; + return '$progress% von $total Dateien'; } @override - String get libraryInLibrary => 'In Library'; + String get libraryInLibrary => 'In Bibliothek'; @override String libraryRemovedMissingFiles(int count) { - return 'Removed $count missing files from library'; + return 'Entfernte $count fehlende Dateien aus der Bibliothek'; } @override - String get libraryCleared => 'Library cleared'; + String get libraryCleared => 'Bibliothek geleert'; @override - String get libraryStorageAccessRequired => 'Storage Access Required'; + String get libraryStorageAccessRequired => 'Speicherzugriff erforderlich'; @override String get libraryStorageAccessMessage => - 'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.'; + 'SpotiFLAC benötigt Speicherzugriff, um deine Musikbibliothek zu scannen. Bitte erteile die Berechtigung in den Einstellungen.'; @override - String get libraryFolderNotExist => 'Selected folder does not exist'; + String get libraryFolderNotExist => 'Der ausgewählte Ordner existiert nicht'; @override - String get librarySourceDownloaded => 'Downloaded'; + String get librarySourceDownloaded => 'Heruntergeladen'; @override - String get librarySourceLocal => 'Local'; + String get librarySourceLocal => 'Lokal'; @override - String get libraryFilterAll => 'All'; + String get libraryFilterAll => 'Alle'; @override - String get libraryFilterDownloaded => 'Downloaded'; + String get libraryFilterDownloaded => 'Heruntergeladen'; @override - String get libraryFilterLocal => 'Local'; + String get libraryFilterLocal => 'Lokal'; @override - String get libraryFilterTitle => 'Filters'; + String get libraryFilterTitle => 'Filter'; @override - String get libraryFilterReset => 'Reset'; + String get libraryFilterReset => 'Zurücksetzen'; @override - String get libraryFilterApply => 'Apply'; + String get libraryFilterApply => 'Anwenden'; @override - String get libraryFilterSource => 'Source'; + String get libraryFilterSource => 'Quelle'; @override - String get libraryFilterQuality => 'Quality'; + String get libraryFilterQuality => 'Qualität'; @override String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; @@ -1774,30 +1792,30 @@ class AppLocalizationsDe extends AppLocalizations { String get libraryFilterQualityCD => 'CD (16bit)'; @override - String get libraryFilterQualityLossy => 'Lossy'; + String get libraryFilterQualityLossy => 'Verlustbehaftet'; @override String get libraryFilterFormat => 'Format'; @override - String get libraryFilterSort => 'Sort'; + String get libraryFilterSort => 'Sortieren'; @override - String get libraryFilterSortLatest => 'Latest'; + String get libraryFilterSortLatest => 'Neuste'; @override - String get libraryFilterSortOldest => 'Oldest'; + String get libraryFilterSortOldest => 'Älteste'; @override - String get timeJustNow => 'Just now'; + String get timeJustNow => 'Gerade eben'; @override String timeMinutesAgo(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count minutes ago', - one: '1 minute ago', + other: 'vor $count Minuten', + one: 'vor $count Minute', ); return '$_temp0'; } @@ -1807,199 +1825,201 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count hours ago', - one: '1 hour ago', + other: 'vor $count Stunden', + one: 'vor $count Stunde', ); return '$_temp0'; } @override - String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + String get tutorialWelcomeTitle => 'Willkommen bei SpotiFLAC!'; @override String get tutorialWelcomeDesc => - 'Let\'s learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.'; + 'Lass uns lernen, wie du deine Lieblingsmusik in verlustfreier Qualität herunterlädst. Dieses schnelle Tutorial zeigt dir die Grundlagen.'; @override String get tutorialWelcomeTip1 => - 'Download music from Spotify, Deezer, or paste any supported URL'; + 'Lade Musik von Spotify, Deezer herunter oder jeden unterstützten Link einfügen'; @override String get tutorialWelcomeTip2 => - 'FLAC-Qualität von Tidal, Qobuz oder Deezer'; + 'Hole dir FLAC Audio von Tidal, Qobuz oder Amazon Musik'; @override String get tutorialWelcomeTip3 => - 'Automatic metadata, cover art, and lyrics embedding'; + 'Automatische Metadaten, Cover und Lyrics einbetten'; @override - String get tutorialSearchTitle => 'Finding Music'; + String get tutorialSearchTitle => 'Suche Musik'; @override String get tutorialSearchDesc => - 'There are two easy ways to find music you want to download.'; + 'Es gibt zwei einfache Möglichkeiten, Musik zu finden, die du herunterladen möchtest.'; @override - String get tutorialDownloadTitle => 'Downloading Music'; + String get tutorialDownloadTitle => 'Musik wird heruntergeladen'; @override String get tutorialDownloadDesc => - 'Downloading music is simple and fast. Here\'s how it works.'; + 'Das Herunterladen von Musik ist einfach und schnell. So funktioniert es.'; @override - String get tutorialLibraryTitle => 'Your Library'; + String get tutorialLibraryTitle => 'Deine Bibliothek'; @override String get tutorialLibraryDesc => - 'All your downloaded music is organized in the Library tab.'; + 'Die gesamte heruntergeladene Musik ist in der Bibliothek organisiert.'; @override String get tutorialLibraryTip1 => - 'View download progress and queue in the Library tab'; + 'Fortschritt und Warteschlange im Bibliothek‑Tab anzeigen'; @override String get tutorialLibraryTip2 => - 'Tap any track to play it with your music player'; + 'Tippe auf einen Titel, um ihn mit deinem Musikplayer abzuspielen'; @override String get tutorialLibraryTip3 => - 'Switch between list and grid view for better browsing'; + 'Wechsle zwischen Listen- und Gitteransicht für ein besseres Surfen'; @override - String get tutorialExtensionsTitle => 'Extensions'; + String get tutorialExtensionsTitle => 'Erweiterungen'; @override String get tutorialExtensionsDesc => - 'Extend the app\'s capabilities with community extensions.'; + 'Erweitere die Fähigkeiten der App mit Community-Erweiterungen.'; @override String get tutorialExtensionsTip1 => - 'Browse the Store tab to discover useful extensions'; + 'Im Store Tab findest du nützliche Erweiterungen'; @override String get tutorialExtensionsTip2 => - 'Add new download providers or search sources'; + 'Neue Download- oder Suchanbieter hinzufügen'; @override String get tutorialExtensionsTip3 => - 'Get lyrics, enhanced metadata, and more features'; + 'Lyrics, erweiterte Metadaten und mehr Funktionen erhalten'; @override - String get tutorialSettingsTitle => 'Customize Your Experience'; + String get tutorialSettingsTitle => 'Passe deine Benutzererfahrung an'; @override String get tutorialSettingsDesc => - 'Personalize the app in Settings to match your preferences.'; + 'Personalisiere die App in den Einstellungen nach deiner Präferenz.'; @override String get tutorialSettingsTip1 => - 'Change download location and folder organization'; + 'Downloadverzeichnis und Ordnerorganisation ändern'; @override String get tutorialSettingsTip2 => - 'Set default audio quality and format preferences'; + 'Standard Audioqualität und Formateinstellungen festlegen'; @override - String get tutorialSettingsTip3 => 'Customize app theme and appearance'; + String get tutorialSettingsTip3 => 'App-Design und Aussehen anpassen'; @override String get tutorialReadyMessage => - 'You\'re all set! Start downloading your favorite music now.'; + 'Das ist alles! Lade jetzt deine Lieblingsmusik herunter.'; @override - String get libraryForceFullScan => 'Force Full Scan'; + String get libraryForceFullScan => 'Vollen Neu-Scan erzwingen'; @override - String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; + String get libraryForceFullScanSubtitle => + 'Alle Dateien erneut scannen und Cache ignorieren'; @override - String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + String get cleanupOrphanedDownloads => 'Verwaiste Downloads bereinigen'; @override String get cleanupOrphanedDownloadsSubtitle => - 'Remove history entries for files that no longer exist'; + 'Verlaufseinträge für Dateien löschen, die nicht mehr existieren'; @override String cleanupOrphanedDownloadsResult(int count) { - return 'Removed $count orphaned entries from history'; + return 'Entfernte $count verwaiste Einträge aus dem Verlauf'; } @override - String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + String get cleanupOrphanedDownloadsNone => + 'Keine verwaisten Einträge gefunden'; @override - String get cacheTitle => 'Storage & Cache'; + String get cacheTitle => 'Speicher & Cache'; @override - String get cacheSummaryTitle => 'Cache overview'; + String get cacheSummaryTitle => 'Cache-Übersicht'; @override String get cacheSummarySubtitle => - 'Clearing cache will not remove downloaded music files.'; + 'Das Leeren des Caches entfernt nicht heruntergeladene Musikdateien.'; @override String cacheEstimatedTotal(String size) { - return 'Estimated cache usage: $size'; + return 'Geschätzte Cache-Größe: $size'; } @override - String get cacheSectionStorage => 'Cached Data'; + String get cacheSectionStorage => 'Zwischengespeicherte Daten'; @override - String get cacheSectionMaintenance => 'Maintenance'; + String get cacheSectionMaintenance => 'Wartung'; @override - String get cacheAppDirectory => 'App cache directory'; + String get cacheAppDirectory => 'App-Cache Verzeichnis'; @override String get cacheAppDirectoryDesc => - 'HTTP responses, WebView data, and other temporary app data.'; + 'HTTP-Antworten, WebView Daten und andere temporäre App-Daten.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => 'Temporäres Verzeichnis'; @override String get cacheTempDirectoryDesc => - 'Temporary files from downloads and audio conversion.'; + 'Temporäre Dateien von Downloads und Audio-Konvertierung.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'Cover-Cache'; @override String get cacheCoverImageDesc => - 'Downloaded album and track cover art. Will re-download when viewed.'; + 'Album- und Titelcover heruntergeladen. Werden erneut heruntergeladen.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'Bibliotheks-Cover-Cache'; @override String get cacheLibraryCoverDesc => - 'Cover art extracted from local music files. Will re-extract on next scan.'; + 'Cover aus lokalen Musikdateien extrahiert. Wird beim nächsten Scannen neu extrahiert.'; @override - String get cacheExploreFeed => 'Explore feed cache'; + String get cacheExploreFeed => 'Feed-Cache entdecken'; @override String get cacheExploreFeedDesc => - 'Explore tab content (new releases, trending). Will refresh on next visit.'; + 'Startseiten-Inhalt (neue Releases, Trends). Wird bei einem Neustart aktualisiert.'; @override - String get cacheTrackLookup => 'Track lookup cache'; + String get cacheTrackLookup => 'Titel Such-Cache'; @override String get cacheTrackLookupDesc => - 'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'; + 'Spotify/Deezer Track-ID-Lookups. Das Löschen kann die nächsten Suchergebnisse verlangsamen.'; @override String get cacheCleanupUnusedDesc => - 'Remove orphaned download history and library entries for missing files.'; + 'Verwaisten Downloadverlauf und Bibliothekseinträge für fehlende Dateien entfernen.'; @override - String get cacheNoData => 'No cached data'; + String get cacheNoData => 'Keine gecachten Daten'; @override String cacheSizeWithFiles(String size, int count) { - return '$size in $count files'; + return '$size in $count Dateien'; } @override @@ -2009,71 +2029,71 @@ class AppLocalizationsDe extends AppLocalizations { @override String cacheEntries(int count) { - return '$count entries'; + return '$count Einträge'; } @override String cacheClearSuccess(String target) { - return 'Cleared: $target'; + return 'Entfernt: $target'; } @override - String get cacheClearConfirmTitle => 'Clear cache?'; + String get cacheClearConfirmTitle => 'Cache leeren?'; @override String cacheClearConfirmMessage(String target) { - return 'This will clear cached data for $target. Downloaded music files will not be deleted.'; + return 'Dies löscht zwischengespeicherte Daten in $target. Die Musikdateien werden nicht gelöscht.'; } @override - String get cacheClearAllConfirmTitle => 'Clear all cache?'; + String get cacheClearAllConfirmTitle => 'Gesamten Cache leeren?'; @override String get cacheClearAllConfirmMessage => - 'This will clear all cache categories on this page. Downloaded music files will not be deleted.'; + 'Dadurch werden alle Cache-Kategorien auf dieser Seite gelöscht. Heruntergeladene Musikdateien werden nicht gelöscht.'; @override - String get cacheClearAll => 'Clear all cache'; + String get cacheClearAll => 'Gesamten Cache leeren'; @override - String get cacheCleanupUnused => 'Cleanup unused data'; + String get cacheCleanupUnused => 'Unbenutzte Daten bereinigen'; @override String get cacheCleanupUnusedSubtitle => - 'Remove orphaned download history and missing library entries'; + 'Verwaisten Downloadverlauf und fehlende Bibliothekseinträge löschen'; @override String cacheCleanupResult(int downloadCount, int libraryCount) { - return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries'; + return 'Bereinigung: $downloadCount verwaiste Downloads, $libraryCount fehlende Bibliothekseinträge'; } @override - String get cacheRefreshStats => 'Refresh stats'; + String get cacheRefreshStats => 'Statistik aktualisieren'; @override - String get trackSaveCoverArt => 'Save Cover Art'; + String get trackSaveCoverArt => 'Cover speichern'; @override - String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file'; + String get trackSaveCoverArtSubtitle => 'Albumcover als .jpg Datei speichern'; @override - String get trackSaveLyrics => 'Save Lyrics (.lrc)'; + String get trackSaveLyrics => 'Lyrics als .lrc speichern'; @override - String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file'; + String get trackSaveLyricsSubtitle => 'Lade Lyrics als .lrc Datei'; @override - String get trackSaveLyricsProgress => 'Saving lyrics...'; + String get trackSaveLyricsProgress => 'Speichere Lyrics...'; @override - String get trackReEnrich => 'Re-enrich'; + String get trackReEnrich => 'Neu-anreichern'; @override String get trackReEnrichOnlineSubtitle => - 'Search metadata online and embed into file'; + 'Metadaten online suchen und in Datei einbinden'; @override - String get trackEditMetadata => 'Edit Metadata'; + String get trackEditMetadata => 'Metadaten bearbeiten'; @override String trackCoverSaved(String fileName) { @@ -2085,43 +2105,44 @@ class AppLocalizationsDe extends AppLocalizations { @override String trackLyricsSaved(String fileName) { - return 'Lyrics saved to $fileName'; + return 'Lyrics in $fileName gespeichert'; } @override - String get trackReEnrichProgress => 'Re-enriching metadata...'; + String get trackReEnrichProgress => 'Metadaten neu anreichern...'; @override - String get trackReEnrichSearching => 'Searching metadata online...'; + String get trackReEnrichSearching => 'Suche Metadaten online...'; @override - String get trackReEnrichSuccess => 'Metadata re-enriched successfully'; + String get trackReEnrichSuccess => 'Metadaten erfolgreich neu angereichert'; @override - String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed'; + String get trackReEnrichFfmpegFailed => + 'FFmpeg Metadaten-Einbettung fehlgeschlagen'; @override String trackSaveFailed(String error) { - return 'Failed: $error'; + return 'Fehler: $error'; } @override - String get trackConvertFormat => 'Convert Format'; + String get trackConvertFormat => 'Format konvertieren'; @override - String get trackConvertFormatSubtitle => 'Convert to MP3 or Opus'; + String get trackConvertFormatSubtitle => 'In MP3 oder Opus konvertieren'; @override - String get trackConvertTitle => 'Convert Audio'; + String get trackConvertTitle => 'Audio konvertieren'; @override - String get trackConvertTargetFormat => 'Target Format'; + String get trackConvertTargetFormat => 'Zielformat'; @override String get trackConvertBitrate => 'Bitrate'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => 'Konvertierung bestätigen'; @override String trackConvertConfirmMessage( @@ -2129,198 +2150,199 @@ class AppLocalizationsDe extends AppLocalizations { String targetFormat, String bitrate, ) { - return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + return 'Konvertieren von $sourceFormat in $targetFormat bei $bitrate?\n\nDie Originaldatei wird nach der Konvertierung gelöscht.'; } @override - String get trackConvertConverting => 'Converting audio...'; + String get trackConvertConverting => 'Konvertiere Audio...'; @override String trackConvertSuccess(String format) { - return 'Converted to $format successfully'; + return 'Konvertiert in $format erfolgreich'; } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => 'Konvertierung fehlgeschlagen'; @override - String get actionCreate => 'Create'; + String get actionCreate => 'Erstellen'; @override - String get collectionFoldersTitle => 'My folders'; + String get collectionFoldersTitle => 'Meine Ordner'; @override - String get collectionWishlist => 'Wishlist'; + String get collectionWishlist => 'Wunschliste'; @override - String get collectionLoved => 'Loved'; + String get collectionLoved => 'Lieblingssongs'; @override - String get collectionPlaylists => 'Playlists'; + String get collectionPlaylists => 'Playlisten'; @override String get collectionPlaylist => 'Playlist'; @override - String get collectionAddToPlaylist => 'Add to playlist'; + String get collectionAddToPlaylist => 'Zur Playlist hinzufügen'; @override - String get collectionCreatePlaylist => 'Create playlist'; + String get collectionCreatePlaylist => 'Playlist erstellen'; @override - String get collectionNoPlaylistsYet => 'No playlists yet'; + String get collectionNoPlaylistsYet => 'Noch keine Playlists'; @override String get collectionNoPlaylistsSubtitle => - 'Create a playlist to start categorizing tracks'; + 'Playlist erstellen, um Titel zu kategorisieren'; @override String collectionPlaylistTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count Titel', + one: '1 Titel', ); return '$_temp0'; } @override String collectionAddedToPlaylist(String playlistName) { - return 'Added to \"$playlistName\"'; + return 'Zu \"$playlistName \" hinzugefügt'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Already in \"$playlistName\"'; + return 'Bereits in \"$playlistName\"'; } @override - String get collectionPlaylistCreated => 'Playlist created'; + String get collectionPlaylistCreated => 'Playlist erstellt'; @override - String get collectionPlaylistNameHint => 'Playlist name'; + String get collectionPlaylistNameHint => 'Playlist-Name'; @override - String get collectionPlaylistNameRequired => 'Playlist name is required'; + String get collectionPlaylistNameRequired => 'Playlist-Name ist erforderlich'; @override - String get collectionRenamePlaylist => 'Rename playlist'; + String get collectionRenamePlaylist => 'Playlist umbenennen'; @override - String get collectionDeletePlaylist => 'Delete playlist'; + String get collectionDeletePlaylist => 'Playlist löschen'; @override String collectionDeletePlaylistMessage(String playlistName) { - return 'Delete \"$playlistName\" and all tracks inside it?'; + return 'Willst du \"$playlistName\" und alle darin enthaltenen Titel löschen?'; } @override - String get collectionPlaylistDeleted => 'Playlist deleted'; + String get collectionPlaylistDeleted => 'Playlist gelöscht'; @override - String get collectionPlaylistRenamed => 'Playlist renamed'; + String get collectionPlaylistRenamed => 'Playlist umbenannt'; @override - String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + String get collectionWishlistEmptyTitle => 'Wunschliste ist leer'; @override String get collectionWishlistEmptySubtitle => - 'Tap + on tracks to save what you want to download later'; + 'Tippe auf das + bei den Titeln, um sie zum späteren Herunterladen zu speichern'; @override - String get collectionLovedEmptyTitle => 'Loved folder is empty'; + String get collectionLovedEmptyTitle => 'Lieblingssongs sind leer'; @override String get collectionLovedEmptySubtitle => - 'Tap love on tracks to keep your favorites'; + 'Tippe auf das Herz, um deine Favoriten zu behalten'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionPlaylistEmptyTitle => 'Die Playlist ist leer'; @override String get collectionPlaylistEmptySubtitle => - 'Long-press + on any track to add it here'; + 'Drücke lange + auf einem beliebigen Titel, um ihn hier hinzuzufügen'; @override - String get collectionRemoveFromPlaylist => 'Remove from playlist'; + String get collectionRemoveFromPlaylist => 'Von Playlist entfernen'; @override - String get collectionRemoveFromFolder => 'Remove from folder'; + String get collectionRemoveFromFolder => 'Aus Ordner entfernen'; @override String collectionRemoved(String trackName) { - return '\"$trackName\" removed'; + return '\"$trackName\" entfernt'; } @override String collectionAddedToLoved(String trackName) { - return '\"$trackName\" added to Loved'; + return '\"$trackName\" zu Lieblingssongs hinzugefügt'; } @override String collectionRemovedFromLoved(String trackName) { - return '\"$trackName\" removed from Loved'; + return '\"$trackName\" aus Lieblingssongs entfernt'; } @override String collectionAddedToWishlist(String trackName) { - return '\"$trackName\" added to Wishlist'; + return '\"$trackName\" zur Wunschliste hinzugefügt'; } @override String collectionRemovedFromWishlist(String trackName) { - return '\"$trackName\" removed from Wishlist'; + return '\"$trackName\" aus der Wunschliste entfernt'; } @override - String get trackOptionAddToLoved => 'Add to Loved'; + String get trackOptionAddToLoved => 'Zu Lieblingssongs hinzufügen'; @override - String get trackOptionRemoveFromLoved => 'Remove from Loved'; + String get trackOptionRemoveFromLoved => 'Aus Lieblingssongs entfernt'; @override - String get trackOptionAddToWishlist => 'Add to Wishlist'; + String get trackOptionAddToWishlist => 'Zur Wunschliste hinzufügen'; @override - String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + String get trackOptionRemoveFromWishlist => 'Von der Wunschliste entfernen'; @override - String get collectionPlaylistChangeCover => 'Change cover image'; + String get collectionPlaylistChangeCover => 'Coverbild ändern'; @override - String get collectionPlaylistRemoveCover => 'Remove cover image'; + String get collectionPlaylistRemoveCover => 'Cover entfernen'; @override String selectionShareCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Share $count $_temp0'; + return 'Teile $count $_temp0'; } @override - String get selectionShareNoFiles => 'No shareable files found'; + String get selectionShareNoFiles => 'Keine teilbare Dateien gefunden'; @override String selectionConvertCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Convert $count $_temp0'; + return 'Konvertiere $count $_temp0'; } @override - String get selectionConvertNoConvertible => 'No convertible tracks selected'; + String get selectionConvertNoConvertible => + 'Keine konvertierbare Titel ausgewählt'; @override - String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + String get selectionBatchConvertConfirmTitle => 'Batch-Konvertierung'; @override String selectionBatchConvertConfirmMessage( @@ -2331,30 +2353,30 @@ class AppLocalizationsDe extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'Titel', + one: 'Titel', ); - return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; + return 'Konvertiere $count $format $_temp0 zu $bitrate?\n\nOriginaldateien werden nach der Konvertierung gelöscht.'; } @override String selectionBatchConvertProgress(int current, int total) { - return 'Converting $current of $total...'; + return 'Konvertiere $current von $total...'; } @override String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; + return '$success von $total Titeln in $format konvertiert'; } @override String downloadedAlbumDownloadedCount(int count) { - return '$count downloaded'; + return '$count heruntergeladen'; } @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Künstlerordner verwenden den Album-Interpreten, wenn verfügbar'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index c98cf0ee..c583ab11 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -688,6 +688,17 @@ class AppLocalizationsEn extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index efc7a016..f4758a27 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -688,6 +688,17 @@ class AppLocalizationsEs extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 89d94355..c93b863f 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -358,7 +358,7 @@ class AppLocalizationsFr extends AppLocalizations { @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; @override String get artistAlbums => 'Albums'; @@ -690,6 +690,17 @@ class AppLocalizationsFr extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; @@ -1811,7 +1822,7 @@ class AppLocalizationsFr extends AppLocalizations { @override String get tutorialWelcomeTip2 => - 'Audio en qualité FLAC depuis Tidal, Qobuz ou Deezer'; + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 5b6ff05f..a12620b5 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -356,7 +356,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; @override String get artistAlbums => 'Albums'; @@ -688,6 +688,17 @@ class AppLocalizationsHi extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; @@ -1809,7 +1820,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get tutorialWelcomeTip2 => - 'Tidal, Qobuz, या Deezer से FLAC गुणवत्ता ऑडियो प्राप्त करें'; + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 4312a41a..e408e8ae 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -15,7 +15,7 @@ class AppLocalizationsId extends AppLocalizations { String get navHome => 'Beranda'; @override - String get navLibrary => 'Library'; + String get navLibrary => 'Pustaka'; @override String get navSettings => 'Pengaturan'; @@ -45,7 +45,7 @@ class AppLocalizationsId extends AppLocalizations { String get historyFilterSingles => 'Single'; @override - String get historySearchHint => 'Search history...'; + String get historySearchHint => 'Cari riwayat...'; @override String get settingsTitle => 'Pengaturan'; @@ -104,7 +104,7 @@ class AppLocalizationsId extends AppLocalizations { String get appearanceHistoryViewList => 'Daftar'; @override - String get appearanceHistoryViewGrid => 'Grid'; + String get appearanceHistoryViewGrid => 'Kisi'; @override String get optionsTitle => 'Opsi'; @@ -126,7 +126,7 @@ class AppLocalizationsId extends AppLocalizations { 'Ketuk Deezer atau Spotify untuk beralih dari ekstensi'; @override - String get optionsAutoFallback => 'Auto Fallback'; + String get optionsAutoFallback => 'Cadangan Otomatis'; @override String get optionsAutoFallbackSubtitle => @@ -217,7 +217,7 @@ class AppLocalizationsId extends AppLocalizations { @override String optionsSpotifyCredentialsConfigured(String clientId) { - return 'Client ID: $clientId...'; + return 'ID Klien: $clientId...'; } @override @@ -230,7 +230,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get optionsSpotifyDeprecationWarning => - 'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.'; + 'Pencarian Spotify akan dihentikan pada 3 Maret 2026 karena perubahan API Spotify. Silakan beralih ke Deezer.'; @override String get extensionsTitle => 'Ekstensi'; @@ -283,7 +283,7 @@ class AppLocalizationsId extends AppLocalizations { 'Seniman berbakat yang membuat logo aplikasi kita yang indah!'; @override - String get aboutTranslators => 'Translators'; + String get aboutTranslators => 'Penerjemah'; @override String get aboutSpecialThanks => 'Terima Kasih Khusus'; @@ -311,19 +311,19 @@ class AppLocalizationsId extends AppLocalizations { 'Sarankan fitur baru untuk aplikasi'; @override - String get aboutTelegramChannel => 'Telegram Channel'; + String get aboutTelegramChannel => 'Saluran Telegram'; @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; + String get aboutTelegramChannelSubtitle => 'Pengumuman dan pembaruan'; @override - String get aboutTelegramChat => 'Telegram Community'; + String get aboutTelegramChat => 'Komunitas Telegram'; @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; + String get aboutTelegramChatSubtitle => 'Berbincang dengan pengguna lain'; @override - String get aboutSocial => 'Social'; + String get aboutSocial => 'Sosial'; @override String get aboutApp => 'Aplikasi'; @@ -341,7 +341,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get aboutSjdonadoDesc => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; + 'Pencipta I Don\'t Have Spotify (IDHS). Penyelesai tautan cadangan yang menyelamatkan keadaan!'; @override String get aboutDabMusic => 'DAB Music'; @@ -355,11 +355,11 @@ class AppLocalizationsId extends AppLocalizations { @override String get aboutSpotiSaverDesc => - 'Tidal Hi-Res FLAC streaming endpoints. A key piece of the lossless puzzle!'; + 'Tidal perangkat streaming FLAC resolusi tinggi. Bagian penting dari teka-teki tanpa kehilangan kualitas!'; @override String get aboutAppDescription => - 'Unduh lagu Spotify dalam kualitas lossless dari Tidal dan Qobuz.'; + 'Unduh lagu Spotify dalam kualitas lossless dari Tidal, Qobuz, dan Amazon Music.'; @override String get artistAlbums => 'Album'; @@ -456,7 +456,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; + 'iCloud Drive tidak didukung. Silakan gunakan folder Dokumen di aplikasi.'; @override String get setupDownloadInFlac => 'Unduh lagu Spotify dalam format FLAC'; @@ -593,7 +593,7 @@ class AppLocalizationsId extends AppLocalizations { @override String csvImportTracks(int count) { - return '$count tracks from CSV'; + return '$count trek dari CSV'; } @override @@ -613,7 +613,7 @@ class AppLocalizationsId extends AppLocalizations { @override String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; + return '\"$trackName\" sudah ada di perpustakaan Anda'; } @override @@ -691,6 +691,17 @@ class AppLocalizationsId extends AppLocalizations { @override String get errorNoTracksFound => 'Tidak ada lagu ditemukan'; + @override + String get errorUrlNotRecognized => 'Link tidak dikenali'; + + @override + String get errorUrlNotRecognizedMessage => + 'Link ini tidak didukung. Pastikan URL benar dan ekstensi yang kompatibel sudah terpasang.'; + + @override + String get errorUrlFetchFailed => + 'Gagal memuat konten dari link ini. Silakan coba lagi.'; + @override String errorMissingExtensionSource(String item) { return 'Tidak dapat memuat $item: sumber ekstensi tidak ada'; @@ -755,11 +766,11 @@ class AppLocalizationsId extends AppLocalizations { String get filenameFormat => 'Format Nama File'; @override - String get filenameShowAdvancedTags => 'Tampilkan tag lanjutan'; + String get filenameShowAdvancedTags => 'Show advanced tags'; @override String get filenameShowAdvancedTagsDescription => - 'Aktifkan tag format untuk padding nomor lagu dan pola tanggal'; + 'Enable formatted tags for track padding and date patterns'; @override String get folderOrganizationNone => 'Tidak ada'; @@ -1343,10 +1354,10 @@ class AppLocalizationsId extends AppLocalizations { 'YouTube provides lossy audio only. Not part of lossless fallback.'; @override - String get youtubeOpusBitrateTitle => 'Bitrate Opus YouTube'; + String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; @override - String get youtubeMp3BitrateTitle => 'Bitrate MP3 YouTube'; + String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; @override String get downloadAskBeforeDownload => 'Tanya Sebelum Unduh'; @@ -1684,8 +1695,8 @@ class AppLocalizationsId extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'trek', - one: 'trek', + other: 'tracks', + one: 'track', ); return '$_temp0'; } @@ -1816,7 +1827,7 @@ class AppLocalizationsId extends AppLocalizations { @override String get tutorialWelcomeTip2 => - 'Dapatkan audio kualitas FLAC dari Tidal, Qobuz, atau Deezer'; + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => @@ -2134,10 +2145,10 @@ class AppLocalizationsId extends AppLocalizations { String get trackConvertFailed => 'Conversion failed'; @override - String get actionCreate => 'Buat'; + String get actionCreate => 'Create'; @override - String get collectionFoldersTitle => 'Folder saya'; + String get collectionFoldersTitle => 'My folders'; @override String get collectionWishlist => 'Wishlist'; @@ -2146,172 +2157,171 @@ class AppLocalizationsId extends AppLocalizations { String get collectionLoved => 'Loved'; @override - String get collectionPlaylists => 'Playlist'; + String get collectionPlaylists => 'Playlists'; @override String get collectionPlaylist => 'Playlist'; @override - String get collectionAddToPlaylist => 'Tambahkan ke playlist'; + String get collectionAddToPlaylist => 'Add to playlist'; @override - String get collectionCreatePlaylist => 'Buat playlist'; + String get collectionCreatePlaylist => 'Create playlist'; @override - String get collectionNoPlaylistsYet => 'Belum ada playlist'; + String get collectionNoPlaylistsYet => 'No playlists yet'; @override String get collectionNoPlaylistsSubtitle => - 'Buat playlist untuk mulai mengategorikan lagu'; + 'Create a playlist to start categorizing tracks'; @override String collectionPlaylistTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count lagu', - one: '1 lagu', + other: '$count tracks', + one: '1 track', ); return '$_temp0'; } @override String collectionAddedToPlaylist(String playlistName) { - return 'Ditambahkan ke \"$playlistName\"'; + return 'Added to \"$playlistName\"'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Sudah ada di \"$playlistName\"'; + return 'Already in \"$playlistName\"'; } @override - String get collectionPlaylistCreated => 'Playlist berhasil dibuat'; + String get collectionPlaylistCreated => 'Playlist created'; @override - String get collectionPlaylistNameHint => 'Nama playlist'; + String get collectionPlaylistNameHint => 'Playlist name'; @override - String get collectionPlaylistNameRequired => 'Nama playlist wajib diisi'; + String get collectionPlaylistNameRequired => 'Playlist name is required'; @override - String get collectionRenamePlaylist => 'Ubah nama playlist'; + String get collectionRenamePlaylist => 'Rename playlist'; @override - String get collectionDeletePlaylist => 'Hapus playlist'; + String get collectionDeletePlaylist => 'Delete playlist'; @override String collectionDeletePlaylistMessage(String playlistName) { - return 'Hapus \"$playlistName\" beserta semua lagunya?'; + return 'Delete \"$playlistName\" and all tracks inside it?'; } @override - String get collectionPlaylistDeleted => 'Playlist dihapus'; + String get collectionPlaylistDeleted => 'Playlist deleted'; @override - String get collectionPlaylistRenamed => 'Nama playlist diperbarui'; + String get collectionPlaylistRenamed => 'Playlist renamed'; @override - String get collectionWishlistEmptyTitle => 'Wishlist masih kosong'; + String get collectionWishlistEmptyTitle => 'Wishlist is empty'; @override String get collectionWishlistEmptySubtitle => - 'Tap + di lagu untuk menyimpan yang ingin diunduh nanti'; + 'Tap + on tracks to save what you want to download later'; @override - String get collectionLovedEmptyTitle => 'Folder Loved masih kosong'; + String get collectionLovedEmptyTitle => 'Loved folder is empty'; @override String get collectionLovedEmptySubtitle => - 'Tap love di lagu untuk menyimpan favoritmu'; + 'Tap love on tracks to keep your favorites'; @override - String get collectionPlaylistEmptyTitle => 'Playlist masih kosong'; + String get collectionPlaylistEmptyTitle => 'Playlist is empty'; @override String get collectionPlaylistEmptySubtitle => - 'Tekan lama tombol + pada lagu untuk menambahkannya ke sini'; + 'Long-press + on any track to add it here'; @override - String get collectionRemoveFromPlaylist => 'Hapus dari playlist'; + String get collectionRemoveFromPlaylist => 'Remove from playlist'; @override - String get collectionRemoveFromFolder => 'Hapus dari folder'; + String get collectionRemoveFromFolder => 'Remove from folder'; @override String collectionRemoved(String trackName) { - return '\"$trackName\" dihapus'; + return '\"$trackName\" removed'; } @override String collectionAddedToLoved(String trackName) { - return '\"$trackName\" ditambahkan ke Loved'; + return '\"$trackName\" added to Loved'; } @override String collectionRemovedFromLoved(String trackName) { - return '\"$trackName\" dihapus dari Loved'; + return '\"$trackName\" removed from Loved'; } @override String collectionAddedToWishlist(String trackName) { - return '\"$trackName\" ditambahkan ke Wishlist'; + return '\"$trackName\" added to Wishlist'; } @override String collectionRemovedFromWishlist(String trackName) { - return '\"$trackName\" dihapus dari Wishlist'; + return '\"$trackName\" removed from Wishlist'; } @override - String get trackOptionAddToLoved => 'Tambahkan ke Loved'; + String get trackOptionAddToLoved => 'Add to Loved'; @override - String get trackOptionRemoveFromLoved => 'Hapus dari Loved'; + String get trackOptionRemoveFromLoved => 'Remove from Loved'; @override - String get trackOptionAddToWishlist => 'Tambahkan ke Wishlist'; + String get trackOptionAddToWishlist => 'Add to Wishlist'; @override - String get trackOptionRemoveFromWishlist => 'Hapus dari Wishlist'; + String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; @override - String get collectionPlaylistChangeCover => 'Ubah gambar sampul'; + String get collectionPlaylistChangeCover => 'Change cover image'; @override - String get collectionPlaylistRemoveCover => 'Hapus gambar sampul'; + String get collectionPlaylistRemoveCover => 'Remove cover image'; @override String selectionShareCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'trek', - one: 'trek', + other: 'tracks', + one: 'track', ); - return 'Bagikan $count $_temp0'; + return 'Share $count $_temp0'; } @override - String get selectionShareNoFiles => 'Tidak ada file yang dapat dibagikan'; + String get selectionShareNoFiles => 'No shareable files found'; @override String selectionConvertCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'trek', - one: 'trek', + other: 'tracks', + one: 'track', ); - return 'Konversi $count $_temp0'; + return 'Convert $count $_temp0'; } @override - String get selectionConvertNoConvertible => - 'Tidak ada trek yang dapat dikonversi dipilih'; + String get selectionConvertNoConvertible => 'No convertible tracks selected'; @override - String get selectionBatchConvertConfirmTitle => 'Konversi Massal'; + String get selectionBatchConvertConfirmTitle => 'Batch Convert'; @override String selectionBatchConvertConfirmMessage( @@ -2322,20 +2332,20 @@ class AppLocalizationsId extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'trek', - one: 'trek', + other: 'tracks', + one: 'track', ); - return 'Konversi $count $_temp0 ke $format pada $bitrate?\n\nFile asli akan dihapus setelah konversi.'; + return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; } @override String selectionBatchConvertProgress(int current, int total) { - return 'Mengonversi $current dari $total...'; + return 'Converting $current of $total...'; } @override String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Berhasil mengonversi $success dari $total trek ke $format'; + return 'Converted $success of $total tracks to $format'; } @override diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 9aa5a2fb..9e898bdf 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -15,7 +15,7 @@ class AppLocalizationsJa extends AppLocalizations { String get navHome => 'ホーム'; @override - String get navLibrary => 'Library'; + String get navLibrary => 'ライブラリ'; @override String get navSettings => '設定'; @@ -160,7 +160,7 @@ class AppLocalizationsJa extends AppLocalizations { @override String optionsConcurrentParallel(int count) { - return '$count parallel downloads'; + return '$count 件の分割ダウンロード'; } @override @@ -352,7 +352,7 @@ class AppLocalizationsJa extends AppLocalizations { @override String get aboutAppDescription => - 'Tidal、Qobuz から Spotify のトラックをロスレス品質でダウンロードします。'; + 'Tidal、Qobuz、Amazon Music から Spotify のトラックをロスレス品質でダウンロードします。'; @override String get artistAlbums => 'アルバム'; @@ -683,6 +683,17 @@ class AppLocalizationsJa extends AppLocalizations { @override String get errorNoTracksFound => 'トラックがありません'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return '$item を読み込めません: 拡張ソースがありません'; @@ -1111,7 +1122,7 @@ class AppLocalizationsJa extends AppLocalizations { String get trackLyricsLoadFailed => '歌詞の読み込みに失敗しました'; @override - String get trackEmbedLyrics => 'Embed Lyrics'; + String get trackEmbedLyrics => '歌詞を埋め込む'; @override String get trackLyricsEmbedded => 'Lyrics embedded successfully'; @@ -1325,10 +1336,10 @@ class AppLocalizationsJa extends AppLocalizations { 'YouTube provides lossy audio only. Not part of lossless fallback.'; @override - String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; + String get youtubeOpusBitrateTitle => 'YouTube Opus のビットレート'; @override - String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; + String get youtubeMp3BitrateTitle => 'YouTube MP3 のビットレート'; @override String get downloadAskBeforeDownload => 'ダウンロード前に確認する'; @@ -1375,20 +1386,20 @@ class AppLocalizationsJa extends AppLocalizations { String get queueClearAllMessage => 'すべてのダウンロードを消去してもよろしいですか?'; @override - String get settingsAutoExportFailed => 'Auto-export failed downloads'; + String get settingsAutoExportFailed => 'ダウンロードの自動エクスポートに失敗しました'; @override String get settingsAutoExportFailedSubtitle => 'Save failed downloads to TXT file automatically'; @override - String get settingsDownloadNetwork => 'Download Network'; + String get settingsDownloadNetwork => 'ダウンロードネットワーク'; @override - String get settingsDownloadNetworkAny => 'WiFi + Mobile Data'; + String get settingsDownloadNetworkAny => 'Wi-Fi + モバイルデータ'; @override - String get settingsDownloadNetworkWifiOnly => 'WiFi Only'; + String get settingsDownloadNetworkWifiOnly => 'Wi-Fi のみ'; @override String get settingsDownloadNetworkSubtitle => @@ -1419,7 +1430,7 @@ class AppLocalizationsJa extends AppLocalizations { String get albumFolderYearAlbumSubtitle => 'アルバム/[2005] アルバム名/'; @override - String get albumFolderArtistAlbumSingles => 'Artist / Album + Singles'; + String get albumFolderArtistAlbumSingles => 'アーティスト / アルバム + シングル'; @override String get albumFolderArtistAlbumSinglesSubtitle => @@ -1485,7 +1496,7 @@ class AppLocalizationsJa extends AppLocalizations { String get recentEmpty => 'No recent items yet'; @override - String get recentShowAllDownloads => 'Show All Downloads'; + String get recentShowAllDownloads => 'すべてのダウンロードを表示'; @override String recentPlaylistInfo(String name) { @@ -1559,10 +1570,10 @@ class AppLocalizationsJa extends AppLocalizations { String get discographyFailedToFetch => '一部のアルバムの取得に失敗しました'; @override - String get sectionStorageAccess => 'Storage Access'; + String get sectionStorageAccess => 'ストレージアクセス'; @override - String get allFilesAccess => 'All Files Access'; + String get allFilesAccess => 'すべてのファイルへのアクセス'; @override String get allFilesAccessEnabledSubtitle => 'Can write to any folder'; @@ -1583,35 +1594,35 @@ class AppLocalizationsJa extends AppLocalizations { 'All Files Access disabled. The app will use limited storage access.'; @override - String get settingsLocalLibrary => 'Local Library'; + String get settingsLocalLibrary => 'ローカルライブラリ'; @override String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates'; @override - String get settingsCache => 'Storage & Cache'; + String get settingsCache => 'ストレージとキャッシュ'; @override String get settingsCacheSubtitle => 'View size and clear cached data'; @override - String get libraryTitle => 'Local Library'; + String get libraryTitle => 'ローカルライブラリ'; @override - String get libraryScanSettings => 'Scan Settings'; + String get libraryScanSettings => 'スキャン設定'; @override - String get libraryEnableLocalLibrary => 'Enable Local Library'; + String get libraryEnableLocalLibrary => 'ローカルライブラリを有効'; @override String get libraryEnableLocalLibrarySubtitle => 'Scan and track your existing music'; @override - String get libraryFolder => 'Library Folder'; + String get libraryFolder => 'ライブラリのフォルダ'; @override - String get libraryFolderHint => 'Tap to select folder'; + String get libraryFolderHint => 'タップでフォルダを選択'; @override String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator'; @@ -1621,13 +1632,13 @@ class AppLocalizationsJa extends AppLocalizations { 'Show when searching for existing tracks'; @override - String get libraryActions => 'Actions'; + String get libraryActions => 'アクション'; @override - String get libraryScan => 'Scan Library'; + String get libraryScan => 'ライブラリをスキャン'; @override - String get libraryScanSubtitle => 'Scan for audio files'; + String get libraryScanSubtitle => 'オーディオファイルをスキャン'; @override String get libraryScanSelectFolderFirst => 'Select a folder first'; @@ -1640,20 +1651,20 @@ class AppLocalizationsJa extends AppLocalizations { 'Remove entries for files that no longer exist'; @override - String get libraryClear => 'Clear Library'; + String get libraryClear => 'ライブラリを消去'; @override String get libraryClearSubtitle => 'Remove all scanned tracks'; @override - String get libraryClearConfirmTitle => 'Clear Library'; + String get libraryClearConfirmTitle => 'ライブラリを消去'; @override String get libraryClearConfirmMessage => 'This will remove all scanned tracks from your library. Your actual music files will not be deleted.'; @override - String get libraryAbout => 'About Local Library'; + String get libraryAbout => 'ローカルライブラリについて'; @override String get libraryAboutDescription => @@ -1672,14 +1683,14 @@ class AppLocalizationsJa extends AppLocalizations { @override String libraryLastScanned(String time) { - return 'Last scanned: $time'; + return '最終スキャン: $time'; } @override String get libraryLastScannedNever => 'Never'; @override - String get libraryScanning => 'Scanning...'; + String get libraryScanning => 'スキャン中...'; @override String libraryScanProgress(String progress, int total) { @@ -1687,7 +1698,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get libraryInLibrary => 'In Library'; + String get libraryInLibrary => 'ライブラリ内'; @override String libraryRemovedMissingFiles(int count) { @@ -1698,7 +1709,7 @@ class AppLocalizationsJa extends AppLocalizations { String get libraryCleared => 'Library cleared'; @override - String get libraryStorageAccessRequired => 'Storage Access Required'; + String get libraryStorageAccessRequired => 'ストレージアクセスが必要です'; @override String get libraryStorageAccessMessage => @@ -1708,37 +1719,37 @@ class AppLocalizationsJa extends AppLocalizations { String get libraryFolderNotExist => 'Selected folder does not exist'; @override - String get librarySourceDownloaded => 'Downloaded'; + String get librarySourceDownloaded => 'ダウンロード済み'; @override - String get librarySourceLocal => 'Local'; + String get librarySourceLocal => 'ローカル'; @override - String get libraryFilterAll => 'All'; + String get libraryFilterAll => 'すべて'; @override - String get libraryFilterDownloaded => 'Downloaded'; + String get libraryFilterDownloaded => 'ダウンロード済み'; @override - String get libraryFilterLocal => 'Local'; + String get libraryFilterLocal => 'ローカル'; @override - String get libraryFilterTitle => 'Filters'; + String get libraryFilterTitle => 'フィルター'; @override - String get libraryFilterReset => 'Reset'; + String get libraryFilterReset => 'リセット'; @override - String get libraryFilterApply => 'Apply'; + String get libraryFilterApply => '適用'; @override - String get libraryFilterSource => 'Source'; + String get libraryFilterSource => 'ソース'; @override - String get libraryFilterQuality => 'Quality'; + String get libraryFilterQuality => '品質'; @override - String get libraryFilterQualityHiRes => 'Hi-Res (24bit)'; + String get libraryFilterQualityHiRes => 'ハイレゾ (24bit)'; @override String get libraryFilterQualityCD => 'CD (16bit)'; @@ -1747,7 +1758,7 @@ class AppLocalizationsJa extends AppLocalizations { String get libraryFilterQualityLossy => 'Lossy'; @override - String get libraryFilterFormat => 'Format'; + String get libraryFilterFormat => '形式'; @override String get libraryFilterSort => 'Sort'; @@ -1766,8 +1777,8 @@ class AppLocalizationsJa extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count minutes ago', - one: '1 minute ago', + other: '$count 分前', + one: '1 分前', ); return '$_temp0'; } @@ -1777,14 +1788,14 @@ class AppLocalizationsJa extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count hours ago', - one: '1 hour ago', + other: '$count 時間前', + one: '1 時間前', ); return '$_temp0'; } @override - String get tutorialWelcomeTitle => 'Welcome to SpotiFLAC!'; + String get tutorialWelcomeTitle => 'SpotiFLAC へようこそ!'; @override String get tutorialWelcomeDesc => @@ -1795,7 +1806,8 @@ class AppLocalizationsJa extends AppLocalizations { 'Download music from Spotify, Deezer, or paste any supported URL'; @override - String get tutorialWelcomeTip2 => 'Tidal、Qobuz、Deezer から FLAC 品質のオーディオを取得'; + String get tutorialWelcomeTip2 => + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => @@ -1809,14 +1821,14 @@ class AppLocalizationsJa extends AppLocalizations { 'There are two easy ways to find music you want to download.'; @override - String get tutorialDownloadTitle => 'Downloading Music'; + String get tutorialDownloadTitle => '音楽をダウンロード中'; @override String get tutorialDownloadDesc => 'Downloading music is simple and fast. Here\'s how it works.'; @override - String get tutorialLibraryTitle => 'Your Library'; + String get tutorialLibraryTitle => 'あなたのライブラリ'; @override String get tutorialLibraryDesc => @@ -1835,7 +1847,7 @@ class AppLocalizationsJa extends AppLocalizations { 'Switch between list and grid view for better browsing'; @override - String get tutorialExtensionsTitle => 'Extensions'; + String get tutorialExtensionsTitle => '拡張'; @override String get tutorialExtensionsDesc => @@ -1876,7 +1888,7 @@ class AppLocalizationsJa extends AppLocalizations { 'You\'re all set! Start downloading your favorite music now.'; @override - String get libraryForceFullScan => 'Force Full Scan'; + String get libraryForceFullScan => '強制フルスキャン'; @override String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache'; @@ -1897,10 +1909,10 @@ class AppLocalizationsJa extends AppLocalizations { String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; @override - String get cacheTitle => 'Storage & Cache'; + String get cacheTitle => 'ストレージとキャッシュ'; @override - String get cacheSummaryTitle => 'Cache overview'; + String get cacheSummaryTitle => 'キャッシュの概要'; @override String get cacheSummarySubtitle => @@ -1912,34 +1924,34 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get cacheSectionStorage => 'Cached Data'; + String get cacheSectionStorage => 'キャッシュ済みデータ'; @override - String get cacheSectionMaintenance => 'Maintenance'; + String get cacheSectionMaintenance => 'メンテナンス'; @override - String get cacheAppDirectory => 'App cache directory'; + String get cacheAppDirectory => 'アプリキャッシュのディレクトリ'; @override String get cacheAppDirectoryDesc => 'HTTP responses, WebView data, and other temporary app data.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => '一時ディレクトリ'; @override String get cacheTempDirectoryDesc => 'Temporary files from downloads and audio conversion.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'カバー画像のキャッシュ'; @override String get cacheCoverImageDesc => 'Downloaded album and track cover art. Will re-download when viewed.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'ライブラリのカバーキャッシュ'; @override String get cacheLibraryCoverDesc => @@ -1964,7 +1976,7 @@ class AppLocalizationsJa extends AppLocalizations { 'Remove orphaned download history and library entries for missing files.'; @override - String get cacheNoData => 'No cached data'; + String get cacheNoData => 'キャッシュデータはありません'; @override String cacheSizeWithFiles(String size, int count) { @@ -1978,16 +1990,16 @@ class AppLocalizationsJa extends AppLocalizations { @override String cacheEntries(int count) { - return '$count entries'; + return '$count 個のエントリ'; } @override String cacheClearSuccess(String target) { - return 'Cleared: $target'; + return '消去済み: $target'; } @override - String get cacheClearConfirmTitle => 'Clear cache?'; + String get cacheClearConfirmTitle => 'キャッシュを消去しますか?'; @override String cacheClearConfirmMessage(String target) { @@ -1995,17 +2007,17 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get cacheClearAllConfirmTitle => 'Clear all cache?'; + String get cacheClearAllConfirmTitle => 'すべてのキャッシュを消去しますか?'; @override String get cacheClearAllConfirmMessage => 'This will clear all cache categories on this page. Downloaded music files will not be deleted.'; @override - String get cacheClearAll => 'Clear all cache'; + String get cacheClearAll => 'すべてのキャッシュを消去'; @override - String get cacheCleanupUnused => 'Cleanup unused data'; + String get cacheCleanupUnused => '未使用のデータを削除'; @override String get cacheCleanupUnusedSubtitle => @@ -2017,16 +2029,16 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get cacheRefreshStats => 'Refresh stats'; + String get cacheRefreshStats => '状態を更新'; @override - String get trackSaveCoverArt => 'Save Cover Art'; + String get trackSaveCoverArt => 'カバー画像を保存'; @override String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file'; @override - String get trackSaveLyrics => 'Save Lyrics (.lrc)'; + String get trackSaveLyrics => '歌詞を保存 (.lrc)'; @override String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file'; @@ -2042,7 +2054,7 @@ class AppLocalizationsJa extends AppLocalizations { 'Search metadata online and embed into file'; @override - String get trackEditMetadata => 'Edit Metadata'; + String get trackEditMetadata => 'メタデータを編集'; @override String trackCoverSaved(String fileName) { @@ -2071,26 +2083,26 @@ class AppLocalizationsJa extends AppLocalizations { @override String trackSaveFailed(String error) { - return 'Failed: $error'; + return '失敗: $error'; } @override - String get trackConvertFormat => 'Convert Format'; + String get trackConvertFormat => '変換の形式'; @override - String get trackConvertFormatSubtitle => 'Convert to MP3 or Opus'; + String get trackConvertFormatSubtitle => 'MP3 または Opus に変換'; @override - String get trackConvertTitle => 'Convert Audio'; + String get trackConvertTitle => 'オーディオを変換'; @override - String get trackConvertTargetFormat => 'Target Format'; + String get trackConvertTargetFormat => 'ターゲットの形式'; @override - String get trackConvertBitrate => 'Bitrate'; + String get trackConvertBitrate => 'ビットレート'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => '変換を確認'; @override String trackConvertConfirmMessage( @@ -2102,7 +2114,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get trackConvertConverting => 'Converting audio...'; + String get trackConvertConverting => 'オーディオを変換中...'; @override String trackConvertSuccess(String format) { @@ -2110,7 +2122,7 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => '変換に失敗しました'; @override String get actionCreate => 'Create'; diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 3796e499..66c66e99 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -45,41 +45,40 @@ class AppLocalizationsKo extends AppLocalizations { String get historyFilterSingles => 'Singles'; @override - String get historySearchHint => 'Search history...'; + String get historySearchHint => '검색 기록...'; @override String get settingsTitle => 'Settings'; @override - String get settingsDownload => 'Download'; + String get settingsDownload => '다운로드'; @override - String get settingsAppearance => 'Appearance'; + String get settingsAppearance => '외관'; @override - String get settingsOptions => 'Options'; + String get settingsOptions => '옵션'; @override - String get settingsExtensions => 'Extensions'; + String get settingsExtensions => '확장 기능'; @override - String get settingsAbout => 'About'; + String get settingsAbout => '정보'; @override - String get downloadTitle => 'Download'; + String get downloadTitle => '다운로드'; @override - String get downloadAskQualitySubtitle => - 'Show quality picker for each download'; + String get downloadAskQualitySubtitle => '다운로드를 할 때마다 품질을 선택하도록 합니다'; @override - String get downloadFilenameFormat => 'Filename Format'; + String get downloadFilenameFormat => '파일 이름 형식'; @override - String get downloadFolderOrganization => 'Folder Organization'; + String get downloadFolderOrganization => '폴더 분류 형식'; @override - String get appearanceTitle => 'Appearance'; + String get appearanceTitle => '외관'; @override String get appearanceThemeSystem => 'System'; @@ -94,10 +93,10 @@ class AppLocalizationsKo extends AppLocalizations { String get appearanceDynamicColor => 'Dynamic Color'; @override - String get appearanceDynamicColorSubtitle => 'Use colors from your wallpaper'; + String get appearanceDynamicColorSubtitle => '배경 화면을 참고하여 강조 색상이 지정됩니다'; @override - String get appearanceHistoryView => 'History View'; + String get appearanceHistoryView => '기록 정렬 방식'; @override String get appearanceHistoryViewList => 'List'; @@ -106,112 +105,104 @@ class AppLocalizationsKo extends AppLocalizations { String get appearanceHistoryViewGrid => 'Grid'; @override - String get optionsTitle => 'Options'; + String get optionsTitle => '옵션'; @override - String get optionsPrimaryProvider => 'Primary Provider'; + String get optionsPrimaryProvider => '기본 제공자'; @override - String get optionsPrimaryProviderSubtitle => - 'Service used when searching by track name.'; + String get optionsPrimaryProviderSubtitle => '음반 이름으로 검색할 때 사용되는 서비스'; @override String optionsUsingExtension(String extensionName) { - return 'Using extension: $extensionName'; + return '확장 기능을 사용: $extensionName'; } @override - String get optionsSwitchBack => - 'Tap Deezer or Spotify to switch back from extension'; + String get optionsSwitchBack => 'Deezer 또는 Spotify를 탭하여 확장 기능에서 다시 전환하세요.'; @override - String get optionsAutoFallback => 'Auto Fallback'; + String get optionsAutoFallback => '자동 재시도'; @override String get optionsAutoFallbackSubtitle => '다운로드가 실패한 경우, 다른 서비스로 재시도'; @override - String get optionsUseExtensionProviders => 'Use Extension Providers'; + String get optionsUseExtensionProviders => '확장 기능 사용'; @override String get optionsUseExtensionProvidersOn => '확장 기능을 우선적으로 사용합니다'; @override - String get optionsUseExtensionProvidersOff => 'Using built-in providers only'; + String get optionsUseExtensionProvidersOff => '기본으로 제공되는 기능만 사용'; @override - String get optionsEmbedLyrics => 'Embed Lyrics'; + String get optionsEmbedLyrics => '가사 삽입'; @override - String get optionsEmbedLyricsSubtitle => - 'Embed synced lyrics into FLAC files'; + String get optionsEmbedLyricsSubtitle => 'FLAC 파일에 동기화된 가사를 삽입합니다'; @override - String get optionsMaxQualityCover => 'Max Quality Cover'; + String get optionsMaxQualityCover => '고품질 커버 이미지'; @override - String get optionsMaxQualityCoverSubtitle => - 'Download highest resolution cover art'; + String get optionsMaxQualityCoverSubtitle => '최고 품질의 커버 이미지를 다운로드'; @override - String get optionsConcurrentDownloads => 'Concurrent Downloads'; + String get optionsConcurrentDownloads => '동시 다운로드'; @override - String get optionsConcurrentSequential => 'Sequential (1 at a time)'; + String get optionsConcurrentSequential => '순차 다운로드 (한 번에 하나)'; @override String optionsConcurrentParallel(int count) { - return '$count parallel downloads'; + return '$count개 동시 다운로드'; } @override - String get optionsConcurrentWarning => - 'Parallel downloads may trigger rate limiting'; + String get optionsConcurrentWarning => '동시에 다수의 음반을 다운로드하면 속도 제한이 발생할 수 있습니다'; @override - String get optionsExtensionStore => 'Extension Store'; + String get optionsExtensionStore => '확장 기능 스토어'; @override - String get optionsExtensionStoreSubtitle => 'Show Store tab in navigation'; + String get optionsExtensionStoreSubtitle => '탐색 메뉴에 스토어 탭 표시'; @override - String get optionsCheckUpdates => 'Check for Updates'; + String get optionsCheckUpdates => '업데이트 확인'; @override - String get optionsCheckUpdatesSubtitle => - 'Notify when new version is available'; + String get optionsCheckUpdatesSubtitle => '새로운 버전이 출시되면 알림'; @override - String get optionsUpdateChannel => 'Update Channel'; + String get optionsUpdateChannel => '업데이트 채널'; @override - String get optionsUpdateChannelStable => 'Stable releases only'; + String get optionsUpdateChannelStable => '안정적인 버전만 수령'; @override - String get optionsUpdateChannelPreview => 'Get preview releases'; + String get optionsUpdateChannelPreview => '미리보기 버전을 수령'; @override - String get optionsUpdateChannelWarning => - 'Preview may contain bugs or incomplete features'; + String get optionsUpdateChannelWarning => '미리보기 버전은 불안정할 수 있습니다'; @override - String get optionsClearHistory => 'Clear Download History'; + String get optionsClearHistory => '다운로드 기록 삭제'; @override - String get optionsClearHistorySubtitle => - 'Remove all downloaded tracks from history'; + String get optionsClearHistorySubtitle => '기록에서 모든 다운로드 음반을 제거합니다'; @override - String get optionsDetailedLogging => 'Detailed Logging'; + String get optionsDetailedLogging => '상세 로깅'; @override - String get optionsDetailedLoggingOn => 'Detailed logs are being recorded'; + String get optionsDetailedLoggingOn => '상세한 로그가 기록되고 있습니다'; @override - String get optionsDetailedLoggingOff => 'Enable for bug reports'; + String get optionsDetailedLoggingOff => '버그 신고를 위한 기능입니다'; @override - String get optionsSpotifyCredentials => 'Spotify Credentials'; + String get optionsSpotifyCredentials => 'Spotify 자격 증명'; @override String optionsSpotifyCredentialsConfigured(String clientId) { @@ -219,21 +210,21 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String get optionsSpotifyCredentialsRequired => 'Required - tap to configure'; + String get optionsSpotifyCredentialsRequired => '탭하여 설정'; @override String get optionsSpotifyWarning => - 'Spotify requires your own API credentials. Get them free from developer.spotify.com'; + 'Spotify는 사용자 고유의 API 자격 증명을 요구합니다. developer.spotify.com에서 무료로 발급받으세요'; @override String get optionsSpotifyDeprecationWarning => - 'Spotify search will be deprecated on March 3, 2026 due to Spotify API changes. Please switch to Deezer.'; + 'Spotify API 변경으로 인해 Spotify 검색 기능은 2026년 3월 3일부터 더 이상 지원되지 않습니다. Deezer로 전환해 주세요'; @override - String get extensionsTitle => 'Extensions'; + String get extensionsTitle => '확장 기능'; @override - String get extensionsDisabled => 'Disabled'; + String get extensionsDisabled => '비활성화'; @override String extensionsVersion(String version) { @@ -246,80 +237,79 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String get extensionsUninstall => 'Uninstall'; + String get extensionsUninstall => '삭제'; @override - String get storeTitle => 'Extension Store'; + String get storeTitle => '확장 기능 스토어'; @override - String get storeSearch => 'Search extensions...'; + String get storeSearch => '확장 기능 검색'; @override - String get storeInstall => 'Install'; + String get storeInstall => '설치'; @override - String get storeInstalled => 'Installed'; + String get storeInstalled => '설치됨'; @override - String get storeUpdate => 'Update'; + String get storeUpdate => '업데이트'; @override - String get aboutTitle => 'About'; + String get aboutTitle => '정보'; @override - String get aboutContributors => 'Contributors'; + String get aboutContributors => '기여자'; @override - String get aboutMobileDeveloper => 'Mobile version developer'; + String get aboutMobileDeveloper => '모바일 버전 개발자'; @override - String get aboutOriginalCreator => 'Creator of the original SpotiFLAC'; + String get aboutOriginalCreator => '오리지널 SpotiFLAC 제작자'; @override - String get aboutLogoArtist => - 'The talented artist who created our beautiful app logo!'; + String get aboutLogoArtist => '아름다운 로고를 만들어주신 재능 있는 아티스트!'; @override - String get aboutTranslators => 'Translators'; + String get aboutTranslators => '번역가들'; @override - String get aboutSpecialThanks => 'Special Thanks'; + String get aboutSpecialThanks => '특별 감사'; @override - String get aboutLinks => 'Links'; + String get aboutLinks => '바로가기'; @override String get aboutMobileSource => 'Mobile source code'; @override - String get aboutPCSource => 'PC source code'; + String get aboutPCSource => 'PC 소스 코드'; @override - String get aboutReportIssue => 'Report an issue'; + String get aboutReportIssue => '문제 신고'; @override - String get aboutReportIssueSubtitle => 'Report any problems you encounter'; + String get aboutReportIssueSubtitle => '발생하는 모든 문제를 신고하여 주세요.'; @override - String get aboutFeatureRequest => 'Feature request'; + String get aboutFeatureRequest => '기능 요청'; @override - String get aboutFeatureRequestSubtitle => 'Suggest new features for the app'; + String get aboutFeatureRequestSubtitle => '앱의 새로운 기능을 제안하여 주세요.'; @override String get aboutTelegramChannel => 'Telegram Channel'; @override - String get aboutTelegramChannelSubtitle => 'Announcements and updates'; + String get aboutTelegramChannelSubtitle => '공지 및 업데이트 안내'; @override String get aboutTelegramChat => 'Telegram Community'; @override - String get aboutTelegramChatSubtitle => 'Chat with other users'; + String get aboutTelegramChatSubtitle => '다른 이용자와 소통'; @override - String get aboutSocial => 'Social'; + String get aboutSocial => '소셜'; @override String get aboutApp => 'App'; @@ -329,244 +319,239 @@ class AppLocalizationsKo extends AppLocalizations { @override String get aboutBinimumDesc => - 'The creator of QQDL & HiFi API. Without this API, Tidal downloads wouldn\'t exist!'; + 'QQDL 및 HiFi API 개발자입니다. 이 API가 없었다면 Tidal 다운로드는 불가능했을 것입니다!'; @override - String get aboutSachinsenalDesc => - 'The original HiFi project creator. The foundation of Tidal integration!'; + String get aboutSachinsenalDesc => '최초의 하이파이 프로젝트 창시자. 타이달 연동의 기반을 마련한 사람!'; @override String get aboutSjdonadoDesc => - 'Creator of I Don\'t Have Spotify (IDHS). The fallback link resolver that saves the day!'; + 'I Don\'t Have Spotify(IDHS) 개발자입니다. 위급 상황 발생 시 해결해 주는 대체 링크 해결 도구를 만들었습니다!'; @override String get aboutDabMusic => 'DAB Music'; @override String get aboutDabMusicDesc => - 'The best Qobuz streaming API. Hi-Res downloads wouldn\'t be possible without this!'; + '최고의 Qobuz 스트리밍 API입니다. 이 API가 없었다면 고해상도 다운로드는 불가능했을 겁니다!'; @override String get aboutSpotiSaver => 'SpotiSaver'; @override String get aboutSpotiSaverDesc => - 'Tidal Hi-Res FLAC streaming endpoints. A key piece of the lossless puzzle!'; + 'Tidal Hi-Res FLAC 스트리밍 엔드포인트. 무손실 음원 재생의 핵심 요소!'; @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Tidal, Qobuz, Amazon Music에서 Spotify 트랙을 무손실 음질로 다운로드하세요.'; @override - String get artistAlbums => 'Albums'; + String get artistAlbums => '앨범'; @override - String get artistSingles => 'Singles & EPs'; + String get artistSingles => '싱글 및 EP'; @override - String get artistCompilations => 'Compilations'; + String get artistCompilations => '편집'; @override - String get artistPopular => 'Popular'; + String get artistPopular => '인기순'; @override String artistMonthlyListeners(String count) { - return '$count monthly listeners'; + return '월간 청취자: $count'; } @override - String get trackMetadataService => 'Service'; + String get trackMetadataService => '제공업체'; @override - String get trackMetadataPlay => 'Play'; + String get trackMetadataPlay => '재생'; @override - String get trackMetadataShare => 'Share'; + String get trackMetadataShare => '공유'; @override - String get trackMetadataDelete => 'Delete'; + String get trackMetadataDelete => '삭제'; @override - String get setupGrantPermission => 'Grant Permission'; + String get setupGrantPermission => '권한을 제공해 주세요.'; @override - String get setupSkip => 'Skip for now'; + String get setupSkip => '다음에 할래요'; @override - String get setupStorageAccessRequired => 'Storage Access Required'; + String get setupStorageAccessRequired => '스토리지 접근 권한 필요'; @override String get setupStorageAccessMessageAndroid11 => - 'Android 11+ requires \"All files access\" permission to save files to your chosen download folder.'; + 'Android 11 이상 버전에서는 선택한 다운로드 폴더에 파일을 저장하려면 \"모든 파일 접근\" 권한이 필요합니다.'; @override - String get setupOpenSettings => 'Open Settings'; + String get setupOpenSettings => '설정으로 이동'; @override String get setupPermissionDeniedMessage => - 'Permission denied. Please grant all permissions to continue.'; + '권한이 거부되었습니다. 계속하려면 모든 권한을 허용해 주세요.'; @override String setupPermissionRequired(String permissionType) { - return '$permissionType Permission Required'; + return '$permissionType 권한 필요'; } @override String setupPermissionRequiredMessage(String permissionType) { - return '$permissionType permission is required for the best experience. You can change this later in Settings.'; + return '최상의 사용 경험을 위해 $permissionType 권한이 필요합니다. 설정에서 나중에 변경할 수 있습니다.'; } @override - String get setupUseDefaultFolder => 'Use Default Folder?'; + String get setupUseDefaultFolder => '기본 폴더를 사용하시겠습니까?'; @override - String get setupNoFolderSelected => - 'No folder selected. Would you like to use the default Music folder?'; + String get setupNoFolderSelected => '선택된 폴더가 없습니다. 기본 음악 폴더를 사용하시겠습니까?'; @override - String get setupUseDefault => 'Use Default'; + String get setupUseDefault => '기본값 사용'; @override - String get setupDownloadLocationTitle => 'Download Location'; + String get setupDownloadLocationTitle => '다운로드 경로'; @override String get setupDownloadLocationIosMessage => - 'On iOS, downloads are saved to the app\'s Documents folder. You can access them via the Files app.'; + 'iOS에서는 다운로드한 파일이 앱의 문서 폴더에 저장됩니다. 파일 앱을 통해 해당 파일에 접근할 수 있습니다.'; @override - String get setupAppDocumentsFolder => 'App Documents Folder'; + String get setupAppDocumentsFolder => '앱 문서 폴더'; @override - String get setupAppDocumentsFolderSubtitle => - 'Recommended - accessible via Files app'; + String get setupAppDocumentsFolderSubtitle => '권장 사항 - 파일 앱을 통해 접근 가능'; @override - String get setupChooseFromFiles => 'Choose from Files'; + String get setupChooseFromFiles => '파일 탐색기에서 선택'; @override - String get setupChooseFromFilesSubtitle => 'Select iCloud or other location'; + String get setupChooseFromFilesSubtitle => 'iCloud 또는 다른 위치를 선택하세요'; @override String get setupIosEmptyFolderWarning => - 'iOS limitation: Empty folders cannot be selected. Choose a folder with at least one file.'; + 'iOS 제한 사항: 빈 폴더는 선택할 수 없습니다. 파일이 하나 이상 있는 폴더를 선택하세요.'; @override String get setupIcloudNotSupported => - 'iCloud Drive is not supported. Please use the app Documents folder.'; + 'iCloud Drive는 지원되지 않습니다. 앱의 문서 폴더를 사용해 주세요.'; @override - String get setupDownloadInFlac => 'Download Spotify tracks in FLAC'; + String get setupDownloadInFlac => 'Spotify 음악을 FLAC 형식으로 다운로드하세요.'; @override - String get setupStorageGranted => 'Storage Permission Granted!'; + String get setupStorageGranted => '저장소 접근 권한이 부여되었습니다!'; @override - String get setupStorageRequired => 'Storage Permission Required'; + String get setupStorageRequired => '저장소 접근 권한이 필요합니다.'; @override String get setupStorageDescription => - 'SpotiFLAC needs storage permission to save your downloaded music files.'; + 'SpotiFLAC은 다운로드한 음악 파일을 저장하기 위해 저장소 접근 권한이 필요합니다.'; @override - String get setupNotificationGranted => 'Notification Permission Granted!'; + String get setupNotificationGranted => '알림 권한이 부여되었습니다!'; @override - String get setupNotificationEnable => 'Enable Notifications'; + String get setupNotificationEnable => '알림 활성화'; @override - String get setupFolderChoose => 'Choose Download Folder'; + String get setupFolderChoose => '다운로드 폴더를 선택하세요'; @override - String get setupFolderDescription => - 'Select a folder where your downloaded music will be saved.'; + String get setupFolderDescription => '다운로드한 음악 파일이 저장될 폴더를 선택하세요.'; @override - String get setupSelectFolder => 'Select Folder'; + String get setupSelectFolder => '폴더 선택'; @override - String get setupEnableNotifications => 'Enable Notifications'; + String get setupEnableNotifications => '알림 활성화'; @override String get setupNotificationBackgroundDescription => - 'Get notified about download progress and completion. This helps you track downloads when the app is in background.'; + '알림으로 다운로드 진행 상황을 확인하세요. 앱이 백그라운드에서 실행 중일 때 다운로드 상태와 완료 여부를 확인할 수 있습니다.'; @override - String get setupSkipForNow => 'Skip for now'; + String get setupSkipForNow => '다음에 할래요.'; @override - String get setupNext => 'Next'; + String get setupNext => '다음'; @override - String get setupGetStarted => 'Get Started'; + String get setupGetStarted => '시작하기'; @override String get setupAllowAccessToManageFiles => - 'Please enable \"Allow access to manage all files\" in the next screen.'; + '다음 화면에서 \"모든 파일 관리 권한 허용\"을 활성화해 주세요.'; @override - String get dialogCancel => 'Cancel'; + String get dialogCancel => '취소'; @override - String get dialogSave => 'Save'; + String get dialogSave => '저장'; @override - String get dialogDelete => 'Delete'; + String get dialogDelete => '삭제'; @override - String get dialogRetry => 'Retry'; + String get dialogRetry => '재시도'; @override - String get dialogClear => 'Clear'; + String get dialogClear => '지우기'; @override - String get dialogDone => 'Done'; + String get dialogDone => '완료'; @override - String get dialogImport => 'Import'; + String get dialogImport => '불러오기'; @override - String get dialogDiscard => 'Discard'; + String get dialogDiscard => '취소'; @override - String get dialogRemove => 'Remove'; + String get dialogRemove => '제거'; @override - String get dialogUninstall => 'Uninstall'; + String get dialogUninstall => '삭제'; @override - String get dialogDiscardChanges => 'Discard Changes?'; + String get dialogDiscardChanges => '변경사항 취소'; @override - String get dialogUnsavedChanges => - 'You have unsaved changes. Do you want to discard them?'; + String get dialogUnsavedChanges => '저장되지 않은 변경 사항이 있습니다. 삭제하시겠습니까?'; @override - String get dialogClearAll => 'Clear All'; + String get dialogClearAll => '모두 제거:'; @override - String get dialogRemoveExtension => 'Remove Extension'; + String get dialogRemoveExtension => '확장 프로그램 제거'; @override String get dialogRemoveExtensionMessage => - 'Are you sure you want to remove this extension? This cannot be undone.'; + '이 확장 프로그램을 정말로 제거하시겠습니까? 이 작업은 되돌릴 수 없습니다.'; @override - String get dialogUninstallExtension => 'Uninstall Extension?'; + String get dialogUninstallExtension => '확장 프로그램을 제거하시겠습니까?'; @override String dialogUninstallExtensionMessage(String extensionName) { - return 'Are you sure you want to remove $extensionName?'; + return '$extensionName을 정말로 삭제하시겠습니까?'; } @override - String get dialogClearHistoryTitle => 'Clear History'; + String get dialogClearHistoryTitle => '기록 삭제'; @override String get dialogClearHistoryMessage => - 'Are you sure you want to clear all download history? This cannot be undone.'; + '다운로드 기록을 모두 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.'; @override - String get dialogDeleteSelectedTitle => 'Delete Selected'; + String get dialogDeleteSelectedTitle => '선택한 항목 삭제'; @override String dialogDeleteSelectedMessage(int count) { @@ -576,50 +561,50 @@ class AppLocalizationsKo extends AppLocalizations { other: 'tracks', one: 'track', ); - return 'Delete $count $_temp0 from history?\n\nThis will also delete the files from storage.'; + return '기록에서 $count $_temp0를 삭제하시겠습니까?'; } @override - String get dialogImportPlaylistTitle => 'Import Playlist'; + String get dialogImportPlaylistTitle => '재생 목록 가져오기'; @override String dialogImportPlaylistMessage(int count) { - return 'Found $count tracks in CSV. Add them to download queue?'; + return 'CSV 파일에서 $count개의 트랙을 찾았습니다. 다운로드 대기열에 추가하시겠습니까?'; } @override String csvImportTracks(int count) { - return '$count tracks from CSV'; + return 'CSV 파일의 트랙: $count'; } @override String snackbarAddedToQueue(String trackName) { - return 'Added \"$trackName\" to queue'; + return '\"$trackName\"(을)를 대기열에 추가했습니다.'; } @override String snackbarAddedTracksToQueue(int count) { - return 'Added $count tracks to queue'; + return '대기열에 $count개의 트랙을 추가했습니다.'; } @override String snackbarAlreadyDownloaded(String trackName) { - return '\"$trackName\" already downloaded'; + return '\"$trackName\"(은)는 이미 다운로드되었습니다.'; } @override String snackbarAlreadyInLibrary(String trackName) { - return '\"$trackName\" already exists in your library'; + return '라이브러리에 \"$trackName\"(은)는 이미 존재합니다.'; } @override - String get snackbarHistoryCleared => 'History cleared'; + String get snackbarHistoryCleared => '기록 삭제됨'; @override - String get snackbarCredentialsSaved => 'Credentials saved'; + String get snackbarCredentialsSaved => '자격 증명이 저장되었습니다.'; @override - String get snackbarCredentialsCleared => 'Credentials cleared'; + String get snackbarCredentialsCleared => '자격 증명이 제거되었습니다.'; @override String snackbarDeletedTracks(int count) { @@ -629,136 +614,145 @@ class AppLocalizationsKo extends AppLocalizations { other: 'tracks', one: 'track', ); - return 'Deleted $count $_temp0'; + return '$count$_temp0 제거됨'; } @override String snackbarCannotOpenFile(String error) { - return 'Cannot open file: $error'; + return '파일을 열 수 없습니다: $error'; } @override - String get snackbarFillAllFields => 'Please fill all fields'; + String get snackbarFillAllFields => '모든 항목을 입력해 주세요.'; @override String get snackbarViewQueue => 'View Queue'; @override String snackbarUrlCopied(String platform) { - return '$platform URL copied to clipboard'; + return '$platform 링크가 클립보드에 저장됨'; } @override - String get snackbarFileNotFound => 'File not found'; + String get snackbarFileNotFound => '파일을 찾을 수 없음'; @override - String get snackbarSelectExtFile => 'Please select a .spotiflac-ext file'; + String get snackbarSelectExtFile => '.spotiflac-ext 확장자 파일을 선택'; @override - String get snackbarProviderPrioritySaved => 'Provider priority saved'; + String get snackbarProviderPrioritySaved => '제공자 우선순위 저장됨'; @override - String get snackbarMetadataProviderSaved => - 'Metadata provider priority saved'; + String get snackbarMetadataProviderSaved => '메타데이터 제공자 우선순위 저장됨'; @override String snackbarExtensionInstalled(String extensionName) { - return '$extensionName installed.'; + return '$extensionName(이)가 설치됨'; } @override String snackbarExtensionUpdated(String extensionName) { - return '$extensionName updated.'; + return '$extensionName(이)가 설치됨.'; } @override - String get snackbarFailedToInstall => 'Failed to install extension'; + String get snackbarFailedToInstall => '확장 프로그램 설치 실패'; @override - String get snackbarFailedToUpdate => 'Failed to update extension'; + String get snackbarFailedToUpdate => '확장 프로그램 업데이트 실패'; @override String get errorRateLimited => 'Rate Limited'; @override - String get errorRateLimitedMessage => - 'Too many requests. Please wait a moment before searching again.'; + String get errorRateLimitedMessage => '요청이 너무 많습니다. 잠시 후 다시 검색해 주세요.'; @override - String get errorNoTracksFound => 'No tracks found'; + String get errorNoTracksFound => '트랙을 찾을 수 없습니다'; + + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; @override String errorMissingExtensionSource(String item) { - return 'Cannot load $item: missing extension source'; + return '확장 소스가 누락되어, $item(을)를 로드할 수 없습니다'; } @override - String get actionPause => 'Pause'; + String get actionPause => '멈추기'; @override - String get actionResume => 'Resume'; + String get actionResume => '재시작'; @override - String get actionCancel => 'Cancel'; + String get actionCancel => '취소'; @override - String get actionSelectAll => 'Select All'; + String get actionSelectAll => '모두 선택'; @override - String get actionDeselect => 'Deselect'; + String get actionDeselect => '선택 해제'; @override - String get actionRemoveCredentials => 'Remove Credentials'; + String get actionRemoveCredentials => '자격 증명 제거'; @override - String get actionSaveCredentials => 'Save Credentials'; + String get actionSaveCredentials => '자격 증명 저장'; @override String selectionSelected(int count) { - return '$count selected'; + return '$count개 선택됨'; } @override - String get selectionAllSelected => 'All tracks selected'; + String get selectionAllSelected => '모든 트랙 선택됨'; @override - String get selectionSelectToDelete => 'Select tracks to delete'; + String get selectionSelectToDelete => '삭제할 트랙을 선택'; @override String progressFetchingMetadata(int current, int total) { - return 'Fetching metadata... $current/$total'; + return '메타데이터 가져오는 중... $current/$total'; } @override - String get progressReadingCsv => 'Reading CSV...'; + String get progressReadingCsv => 'CSV 파일을 읽는 중...'; @override - String get searchSongs => 'Songs'; + String get searchSongs => '곡들'; @override - String get searchArtists => 'Artists'; + String get searchArtists => '아티스트들'; @override - String get searchAlbums => 'Albums'; + String get searchAlbums => '앨범들'; @override - String get searchPlaylists => 'Playlists'; + String get searchPlaylists => '재생목록들'; @override - String get tooltipPlay => 'Play'; + String get tooltipPlay => '재생'; @override - String get filenameFormat => 'Filename Format'; + String get filenameFormat => ''; @override - String get filenameShowAdvancedTags => 'Show advanced tags'; + String get filenameShowAdvancedTags => '고급 태그 표시'; @override String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; + '트랙 패딩 및 날짜 패턴에 대한 서식 있는 태그를 활성화합니다.'; @override - String get folderOrganizationNone => 'No organization'; + String get folderOrganizationNone => '정리하지 않음'; @override String get folderOrganizationByArtist => 'By Artist'; @@ -877,116 +871,114 @@ class AppLocalizationsKo extends AppLocalizations { String get logShareLogs => 'Share logs'; @override - String get logClearLogs => 'Clear logs'; + String get logClearLogs => '로그 제거'; @override - String get logClearLogsTitle => 'Clear Logs'; + String get logClearLogsTitle => '로그 제거'; @override - String get logClearLogsMessage => 'Are you sure you want to clear all logs?'; + String get logClearLogsMessage => '모든 로그를 삭제하시겠습니까?'; @override - String get logFilterBySeverity => 'Filter logs by severity'; + String get logFilterBySeverity => '심각성에 따라 로그 분류'; @override - String get logNoLogsYet => 'No logs yet'; + String get logNoLogsYet => '어떠한 로그도 없음'; @override - String get logNoLogsYetSubtitle => 'Logs will appear here as you use the app'; + String get logNoLogsYetSubtitle => '앱을 사용하는 동안 로그가 여기에 표시됩니다.'; @override String logEntriesFiltered(int count) { - return 'Entries ($count filtered)'; + return '($count filtered)개 항목 필터링'; } @override String logEntries(int count) { - return 'Entries ($count)'; + return '항목 수: ($count)'; } @override - String get credentialsTitle => 'Spotify Credentials'; + String get credentialsTitle => 'Spotify 자격 증명'; @override String get credentialsDescription => - 'Enter your Client ID and Secret to use your own Spotify application quota.'; + 'Spotify 애플리케이션 할당량을 사용하려면 클라이언트 ID와 비밀키를 입력하세요.'; @override String get credentialsClientId => 'Client ID'; @override - String get credentialsClientIdHint => 'Paste Client ID'; + String get credentialsClientIdHint => 'Client ID를 붙여넣으세요'; @override - String get credentialsClientSecret => 'Client Secret'; + String get credentialsClientSecret => '비밀키'; @override - String get credentialsClientSecretHint => 'Paste Client Secret'; + String get credentialsClientSecretHint => '비밀키를 붙여넣으세요'; @override - String get channelStable => 'Stable'; + String get channelStable => '안정'; @override - String get channelPreview => 'Preview'; + String get channelPreview => '베타'; @override - String get sectionSearchSource => 'Search Source'; + String get sectionSearchSource => '검색 소스'; @override - String get sectionDownload => 'Download'; + String get sectionDownload => '다운로드'; @override - String get sectionPerformance => 'Performance'; + String get sectionPerformance => '성능'; @override - String get sectionApp => 'App'; + String get sectionApp => '앱'; @override - String get sectionData => 'Data'; + String get sectionData => '데이터'; @override String get sectionDebug => 'Debug'; @override - String get sectionService => 'Service'; + String get sectionService => '서비스'; @override - String get sectionAudioQuality => 'Audio Quality'; + String get sectionAudioQuality => '오디오 품질'; @override - String get sectionFileSettings => 'File Settings'; + String get sectionFileSettings => '파일 설정'; @override - String get sectionLyrics => 'Lyrics'; + String get sectionLyrics => '가사'; @override - String get lyricsMode => 'Lyrics Mode'; + String get lyricsMode => '가사 설정'; @override - String get lyricsModeDescription => - 'Choose how lyrics are saved with your downloads'; + String get lyricsModeDescription => '다운로드한 파일에 가사를 저장하는 방법을 선택하세요.'; @override - String get lyricsModeEmbed => 'Embed in file'; + String get lyricsModeEmbed => '파일에 포함'; @override - String get lyricsModeEmbedSubtitle => 'Lyrics stored inside FLAC metadata'; + String get lyricsModeEmbedSubtitle => 'FLAC 메타데이터 내에 저장됩니다.'; @override - String get lyricsModeExternal => 'External .lrc file'; + String get lyricsModeExternal => '외부 .lrc 파일'; @override - String get lyricsModeExternalSubtitle => - 'Separate .lrc file for players like Samsung Music'; + String get lyricsModeExternalSubtitle => '삼성 뮤직과 같은 플레이어용 별도 .lrc 파일'; @override - String get lyricsModeBoth => 'Both'; + String get lyricsModeBoth => '둘 다'; @override - String get lyricsModeBothSubtitle => 'Embed and save .lrc file'; + String get lyricsModeBothSubtitle => '.lrc 파일을 삽입하고 저장합니다.'; @override - String get sectionColor => 'Color'; + String get sectionColor => '색상'; @override String get sectionTheme => 'Theme'; @@ -1807,7 +1799,8 @@ class AppLocalizationsKo extends AppLocalizations { 'Download music from Spotify, Deezer, or paste any supported URL'; @override - String get tutorialWelcomeTip2 => 'Tidal, Qobuz 또는 Deezer에서 FLAC 품질 오디오 받기'; + String get tutorialWelcomeTip2 => + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 81ecfd12..6144f9b6 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -356,7 +356,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; @override String get artistAlbums => 'Albums'; @@ -688,6 +688,17 @@ class AppLocalizationsNl extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; @@ -1809,7 +1820,7 @@ class AppLocalizationsNl extends AppLocalizations { @override String get tutorialWelcomeTip2 => - 'Krijg FLAC-kwaliteit audio van Tidal, Qobuz of Deezer'; + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 24b813f3..d5c8d821 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -688,6 +688,17 @@ class AppLocalizationsPt extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 77913294..909b5842 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -67,7 +67,7 @@ class AppLocalizationsRu extends AppLocalizations { String get settingsAbout => 'О программе'; @override - String get downloadTitle => 'Скачивание'; + String get downloadTitle => 'Скачать'; @override String get downloadAskQualitySubtitle => @@ -146,11 +146,11 @@ class AppLocalizationsRu extends AppLocalizations { 'Использование только встроенных провайдеров'; @override - String get optionsEmbedLyrics => 'Вставить текст песни'; + String get optionsEmbedLyrics => 'Вписать текст песни'; @override String get optionsEmbedLyricsSubtitle => - 'Вставить синхронизированные тексты в FLAC файлы'; + 'Вписать синхронизированные тексты во FLAC файлы'; @override String get optionsMaxQualityCover => 'Максимальное качество обложки'; @@ -337,7 +337,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get aboutBinimumDesc => - 'Создатель QQDL & HiFi API. Без этого API загрузки Tidal не существовали бы!'; + 'Создатель QQDL & HiFi API. Без него API загрузки Tidal не существовали бы!'; @override String get aboutSachinsenalDesc => @@ -363,7 +363,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get aboutAppDescription => - 'Скачайте треки Spotify в Lossless качестве из Tidal и Qobuz.'; + 'Скачайте треки Spotify в Lossless качестве из Tidal, Qobuz и Amazon Music.'; @override String get artistAlbums => 'Альбомы'; @@ -601,7 +601,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String csvImportTracks(int count) { - return '$count треков из CSV'; + return '$count трек(-ов) из CSV'; } @override @@ -702,6 +702,17 @@ class AppLocalizationsRu extends AppLocalizations { @override String get errorNoTracksFound => 'Треки не найдены'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Невозможно загрузить $item: отсутствует источник расширения'; @@ -766,11 +777,11 @@ class AppLocalizationsRu extends AppLocalizations { String get filenameFormat => 'Формат имени файла'; @override - String get filenameShowAdvancedTags => 'Show advanced tags'; + String get filenameShowAdvancedTags => 'Показать расширенные теги'; @override String get filenameShowAdvancedTagsDescription => - 'Enable formatted tags for track padding and date patterns'; + 'Включить форматированные теги для отслеживания заполнения и шаблонов дат'; @override String get folderOrganizationNone => 'Без организации'; @@ -983,7 +994,7 @@ class AppLocalizationsRu extends AppLocalizations { 'Выберите как сохранить тексты песен при скачивании'; @override - String get lyricsModeEmbed => 'Вставить в файл'; + String get lyricsModeEmbed => 'Вписать в файл'; @override String get lyricsModeEmbedSubtitle => 'Встроить текст в метаданные FLAC'; @@ -999,7 +1010,7 @@ class AppLocalizationsRu extends AppLocalizations { String get lyricsModeBoth => 'Оба варианта'; @override - String get lyricsModeBothSubtitle => 'Вставить и сохранить файл .lrc'; + String get lyricsModeBothSubtitle => 'Вписать и сохранить .lrc файл'; @override String get sectionColor => 'Цвет'; @@ -1138,7 +1149,7 @@ class AppLocalizationsRu extends AppLocalizations { String get trackLyricsLoadFailed => 'Не удалось загрузить текст песни'; @override - String get trackEmbedLyrics => 'Вставить текст песни'; + String get trackEmbedLyrics => 'Вписать текст песни'; @override String get trackLyricsEmbedded => 'Текст успешно добавлен'; @@ -1361,10 +1372,10 @@ class AppLocalizationsRu extends AppLocalizations { 'YouTube обеспечивает только звук с потерями(Lossy).'; @override - String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; + String get youtubeOpusBitrateTitle => 'Битрейт YouTube Opus'; @override - String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; + String get youtubeMp3BitrateTitle => 'Битрейт YouTube MP3'; @override String get downloadAskBeforeDownload => 'Спрашивать перед скачиванием'; @@ -1383,7 +1394,8 @@ class AppLocalizationsRu extends AppLocalizations { 'Использовать исполнителя альбома для папок'; @override - String get downloadUsePrimaryArtistOnly => 'Primary artist only for folders'; + String get downloadUsePrimaryArtistOnly => + 'Основной исполнитель только для папок'; @override String get downloadUsePrimaryArtistOnlyEnabled => @@ -1391,7 +1403,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get downloadUsePrimaryArtistOnlyDisabled => - 'Full artist string used for folder name'; + 'Полная строка исполнителя, используемая для имени папки'; @override String get downloadSelectQuality => 'Выбор качества'; @@ -1423,7 +1435,7 @@ class AppLocalizationsRu extends AppLocalizations { String get settingsDownloadNetwork => 'Сеть для скачивания'; @override - String get settingsDownloadNetworkAny => 'WiFi и мобильная сеть'; + String get settingsDownloadNetworkAny => 'WiFi и Мобильная сеть'; @override String get settingsDownloadNetworkWifiOnly => 'Только WiFi'; @@ -1712,8 +1724,10 @@ class AppLocalizationsRu extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'треков', + many: 'треков', + few: 'трека', + one: 'трек', ); return '$_temp0'; } @@ -1800,7 +1814,7 @@ class AppLocalizationsRu extends AppLocalizations { String get libraryFilterQualityCD => 'CD (16 бит)'; @override - String get libraryFilterQualityLossy => 'С потерями'; + String get libraryFilterQualityLossy => 'Lossy'; @override String get libraryFilterFormat => 'Формат'; @@ -1855,7 +1869,8 @@ class AppLocalizationsRu extends AppLocalizations { 'Скачивайте музыку из Spotify, Deezer, или вставьте любой поддерживаемый URL'; @override - String get tutorialWelcomeTip2 => 'Скачайте FLAC с Tidal, Qobuz или Deezer'; + String get tutorialWelcomeTip2 => + 'Скачайте FLAC с Tidal, Qobuz или Amazon Music'; @override String get tutorialWelcomeTip3 => @@ -1903,7 +1918,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get tutorialExtensionsTip1 => - 'Browse the Store tab to discover useful extensions'; + 'Просмотрите вкладку Магазина, чтобы найти полезные расширения'; @override String get tutorialExtensionsTip2 => @@ -1911,14 +1926,14 @@ class AppLocalizationsRu extends AppLocalizations { @override String get tutorialExtensionsTip3 => - 'Get lyrics, enhanced metadata, and more features'; + 'Получайте тексты песен, улучшенные метаданные и другие возможности'; @override String get tutorialSettingsTitle => 'Настройте приложение под себя'; @override String get tutorialSettingsDesc => - 'Personalize the app in Settings to match your preferences.'; + 'Персонализируйте приложение в Настройках, чтобы оно соответствовало вашим предпочтениям.'; @override String get tutorialSettingsTip1 => @@ -1943,11 +1958,11 @@ class AppLocalizationsRu extends AppLocalizations { 'Пересканировать все файлы, игнорировать кэш'; @override - String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads'; + String get cleanupOrphanedDownloads => 'Очистка отложенных скачиваний'; @override String get cleanupOrphanedDownloadsSubtitle => - 'Remove history entries for files that no longer exist'; + 'Удалить историю записи для файлов, которых больше не существует'; @override String cleanupOrphanedDownloadsResult(int count) { @@ -1955,7 +1970,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get cleanupOrphanedDownloadsNone => 'No orphaned entries found'; + String get cleanupOrphanedDownloadsNone => 'Записей без описания не найдено'; @override String get cacheTitle => 'Хранилище и кэш'; @@ -1965,11 +1980,11 @@ class AppLocalizationsRu extends AppLocalizations { @override String get cacheSummarySubtitle => - 'Clearing cache will not remove downloaded music files.'; + 'Очистка кэша не приведет к удалению загруженных музыкальных файлов.'; @override String cacheEstimatedTotal(String size) { - return 'Estimated cache usage: $size'; + return 'Приблизительное использование кэша: $size'; } @override @@ -1983,42 +1998,42 @@ class AppLocalizationsRu extends AppLocalizations { @override String get cacheAppDirectoryDesc => - 'HTTP responses, WebView data, and other temporary app data.'; + 'HTTP-ответы, данные WebView и другие временные данные приложения.'; @override - String get cacheTempDirectory => 'Temporary directory'; + String get cacheTempDirectory => 'Временная директория'; @override String get cacheTempDirectoryDesc => - 'Temporary files from downloads and audio conversion.'; + 'Временные файлы из загрузок и аудио конвертации.'; @override - String get cacheCoverImage => 'Cover image cache'; + String get cacheCoverImage => 'Кэш обложек'; @override String get cacheCoverImageDesc => - 'Downloaded album and track cover art. Will re-download when viewed.'; + 'Скачанный альбом и трек обложки. Будет заново скачан после просмотра.'; @override - String get cacheLibraryCover => 'Library cover cache'; + String get cacheLibraryCover => 'Кэш обложек библиотеки'; @override String get cacheLibraryCoverDesc => - 'Cover art extracted from local music files. Will re-extract on next scan.'; + 'Обложка извлечена из локальных музыкальных файлов. Будет повторно извлечено при следующем сканировании.'; @override - String get cacheExploreFeed => 'Explore feed cache'; + String get cacheExploreFeed => 'Просмотреть кэш ленты'; @override String get cacheExploreFeedDesc => - 'Explore tab content (new releases, trending). Will refresh on next visit.'; + 'Изучите содержимое вкладки (новые релизы, тренды). Они обновятся при следующем посещении.'; @override - String get cacheTrackLookup => 'Track lookup cache'; + String get cacheTrackLookup => 'Отслеживать кэш поиска'; @override String get cacheTrackLookupDesc => - 'Spotify/Deezer track ID lookups. Clearing may slow next few searches.'; + 'Поиск ID трека в Spotify/Deezer. Очистка может замедлить следующие несколько поисков.'; @override String get cacheCleanupUnusedDesc => @@ -2039,7 +2054,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String cacheEntries(int count) { - return '$count entries'; + return '$count записей'; } @override @@ -2052,7 +2067,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String cacheClearConfirmMessage(String target) { - return 'This will clear cached data for $target. Downloaded music files will not be deleted.'; + return 'Это очистит кэш для $target. Загруженные музыкальные файлы не будут удалены.'; } @override @@ -2074,7 +2089,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String cacheCleanupResult(int downloadCount, int libraryCount) { - return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries'; + return 'Очистка завершена: $downloadCount потерянных загрузок, $libraryCount отсутствующих записей в библиотеке'; } @override @@ -2094,14 +2109,14 @@ class AppLocalizationsRu extends AppLocalizations { 'Получить и сохранить текст песни в формате .lrc'; @override - String get trackSaveLyricsProgress => 'Saving lyrics...'; + String get trackSaveLyricsProgress => 'Сохранение текста...'; @override - String get trackReEnrich => 'Re-enrich'; + String get trackReEnrich => 'Обновить'; @override String get trackReEnrichOnlineSubtitle => - 'Search metadata online and embed into file'; + 'Поиск в сети метаданных и встраивание в файл'; @override String get trackEditMetadata => 'Редактировать метаданные'; @@ -2120,13 +2135,13 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get trackReEnrichProgress => 'Re-enriching metadata...'; + String get trackReEnrichProgress => 'Обновление метаданных...'; @override String get trackReEnrichSearching => 'Поиск метаданных в сети...'; @override - String get trackReEnrichSuccess => 'Metadata re-enriched successfully'; + String get trackReEnrichSuccess => 'Метаданные успешно обновлены'; @override String get trackReEnrichFfmpegFailed => @@ -2138,22 +2153,22 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get trackConvertFormat => 'Convert Format'; + String get trackConvertFormat => 'Переконвертировать формат'; @override - String get trackConvertFormatSubtitle => 'Convert to MP3 or Opus'; + String get trackConvertFormatSubtitle => 'Конвертировать в MP3 или Opus'; @override - String get trackConvertTitle => 'Convert Audio'; + String get trackConvertTitle => 'Конвертировать аудио'; @override - String get trackConvertTargetFormat => 'Target Format'; + String get trackConvertTargetFormat => 'Целевой формат'; @override - String get trackConvertBitrate => 'Bitrate'; + String get trackConvertBitrate => 'Битрейт'; @override - String get trackConvertConfirmTitle => 'Confirm Conversion'; + String get trackConvertConfirmTitle => 'Подтвердить конвертацию'; @override String trackConvertConfirmMessage( @@ -2161,177 +2176,181 @@ class AppLocalizationsRu extends AppLocalizations { String targetFormat, String bitrate, ) { - return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.'; + return 'Конвертировать из $sourceFormat в $targetFormat $bitrate?\n\nОригинальный файл будет удален после конвертации.'; } @override - String get trackConvertConverting => 'Converting audio...'; + String get trackConvertConverting => 'Конвертация аудио...'; @override String trackConvertSuccess(String format) { - return 'Converted to $format successfully'; + return 'Успешно конвертировано в $format'; } @override - String get trackConvertFailed => 'Conversion failed'; + String get trackConvertFailed => 'Ошибка конвертации'; @override - String get actionCreate => 'Create'; + String get actionCreate => 'Создать'; @override - String get collectionFoldersTitle => 'My folders'; + String get collectionFoldersTitle => 'Мои папки'; @override - String get collectionWishlist => 'Wishlist'; + String get collectionWishlist => 'Список желаемого'; @override - String get collectionLoved => 'Loved'; + String get collectionLoved => 'Любимые'; @override - String get collectionPlaylists => 'Playlists'; + String get collectionPlaylists => 'Плейлисты'; @override - String get collectionPlaylist => 'Playlist'; + String get collectionPlaylist => 'Плейлист'; @override - String get collectionAddToPlaylist => 'Add to playlist'; + String get collectionAddToPlaylist => 'Добавить в плейлист'; @override - String get collectionCreatePlaylist => 'Create playlist'; + String get collectionCreatePlaylist => 'Создать плейлист'; @override - String get collectionNoPlaylistsYet => 'No playlists yet'; + String get collectionNoPlaylistsYet => 'Плейлисты отсутствуют'; @override String get collectionNoPlaylistsSubtitle => - 'Create a playlist to start categorizing tracks'; + 'Создайте плейлист, чтобы начать классифицировать треки'; @override String collectionPlaylistTracks(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: '$count tracks', - one: '1 track', + other: '$count треков', + many: '$count треков', + few: '$count трека', + one: '$count трек', ); return '$_temp0'; } @override String collectionAddedToPlaylist(String playlistName) { - return 'Added to \"$playlistName\"'; + return 'Добавлено в \"$playlistName\"'; } @override String collectionAlreadyInPlaylist(String playlistName) { - return 'Already in \"$playlistName\"'; + return 'Уже в \"$playlistName\"'; } @override - String get collectionPlaylistCreated => 'Playlist created'; + String get collectionPlaylistCreated => 'Плейлист создан'; @override - String get collectionPlaylistNameHint => 'Playlist name'; + String get collectionPlaylistNameHint => 'Название плейлиста'; @override - String get collectionPlaylistNameRequired => 'Playlist name is required'; + String get collectionPlaylistNameRequired => 'Имя плейлиста обязательно'; @override - String get collectionRenamePlaylist => 'Rename playlist'; + String get collectionRenamePlaylist => 'Переименовать плейлист'; @override - String get collectionDeletePlaylist => 'Delete playlist'; + String get collectionDeletePlaylist => 'Удалить плейлист'; @override String collectionDeletePlaylistMessage(String playlistName) { - return 'Delete \"$playlistName\" and all tracks inside it?'; + return 'Удалить \"$playlistName\" и все треки внутри него?'; } @override - String get collectionPlaylistDeleted => 'Playlist deleted'; + String get collectionPlaylistDeleted => 'Плейлист удалён'; @override - String get collectionPlaylistRenamed => 'Playlist renamed'; + String get collectionPlaylistRenamed => 'Плейлист переименован'; @override - String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + String get collectionWishlistEmptyTitle => 'Список желаний пуст'; @override String get collectionWishlistEmptySubtitle => - 'Tap + on tracks to save what you want to download later'; + 'Нажмите + на треках, чтобы сохранить то, что вы хотите скачать позже'; @override - String get collectionLovedEmptyTitle => 'Loved folder is empty'; + String get collectionLovedEmptyTitle => 'Папка Любимые пуста'; @override String get collectionLovedEmptySubtitle => - 'Tap love on tracks to keep your favorites'; + 'Нажмите \"любовь\" на треках, чтобы сохранить ваши избранные'; @override - String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + String get collectionPlaylistEmptyTitle => 'Плейлист пуст'; @override String get collectionPlaylistEmptySubtitle => - 'Long-press + on any track to add it here'; + 'Удерживайте + на любом треке, чтобы добавить его сюда'; @override - String get collectionRemoveFromPlaylist => 'Remove from playlist'; + String get collectionRemoveFromPlaylist => 'Удалить из плейлиста'; @override - String get collectionRemoveFromFolder => 'Remove from folder'; + String get collectionRemoveFromFolder => 'Убрать из папки'; @override String collectionRemoved(String trackName) { - return '\"$trackName\" removed'; + return '\"$trackName\" удалён'; } @override String collectionAddedToLoved(String trackName) { - return '\"$trackName\" added to Loved'; + return '\"$trackName\" добавлен в Любимые'; } @override String collectionRemovedFromLoved(String trackName) { - return '\"$trackName\" removed from Loved'; + return '\"$trackName\" удалено из Любимых'; } @override String collectionAddedToWishlist(String trackName) { - return '\"$trackName\" added to Wishlist'; + return '\"$trackName\" добавлен в список желаний'; } @override String collectionRemovedFromWishlist(String trackName) { - return '\"$trackName\" removed from Wishlist'; + return '\"$trackName\" удалён из списка желаний'; } @override - String get trackOptionAddToLoved => 'Add to Loved'; + String get trackOptionAddToLoved => 'Добавить в Любимое'; @override - String get trackOptionRemoveFromLoved => 'Remove from Loved'; + String get trackOptionRemoveFromLoved => 'Исключить из Любимых'; @override - String get trackOptionAddToWishlist => 'Add to Wishlist'; + String get trackOptionAddToWishlist => 'Добавить в список желаний'; @override - String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + String get trackOptionRemoveFromWishlist => 'Удалить из списка желаний'; @override - String get collectionPlaylistChangeCover => 'Change cover image'; + String get collectionPlaylistChangeCover => 'Изменить обложку'; @override - String get collectionPlaylistRemoveCover => 'Remove cover image'; + String get collectionPlaylistRemoveCover => 'Удалить обложку'; @override String selectionShareCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'треков', + many: 'треков', + few: 'трека', + one: 'трек', ); - return 'Share $count $_temp0'; + return 'Отправить $count $_temp0'; } @override @@ -2342,17 +2361,19 @@ class AppLocalizationsRu extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'tracks', - one: 'track', + other: 'треков', + many: 'треков', + few: 'трека', + one: 'трек', ); - return 'Convert $count $_temp0'; + return 'Конвертировать $count $_temp0'; } @override - String get selectionConvertNoConvertible => 'No convertible tracks selected'; + String get selectionConvertNoConvertible => 'Не выбраны конвертируемые треки'; @override - String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + String get selectionBatchConvertConfirmTitle => 'Пакетная конвертация'; @override String selectionBatchConvertConfirmMessage( @@ -2371,12 +2392,12 @@ class AppLocalizationsRu extends AppLocalizations { @override String selectionBatchConvertProgress(int current, int total) { - return 'Converting $current of $total...'; + return 'Конвертация $current из $total...'; } @override String selectionBatchConvertSuccess(int success, int total, String format) { - return 'Converted $success of $total tracks to $format'; + return 'Конвертировано $success треков $total в $format'; } @override @@ -2386,7 +2407,7 @@ class AppLocalizationsRu extends AppLocalizations { @override String get downloadUseAlbumArtistForFoldersAlbumSubtitle => - 'Artist folders use Album Artist when available'; + 'Для папок исполнителей используется исполнитель альбома, если он указан'; @override String get downloadUseAlbumArtistForFoldersTrackSubtitle => diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 53034492..b608cff7 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -693,6 +693,17 @@ class AppLocalizationsTr extends AppLocalizations { @override String get errorNoTracksFound => 'Parça bulunamadı'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return '$item yüklenemedi: Eksik eklenti kaynağı'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index a4fc7e77..4104845c 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -688,6 +688,17 @@ class AppLocalizationsZh extends AppLocalizations { @override String get errorNoTracksFound => 'No tracks found'; + @override + String get errorUrlNotRecognized => 'Link not recognized'; + + @override + String get errorUrlNotRecognizedMessage => + 'This link is not supported. Make sure the URL is correct and a compatible extension is installed.'; + + @override + String get errorUrlFetchFailed => + 'Failed to load content from this link. Please try again.'; + @override String errorMissingExtensionSource(String item) { return 'Cannot load $item: missing extension source'; @@ -2696,7 +2707,7 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; @override String get artistAlbums => 'Albums'; @@ -3091,6 +3102,13 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get filenameFormat => 'Filename Format'; + @override + String get filenameShowAdvancedTags => 'Show advanced tags'; + + @override + String get filenameShowAdvancedTagsDescription => + 'Enable formatted tags for track padding and date patterns'; + @override String get folderOrganizationNone => 'No organization'; @@ -3668,6 +3686,12 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get youtubeQualityNote => 'YouTube provides lossy audio only. Not part of lossless fallback.'; + @override + String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; + + @override + String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; + @override String get downloadAskBeforeDownload => 'Ask Before Download'; @@ -3999,6 +4023,17 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { String get libraryAboutDescription => 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + @override + String libraryTracksUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return '$_temp0'; + } + @override String libraryLastScanned(String time) { return 'Last scanned: $time'; @@ -4124,7 +4159,8 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { 'Download music from Spotify, Deezer, or paste any supported URL'; @override - String get tutorialWelcomeTip2 => '从 Tidal、Qobuz 或 Deezer 获取 FLAC 品质音频'; + String get tutorialWelcomeTip2 => + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => @@ -4441,6 +4477,210 @@ class AppLocalizationsZhCn extends AppLocalizationsZh { @override String get trackConvertFailed => 'Conversion failed'; + @override + String get actionCreate => 'Create'; + + @override + String get collectionFoldersTitle => 'My folders'; + + @override + String get collectionWishlist => 'Wishlist'; + + @override + String get collectionLoved => 'Loved'; + + @override + String get collectionPlaylists => 'Playlists'; + + @override + String get collectionPlaylist => 'Playlist'; + + @override + String get collectionAddToPlaylist => 'Add to playlist'; + + @override + String get collectionCreatePlaylist => 'Create playlist'; + + @override + String get collectionNoPlaylistsYet => 'No playlists yet'; + + @override + String get collectionNoPlaylistsSubtitle => + 'Create a playlist to start categorizing tracks'; + + @override + String collectionPlaylistTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks', + one: '1 track', + ); + return '$_temp0'; + } + + @override + String collectionAddedToPlaylist(String playlistName) { + return 'Added to \"$playlistName\"'; + } + + @override + String collectionAlreadyInPlaylist(String playlistName) { + return 'Already in \"$playlistName\"'; + } + + @override + String get collectionPlaylistCreated => 'Playlist created'; + + @override + String get collectionPlaylistNameHint => 'Playlist name'; + + @override + String get collectionPlaylistNameRequired => 'Playlist name is required'; + + @override + String get collectionRenamePlaylist => 'Rename playlist'; + + @override + String get collectionDeletePlaylist => 'Delete playlist'; + + @override + String collectionDeletePlaylistMessage(String playlistName) { + return 'Delete \"$playlistName\" and all tracks inside it?'; + } + + @override + String get collectionPlaylistDeleted => 'Playlist deleted'; + + @override + String get collectionPlaylistRenamed => 'Playlist renamed'; + + @override + String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + + @override + String get collectionWishlistEmptySubtitle => + 'Tap + on tracks to save what you want to download later'; + + @override + String get collectionLovedEmptyTitle => 'Loved folder is empty'; + + @override + String get collectionLovedEmptySubtitle => + 'Tap love on tracks to keep your favorites'; + + @override + String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + + @override + String get collectionPlaylistEmptySubtitle => + 'Long-press + on any track to add it here'; + + @override + String get collectionRemoveFromPlaylist => 'Remove from playlist'; + + @override + String get collectionRemoveFromFolder => 'Remove from folder'; + + @override + String collectionRemoved(String trackName) { + return '\"$trackName\" removed'; + } + + @override + String collectionAddedToLoved(String trackName) { + return '\"$trackName\" added to Loved'; + } + + @override + String collectionRemovedFromLoved(String trackName) { + return '\"$trackName\" removed from Loved'; + } + + @override + String collectionAddedToWishlist(String trackName) { + return '\"$trackName\" added to Wishlist'; + } + + @override + String collectionRemovedFromWishlist(String trackName) { + return '\"$trackName\" removed from Wishlist'; + } + + @override + String get trackOptionAddToLoved => 'Add to Loved'; + + @override + String get trackOptionRemoveFromLoved => 'Remove from Loved'; + + @override + String get trackOptionAddToWishlist => 'Add to Wishlist'; + + @override + String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + + @override + String get collectionPlaylistChangeCover => 'Change cover image'; + + @override + String get collectionPlaylistRemoveCover => 'Remove cover image'; + + @override + String selectionShareCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Share $count $_temp0'; + } + + @override + String get selectionShareNoFiles => 'No shareable files found'; + + @override + String selectionConvertCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0'; + } + + @override + String get selectionConvertNoConvertible => 'No convertible tracks selected'; + + @override + String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + + @override + String selectionBatchConvertConfirmMessage( + int count, + String format, + String bitrate, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; + } + + @override + String selectionBatchConvertProgress(int current, int total) { + return 'Converting $current of $total...'; + } + + @override + String selectionBatchConvertSuccess(int success, int total, String format) { + return 'Converted $success of $total tracks to $format'; + } + @override String downloadedAlbumDownloadedCount(int count) { return '$count downloaded'; @@ -4807,7 +5047,7 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get aboutAppDescription => - 'Download Spotify tracks in lossless quality from Tidal and Qobuz.'; + 'Download Spotify tracks in lossless quality from Tidal, Qobuz, and Amazon Music.'; @override String get artistAlbums => 'Albums'; @@ -5202,6 +5442,13 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get filenameFormat => 'Filename Format'; + @override + String get filenameShowAdvancedTags => 'Show advanced tags'; + + @override + String get filenameShowAdvancedTagsDescription => + 'Enable formatted tags for track padding and date patterns'; + @override String get folderOrganizationNone => 'No organization'; @@ -5779,6 +6026,12 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get youtubeQualityNote => 'YouTube provides lossy audio only. Not part of lossless fallback.'; + @override + String get youtubeOpusBitrateTitle => 'YouTube Opus Bitrate'; + + @override + String get youtubeMp3BitrateTitle => 'YouTube MP3 Bitrate'; + @override String get downloadAskBeforeDownload => 'Ask Before Download'; @@ -6110,6 +6363,17 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { String get libraryAboutDescription => 'Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.'; + @override + String libraryTracksUnit(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return '$_temp0'; + } + @override String libraryLastScanned(String time) { return 'Last scanned: $time'; @@ -6235,7 +6499,8 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { 'Download music from Spotify, Deezer, or paste any supported URL'; @override - String get tutorialWelcomeTip2 => '從 Tidal、Qobuz 或 Deezer 取得 FLAC 品質音訊'; + String get tutorialWelcomeTip2 => + 'Get FLAC quality audio from Tidal, Qobuz, or Amazon Music'; @override String get tutorialWelcomeTip3 => @@ -6552,6 +6817,210 @@ class AppLocalizationsZhTw extends AppLocalizationsZh { @override String get trackConvertFailed => 'Conversion failed'; + @override + String get actionCreate => 'Create'; + + @override + String get collectionFoldersTitle => 'My folders'; + + @override + String get collectionWishlist => 'Wishlist'; + + @override + String get collectionLoved => 'Loved'; + + @override + String get collectionPlaylists => 'Playlists'; + + @override + String get collectionPlaylist => 'Playlist'; + + @override + String get collectionAddToPlaylist => 'Add to playlist'; + + @override + String get collectionCreatePlaylist => 'Create playlist'; + + @override + String get collectionNoPlaylistsYet => 'No playlists yet'; + + @override + String get collectionNoPlaylistsSubtitle => + 'Create a playlist to start categorizing tracks'; + + @override + String collectionPlaylistTracks(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count tracks', + one: '1 track', + ); + return '$_temp0'; + } + + @override + String collectionAddedToPlaylist(String playlistName) { + return 'Added to \"$playlistName\"'; + } + + @override + String collectionAlreadyInPlaylist(String playlistName) { + return 'Already in \"$playlistName\"'; + } + + @override + String get collectionPlaylistCreated => 'Playlist created'; + + @override + String get collectionPlaylistNameHint => 'Playlist name'; + + @override + String get collectionPlaylistNameRequired => 'Playlist name is required'; + + @override + String get collectionRenamePlaylist => 'Rename playlist'; + + @override + String get collectionDeletePlaylist => 'Delete playlist'; + + @override + String collectionDeletePlaylistMessage(String playlistName) { + return 'Delete \"$playlistName\" and all tracks inside it?'; + } + + @override + String get collectionPlaylistDeleted => 'Playlist deleted'; + + @override + String get collectionPlaylistRenamed => 'Playlist renamed'; + + @override + String get collectionWishlistEmptyTitle => 'Wishlist is empty'; + + @override + String get collectionWishlistEmptySubtitle => + 'Tap + on tracks to save what you want to download later'; + + @override + String get collectionLovedEmptyTitle => 'Loved folder is empty'; + + @override + String get collectionLovedEmptySubtitle => + 'Tap love on tracks to keep your favorites'; + + @override + String get collectionPlaylistEmptyTitle => 'Playlist is empty'; + + @override + String get collectionPlaylistEmptySubtitle => + 'Long-press + on any track to add it here'; + + @override + String get collectionRemoveFromPlaylist => 'Remove from playlist'; + + @override + String get collectionRemoveFromFolder => 'Remove from folder'; + + @override + String collectionRemoved(String trackName) { + return '\"$trackName\" removed'; + } + + @override + String collectionAddedToLoved(String trackName) { + return '\"$trackName\" added to Loved'; + } + + @override + String collectionRemovedFromLoved(String trackName) { + return '\"$trackName\" removed from Loved'; + } + + @override + String collectionAddedToWishlist(String trackName) { + return '\"$trackName\" added to Wishlist'; + } + + @override + String collectionRemovedFromWishlist(String trackName) { + return '\"$trackName\" removed from Wishlist'; + } + + @override + String get trackOptionAddToLoved => 'Add to Loved'; + + @override + String get trackOptionRemoveFromLoved => 'Remove from Loved'; + + @override + String get trackOptionAddToWishlist => 'Add to Wishlist'; + + @override + String get trackOptionRemoveFromWishlist => 'Remove from Wishlist'; + + @override + String get collectionPlaylistChangeCover => 'Change cover image'; + + @override + String get collectionPlaylistRemoveCover => 'Remove cover image'; + + @override + String selectionShareCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Share $count $_temp0'; + } + + @override + String get selectionShareNoFiles => 'No shareable files found'; + + @override + String selectionConvertCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0'; + } + + @override + String get selectionConvertNoConvertible => 'No convertible tracks selected'; + + @override + String get selectionBatchConvertConfirmTitle => 'Batch Convert'; + + @override + String selectionBatchConvertConfirmMessage( + int count, + String format, + String bitrate, + ) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'tracks', + one: 'track', + ); + return 'Convert $count $_temp0 to $format at $bitrate?\n\nOriginal files will be deleted after conversion.'; + } + + @override + String selectionBatchConvertProgress(int current, int total) { + return 'Converting $current of $total...'; + } + + @override + String selectionBatchConvertSuccess(int success, int total, String format) { + return 'Converted $success of $total tracks to $format'; + } + @override String downloadedAlbumDownloadedCount(int count) { return '$count downloaded'; diff --git a/lib/l10n/arb/app_de.arb b/lib/l10n/arb/app_de.arb index 139b620e..e32aa56e 100644 --- a/lib/l10n/arb/app_de.arb +++ b/lib/l10n/arb/app_de.arb @@ -728,7 +728,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Lösche {count} {count, plural, one {}=1{Track} other{Tracks}} aus dem Verlauf?\n\nDies löscht auch die Dateien aus dem Speicher.", + "dialogDeleteSelectedMessage": "Lösche {count} {count, plural, one {Track} other{Tracks}} aus dem Verlauf?\n\nDies löscht auch die Dateien aus dem Speicher.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -807,7 +807,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "{count} {count, plural, one {}=1{Titel} other{Titel}}", + "snackbarDeletedTracks": "{count} {count, plural, one {Titel} other{Titel}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1889,7 +1889,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "{count} {count, plural, one {}=1{Titel} other{Titel}} aus diesem Album löschen?\n\nDadurch werden auch die Dateien aus dem Speicher gelöscht.", + "downloadedAlbumDeleteMessage": "{count} {count, plural, one {Titel} other{Titel}} aus diesem Album löschen?\n\nDadurch werden auch die Dateien aus dem Speicher gelöscht.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -1915,7 +1915,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Lösche {count} {count, plural, one {}=1{Titel}other{Titel}}", + "downloadedAlbumDeleteCount": "Lösche {count} {count, plural, one {Titel} other{Titel}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2353,7 +2353,7 @@ "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, one {}=1{vor 1 Minute} other{vor {count} Minuten}}", + "timeMinutesAgo": "{count, plural, one {vor {count} Minute} other{vor {count} Minuten}}", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2362,7 +2362,7 @@ } } }, - "timeHoursAgo": "{count, plural, one {}=1{vor 1 Stunde} other{vor {count} Stunden}}", + "timeHoursAgo": "{count, plural, one {vor {count} Stunde} other{vor {count} Stunden}}", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -3013,7 +3013,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Teile {count} {count, plural, one {}=1{Titel}other{Titel}}", + "selectionShareCount": "Teile {count} {count, plural, one {Titel} other{Titel}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3026,7 +3026,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Konvertiere {count} {count, plural, one {}=1{Titel}other{Titel}}", + "selectionConvertCount": "Konvertiere {count} {count, plural, one {Titel} other{Titel}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { @@ -3043,7 +3043,7 @@ "@selectionBatchConvertConfirmTitle": { "description": "Confirmation dialog title for batch conversion" }, - "selectionBatchConvertConfirmMessage": "Konvertiere {count} {format} {count, plural, one {}=1{Titel} other{Titel}} zu {bitrate}?\n\nOriginaldateien werden nach der Konvertierung gelöscht.", + "selectionBatchConvertConfirmMessage": "Konvertiere {count} {format} {count, plural, one {Titel} other{Titel}} zu {bitrate}?\n\nOriginaldateien werden nach der Konvertierung gelöscht.", "@selectionBatchConvertConfirmMessage": { "description": "Confirmation dialog message for batch conversion", "placeholders": { diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 7eee4649..bb8bac99 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -897,6 +897,18 @@ "@errorNoTracksFound": { "description": "Error - search returned no results" }, + "errorUrlNotRecognized": "Link not recognized", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "This link is not supported. Make sure the URL is correct and a compatible extension is installed.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Failed to load content from this link. Please try again.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, "errorMissingExtensionSource": "Cannot load {item}: missing extension source", "@errorMissingExtensionSource": { "description": "Error - extension source not available", diff --git a/lib/l10n/arb/app_es-ES.arb b/lib/l10n/arb/app_es-ES.arb deleted file mode 100644 index c48b16f4..00000000 --- a/lib/l10n/arb/app_es-ES.arb +++ /dev/null @@ -1,3105 +0,0 @@ -{ - "@@locale": "es-ES", - "@@last_modified": "2026-01-16", - "appName": "SpotiFLAC", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Inicio", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Biblioteca", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "Ajustes", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Tienda", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Inicio", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Pegar enlace de Spotify o buscar por nombre", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeSupports": "Soportes: Pista, Álbum, Lista de reproducción, URLs de Artistas", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "Recientes", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "Todo", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Álbumes", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Pistas", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Buscar en historial...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Ajustes", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Descargar", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Apariencia", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsOptions": "Opciones", - "@settingsOptions": { - "description": "Settings section - app options" - }, - "settingsExtensions": "Extensiones", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "Acerca de", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Descargar", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Mostrar selector de calidad para cada descarga", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Formato del nombre del archivo", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadFolderOrganization": "Organización de carpetas", - "@downloadFolderOrganization": { - "description": "Setting for folder structure" - }, - "appearanceTitle": "Apariencia", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "Sistema", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Claro", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Oscuro", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Color dinámico", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Usar colores de tu fondo de pantalla", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "Vista de Historial", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "Lista", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Cuadrícula", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsTitle": "Opciones", - "@optionsTitle": { - "description": "Options settings page title" - }, - "optionsPrimaryProvider": "Proveedor Principal", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Servicio usado al buscar por nombre de la pista.", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Usando la extensión: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsSwitchBack": "Toque Deezer o Spotify para volver desde la extensión", - "@optionsSwitchBack": { - "description": "Hint to switch back to built-in providers" - }, - "optionsAutoFallback": "Alternativa automática", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Pruebe otros servicios si falla la descarga", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsUseExtensionProviders": "Usar proveedores de extensiones", - "@optionsUseExtensionProviders": { - "description": "Enable extension download providers" - }, - "optionsUseExtensionProvidersOn": "Las extensiones serán probadas primero", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Utilizando sólo proveedores integrados", - "@optionsUseExtensionProvidersOff": { - "description": "Status when extension providers disabled" - }, - "optionsEmbedLyrics": "Incrustar Letras", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Insertar letras sincronizadas en archivos FLAC", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Carátula de calidad máxima", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Descargar carátula de resolución máxima", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsConcurrentDownloads": "Descargas Simultáneas", - "@optionsConcurrentDownloads": { - "description": "Number of parallel downloads" - }, - "optionsConcurrentSequential": "Secuencial (1 a la vez)", - "@optionsConcurrentSequential": { - "description": "Download one at a time" - }, - "optionsConcurrentParallel": "{count} descargas paralelas", - "@optionsConcurrentParallel": { - "description": "Multiple parallel downloads", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsConcurrentWarning": "Las descargas paralelas pueden activar la limitación de velocidad", - "@optionsConcurrentWarning": { - "description": "Warning about rate limits" - }, - "optionsExtensionStore": "Tienda de extensiones", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Mostrar pestaña de tienda en la navegación", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Comprobar actualizaciones", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notificar cuando una nueva versión esté disponible", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Tipo de actualizaciones", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Sólo versiones estables", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Versión preliminar", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "La Versión preliminar puede contener errores o características incompletas", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Borrar el historial de descargas", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Eliminar todas las pistas descargadas del historial", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Registro detallado", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Registros detallados están siendo registrados", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Habilitar para informes de errores", - "@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 - toque para configurar", - "@optionsSpotifyCredentialsRequired": { - "description": "Prompt to set up credentials" - }, - "optionsSpotifyWarning": "Spotify requiere tus propias credenciales API. Obténgalas gratis de 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": "Extensiones", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Deshabilitado", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Versión {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsAuthor": "por {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, - "extensionsUninstall": "Desinstalar", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Tienda de extensiones", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Buscar extensiones...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Instalar", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Instalada", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Actualizar", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "Acerca de", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Colaboradores", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Desarrollador de versiones móviles", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Creador original de SpotiFLAC", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "¡El talentoso artista que creó nuestro hermoso logo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Traductores", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Agradecimientos especiales", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Enlaces", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Código fuente móvil", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "Código fuente de PC", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutReportIssue": "Reportar un problema", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Reporta cualquier problema que encuentres", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Sugerir una función", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Sugerir nuevas funciones para la aplicación", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Canal de Telegram", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Anuncios y actualizaciones", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Comunidad de Telegram", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Chatear con otros usuarios", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Redes sociales", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "Aplicación", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Versión", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "El creador de la API QQDL & Hi-Fi. ¡Sin esta API, las descargas de Tidal no existiría!", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "El creador original del proyecto Hi-Fi. ¡La base de la integración de Tidal!", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creador de I No tengo Spotify (IDHS). ¡La solución de enlace de reserva que salva el día!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutDabMusic": "Música DAB", - "@aboutDabMusic": { - "description": "Name of Qobuz API service - DO NOT TRANSLATE" - }, - "aboutDabMusicDesc": "La mejor API de streaming de Qobuz. ¡Las descargas de Hi-Res no serían posibles sin esto!", - "@aboutDabMusicDesc": { - "description": "Credit for DAB Music API" - }, - "aboutSpotiSaver": "SpotiSaver", - "@aboutSpotiSaver": { - "description": "Name of SpotiSaver API service - DO NOT TRANSLATE" - }, - "aboutSpotiSaverDesc": "Tidal de transmisión Hi-Res FLAC. ¡Una pieza clave del rompecabezas sin pérdida!", - "@aboutSpotiSaverDesc": { - "description": "Credit for SpotiSaver API" - }, - "aboutAppDescription": "Descarga pistas de Spotify con calidad sin pérdida de Tidal, Qobuz y Amazon Music.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Álbumes", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Pistas y EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilaciones", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Populares", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} oyentes mensuales", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Servicio", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Reproducir", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Compartir", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Eliminar", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Conceder permiso", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Omitir por ahora", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Acceso al almacenamiento requerido", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11+ requiere permiso \"Todos los archivos de acceso\" para guardar los archivos en la carpeta de descargas elegida.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Abrir ajustes", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permiso denegado. Por favor, conceda todos los permisos para continuar.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "Permiso de {permissionType} requerido", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "Se requiere un permiso {permissionType} para la mejor experiencia. Puedes cambiar esto más tarde en ajustes.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "¿Usar carpeta por defecto?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "No se ha seleccionado ninguna carpeta. ¿Desea utilizar la carpeta por defecto?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Usar por defecto", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Ubicación de descarga", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "En iOS, las descargas se guardan en la carpeta de documentos de la aplicación. Puede acceder a ellas desde la aplicación Archivos.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "Carpeta de documentos de App", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recomendado - accesible desde la aplicación Archivos", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Elegir de archivos", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Seleccione iCloud u otra ubicación", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "Limitación de iOS: No se pueden seleccionar carpetas vacías. Elige una carpeta con al menos un archivo.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive no es compatible. Utilice la carpeta Documentos de la aplicación.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Descargar pistas de Spotify en FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "¡Permiso de almacenamiento concedido!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Permiso de almacenamiento requerido", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC necesita permiso de almacenamiento para guardar sus archivos de música descargados.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "¡Acceso a las notificaciones permitido!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Activar notificaciones", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Cambiar carpeta de descargas", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Seleccione una carpeta donde se guardará la música descargada.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Seleccionar Carpeta", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Activar notificaciones", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Recibe notificaciones sobre el progreso de la descarga y la finalización. Esto te ayuda a rastrear las descargas cuando la aplicación está en segundo plano.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Omitir por ahora", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Siguiente", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Empezar", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Por favor, activa \"Permitir el acceso para gestionar todos los archivos\" en la siguiente pantalla.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "dialogCancel": "Cancelar", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Guardar", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Eliminar", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Volver a intentar", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Borrar", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Hecho", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Importar", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDiscard": "Descartar", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Eliminar", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Desinstalar", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "¿Descartar cambios?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "Tienes cambios sin guardar. ¿Quieres descartarlos?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Eliminar todo", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Eliminar extensión", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "¿Estás seguro de que quieres eliminar esta extensión? Esto no se puede deshacer.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "¿Desinstalar extensión?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "¿Estás seguro de que quieres eliminar {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Borrar historial", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "¿Estás seguro de que quieres borrar todo el historial de descargas? Esta acción no se puede deshacer.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Borrar Seleccionados", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "¿Eliminar {count} {count, plural, one {}=1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Importar lista de reproducción", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "Se han encontrado pistas {count} en CSV. ¿Añadirlas para descargar la cola?", - "csvImportTracks": "{count} pistas de CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "Añadido \"{trackName}\" a la cola", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "Añadidas pistas {count} a la cola", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" ya descargado", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" ya existe en tu biblioteca", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "Historial borrado", - "@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, one {}=1{pista} other{pistas}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "No se puede abrir el archivo: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarFillAllFields": "Por favor, completa todos los campos", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, - "snackbarViewQueue": "Ver cola", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "URL {platform} copiada al portapapeles", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "Archivo no encontrado", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Por favor, seleccione un archivo .spotiflac-ext", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Prioridad de proveedor guardada", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Prioridad de proveedor de metadatos guardada", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} instalado.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} actualizada.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Fallo al instalar la extensión", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Error al actualizar la extensión", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Límite Excedido", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Demasiadas solicitudes. Por favor, espere un momento antes de buscar de nuevo.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "No se encontraron pistas", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "errorMissingExtensionSource": "No se puede cargar {item}: falta una fuente de extensión", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pausar", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Reanudar", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancelar", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Seleccionar Todo", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Deseleccionar", - "@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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "Todas las pistas seleccionadas", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Seleccionar pistas a eliminar", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Obteniendo metadatos... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Leyendo CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Canciones", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artistas", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Álbumes", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Listas de reproducción", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "tooltipPlay": "Reproducir", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Formato del nombre del archivo", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "Ninguna organización", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByArtist": "Por Artista", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "Por Álbum", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artista/Álbum", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organizar los archivos descargados en carpetas", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "Todos los archivos de la carpeta de descargas", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Carpeta separada para cada artista", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Carpeta separada para cada artista", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Carpetas organizadas por artista y álbum", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Actualización Disponible", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Más tarde", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Iniciando descarga...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Descarga fallida", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Error al descargar la actualización", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "Una nueva versión está lista", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Actual", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "Nuevo", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Descargando...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "Novedades", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Descargar & Instalar", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "No recordar", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Prioridad del proveedor", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Arrastra para reordenar los proveedores de descarga. La aplicación intentará usar los proveedores de arriba hacia abajo al descargar las pistas.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "Si una pista no está disponible en el primer proveedor, la aplicación intentará automáticamente el siguiente.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerBuiltIn": "Integrado", - "@providerBuiltIn": { - "description": "Label for built-in providers (Tidal/Qobuz/Amazon)" - }, - "providerExtension": "Extensión", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Prioridad de los metadatos", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Arrastra para reordenar los proveedores de metadatos. La aplicación probará los proveedores de arriba hacia abajo al buscar pistas y obtener los metadatos.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer no tiene límites de tasa y se recomienda como principal. Spotify puede valorar el límite después de muchas solicitudes.", - "@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" - }, - "logCopied": "Registros copiados al portapapeles", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Buscar registros...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Nivel", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filtrar", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Compartir registros", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Borrar registros", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Limpiar registros", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "¿Estás seguro que deseas limpiar todos los registros?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filtrar los registros por gravedad", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No hay registros aún", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Los registros aparecerán aquí mientras usas la aplicación", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entradas ({count} filtradas)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entradas ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "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": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Pegar Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, - "channelStable": "Estable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Vista previa", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Buscar Fuente", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Descargar", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Alto rendimiento", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "Aplicación", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Datos", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Depuración", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Servicio", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Calidad de Sonido", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "Ajustes del archivo", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Letras", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Modo Letras", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Elige cómo se guardan las letras de tus descargas", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Insertar en archivo", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Letras almacenadas en los metadatos FLAC", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "Archivo .lrc externo", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Archivo .lrc separado para reproductores como Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Ambos", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Insertar y guardar archivo .lrc", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Colores", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Tema", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Diseño", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Idioma", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "Idioma de la aplicación", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Tema, colores, pantalla", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Servicio, calidad, formato del nombre del archivo", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsOptionsSubtitle": "Alternativa, letras, carátula, actualizaciones", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, - "settingsExtensionsSubtitle": "Administrar proveedores de descarga", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "Ver registros de aplicaciones para depuración", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Cargando enlace compartido...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Presione de nuevo para salir", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Descargar Todo ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, one {}=1{1 pista} other{{count} pistas}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copiar ruta de archivo", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Eliminar del dispositivo", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Cargar letras", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadatos", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "Información de archivo", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Letras", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "Archivo no encontrado", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Abrir en Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Abrir en Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Nombre de pista", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artista", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Artista del álbum", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Álbum", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Número de pista", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Número de disco", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duración", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Calidad del sonido", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Fecha de lanzamiento", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Género", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Etiqueta", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Derechos de autor", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Descargado", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copiar letras", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsNotAvailable": "Letras no disponibles para este tema", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsTimeout": "Tiempo de espera agotado. Inténtalo de nuevo más tarde.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Error al cargar la letra", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Incrustar Letras", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Letra incrustada con éxito", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Pista intrumental", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copiado al portapapeles", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "¿Eliminar del dispositivo?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "Esto eliminará permanentemente el archivo descargado y lo eliminará de tu historial.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Hoy", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Ayer", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "Hace {count} días", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} semanas antes", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} meses atrás", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "Todo", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadatos", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Descargar", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utilidad", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Letras", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integración", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Limpiar filtros", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "extensionDefaultProvider": "Por defecto (Deezer/Spotify)", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Usar búsqueda integrada", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Autor/a", - "@extensionAuthor": { - "description": "Extension detail - author" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Recursos", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Proveedor de metadatos", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Proveedor de descargas", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Proveedor de letras", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "Gestor de URL", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Opciones de calidad", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Hooks post-procesamiento", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permisos", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Ajustes", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Eliminar extensión", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Actualizado", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Versión Mínima de la aplicación", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Coincidencia de pista personalizada", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Procesamiento", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) disponibles", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "Patrón(es) {count}", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Estrategia: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Prioridad del proveedor", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Extensiones instaladas", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No hay extensiones instaladas", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Instalar archivos .spotiflac-ext para añadir nuevos proveedores", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Instalar extensión", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Las extensiones pueden añadir nuevos metadatos y proveedores de descargas. Sólo instalar extensiones desde fuentes confiables.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extensión instalada correctamente", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsDownloadPriority": "Prioridad de descarga", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Establecer orden de servicio de descarga", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsNoDownloadProvider": "No hay extensiones con proveedor de descargas", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Prioridad de los metadatos", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Establecer orden de búsqueda y metadatos", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No hay extensiones con el proveedor de metadatos", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Proveedor de búsqueda", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No hay extensiones con búsqueda personalizada", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Elegir qué servicio usar para buscar pistas", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Búsqueda personalizada", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error al cargar la extensión", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24 bits/hasta 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24 bits / hasta 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "qualityNote": "La calidad real depende de la disponibilidad de la pista del servicio", - "@qualityNote": { - "description": "Note about quality availability" - }, - "youtubeQualityNote": "YouTube provides lossy audio only. Not part of lossless fallback.", - "@youtubeQualityNote": { - "description": "Note for YouTube service explaining lossy-only quality" - }, - "youtubeOpusBitrateTitle": "YouTube Opus Bitrate", - "@youtubeOpusBitrateTitle": { - "description": "Title for YouTube Opus bitrate setting" - }, - "youtubeMp3BitrateTitle": "YouTube MP3 Bitrate", - "@youtubeMp3BitrateTitle": { - "description": "Title for YouTube MP3 bitrate setting" - }, - "downloadAskBeforeDownload": "Preguntar antes de descargar", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Carpeta de descarga", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Carpeta separada para pistas", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Estructura de carpeta del álbum", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Seleccionar Calidad", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Descargar Desde", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Oscuro", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Fondo negro puro", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Eliminar todo", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "¿Estás seguro de que quieres borrar todas las descargas?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Autoexportar descargas fallidas", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Guardar descargas fallidas en el archivo TXT automáticamente", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Red de descarga", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Datos móviles", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "Iniciar solo por Wifi", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Elegir qué red usar para descargas. Cuando se establece en WiFi solamente, las descargas se detendrán en los datos móviles.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artista / Álbum", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Álbumes/Nombre del Artista/Nombre del Álbum/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artista / [Año] Álbum", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Álbumes/Nombre del Artista /[2005] Nombre del Álbum/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Sólo álbum", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Álbumes/Nombre del Álbum/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "Álbum [Año]", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Álbumes/[2005] Nombre del Álbum/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artista / Álbum + Pistas", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artista/Álbum/ y Artista/pistas/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "Borrar Seleccionados", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "¿Eliminar {count} {count, plural, one {}=1{pista} other{pistas}} del historial?\n\nEsto también eliminará los archivos del almacenamiento.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} seleccionado", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumAllSelected": "Todas las pistas seleccionadas", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, - "downloadedAlbumTapToSelect": "Toca las pistas para seleccionar", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "¡Eliminar {count} {count, plural, one {}=1{pista} other{pistas}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Seleccionar pistas a eliminar", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disco {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artista", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Álbum", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Canción", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Lista de reproducción", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Lista de reproducción: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Descargar Discografía", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Descargar Todo", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} pistas de {albumCount} lanzamientos", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Sólo álbumes", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} pistas de {albumCount} álbumes", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Solo sencillos & EPs ", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Amazon Music", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Store tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "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" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertFormatSubtitle": "Convert to MP3 or Opus", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "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" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "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", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} descargado", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when Album Artist is used for folder naming" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when Track Artist is used for folder naming" - } -} \ No newline at end of file diff --git a/lib/l10n/arb/app_id.arb b/lib/l10n/arb/app_id.arb index dcd14626..de9d90d0 100644 --- a/lib/l10n/arb/app_id.arb +++ b/lib/l10n/arb/app_id.arb @@ -897,6 +897,18 @@ "@errorNoTracksFound": { "description": "Error - search returned no results" }, + "errorUrlNotRecognized": "Link tidak dikenali", + "@errorUrlNotRecognized": { + "description": "Error title - URL not handled by any extension or service" + }, + "errorUrlNotRecognizedMessage": "Link ini tidak didukung. Pastikan URL benar dan ekstensi yang kompatibel sudah terpasang.", + "@errorUrlNotRecognizedMessage": { + "description": "Error message - URL not recognized explanation" + }, + "errorUrlFetchFailed": "Gagal memuat konten dari link ini. Silakan coba lagi.", + "@errorUrlFetchFailed": { + "description": "Error message - generic URL fetch failure" + }, "errorMissingExtensionSource": "Tidak dapat memuat {item}: sumber ekstensi tidak ada", "@errorMissingExtensionSource": { "description": "Error - extension source not available", diff --git a/lib/l10n/arb/app_pt-PT.arb b/lib/l10n/arb/app_pt-PT.arb deleted file mode 100644 index 7d06cfa8..00000000 --- a/lib/l10n/arb/app_pt-PT.arb +++ /dev/null @@ -1,3105 +0,0 @@ -{ - "@@locale": "pt-PT", - "@@last_modified": "2026-01-16", - "appName": "SpotiFLAC", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Início", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "Configurações", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Loja", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Início", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Cole um link do Spotify ou procure por nome", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeSupports": "Suporte: Faixas, Álbuns, Playlists, URLs de Artista", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "Recentes", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "Tudo", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Álbuns", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Singles", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Pesquisar histórico...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Configurações", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "Download", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Aparência", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsOptions": "Opções", - "@settingsOptions": { - "description": "Settings section - app options" - }, - "settingsExtensions": "Extensões", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "Sobre", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "Download", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Mostrar seletor de qualidade para cada download", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Formato do Nome do Arquivo", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadFolderOrganization": "Organização de Pastas", - "@downloadFolderOrganization": { - "description": "Setting for folder structure" - }, - "appearanceTitle": "Aparência", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "Sistema", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Claro", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Escuro", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Cores Dinâmicas", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Usar cores do seu papel de parede", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "Visualização do Histórico", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "Lista", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Grade", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsTitle": "Opções", - "@optionsTitle": { - "description": "Options settings page title" - }, - "optionsPrimaryProvider": "Provedor Primário", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Serviço usado ao pesquisar por nome da faixa.", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Usando a extensão: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsSwitchBack": "Toque no Deezer ou Spotify para alternar de volta da extensão", - "@optionsSwitchBack": { - "description": "Hint to switch back to built-in providers" - }, - "optionsAutoFallback": "Fallback Automático", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "Tentar outros serviços se o download falhar", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsUseExtensionProviders": "Usar Provedores de Extensão", - "@optionsUseExtensionProviders": { - "description": "Enable extension download providers" - }, - "optionsUseExtensionProvidersOn": "Extensões serão tentadas primeiro", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Usando apenas provedores integrados", - "@optionsUseExtensionProvidersOff": { - "description": "Status when extension providers disabled" - }, - "optionsEmbedLyrics": "Incorporar Letras", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Incorporar letras sincronizadas aos arquivos FLAC", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "Capa de Qualidade Máxima", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "Baixar capa do álbum com a mais alta resolução", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsConcurrentDownloads": "Downloads Simultâneos", - "@optionsConcurrentDownloads": { - "description": "Number of parallel downloads" - }, - "optionsConcurrentSequential": "Sequencial (1 por vez)", - "@optionsConcurrentSequential": { - "description": "Download one at a time" - }, - "optionsConcurrentParallel": "{count} downloads paralelos", - "@optionsConcurrentParallel": { - "description": "Multiple parallel downloads", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsConcurrentWarning": "Downloads simultâneos podem causar um limite da taxa (ratelimit)", - "@optionsConcurrentWarning": { - "description": "Warning about rate limits" - }, - "optionsExtensionStore": "Loja de Extensões", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Mostrar aba da Loja na navegação", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Procurar Atualizações", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Notificar quando uma nova versão estiver disponível", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Canal de Atualização", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Somente versões estáveis", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Obter versões de prévia", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "A prévia pode conter erros ou recursos incompletos", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "Limpar Histórico de Download", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "Remover todas as faixas baixadas do histórico", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Registro detalhado", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Registros detalhados estão sendo gravados", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Habilitar para relatórios de erros", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "optionsSpotifyCredentials": "Credenciais do Spotify", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {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": "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": "Extensões", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Desabilitado", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Versão {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsAuthor": "por {author}", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, - "extensionsUninstall": "Desinstalar", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Loja de Extensões", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Pesquisar extensões...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Instalar", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Instalado", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Atualizar", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "Sobre", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Colaboradores", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Desenvolvedor da versão móvel", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Criador do SpotiFLAC original", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "O artista talentoso que criou o nosso lindo logotipo do aplicativo!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Tradutores", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Agradecimentos Especiais", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Links", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Código-fonte do app móvel", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "Código-fonte do app desktop", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutReportIssue": "Reportar um problema", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Reporte qualquer problema que encontrar", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Solicitação de recurso", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Sugira novos recursos para o aplicativo", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Canal do Telegram", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Anúncios e atualizações", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Comunidade do Telegram", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Converse com outros usuários", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Social", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "Aplicativo", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Versão", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "O criador da API QQDL e HiFi. Sem esta API, os downloads Tidal não existiriam!", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "O criador original do projeto HiFi. A base da integração do Tidal!", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutDabMusic": "DAB Music", - "@aboutDabMusic": { - "description": "Name of Qobuz API service - DO NOT TRANSLATE" - }, - "aboutDabMusicDesc": "A melhor API de streaming do Qobuz. Downloads de alta resolução não seriam possíveis sem isso!", - "@aboutDabMusicDesc": { - "description": "Credit for DAB Music API" - }, - "aboutSpotiSaver": "SpotiSaver", - "@aboutSpotiSaver": { - "description": "Name of SpotiSaver API service - DO NOT TRANSLATE" - }, - "aboutSpotiSaverDesc": "Tidal Hi-Res FLAC streaming endpoints. A key piece of the lossless puzzle!", - "@aboutSpotiSaverDesc": { - "description": "Credit for SpotiSaver API" - }, - "aboutAppDescription": "Baixe faixas do Spotify em qualidade sem perdas do Tidal, Qobuz e Amazon Music.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Álbuns", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Singles e EPs", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Compilações", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Populares", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "{count} ouvintes mensais", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Serviço", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Reproduzir", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Compartilhar", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Apagar", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "Conceder Permissão", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Ignorar por enquanto", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Acesso ao Armazenamento Necessário", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "O Android 11+ requer a permissão \"Acesso a Todos os Arquivos\" para salvar arquivos na pasta de download escolhida.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Abrir Configurações", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "Permissão negada. Por favor, conceda todas as permissões para continuar.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "Permissão {permissionType} Necessária", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "A permissão {permissionType} é necessária para a melhor experiência. Você pode alterar isso mais tarde em Configurações.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Usar Pasta Padrão?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "Nenhuma pasta selecionada. Você gostaria de usar a pasta padrão de música?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Usar Padrão", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "Local do Download", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "No iOS, downloads são salvos na pasta Documentos do aplicativo. Você pode acessá-los através do app Arquivos.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "Pasta Documentos do App", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Recomendado - acessível através do aplicativo Arquivos", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Escolher dos Arquivos", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "Selecione o iCloud ou outro local", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "Limitação do iOS: Pastas vazias não podem ser selecionadas. Escolha uma pasta com pelo menos um arquivo.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Baixar faixas do Spotify em FLAC", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Permissão de Armazenamento Concedida!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Permissão de Armazenamento Necessária", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "O SpotiFLAC precisa de permissão de armazenamento para salvar os seus arquivos de música baixados.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Permissão de Notificações Concedida!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Habilitar Notificações", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "Escolher Pasta de Download", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "Selecione uma pasta onde as suas músicas baixadas serão salvas.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Seleccionar Pasta", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Habilitar Notificações", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "Seja notificado sobre o progresso e conclusão do download. Isso ajuda você a acompanhar os downloads quando o app estiver em segundo plano.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Ignorar por enquanto", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Próximo", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Começar", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Por favor, habilite \"Permitir acesso para gerenciar todos os arquivos\" na próxima tela.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "dialogCancel": "Cancelar", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Salvar", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Apagar", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Tentar novamente", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Limpar", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Concluído", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "Importar", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDiscard": "Descartar", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Remover", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Desinstalar", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Descartar Alterações?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "Você tem alterações não salvas. Deseja descartá-las?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Limpar Tudo", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Remover Extensão", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Tem certeza de que deseja remover esta extensão? Isso não pode ser desfeito.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Desinstalar Extensão?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "Tem certeza que deseja remover {extensionName}?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Limpar Histórico", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Tem certeza que deseja limpar todo o histórico de downloads? Isso não pode ser desfeito.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Apagar Selecionados", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "Apagar {count} {count, plural, one {}=1{faixa} other{faixas}} do histórico?\n\nIsso também apagará os arquivos do armazenamento.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Importar Playlist", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "{count} Faixas encontradas em CSV. Adicioná-las à lista de downloads?", - "csvImportTracks": "{count} faixas do CSV", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "\"{trackName}\" adicionada à fila", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "{count} faixas adicionadas à fila", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" já foi baixada", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "Histórico limpo", - "@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, one {}=1{faixa apagada} other{faixas apagadas}}", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Não foi possível abrir o arquivo: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "snackbarFillAllFields": "Por favor, preencha todos os campos", - "@snackbarFillAllFields": { - "description": "Snackbar - validation error" - }, - "snackbarViewQueue": "Ver Fila", - "@snackbarViewQueue": { - "description": "Snackbar action - view download queue" - }, - "snackbarUrlCopied": "URL do {platform} copiado para a área de transferência", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "Arquivo não encontrado", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Por favor, selecione um arquivo .spotiflac-ext", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Prioridade de provedor salva", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Prioridade do provedor de metadados salva", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} instalada.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} atualizada.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Falha ao instalar a extensão", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Falha ao atualizar a extensão", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Tráfico Limitado (Rate Limited)", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Muitas solicitações. Por favor, aguarde um momento antes de pesquisar novamente.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "Nenhuma faixa encontrada", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "errorMissingExtensionSource": "Não é possível carregar {item}: faltando a fonte da extensão", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Pausar", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Retomar", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Cancelar", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Selecionar Tudo", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Desselecionar", - "@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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "Todas as faixas selecionadas", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Selecione as faixas para apagar", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Buscando metadados... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "Lendo CSV...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Músicas", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Artistas", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Álbuns", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Playlists", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "tooltipPlay": "Reproduzir", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Formato do Nome do Arquivo", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "Nenhuma organização", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByArtist": "Por Artista", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "Por Album", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Artista/Álbum", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "Organizar arquivos baixados em pastas", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "Todos os arquivos na pasta de download", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Pasta separada para cada artista", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Pasta separada para cada álbum", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Pastas aninhadas para artista e álbum", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Atualização Disponível", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Depois", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "Iniciando download...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "Download falhou", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Falha ao baixar a atualização", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "Uma nova versão está pronta", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Atual", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "Novo", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "Baixando...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "Novidades", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "Baixar e Instalar", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Não lembrar", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "Prioridade de Provedor", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "Arraste para reordenar provedores de download. O aplicativo irá tentar provedores de cima para baixo ao baixar as faixas.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "Se uma faixa não estiver disponível no primeiro provedor, o aplicativo irá tentar automaticamente a próxima.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerBuiltIn": "Embutido", - "@providerBuiltIn": { - "description": "Label for built-in providers (Tidal/Qobuz/Amazon)" - }, - "providerExtension": "Extensão", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Prioridade de Metadados", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Arraste para reordenar provedores de metadados. O aplicativo tentará provedores de cima para baixo ao procurar por faixas e buscar metadados.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "O Deezer não tem limites de taxa e é recomendado como principal. O Spotify pode limitar a taxa após muitas solicitações.", - "@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" - }, - "logCopied": "Registros copiados para área de transferência", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Pesquisar registros...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Nível", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filtro", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Compartilhar registros", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Limpar registros", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Limpar Registros", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Tem certeza de que deseja limpar todos os registros?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filtrar registros por gravidade", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "Ainda não há registros", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Os registros aparecerão aqui enquanto você usa o aplicativo", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entradas ({count} filtradas)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entradas ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "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": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Colar Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@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" - }, - "channelPreview": "Prévia", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Origem da Pesquisa", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Desempenho", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "Aplicativo", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Dados", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Depuração", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Serviço", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Qualidade de Áudio", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "Configurações de Arquivo", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Letras", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Modo de Letras", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Escolha como as letras são salvas com os seus downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Incorporar no arquivo", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Letra armazenada nos metadados da FLAC", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "Arquivo .lrc externo", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Arquivo .lrc separado para reprodutores como o Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Ambos", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Incorporar e salvar arquivo .lrc", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Cor", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Tema", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Idioma", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "Idioma do aplicativo", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Tema, cores, exibição", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Serviço, qualidade, formato de nome de arquivo", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsOptionsSubtitle": "Fallback, letras, arte de capa, atualizações", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, - "settingsExtensionsSubtitle": "Gerenciar provedores de download", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "Ver logs do app para depuração", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Carregando link compartilhado...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Pressione voltar novamente para sair", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Baixar Todos ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, one {}=1{1 faixa} other{{count} faixas}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copiar caminho do arquivo", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remover do dispositivo", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Carregar Letras", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadados", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "Informações do Arquivo", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Letras", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "Arquivo não encontrado", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Abrir no Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Abrir no Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Nome da faixa", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artista", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Artista do álbum", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Álbum", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Número da faixa", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Número do disco", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duração", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Qualidade de Áudio", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Data de lançamento", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Género", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Gravadora", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Direitos Autorais", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Baixado", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copiar letra", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsNotAvailable": "Letra não disponível para esta faixa", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsTimeout": "A solicitação expirou. Tente novamente mais tarde.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Falha ao carregar a letra", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Incorporar Letras", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Letras incorporadas com sucesso", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Faixa de instrumentais", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copiado para a área de transferência", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remover do dispositivo?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "Isto irá excluir o arquivo baixado permanentemente e removê-lo do seu histórico.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Hoje", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Ontem", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} dias atrás", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} semanas atrás", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} meses atrás", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "Tudo", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadados", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utilidade", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Letras", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integração", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Limpar filtros", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "extensionDefaultProvider": "Padrão (Deezer/Spotify)", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Usar pesquisa integrada", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Autor", - "@extensionAuthor": { - "description": "Extension detail - author" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Erro", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Funcionalidades", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Provedor de Metadados", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Provedor de Download", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Provedor de Letras", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "Gerenciador de URL", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Opções de Qualidade", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Ganchos de Pós-Processamento", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissões", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Configurações", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remover Extensão", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Atualizado", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Versão Mínima do App", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Correspondência de Faixa Personalizada", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Pós-Processamento", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} gancho(s) disponíveis", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} padrão(ões)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Estratégia: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Prioridade de Provedor", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Extensões Instaladas", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "Nenhuma extensão instalada", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Instale arquivos .spotiflac-ext para adicionar novos provedores", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Instalar Extensão", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensões podem adicionar novos metadados e baixar provedores. Somente instale extensões a partir de fontes confiáveis.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extensão instalada com sucesso", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsDownloadPriority": "Prioridade de Download", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Definir ordem do serviço de download", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsNoDownloadProvider": "Nenhuma extensão com provedor de download", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Prioridade de Metadados", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Definir ordem de origem de pesquisa e metadados", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "Nenhuma extensão com provedor de metadados", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Provedor de Pesquisa", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "Nenhuma extensão com pesquisa personalizada", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Escolha qual serviço utilizar para pesquisar faixas", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Busca personalizada", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Erro ao carregar extensão", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / até 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / até 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "qualityNote": "A qualidade real depende da faixa que estiver disponível no serviço", - "@qualityNote": { - "description": "Note about quality availability" - }, - "youtubeQualityNote": "YouTube provides lossy audio only. Not part of lossless fallback.", - "@youtubeQualityNote": { - "description": "Note for YouTube service explaining lossy-only quality" - }, - "youtubeOpusBitrateTitle": "YouTube Opus Bitrate", - "@youtubeOpusBitrateTitle": { - "description": "Title for YouTube Opus bitrate setting" - }, - "youtubeMp3BitrateTitle": "YouTube MP3 Bitrate", - "@youtubeMp3BitrateTitle": { - "description": "Title for YouTube MP3 bitrate setting" - }, - "downloadAskBeforeDownload": "Perguntar qualidade antes de baixar", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Pasta de Download", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Pasta de Singles Separada", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Estrutura da Pasta de Álbum", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Selecionar Qualidade", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Baixar De", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "Escuro AMOLED", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Fundo preto puro", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Limpar Tudo", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Você tem certeza que deseja limpar todos os downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artista / Álbum", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Álbuns/Nome do Artista/Nome do Álbum/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artista / [Ano] Álbum", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Álbuns/Nome do Artista/[2005] Nome do Álbum/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Somente Álbum", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Nome do Álbum/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Ano] Álbum", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Álbuns/[2005] Nome do Álbum/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artista / Álbum + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artista/Álbum/ e Artista/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "Apagar Selecionados", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Excluir {count} {count, plural, one {}=1{faixa} other{faixas}} deste álbum?\n\nIsso também excluirá os arquivos do armazenamento.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selecionado(s)", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumAllSelected": "Todas as faixas selecionadas", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, - "downloadedAlbumTapToSelect": "Toque nas faixas para selecionar", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Apagar {count} {count, plural, one {}=1{faixa} other{faixas}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Selecione as faixas para apagar", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disco {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artista", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Álbum", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Música", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Baixar Discografia", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Baixar Tudo", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} faixas de {albumCount} lançamentos", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Somente Álbuns", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} faixas de {albumCount} álbuns", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Somente Singles e EPs", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} faixas de {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Selecione Álbuns...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Escolher álbuns ou singles específicos", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Buscando faixas...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Buscando {current} de {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selecionado(s)", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Baixar Selecionados", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "{count} faixas adicionadas à fila", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} adicionada(s), {skipped} já baixada(s)", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "Nenhum álbum disponível", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Falha ao obter alguns álbuns", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Amazon Music", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Store tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "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" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertFormatSubtitle": "Convert to MP3 or Opus", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "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" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "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", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} baixado(s)", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when Album Artist is used for folder naming" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when Track Artist is used for folder naming" - } -} \ No newline at end of file diff --git a/lib/l10n/arb/app_ru.arb b/lib/l10n/arb/app_ru.arb index 877c925e..10f1fce3 100644 --- a/lib/l10n/arb/app_ru.arb +++ b/lib/l10n/arb/app_ru.arb @@ -728,7 +728,7 @@ "@dialogDeleteSelectedTitle": { "description": "Dialog title - delete selected items" }, - "dialogDeleteSelectedMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} из истории?\n\nЭто также удалит файлы из хранилища.", + "dialogDeleteSelectedMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} из истории?\n\nЭто также удалит файлы из хранилища.", "@dialogDeleteSelectedMessage": { "description": "Dialog message - delete selected tracks", "placeholders": { @@ -807,7 +807,7 @@ "@snackbarCredentialsCleared": { "description": "Snackbar - Spotify credentials removed" }, - "snackbarDeletedTracks": "Удалено {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", + "snackbarDeletedTracks": "Удалено {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", "@snackbarDeletedTracks": { "description": "Snackbar - tracks deleted", "placeholders": { @@ -1350,7 +1350,7 @@ } } }, - "tracksCount": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} =1 {1 трек} other {{count} треков}}", + "tracksCount": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} other {{count} треков}}", "@tracksCount": { "description": "Track count display", "placeholders": { @@ -1889,7 +1889,7 @@ "@downloadedAlbumDeleteSelected": { "description": "Button - delete selected tracks" }, - "downloadedAlbumDeleteMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}} из этого альбома?\n\nЭто также удалит файлы из хранилища.", + "downloadedAlbumDeleteMessage": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}} из этого альбома?\n\nЭто также удалит файлы из хранилища.", "@downloadedAlbumDeleteMessage": { "description": "Delete confirmation with count", "placeholders": { @@ -1915,7 +1915,7 @@ "@downloadedAlbumTapToSelect": { "description": "Selection hint" }, - "downloadedAlbumDeleteCount": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", + "downloadedAlbumDeleteCount": "Удалить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", "@downloadedAlbumDeleteCount": { "description": "Delete button text with count", "placeholders": { @@ -2214,7 +2214,7 @@ "@libraryAboutDescription": { "description": "Description of local library feature" }, - "libraryTracksUnit": "{count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", + "libraryTracksUnit": "{count, plural, one {трек} few {трека} many {треков} other{треков}}", "@libraryTracksUnit": { "description": "Unit label for tracks count (without the number itself)", "placeholders": { @@ -2353,7 +2353,7 @@ "@timeJustNow": { "description": "Relative time - less than a minute ago" }, - "timeMinutesAgo": "{count, plural, one {{count} минуту} few {{count} минуты} many {{count} минут} =1 {1 минуту} other {{count} минут}} назад", + "timeMinutesAgo": "{count, plural, one {{count} минуту} few {{count} минуты} many {{count} минут} other {{count} минут}} назад", "@timeMinutesAgo": { "description": "Relative time - minutes ago", "placeholders": { @@ -2362,7 +2362,7 @@ } } }, - "timeHoursAgo": "{count, plural, one {{count} час} few {{count} часа} many {{count} часов} =1 {1 час} other {{count} часов}} назад", + "timeHoursAgo": "{count, plural, one {{count} час} few {{count} часа} many {{count} часов} other {{count} часов}} назад", "@timeHoursAgo": { "description": "Relative time - hours ago", "placeholders": { @@ -2848,7 +2848,7 @@ "@collectionNoPlaylistsSubtitle": { "description": "Empty state subtitle when user has no playlists" }, - "collectionPlaylistTracks": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} =1 {1 трек} other {{count} треков}}", + "collectionPlaylistTracks": "{count, plural, one {{count} трек} few {{count} трека} many {{count} треков} other {{count} треков}}", "@collectionPlaylistTracks": { "description": "Track count label for custom playlists", "placeholders": { @@ -3013,7 +3013,7 @@ "@collectionPlaylistRemoveCover": { "description": "Bottom sheet action to remove custom cover image from a playlist" }, - "selectionShareCount": "Отправить {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", + "selectionShareCount": "Отправить {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", "@selectionShareCount": { "description": "Share button text with count in selection mode", "placeholders": { @@ -3026,7 +3026,7 @@ "@selectionShareNoFiles": { "description": "Snackbar when no selected files exist on disk" }, - "selectionConvertCount": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} =1{трек} other{треков}}", + "selectionConvertCount": "Конвертировать {count} {count, plural, one {трек} few {трека} many {треков} other{треков}}", "@selectionConvertCount": { "description": "Convert button text with count in selection mode", "placeholders": { diff --git a/lib/l10n/arb/app_tr-TR.arb b/lib/l10n/arb/app_tr-TR.arb deleted file mode 100644 index 3e87884e..00000000 --- a/lib/l10n/arb/app_tr-TR.arb +++ /dev/null @@ -1,3105 +0,0 @@ -{ - "@@locale": "tr", - "@@last_modified": "2026-01-16", - "appName": "SpotiFLAC", - "@appName": { - "description": "App name - DO NOT TRANSLATE" - }, - "navHome": "Ara", - "@navHome": { - "description": "Bottom navigation - Home tab" - }, - "navLibrary": "Library", - "@navLibrary": { - "description": "Bottom navigation - Library tab" - }, - "navSettings": "Ayarlar", - "@navSettings": { - "description": "Bottom navigation - Settings tab" - }, - "navStore": "Dükkan", - "@navStore": { - "description": "Bottom navigation - Extension store tab" - }, - "homeTitle": "Ara", - "@homeTitle": { - "description": "Home screen title" - }, - "homeSubtitle": "Spotify linki yapıştır veya isimle arat", - "@homeSubtitle": { - "description": "Subtitle shown below search box" - }, - "homeSupports": "Desteklenen linkler: Şarkı, Albüm, Çalma Listesi, Sanatçı linkleri", - "@homeSupports": { - "description": "Info text about supported URL types" - }, - "homeRecent": "En son", - "@homeRecent": { - "description": "Section header for recent searches" - }, - "historyFilterAll": "Tümü", - "@historyFilterAll": { - "description": "Filter chip - show all items" - }, - "historyFilterAlbums": "Albümler", - "@historyFilterAlbums": { - "description": "Filter chip - show albums only" - }, - "historyFilterSingles": "Single'lar", - "@historyFilterSingles": { - "description": "Filter chip - show singles only" - }, - "historySearchHint": "Arama geçmişi...", - "@historySearchHint": { - "description": "Search bar placeholder in history" - }, - "settingsTitle": "Ayarlar", - "@settingsTitle": { - "description": "Settings screen title" - }, - "settingsDownload": "İndirme", - "@settingsDownload": { - "description": "Settings section - download options" - }, - "settingsAppearance": "Görünüm", - "@settingsAppearance": { - "description": "Settings section - visual customization" - }, - "settingsOptions": "Seçenekler", - "@settingsOptions": { - "description": "Settings section - app options" - }, - "settingsExtensions": "Eklentiler", - "@settingsExtensions": { - "description": "Settings section - extension management" - }, - "settingsAbout": "Hakkında", - "@settingsAbout": { - "description": "Settings section - app info" - }, - "downloadTitle": "İndirme", - "@downloadTitle": { - "description": "Download settings page title" - }, - "downloadAskQualitySubtitle": "Her indirmeden önce kalite seçim ekranını göster", - "@downloadAskQualitySubtitle": { - "description": "Subtitle for ask quality toggle" - }, - "downloadFilenameFormat": "Dosya adı formatı", - "@downloadFilenameFormat": { - "description": "Setting for output filename pattern" - }, - "downloadFolderOrganization": "Dosya Organizasyonu", - "@downloadFolderOrganization": { - "description": "Setting for folder structure" - }, - "appearanceTitle": "Görünüm", - "@appearanceTitle": { - "description": "Appearance settings page title" - }, - "appearanceThemeSystem": "Sistem", - "@appearanceThemeSystem": { - "description": "Follow system theme" - }, - "appearanceThemeLight": "Açık", - "@appearanceThemeLight": { - "description": "Light theme" - }, - "appearanceThemeDark": "Koyu", - "@appearanceThemeDark": { - "description": "Dark theme" - }, - "appearanceDynamicColor": "Dinamik Renk", - "@appearanceDynamicColor": { - "description": "Material You dynamic colors" - }, - "appearanceDynamicColorSubtitle": "Duvar kağıdının renklerini kullan", - "@appearanceDynamicColorSubtitle": { - "description": "Subtitle for dynamic color" - }, - "appearanceHistoryView": "Geçmiş Düzeni", - "@appearanceHistoryView": { - "description": "Layout style for history" - }, - "appearanceHistoryViewList": "Liste", - "@appearanceHistoryViewList": { - "description": "List layout option" - }, - "appearanceHistoryViewGrid": "Izgara", - "@appearanceHistoryViewGrid": { - "description": "Grid layout option" - }, - "optionsTitle": "Seçenekler", - "@optionsTitle": { - "description": "Options settings page title" - }, - "optionsPrimaryProvider": "Ana Kaynek", - "@optionsPrimaryProvider": { - "description": "Main search provider setting" - }, - "optionsPrimaryProviderSubtitle": "Şarkı ismi aratılırken kullanılan kaynak.", - "@optionsPrimaryProviderSubtitle": { - "description": "Subtitle for primary provider" - }, - "optionsUsingExtension": "Kullanılan eklenti: {extensionName}", - "@optionsUsingExtension": { - "description": "Shows active extension name", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "optionsSwitchBack": "Dahili kaynaklara dönmek için Deezer veya Spotify'a tıkla", - "@optionsSwitchBack": { - "description": "Hint to switch back to built-in providers" - }, - "optionsAutoFallback": "Diğerlerini dene", - "@optionsAutoFallback": { - "description": "Auto-retry with other services" - }, - "optionsAutoFallbackSubtitle": "İndirme başarısız olursa diğer hizmetleri dene", - "@optionsAutoFallbackSubtitle": { - "description": "Subtitle for auto fallback" - }, - "optionsUseExtensionProviders": "Eklenti sağlayıcılarını kullan", - "@optionsUseExtensionProviders": { - "description": "Enable extension download providers" - }, - "optionsUseExtensionProvidersOn": "Eklentiler ilk denenecek", - "@optionsUseExtensionProvidersOn": { - "description": "Status when extension providers enabled" - }, - "optionsUseExtensionProvidersOff": "Sadece dahili sağlayıcıları kullan", - "@optionsUseExtensionProvidersOff": { - "description": "Status when extension providers disabled" - }, - "optionsEmbedLyrics": "Şarkı Sözlerini Göm", - "@optionsEmbedLyrics": { - "description": "Embed lyrics in audio files" - }, - "optionsEmbedLyricsSubtitle": "Senkronize şarkı sözlerini FLAC dosyalarına göm", - "@optionsEmbedLyricsSubtitle": { - "description": "Subtitle for embed lyrics" - }, - "optionsMaxQualityCover": "En Yüksek Kapak Kalitesi", - "@optionsMaxQualityCover": { - "description": "Download highest quality album art" - }, - "optionsMaxQualityCoverSubtitle": "En yüksek kalitedeki albüm kapaklarını indir", - "@optionsMaxQualityCoverSubtitle": { - "description": "Subtitle for max quality cover" - }, - "optionsConcurrentDownloads": "Eş Zamanlı İndirmeler", - "@optionsConcurrentDownloads": { - "description": "Number of parallel downloads" - }, - "optionsConcurrentSequential": "Sıralı (Birer birer)", - "@optionsConcurrentSequential": { - "description": "Download one at a time" - }, - "optionsConcurrentParallel": "Aynı anda {count} indirme", - "@optionsConcurrentParallel": { - "description": "Multiple parallel downloads", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "optionsConcurrentWarning": "Aynı anda birden fazla indirme sınırlamaya takılabilir", - "@optionsConcurrentWarning": { - "description": "Warning about rate limits" - }, - "optionsExtensionStore": "Eklenti Dükkanı", - "@optionsExtensionStore": { - "description": "Show/hide store tab" - }, - "optionsExtensionStoreSubtitle": "Dükkan sekmesini altta göster", - "@optionsExtensionStoreSubtitle": { - "description": "Subtitle for extension store toggle" - }, - "optionsCheckUpdates": "Güncelleştirmeleri Denetle", - "@optionsCheckUpdates": { - "description": "Auto update check toggle" - }, - "optionsCheckUpdatesSubtitle": "Yeni sürüm çıktığında bildir", - "@optionsCheckUpdatesSubtitle": { - "description": "Subtitle for update check" - }, - "optionsUpdateChannel": "Güncelleme Kanalı", - "@optionsUpdateChannel": { - "description": "Stable vs preview releases" - }, - "optionsUpdateChannelStable": "Sadece stabil sürümler", - "@optionsUpdateChannelStable": { - "description": "Only stable updates" - }, - "optionsUpdateChannelPreview": "Önizleme sürümlerini al", - "@optionsUpdateChannelPreview": { - "description": "Include beta/preview updates" - }, - "optionsUpdateChannelWarning": "Önizleme sürümleri hatalar veya tamamlanmamış özellikler içerebilir", - "@optionsUpdateChannelWarning": { - "description": "Warning about preview channel" - }, - "optionsClearHistory": "İndirme Geçmişini Temizle", - "@optionsClearHistory": { - "description": "Delete all download history" - }, - "optionsClearHistorySubtitle": "İndirilen bütün şarkıları geçmişten temizle", - "@optionsClearHistorySubtitle": { - "description": "Subtitle for clear history" - }, - "optionsDetailedLogging": "Detaylı Günlükleme", - "@optionsDetailedLogging": { - "description": "Enable verbose logs for debugging" - }, - "optionsDetailedLoggingOn": "Detaylı günlük kayıt ediliyor", - "@optionsDetailedLoggingOn": { - "description": "Status when logging enabled" - }, - "optionsDetailedLoggingOff": "Hata bildirmek için aç", - "@optionsDetailedLoggingOff": { - "description": "Status when logging disabled" - }, - "optionsSpotifyCredentials": "Spotify Kimlik Bilgileri", - "@optionsSpotifyCredentials": { - "description": "Spotify API credentials setting" - }, - "optionsSpotifyCredentialsConfigured": "Client ID: {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 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": "Eklentiler", - "@extensionsTitle": { - "description": "Extensions page title" - }, - "extensionsDisabled": "Devre Dışı", - "@extensionsDisabled": { - "description": "Extension status - inactive" - }, - "extensionsVersion": "Versiyon {version}", - "@extensionsVersion": { - "description": "Extension version display", - "placeholders": { - "version": { - "type": "String" - } - } - }, - "extensionsAuthor": "{author} tarafından", - "@extensionsAuthor": { - "description": "Extension author credit", - "placeholders": { - "author": { - "type": "String" - } - } - }, - "extensionsUninstall": "Kaldır", - "@extensionsUninstall": { - "description": "Uninstall extension button" - }, - "storeTitle": "Eklenti Dükkanı", - "@storeTitle": { - "description": "Store screen title" - }, - "storeSearch": "Eklenti ara...", - "@storeSearch": { - "description": "Store search placeholder" - }, - "storeInstall": "Kur", - "@storeInstall": { - "description": "Install extension button" - }, - "storeInstalled": "Kuruldu", - "@storeInstalled": { - "description": "Already installed badge" - }, - "storeUpdate": "Güncelle", - "@storeUpdate": { - "description": "Update available button" - }, - "aboutTitle": "Hakkında", - "@aboutTitle": { - "description": "About page title" - }, - "aboutContributors": "Katkıda Bulunanlar", - "@aboutContributors": { - "description": "Section for contributors" - }, - "aboutMobileDeveloper": "Mobil versiyon geliştiricisi", - "@aboutMobileDeveloper": { - "description": "Role description for mobile dev" - }, - "aboutOriginalCreator": "Orijinal SpotiFLAC'ın kurucusu", - "@aboutOriginalCreator": { - "description": "Role description for original creator" - }, - "aboutLogoArtist": "Uygulama logomuzu yaratmış yetenekli sanatçımız!", - "@aboutLogoArtist": { - "description": "Role description for logo artist" - }, - "aboutTranslators": "Çevirmenler", - "@aboutTranslators": { - "description": "Section for translators" - }, - "aboutSpecialThanks": "Özel teşekkür", - "@aboutSpecialThanks": { - "description": "Section for special thanks" - }, - "aboutLinks": "Linkler", - "@aboutLinks": { - "description": "Section for external links" - }, - "aboutMobileSource": "Mobil kaynak kodu", - "@aboutMobileSource": { - "description": "Link to mobile GitHub repo" - }, - "aboutPCSource": "PC kaynak kodu", - "@aboutPCSource": { - "description": "Link to PC GitHub repo" - }, - "aboutReportIssue": "Sorun bildir", - "@aboutReportIssue": { - "description": "Link to report bugs" - }, - "aboutReportIssueSubtitle": "Karşılaştığın herhangi bir problemi bildir", - "@aboutReportIssueSubtitle": { - "description": "Subtitle for report issue" - }, - "aboutFeatureRequest": "Özellik isteği", - "@aboutFeatureRequest": { - "description": "Link to suggest features" - }, - "aboutFeatureRequestSubtitle": "Uygulama için yeni özellikler isteyin", - "@aboutFeatureRequestSubtitle": { - "description": "Subtitle for feature request" - }, - "aboutTelegramChannel": "Telegram Kanalı", - "@aboutTelegramChannel": { - "description": "Link to Telegram channel" - }, - "aboutTelegramChannelSubtitle": "Duyurular ve güncellemeler", - "@aboutTelegramChannelSubtitle": { - "description": "Subtitle for Telegram channel" - }, - "aboutTelegramChat": "Telegram Grubu", - "@aboutTelegramChat": { - "description": "Link to Telegram chat group" - }, - "aboutTelegramChatSubtitle": "Diğer kullanıcılarla sohbet et", - "@aboutTelegramChatSubtitle": { - "description": "Subtitle for Telegram chat" - }, - "aboutSocial": "Sosyal ağlar", - "@aboutSocial": { - "description": "Section for social links" - }, - "aboutApp": "Uygulama", - "@aboutApp": { - "description": "Section for app info" - }, - "aboutVersion": "Versiyon", - "@aboutVersion": { - "description": "Version info label" - }, - "aboutBinimumDesc": "QQDL ve HiFi API'ın kurucusu. Bu API olmadan, Tidal indirmeleri olmazdı!", - "@aboutBinimumDesc": { - "description": "Credit description for binimum" - }, - "aboutSachinsenalDesc": "Orijinal HiFi projesi kurucusu. Tidal entegrasyonun temeli!", - "@aboutSachinsenalDesc": { - "description": "Credit description for sachinsenal0x64" - }, - "aboutSjdonadoDesc": "Creator of I Don't Have Spotify (IDHS). The fallback link resolver that saves the day!", - "@aboutSjdonadoDesc": { - "description": "Credit description for sjdonado" - }, - "aboutDabMusic": "DAB Music", - "@aboutDabMusic": { - "description": "Name of Qobuz API service - DO NOT TRANSLATE" - }, - "aboutDabMusicDesc": "En iyi Qobuz streaming API'ı. Yüksek kalite indirmeler bunun sayesinde!", - "@aboutDabMusicDesc": { - "description": "Credit for DAB Music API" - }, - "aboutSpotiSaver": "SpotiSaver", - "@aboutSpotiSaver": { - "description": "Name of SpotiSaver API service - DO NOT TRANSLATE" - }, - "aboutSpotiSaverDesc": "Tidal Hi-Res FLAC streaming endpoints. A key piece of the lossless puzzle!", - "@aboutSpotiSaverDesc": { - "description": "Credit for SpotiSaver API" - }, - "aboutAppDescription": "Spotify şarkılarını Tidal, Qobuz ve Amazon Music'den yüksek kalitede indir.", - "@aboutAppDescription": { - "description": "App description in header card" - }, - "artistAlbums": "Albümler", - "@artistAlbums": { - "description": "Section header for artist albums" - }, - "artistSingles": "Single'lar ve EP'ler", - "@artistSingles": { - "description": "Section header for singles/EPs" - }, - "artistCompilations": "Derlemeler", - "@artistCompilations": { - "description": "Section header for compilations" - }, - "artistPopular": "Popüler", - "@artistPopular": { - "description": "Section header for popular/top tracks" - }, - "artistMonthlyListeners": "Aylık {count} dinleyici", - "@artistMonthlyListeners": { - "description": "Monthly listener count display", - "placeholders": { - "count": { - "type": "String", - "description": "Formatted listener count" - } - } - }, - "trackMetadataService": "Hizmet", - "@trackMetadataService": { - "description": "Metadata field - download service used" - }, - "trackMetadataPlay": "Oynat", - "@trackMetadataPlay": { - "description": "Action button - play track" - }, - "trackMetadataShare": "Paylaş", - "@trackMetadataShare": { - "description": "Action button - share track" - }, - "trackMetadataDelete": "Sil", - "@trackMetadataDelete": { - "description": "Action button - delete track" - }, - "setupGrantPermission": "İzin Ver", - "@setupGrantPermission": { - "description": "Button to request permission" - }, - "setupSkip": "Şimdilik atla", - "@setupSkip": { - "description": "Skip current step button" - }, - "setupStorageAccessRequired": "Depolama Erişimi Gerekli", - "@setupStorageAccessRequired": { - "description": "Title when storage access needed" - }, - "setupStorageAccessMessageAndroid11": "Android 11 ve sonrasında şarkıların seçili klasörünüze kaydedilebilmesi için \"Bütün dosyalara eriş\" iznine ihtiyaç var.", - "@setupStorageAccessMessageAndroid11": { - "description": "Android 11+ specific explanation" - }, - "setupOpenSettings": "Ayarları Aç", - "@setupOpenSettings": { - "description": "Button to open system settings" - }, - "setupPermissionDeniedMessage": "İzin reddedildi. Devam etmek için lütfen bütün izinleri verin.", - "@setupPermissionDeniedMessage": { - "description": "Error when permission denied" - }, - "setupPermissionRequired": "{permissionType} İzni Zorunlu", - "@setupPermissionRequired": { - "description": "Generic permission required title", - "placeholders": { - "permissionType": { - "type": "String", - "description": "Type of permission (Storage/Notification)" - } - } - }, - "setupPermissionRequiredMessage": "En iyi deneyim için {permissionType} izni zorunludur. Bunu ayarlardan daha sonra değiştirebilirsiniz.", - "@setupPermissionRequiredMessage": { - "description": "Generic permission required message", - "placeholders": { - "permissionType": { - "type": "String" - } - } - }, - "setupUseDefaultFolder": "Varsayılan Klasörü Kullan?", - "@setupUseDefaultFolder": { - "description": "Dialog title for default folder" - }, - "setupNoFolderSelected": "Klasör seçilmedi. Varsayılan \"Music\" klasörünü kullanmak ister misiniz?", - "@setupNoFolderSelected": { - "description": "Prompt when no folder selected" - }, - "setupUseDefault": "Varsayılanı Kullan", - "@setupUseDefault": { - "description": "Button to use default folder" - }, - "setupDownloadLocationTitle": "İndirme Konumu", - "@setupDownloadLocationTitle": { - "description": "Download location dialog title" - }, - "setupDownloadLocationIosMessage": "iOS'ta indirilenler uygulamanın \"Documents\" dosyasına kaydedilir. Onlara Dosyalar uygulamasından erişebilirsiniz.", - "@setupDownloadLocationIosMessage": { - "description": "iOS-specific folder info" - }, - "setupAppDocumentsFolder": "App Documents Folder", - "@setupAppDocumentsFolder": { - "description": "iOS documents folder option" - }, - "setupAppDocumentsFolderSubtitle": "Tavsiye edilen - Dosyalar uygulamasından erişilebilir", - "@setupAppDocumentsFolderSubtitle": { - "description": "Subtitle for documents folder" - }, - "setupChooseFromFiles": "Dosyalar'dan Seç", - "@setupChooseFromFiles": { - "description": "iOS file picker option" - }, - "setupChooseFromFilesSubtitle": "iCloud veya başka konum seç", - "@setupChooseFromFilesSubtitle": { - "description": "Subtitle for file picker" - }, - "setupIosEmptyFolderWarning": "iOS'un sınırlaması: Boş klasörler seçilemiyor. İçinde en az bir dosya bulunan bir klasör seçin.", - "@setupIosEmptyFolderWarning": { - "description": "iOS folder selection warning" - }, - "setupIcloudNotSupported": "iCloud Drive is not supported. Please use the app Documents folder.", - "@setupIcloudNotSupported": { - "description": "Error when user selects iCloud Drive on iOS" - }, - "setupDownloadInFlac": "Spotify şarkılarını FLAC olarak indirin", - "@setupDownloadInFlac": { - "description": "App tagline in setup" - }, - "setupStorageGranted": "Depolama İzni Verildi!", - "@setupStorageGranted": { - "description": "Success message for storage permission" - }, - "setupStorageRequired": "Depolama İzni Gerekli", - "@setupStorageRequired": { - "description": "Title when storage permission needed" - }, - "setupStorageDescription": "SpotiFLAC'ın şarkılarınızı kaydetmek için depolama iznine ihtiyacı var.", - "@setupStorageDescription": { - "description": "Explanation for storage permission" - }, - "setupNotificationGranted": "Bildirim İzni Verildi!", - "@setupNotificationGranted": { - "description": "Success message for notification permission" - }, - "setupNotificationEnable": "Bildirimleri Etkinleştir", - "@setupNotificationEnable": { - "description": "Button to enable notifications" - }, - "setupFolderChoose": "İndirilecek Klasörü Seç", - "@setupFolderChoose": { - "description": "Button to choose folder" - }, - "setupFolderDescription": "İndirdiğin şarkıların kaydedileceği klasörü seç.", - "@setupFolderDescription": { - "description": "Explanation for folder selection" - }, - "setupSelectFolder": "Klasör Seç", - "@setupSelectFolder": { - "description": "Button to select folder" - }, - "setupEnableNotifications": "Bildirimleri Etkinleştir", - "@setupEnableNotifications": { - "description": "Button to enable notifications" - }, - "setupNotificationBackgroundDescription": "İndirmelerin durumu hakkında bildirim al. Bunu açmak uygulama arka plandayken indirmelerinizi takip etmenizi sağlar.", - "@setupNotificationBackgroundDescription": { - "description": "Detailed notification explanation" - }, - "setupSkipForNow": "Şimdilik atla", - "@setupSkipForNow": { - "description": "Skip button text" - }, - "setupNext": "Sıradaki", - "@setupNext": { - "description": "Next button text" - }, - "setupGetStarted": "Başla", - "@setupGetStarted": { - "description": "Final setup button" - }, - "setupAllowAccessToManageFiles": "Lütfen bir sonraki ekranda \"Bütün dosyalara eriş\" iznini sağlayın.", - "@setupAllowAccessToManageFiles": { - "description": "Instruction for file access permission" - }, - "dialogCancel": "İptal", - "@dialogCancel": { - "description": "Dialog button - cancel action" - }, - "dialogSave": "Kaydet", - "@dialogSave": { - "description": "Dialog button - save changes" - }, - "dialogDelete": "Sil", - "@dialogDelete": { - "description": "Dialog button - delete item" - }, - "dialogRetry": "Yeniden dene", - "@dialogRetry": { - "description": "Dialog button - retry action" - }, - "dialogClear": "Temizle", - "@dialogClear": { - "description": "Dialog button - clear items" - }, - "dialogDone": "Tamamlandı", - "@dialogDone": { - "description": "Dialog button - action completed" - }, - "dialogImport": "İçe aktar", - "@dialogImport": { - "description": "Dialog button - import data" - }, - "dialogDiscard": "Vazgeç", - "@dialogDiscard": { - "description": "Dialog button - discard changes" - }, - "dialogRemove": "Kaldır", - "@dialogRemove": { - "description": "Dialog button - remove item" - }, - "dialogUninstall": "Kaldır", - "@dialogUninstall": { - "description": "Dialog button - uninstall extension" - }, - "dialogDiscardChanges": "Değişiklikleri İptal Et?", - "@dialogDiscardChanges": { - "description": "Dialog title - unsaved changes warning" - }, - "dialogUnsavedChanges": "Kaydedilmeyen değişiklikler mevcut. Bu değişiklikleri iptal etmek istiyor musunuz?", - "@dialogUnsavedChanges": { - "description": "Dialog message - unsaved changes" - }, - "dialogClearAll": "Tümünü Temizle", - "@dialogClearAll": { - "description": "Dialog title - clear all items" - }, - "dialogRemoveExtension": "Eklentiyi Kaldır", - "@dialogRemoveExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogRemoveExtensionMessage": "Bu eklentiyi kaldırmak istediğine emin misin? Bu işlem geri alınamaz.", - "@dialogRemoveExtensionMessage": { - "description": "Dialog message - uninstall confirmation" - }, - "dialogUninstallExtension": "Eklentiyi Kaldır?", - "@dialogUninstallExtension": { - "description": "Dialog title - uninstall extension" - }, - "dialogUninstallExtensionMessage": "{extensionName} eklentisini kaldırmak istediğine emin misin?", - "@dialogUninstallExtensionMessage": { - "description": "Dialog message - uninstall specific extension", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "dialogClearHistoryTitle": "Geçmişi Temizle", - "@dialogClearHistoryTitle": { - "description": "Dialog title - clear download history" - }, - "dialogClearHistoryMessage": "Tüm indirme geçmişini temizlemek istediğinizden emin misiniz? Bu işlem geri alınamaz.", - "@dialogClearHistoryMessage": { - "description": "Dialog message - clear history confirmation" - }, - "dialogDeleteSelectedTitle": "Seçileni Sil", - "@dialogDeleteSelectedTitle": { - "description": "Dialog title - delete selected items" - }, - "dialogDeleteSelectedMessage": "{count} {count, plural, one {}=1{şarkıyı} other{şarkıyı}} geçmişten silmeye emin misiniz?\n\nBu işlem seçilenleri cihazınızdan da silecektir.", - "@dialogDeleteSelectedMessage": { - "description": "Dialog message - delete selected tracks", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dialogImportPlaylistTitle": "Çalma listesini içe aktar", - "@dialogImportPlaylistTitle": { - "description": "Dialog title - import CSV playlist" - }, - "dialogImportPlaylistMessage": "CSV'de {count} şarkı bulundu. İndirme kuyruğuna ekle?", - "csvImportTracks": "CSV'den {count} şarkı", - "@csvImportTracks": { - "description": "Label shown in quality picker for CSV import", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "@dialogImportPlaylistMessage": { - "description": "Dialog message - import playlist confirmation", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAddedToQueue": "\"{trackName}\" kuyruğa eklendi", - "@snackbarAddedToQueue": { - "description": "Snackbar - track added to download queue", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAddedTracksToQueue": "{count} şarkı kuyruğa eklendi", - "@snackbarAddedTracksToQueue": { - "description": "Snackbar - multiple tracks added to queue", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarAlreadyDownloaded": "\"{trackName}\" zaten indirilmiş", - "@snackbarAlreadyDownloaded": { - "description": "Snackbar - track already exists", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarAlreadyInLibrary": "\"{trackName}\" already exists in your library", - "@snackbarAlreadyInLibrary": { - "description": "Snackbar - track already exists in local library", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "snackbarHistoryCleared": "Geçmiş temizlendi", - "@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, one {}=1{şarkı} other{şarkı}} silindi", - "@snackbarDeletedTracks": { - "description": "Snackbar - tracks deleted", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "snackbarCannotOpenFile": "Dosya açılamadı: {error}", - "@snackbarCannotOpenFile": { - "description": "Snackbar - file open error", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "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" - }, - "snackbarUrlCopied": "{platform} Bağlantı panoya kopyalandı", - "@snackbarUrlCopied": { - "description": "Snackbar - URL copied", - "placeholders": { - "platform": { - "type": "String", - "description": "Platform name (Spotify/Deezer)" - } - } - }, - "snackbarFileNotFound": "Dosya bulunamadı", - "@snackbarFileNotFound": { - "description": "Snackbar - file doesn't exist" - }, - "snackbarSelectExtFile": "Lütfen .spotiflac-ext dosyasını seçin", - "@snackbarSelectExtFile": { - "description": "Snackbar - wrong file type selected" - }, - "snackbarProviderPrioritySaved": "Provider priority saved", - "@snackbarProviderPrioritySaved": { - "description": "Snackbar - provider order saved" - }, - "snackbarMetadataProviderSaved": "Metadata provider priority saved", - "@snackbarMetadataProviderSaved": { - "description": "Snackbar - metadata provider order saved" - }, - "snackbarExtensionInstalled": "{extensionName} yüklendi.", - "@snackbarExtensionInstalled": { - "description": "Snackbar - extension installed successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarExtensionUpdated": "{extensionName} güncellendi.", - "@snackbarExtensionUpdated": { - "description": "Snackbar - extension updated successfully", - "placeholders": { - "extensionName": { - "type": "String" - } - } - }, - "snackbarFailedToInstall": "Eklenti yüklenirken hata oluştu", - "@snackbarFailedToInstall": { - "description": "Snackbar - extension install error" - }, - "snackbarFailedToUpdate": "Eklenti güncellenirken hata oluştu", - "@snackbarFailedToUpdate": { - "description": "Snackbar - extension update error" - }, - "errorRateLimited": "Aşırı istek gönderildi", - "@errorRateLimited": { - "description": "Error title - too many requests" - }, - "errorRateLimitedMessage": "Çok fazla istek. Lütfen arama yapmadan önce biraz bekleyin.", - "@errorRateLimitedMessage": { - "description": "Error message - rate limit explanation" - }, - "errorNoTracksFound": "Parça bulunamadı", - "@errorNoTracksFound": { - "description": "Error - search returned no results" - }, - "errorMissingExtensionSource": "{item} yüklenemedi: Eksik eklenti kaynağı", - "@errorMissingExtensionSource": { - "description": "Error - extension source not available", - "placeholders": { - "item": { - "type": "String" - } - } - }, - "actionPause": "Duraklat", - "@actionPause": { - "description": "Action button - pause download" - }, - "actionResume": "Devam et", - "@actionResume": { - "description": "Action button - resume download" - }, - "actionCancel": "Vazgeç", - "@actionCancel": { - "description": "Action button - cancel operation" - }, - "actionSelectAll": "Tümünü Seç", - "@actionSelectAll": { - "description": "Action button - select all items" - }, - "actionDeselect": "Seçimi kaldır", - "@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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionAllSelected": "Tüm parçalar seçildi", - "@selectionAllSelected": { - "description": "Status - all items selected" - }, - "selectionSelectToDelete": "Silinecek parçaları seçin", - "@selectionSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "progressFetchingMetadata": "Meta verileri alınıyor... {current}/{total}", - "@progressFetchingMetadata": { - "description": "Progress indicator - loading track info", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "progressReadingCsv": "CSV okunuyor...", - "@progressReadingCsv": { - "description": "Progress indicator - parsing CSV file" - }, - "searchSongs": "Şarkılar", - "@searchSongs": { - "description": "Search result category - songs" - }, - "searchArtists": "Sanatçılar", - "@searchArtists": { - "description": "Search result category - artists" - }, - "searchAlbums": "Albümler", - "@searchAlbums": { - "description": "Search result category - albums" - }, - "searchPlaylists": "Çalma Listeleri", - "@searchPlaylists": { - "description": "Search result category - playlists" - }, - "tooltipPlay": "Oynat", - "@tooltipPlay": { - "description": "Tooltip - play button" - }, - "filenameFormat": "Dosya adı formatı", - "@filenameFormat": { - "description": "Setting title - filename pattern" - }, - "filenameShowAdvancedTags": "Show advanced tags", - "@filenameShowAdvancedTags": { - "description": "Toggle label for showing advanced filename tags" - }, - "filenameShowAdvancedTagsDescription": "Enable formatted tags for track padding and date patterns", - "@filenameShowAdvancedTagsDescription": { - "description": "Description for advanced filename tag toggle" - }, - "folderOrganizationNone": "Organizasyon yok", - "@folderOrganizationNone": { - "description": "Folder option - flat structure" - }, - "folderOrganizationByArtist": "Sanatçıya Göre", - "@folderOrganizationByArtist": { - "description": "Folder option - artist folders" - }, - "folderOrganizationByAlbum": "Albüme Göre", - "@folderOrganizationByAlbum": { - "description": "Folder option - album folders" - }, - "folderOrganizationByArtistAlbum": "Sanatçı/Albüm", - "@folderOrganizationByArtistAlbum": { - "description": "Folder option - nested folders" - }, - "folderOrganizationDescription": "İndirilenleri klasörlerle organize et", - "@folderOrganizationDescription": { - "description": "Folder organization sheet description" - }, - "folderOrganizationNoneSubtitle": "Her şey indirilen dosyasına kaydedilecek", - "@folderOrganizationNoneSubtitle": { - "description": "Subtitle for no organization option" - }, - "folderOrganizationByArtistSubtitle": "Her sanatçı için ayrı klasör", - "@folderOrganizationByArtistSubtitle": { - "description": "Subtitle for artist folder option" - }, - "folderOrganizationByAlbumSubtitle": "Her albüm için ayrı klasör", - "@folderOrganizationByAlbumSubtitle": { - "description": "Subtitle for album folder option" - }, - "folderOrganizationByArtistAlbumSubtitle": "Sanatçı klasörlerinin içinde Albüm klasörleri", - "@folderOrganizationByArtistAlbumSubtitle": { - "description": "Subtitle for nested folder option" - }, - "updateAvailable": "Güncelleme Mevcut", - "@updateAvailable": { - "description": "Update dialog title" - }, - "updateLater": "Daha Sonra", - "@updateLater": { - "description": "Update button - dismiss" - }, - "updateStartingDownload": "İndirme başlıyor...", - "@updateStartingDownload": { - "description": "Update status - initializing" - }, - "updateDownloadFailed": "İndirme başarısız", - "@updateDownloadFailed": { - "description": "Update error title" - }, - "updateFailedMessage": "Güncelleme indirilemedi", - "@updateFailedMessage": { - "description": "Update error message" - }, - "updateNewVersionReady": "Yeni bir sürüm hazır", - "@updateNewVersionReady": { - "description": "Update subtitle" - }, - "updateCurrent": "Şimdiki", - "@updateCurrent": { - "description": "Label for current version" - }, - "updateNew": "Yeni", - "@updateNew": { - "description": "Label for new version" - }, - "updateDownloading": "İndiriliyor...", - "@updateDownloading": { - "description": "Update status - downloading" - }, - "updateWhatsNew": "Yenilikler", - "@updateWhatsNew": { - "description": "Changelog section title" - }, - "updateDownloadInstall": "İndir & Yükle", - "@updateDownloadInstall": { - "description": "Update button - download and install" - }, - "updateDontRemind": "Bir daha sorma", - "@updateDontRemind": { - "description": "Update button - skip this version" - }, - "providerPriorityTitle": "İndirme hizmetleri öncelik sırası", - "@providerPriorityTitle": { - "description": "Provider priority page title" - }, - "providerPriorityDescription": "İndirme hizmetlerini sıralamak için kaydır. Uygulama şarkı indirirken hizmetleri yukarıdan aşağıya doğru deneyecektir.", - "@providerPriorityDescription": { - "description": "Provider priority page description" - }, - "providerPriorityInfo": "Eğer bir şarkı ilk hizmette mevcut değilse uygulama otomatik olarak bir sonrakini deneyecektir.", - "@providerPriorityInfo": { - "description": "Info tip about fallback behavior" - }, - "providerBuiltIn": "Dahili", - "@providerBuiltIn": { - "description": "Label for built-in providers (Tidal/Qobuz/Amazon)" - }, - "providerExtension": "Eklenti", - "@providerExtension": { - "description": "Label for extension-provided providers" - }, - "metadataProviderPriorityTitle": "Metadata Priority", - "@metadataProviderPriorityTitle": { - "description": "Metadata priority page title" - }, - "metadataProviderPriorityDescription": "Drag to reorder metadata providers. The app will try providers from top to bottom when searching for tracks and fetching metadata.", - "@metadataProviderPriorityDescription": { - "description": "Metadata priority page description" - }, - "metadataProviderPriorityInfo": "Deezer has no rate limits and is recommended as primary. Spotify may rate limit after many requests.", - "@metadataProviderPriorityInfo": { - "description": "Info tip about rate limits" - }, - "metadataNoRateLimits": "No rate limits", - "@metadataNoRateLimits": { - "description": "Deezer provider description" - }, - "metadataMayRateLimit": "May rate limit", - "@metadataMayRateLimit": { - "description": "Spotify provider description" - }, - "logTitle": "Kayıtlar", - "@logTitle": { - "description": "Logs screen title" - }, - "logCopied": "Kayıtlar panoya kopyalandı", - "@logCopied": { - "description": "Snackbar - logs copied" - }, - "logSearchHint": "Kayıtları Ara...", - "@logSearchHint": { - "description": "Log search placeholder" - }, - "logFilterLevel": "Seviye", - "@logFilterLevel": { - "description": "Filter by log level" - }, - "logFilterSection": "Filtre", - "@logFilterSection": { - "description": "Filter section title" - }, - "logShareLogs": "Kayıtları paylaş", - "@logShareLogs": { - "description": "Share button tooltip" - }, - "logClearLogs": "Kayıtları temizle", - "@logClearLogs": { - "description": "Clear button tooltip" - }, - "logClearLogsTitle": "Kayıtları temizle", - "@logClearLogsTitle": { - "description": "Clear logs dialog title" - }, - "logClearLogsMessage": "Tüm kayıtları temizlemek istediğinize emin misiniz?", - "@logClearLogsMessage": { - "description": "Clear logs confirmation message" - }, - "logFilterBySeverity": "Filter logs by severity", - "@logFilterBySeverity": { - "description": "Filter dialog title" - }, - "logNoLogsYet": "No logs yet", - "@logNoLogsYet": { - "description": "Empty state title" - }, - "logNoLogsYetSubtitle": "Logs will appear here as you use the app", - "@logNoLogsYetSubtitle": { - "description": "Empty state subtitle" - }, - "logEntriesFiltered": "Entries ({count} filtered)", - "@logEntriesFiltered": { - "description": "Log count with filter active", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "logEntries": "Entries ({count})", - "@logEntries": { - "description": "Total log count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "credentialsTitle": "Spotify Credentials", - "@credentialsTitle": { - "description": "Credentials dialog title" - }, - "credentialsDescription": "Enter your Client ID and Secret to use your own Spotify application quota.", - "@credentialsDescription": { - "description": "Credentials dialog explanation" - }, - "credentialsClientId": "Client ID", - "@credentialsClientId": { - "description": "Client ID field label - DO NOT TRANSLATE" - }, - "credentialsClientIdHint": "Paste Client ID", - "@credentialsClientIdHint": { - "description": "Client ID placeholder" - }, - "credentialsClientSecret": "Client Secret", - "@credentialsClientSecret": { - "description": "Client Secret field label - DO NOT TRANSLATE" - }, - "credentialsClientSecretHint": "Paste Client Secret", - "@credentialsClientSecretHint": { - "description": "Client Secret placeholder" - }, - "channelStable": "Stable", - "@channelStable": { - "description": "Update channel - stable releases" - }, - "channelPreview": "Preview", - "@channelPreview": { - "description": "Update channel - beta/preview releases" - }, - "sectionSearchSource": "Search Source", - "@sectionSearchSource": { - "description": "Settings section header" - }, - "sectionDownload": "Download", - "@sectionDownload": { - "description": "Settings section header" - }, - "sectionPerformance": "Performance", - "@sectionPerformance": { - "description": "Settings section header" - }, - "sectionApp": "App", - "@sectionApp": { - "description": "Settings section header" - }, - "sectionData": "Data", - "@sectionData": { - "description": "Settings section header" - }, - "sectionDebug": "Debug", - "@sectionDebug": { - "description": "Settings section header" - }, - "sectionService": "Service", - "@sectionService": { - "description": "Settings section header" - }, - "sectionAudioQuality": "Audio Quality", - "@sectionAudioQuality": { - "description": "Settings section header" - }, - "sectionFileSettings": "File Settings", - "@sectionFileSettings": { - "description": "Settings section header" - }, - "sectionLyrics": "Lyrics", - "@sectionLyrics": { - "description": "Settings section header" - }, - "lyricsMode": "Lyrics Mode", - "@lyricsMode": { - "description": "Setting - how to save lyrics" - }, - "lyricsModeDescription": "Choose how lyrics are saved with your downloads", - "@lyricsModeDescription": { - "description": "Lyrics mode picker description" - }, - "lyricsModeEmbed": "Embed in file", - "@lyricsModeEmbed": { - "description": "Lyrics mode option - embed in audio file" - }, - "lyricsModeEmbedSubtitle": "Lyrics stored inside FLAC metadata", - "@lyricsModeEmbedSubtitle": { - "description": "Subtitle for embed option" - }, - "lyricsModeExternal": "External .lrc file", - "@lyricsModeExternal": { - "description": "Lyrics mode option - separate LRC file" - }, - "lyricsModeExternalSubtitle": "Separate .lrc file for players like Samsung Music", - "@lyricsModeExternalSubtitle": { - "description": "Subtitle for external option" - }, - "lyricsModeBoth": "Both", - "@lyricsModeBoth": { - "description": "Lyrics mode option - embed and external" - }, - "lyricsModeBothSubtitle": "Embed and save .lrc file", - "@lyricsModeBothSubtitle": { - "description": "Subtitle for both option" - }, - "sectionColor": "Color", - "@sectionColor": { - "description": "Settings section header" - }, - "sectionTheme": "Theme", - "@sectionTheme": { - "description": "Settings section header" - }, - "sectionLayout": "Layout", - "@sectionLayout": { - "description": "Settings section header" - }, - "sectionLanguage": "Language", - "@sectionLanguage": { - "description": "Settings section header for language" - }, - "appearanceLanguage": "App Language", - "@appearanceLanguage": { - "description": "Language setting title" - }, - "settingsAppearanceSubtitle": "Theme, colors, display", - "@settingsAppearanceSubtitle": { - "description": "Appearance settings description" - }, - "settingsDownloadSubtitle": "Service, quality, filename format", - "@settingsDownloadSubtitle": { - "description": "Download settings description" - }, - "settingsOptionsSubtitle": "Fallback, lyrics, cover art, updates", - "@settingsOptionsSubtitle": { - "description": "Options settings description" - }, - "settingsExtensionsSubtitle": "Manage download providers", - "@settingsExtensionsSubtitle": { - "description": "Extensions settings description" - }, - "settingsLogsSubtitle": "View app logs for debugging", - "@settingsLogsSubtitle": { - "description": "Logs settings description" - }, - "loadingSharedLink": "Loading shared link...", - "@loadingSharedLink": { - "description": "Status when opening shared URL" - }, - "pressBackAgainToExit": "Press back again to exit", - "@pressBackAgainToExit": { - "description": "Exit confirmation message" - }, - "downloadAllCount": "Download All ({count})", - "@downloadAllCount": { - "description": "Download all button with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tracksCount": "{count, plural, =1{1 track} other{{count} tracks}}", - "@tracksCount": { - "description": "Track count display", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "trackCopyFilePath": "Copy file path", - "@trackCopyFilePath": { - "description": "Action - copy file path" - }, - "trackRemoveFromDevice": "Remove from device", - "@trackRemoveFromDevice": { - "description": "Action - delete downloaded file" - }, - "trackLoadLyrics": "Load Lyrics", - "@trackLoadLyrics": { - "description": "Action - fetch lyrics" - }, - "trackMetadata": "Metadata", - "@trackMetadata": { - "description": "Tab title - track metadata" - }, - "trackFileInfo": "File Info", - "@trackFileInfo": { - "description": "Tab title - file information" - }, - "trackLyrics": "Lyrics", - "@trackLyrics": { - "description": "Tab title - lyrics" - }, - "trackFileNotFound": "File not found", - "@trackFileNotFound": { - "description": "Error - file doesn't exist" - }, - "trackOpenInDeezer": "Open in Deezer", - "@trackOpenInDeezer": { - "description": "Action - open track in Deezer app" - }, - "trackOpenInSpotify": "Open in Spotify", - "@trackOpenInSpotify": { - "description": "Action - open track in Spotify app" - }, - "trackTrackName": "Track name", - "@trackTrackName": { - "description": "Metadata label - track title" - }, - "trackArtist": "Artist", - "@trackArtist": { - "description": "Metadata label - artist name" - }, - "trackAlbumArtist": "Album artist", - "@trackAlbumArtist": { - "description": "Metadata label - album artist" - }, - "trackAlbum": "Album", - "@trackAlbum": { - "description": "Metadata label - album name" - }, - "trackTrackNumber": "Track number", - "@trackTrackNumber": { - "description": "Metadata label - track number" - }, - "trackDiscNumber": "Disc number", - "@trackDiscNumber": { - "description": "Metadata label - disc number" - }, - "trackDuration": "Duration", - "@trackDuration": { - "description": "Metadata label - track length" - }, - "trackAudioQuality": "Audio quality", - "@trackAudioQuality": { - "description": "Metadata label - audio quality" - }, - "trackReleaseDate": "Release date", - "@trackReleaseDate": { - "description": "Metadata label - release date" - }, - "trackGenre": "Genre", - "@trackGenre": { - "description": "Metadata label - music genre" - }, - "trackLabel": "Label", - "@trackLabel": { - "description": "Metadata label - record label" - }, - "trackCopyright": "Copyright", - "@trackCopyright": { - "description": "Metadata label - copyright information" - }, - "trackDownloaded": "Downloaded", - "@trackDownloaded": { - "description": "Metadata label - download date" - }, - "trackCopyLyrics": "Copy lyrics", - "@trackCopyLyrics": { - "description": "Action - copy lyrics to clipboard" - }, - "trackLyricsNotAvailable": "Lyrics not available for this track", - "@trackLyricsNotAvailable": { - "description": "Message when lyrics not found" - }, - "trackLyricsTimeout": "Request timed out. Try again later.", - "@trackLyricsTimeout": { - "description": "Message when lyrics request times out" - }, - "trackLyricsLoadFailed": "Failed to load lyrics", - "@trackLyricsLoadFailed": { - "description": "Message when lyrics loading fails" - }, - "trackEmbedLyrics": "Embed Lyrics", - "@trackEmbedLyrics": { - "description": "Action - embed lyrics into audio file" - }, - "trackLyricsEmbedded": "Lyrics embedded successfully", - "@trackLyricsEmbedded": { - "description": "Snackbar - lyrics saved to file" - }, - "trackInstrumental": "Instrumental track", - "@trackInstrumental": { - "description": "Message when track is instrumental (no lyrics)" - }, - "trackCopiedToClipboard": "Copied to clipboard", - "@trackCopiedToClipboard": { - "description": "Snackbar - content copied" - }, - "trackDeleteConfirmTitle": "Remove from device?", - "@trackDeleteConfirmTitle": { - "description": "Delete confirmation title" - }, - "trackDeleteConfirmMessage": "This will permanently delete the downloaded file and remove it from your history.", - "@trackDeleteConfirmMessage": { - "description": "Delete confirmation message" - }, - "dateToday": "Today", - "@dateToday": { - "description": "Relative date - today" - }, - "dateYesterday": "Yesterday", - "@dateYesterday": { - "description": "Relative date - yesterday" - }, - "dateDaysAgo": "{count} days ago", - "@dateDaysAgo": { - "description": "Relative date - days ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateWeeksAgo": "{count} weeks ago", - "@dateWeeksAgo": { - "description": "Relative date - weeks ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "dateMonthsAgo": "{count} months ago", - "@dateMonthsAgo": { - "description": "Relative date - months ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "storeFilterAll": "All", - "@storeFilterAll": { - "description": "Store filter - all extensions" - }, - "storeFilterMetadata": "Metadata", - "@storeFilterMetadata": { - "description": "Store filter - metadata providers" - }, - "storeFilterDownload": "Download", - "@storeFilterDownload": { - "description": "Store filter - download providers" - }, - "storeFilterUtility": "Utility", - "@storeFilterUtility": { - "description": "Store filter - utility extensions" - }, - "storeFilterLyrics": "Lyrics", - "@storeFilterLyrics": { - "description": "Store filter - lyrics providers" - }, - "storeFilterIntegration": "Integration", - "@storeFilterIntegration": { - "description": "Store filter - integrations" - }, - "storeClearFilters": "Clear filters", - "@storeClearFilters": { - "description": "Button to clear all filters" - }, - "extensionDefaultProvider": "Default (Deezer/Spotify)", - "@extensionDefaultProvider": { - "description": "Default search provider option" - }, - "extensionDefaultProviderSubtitle": "Use built-in search", - "@extensionDefaultProviderSubtitle": { - "description": "Subtitle for default provider" - }, - "extensionAuthor": "Author", - "@extensionAuthor": { - "description": "Extension detail - author" - }, - "extensionId": "ID", - "@extensionId": { - "description": "Extension detail - unique ID" - }, - "extensionError": "Error", - "@extensionError": { - "description": "Extension detail - error message" - }, - "extensionCapabilities": "Capabilities", - "@extensionCapabilities": { - "description": "Section header - extension features" - }, - "extensionMetadataProvider": "Metadata Provider", - "@extensionMetadataProvider": { - "description": "Capability - provides metadata" - }, - "extensionDownloadProvider": "Download Provider", - "@extensionDownloadProvider": { - "description": "Capability - provides downloads" - }, - "extensionLyricsProvider": "Lyrics Provider", - "@extensionLyricsProvider": { - "description": "Capability - provides lyrics" - }, - "extensionUrlHandler": "URL Handler", - "@extensionUrlHandler": { - "description": "Capability - handles URLs" - }, - "extensionQualityOptions": "Quality Options", - "@extensionQualityOptions": { - "description": "Capability - quality selection" - }, - "extensionPostProcessingHooks": "Post-Processing Hooks", - "@extensionPostProcessingHooks": { - "description": "Capability - post-processing" - }, - "extensionPermissions": "Permissions", - "@extensionPermissions": { - "description": "Section header - required permissions" - }, - "extensionSettings": "Settings", - "@extensionSettings": { - "description": "Section header - extension settings" - }, - "extensionRemoveButton": "Remove Extension", - "@extensionRemoveButton": { - "description": "Button to uninstall extension" - }, - "extensionUpdated": "Updated", - "@extensionUpdated": { - "description": "Extension detail - last update" - }, - "extensionMinAppVersion": "Min App Version", - "@extensionMinAppVersion": { - "description": "Extension detail - minimum app version" - }, - "extensionCustomTrackMatching": "Custom Track Matching", - "@extensionCustomTrackMatching": { - "description": "Capability - custom track matching algorithm" - }, - "extensionPostProcessing": "Post-Processing", - "@extensionPostProcessing": { - "description": "Capability - post-download processing" - }, - "extensionHooksAvailable": "{count} hook(s) available", - "@extensionHooksAvailable": { - "description": "Post-processing hooks count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionPatternsCount": "{count} pattern(s)", - "@extensionPatternsCount": { - "description": "URL patterns count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "extensionStrategy": "Strategy: {strategy}", - "@extensionStrategy": { - "description": "Track matching strategy name", - "placeholders": { - "strategy": { - "type": "String" - } - } - }, - "extensionsProviderPrioritySection": "Provider Priority", - "@extensionsProviderPrioritySection": { - "description": "Section header - provider priority" - }, - "extensionsInstalledSection": "Installed Extensions", - "@extensionsInstalledSection": { - "description": "Section header - installed extensions" - }, - "extensionsNoExtensions": "No extensions installed", - "@extensionsNoExtensions": { - "description": "Empty state - no extensions" - }, - "extensionsNoExtensionsSubtitle": "Install .spotiflac-ext files to add new providers", - "@extensionsNoExtensionsSubtitle": { - "description": "Empty state subtitle" - }, - "extensionsInstallButton": "Install Extension", - "@extensionsInstallButton": { - "description": "Button to install extension from file" - }, - "extensionsInfoTip": "Extensions can add new metadata and download providers. Only install extensions from trusted sources.", - "@extensionsInfoTip": { - "description": "Security warning about extensions" - }, - "extensionsInstalledSuccess": "Extension installed successfully", - "@extensionsInstalledSuccess": { - "description": "Success message after install" - }, - "extensionsDownloadPriority": "Download Priority", - "@extensionsDownloadPriority": { - "description": "Setting - download provider order" - }, - "extensionsDownloadPrioritySubtitle": "Set download service order", - "@extensionsDownloadPrioritySubtitle": { - "description": "Subtitle for download priority" - }, - "extensionsNoDownloadProvider": "No extensions with download provider", - "@extensionsNoDownloadProvider": { - "description": "Empty state - no download providers" - }, - "extensionsMetadataPriority": "Metadata Priority", - "@extensionsMetadataPriority": { - "description": "Setting - metadata provider order" - }, - "extensionsMetadataPrioritySubtitle": "Set search & metadata source order", - "@extensionsMetadataPrioritySubtitle": { - "description": "Subtitle for metadata priority" - }, - "extensionsNoMetadataProvider": "No extensions with metadata provider", - "@extensionsNoMetadataProvider": { - "description": "Empty state - no metadata providers" - }, - "extensionsSearchProvider": "Search Provider", - "@extensionsSearchProvider": { - "description": "Setting - search provider selection" - }, - "extensionsNoCustomSearch": "No extensions with custom search", - "@extensionsNoCustomSearch": { - "description": "Empty state - no search providers" - }, - "extensionsSearchProviderDescription": "Choose which service to use for searching tracks", - "@extensionsSearchProviderDescription": { - "description": "Search provider setting description" - }, - "extensionsCustomSearch": "Custom search", - "@extensionsCustomSearch": { - "description": "Label for custom search provider" - }, - "extensionsErrorLoading": "Error loading extension", - "@extensionsErrorLoading": { - "description": "Error message when extension fails to load" - }, - "qualityFlacLossless": "FLAC Lossless", - "@qualityFlacLossless": { - "description": "Quality option - CD quality FLAC" - }, - "qualityFlacLosslessSubtitle": "16-bit / 44.1kHz", - "@qualityFlacLosslessSubtitle": { - "description": "Technical spec for lossless" - }, - "qualityHiResFlac": "Hi-Res FLAC", - "@qualityHiResFlac": { - "description": "Quality option - high resolution FLAC" - }, - "qualityHiResFlacSubtitle": "24-bit / up to 96kHz", - "@qualityHiResFlacSubtitle": { - "description": "Technical spec for hi-res" - }, - "qualityHiResFlacMax": "Hi-Res FLAC Max", - "@qualityHiResFlacMax": { - "description": "Quality option - maximum resolution FLAC" - }, - "qualityHiResFlacMaxSubtitle": "24-bit / up to 192kHz", - "@qualityHiResFlacMaxSubtitle": { - "description": "Technical spec for hi-res max" - }, - "qualityNote": "Actual quality depends on track availability from the service", - "@qualityNote": { - "description": "Note about quality availability" - }, - "youtubeQualityNote": "YouTube provides lossy audio only. Not part of lossless fallback.", - "@youtubeQualityNote": { - "description": "Note for YouTube service explaining lossy-only quality" - }, - "youtubeOpusBitrateTitle": "YouTube Opus Bitrate", - "@youtubeOpusBitrateTitle": { - "description": "Title for YouTube Opus bitrate setting" - }, - "youtubeMp3BitrateTitle": "YouTube MP3 Bitrate", - "@youtubeMp3BitrateTitle": { - "description": "Title for YouTube MP3 bitrate setting" - }, - "downloadAskBeforeDownload": "Ask Before Download", - "@downloadAskBeforeDownload": { - "description": "Setting - show quality picker" - }, - "downloadDirectory": "Download Directory", - "@downloadDirectory": { - "description": "Setting - download folder" - }, - "downloadSeparateSinglesFolder": "Separate Singles Folder", - "@downloadSeparateSinglesFolder": { - "description": "Setting - separate folder for singles" - }, - "downloadAlbumFolderStructure": "Album Folder Structure", - "@downloadAlbumFolderStructure": { - "description": "Setting - album folder organization" - }, - "downloadUseAlbumArtistForFolders": "Use Album Artist for folders", - "@downloadUseAlbumArtistForFolders": { - "description": "Setting - choose whether artist folders use Album Artist or Track Artist" - }, - "downloadUsePrimaryArtistOnly": "Primary artist only for folders", - "@downloadUsePrimaryArtistOnly": { - "description": "Setting - strip featured artists from folder name" - }, - "downloadUsePrimaryArtistOnlyEnabled": "Featured artists removed from folder name (e.g. Justin Bieber, Quavo → Justin Bieber)", - "@downloadUsePrimaryArtistOnlyEnabled": { - "description": "Subtitle when primary artist only is enabled" - }, - "downloadUsePrimaryArtistOnlyDisabled": "Full artist string used for folder name", - "@downloadUsePrimaryArtistOnlyDisabled": { - "description": "Subtitle when primary artist only is disabled" - }, - "downloadSelectQuality": "Select Quality", - "@downloadSelectQuality": { - "description": "Dialog title - choose audio quality" - }, - "downloadFrom": "Download From", - "@downloadFrom": { - "description": "Label - download source" - }, - "appearanceAmoledDark": "AMOLED Dark", - "@appearanceAmoledDark": { - "description": "Theme option - pure black" - }, - "appearanceAmoledDarkSubtitle": "Pure black background", - "@appearanceAmoledDarkSubtitle": { - "description": "Subtitle for AMOLED dark" - }, - "queueClearAll": "Clear All", - "@queueClearAll": { - "description": "Button - clear all queue items" - }, - "queueClearAllMessage": "Are you sure you want to clear all downloads?", - "@queueClearAllMessage": { - "description": "Clear queue confirmation" - }, - "settingsAutoExportFailed": "Auto-export failed downloads", - "@settingsAutoExportFailed": { - "description": "Setting toggle for auto-export" - }, - "settingsAutoExportFailedSubtitle": "Save failed downloads to TXT file automatically", - "@settingsAutoExportFailedSubtitle": { - "description": "Subtitle for auto-export setting" - }, - "settingsDownloadNetwork": "Download Network", - "@settingsDownloadNetwork": { - "description": "Setting for network type preference" - }, - "settingsDownloadNetworkAny": "WiFi + Mobile Data", - "@settingsDownloadNetworkAny": { - "description": "Network option - use any connection" - }, - "settingsDownloadNetworkWifiOnly": "WiFi Only", - "@settingsDownloadNetworkWifiOnly": { - "description": "Network option - only use WiFi" - }, - "settingsDownloadNetworkSubtitle": "Choose which network to use for downloads. When set to WiFi Only, downloads will pause on mobile data.", - "@settingsDownloadNetworkSubtitle": { - "description": "Subtitle explaining network preference" - }, - "albumFolderArtistAlbum": "Artist / Album", - "@albumFolderArtistAlbum": { - "description": "Album folder option" - }, - "albumFolderArtistAlbumSubtitle": "Albums/Artist Name/Album Name/", - "@albumFolderArtistAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistYearAlbum": "Artist / [Year] Album", - "@albumFolderArtistYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderArtistYearAlbumSubtitle": "Albums/Artist Name/[2005] Album Name/", - "@albumFolderArtistYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderAlbumOnly": "Album Only", - "@albumFolderAlbumOnly": { - "description": "Album folder option" - }, - "albumFolderAlbumOnlySubtitle": "Albums/Album Name/", - "@albumFolderAlbumOnlySubtitle": { - "description": "Folder structure example" - }, - "albumFolderYearAlbum": "[Year] Album", - "@albumFolderYearAlbum": { - "description": "Album folder option with year" - }, - "albumFolderYearAlbumSubtitle": "Albums/[2005] Album Name/", - "@albumFolderYearAlbumSubtitle": { - "description": "Folder structure example" - }, - "albumFolderArtistAlbumSingles": "Artist / Album + Singles", - "@albumFolderArtistAlbumSingles": { - "description": "Album folder option with singles inside artist" - }, - "albumFolderArtistAlbumSinglesSubtitle": "Artist/Album/ and Artist/Singles/", - "@albumFolderArtistAlbumSinglesSubtitle": { - "description": "Folder structure example" - }, - "downloadedAlbumDeleteSelected": "Delete Selected", - "@downloadedAlbumDeleteSelected": { - "description": "Button - delete selected tracks" - }, - "downloadedAlbumDeleteMessage": "Delete {count} {count, plural, =1{track} other{tracks}} from this album?\n\nThis will also delete the files from storage.", - "@downloadedAlbumDeleteMessage": { - "description": "Delete confirmation with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectedCount": "{count} selected", - "@downloadedAlbumSelectedCount": { - "description": "Selection count indicator", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumAllSelected": "All tracks selected", - "@downloadedAlbumAllSelected": { - "description": "Status - all items selected" - }, - "downloadedAlbumTapToSelect": "Tap tracks to select", - "@downloadedAlbumTapToSelect": { - "description": "Selection hint" - }, - "downloadedAlbumDeleteCount": "Delete {count} {count, plural, =1{track} other{tracks}}", - "@downloadedAlbumDeleteCount": { - "description": "Delete button text with count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadedAlbumSelectToDelete": "Select tracks to delete", - "@downloadedAlbumSelectToDelete": { - "description": "Placeholder when nothing selected" - }, - "downloadedAlbumDiscHeader": "Disc {discNumber}", - "@downloadedAlbumDiscHeader": { - "description": "Header for disc separator in multi-disc albums", - "placeholders": { - "discNumber": { - "type": "int", - "example": "1" - } - } - }, - "recentTypeArtist": "Artist", - "@recentTypeArtist": { - "description": "Recent access item type - artist" - }, - "recentTypeAlbum": "Album", - "@recentTypeAlbum": { - "description": "Recent access item type - album" - }, - "recentTypeSong": "Song", - "@recentTypeSong": { - "description": "Recent access item type - song/track" - }, - "recentTypePlaylist": "Playlist", - "@recentTypePlaylist": { - "description": "Recent access item type - playlist" - }, - "recentEmpty": "No recent items yet", - "@recentEmpty": { - "description": "Empty state text for recent access list" - }, - "recentShowAllDownloads": "Show All Downloads", - "@recentShowAllDownloads": { - "description": "Button label to unhide hidden downloads in recent access" - }, - "recentPlaylistInfo": "Playlist: {name}", - "@recentPlaylistInfo": { - "description": "Snackbar message when tapping playlist in recent access", - "placeholders": { - "name": { - "type": "String", - "description": "Playlist name" - } - } - }, - "discographyDownload": "Download Discography", - "@discographyDownload": { - "description": "Button - download artist discography" - }, - "discographyDownloadAll": "Download All", - "@discographyDownloadAll": { - "description": "Option - download entire discography" - }, - "discographyDownloadAllSubtitle": "{count} tracks from {albumCount} releases", - "@discographyDownloadAllSubtitle": { - "description": "Subtitle showing total tracks and albums", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographyAlbumsOnly": "Albums Only", - "@discographyAlbumsOnly": { - "description": "Option - download only albums" - }, - "discographyAlbumsOnlySubtitle": "{count} tracks from {albumCount} albums", - "@discographyAlbumsOnlySubtitle": { - "description": "Subtitle showing album tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySinglesOnly": "Singles & EPs Only", - "@discographySinglesOnly": { - "description": "Option - download only singles" - }, - "discographySinglesOnlySubtitle": "{count} tracks from {albumCount} singles", - "@discographySinglesOnlySubtitle": { - "description": "Subtitle showing singles tracks count", - "placeholders": { - "count": { - "type": "int" - }, - "albumCount": { - "type": "int" - } - } - }, - "discographySelectAlbums": "Select Albums...", - "@discographySelectAlbums": { - "description": "Option - manually select albums to download" - }, - "discographySelectAlbumsSubtitle": "Choose specific albums or singles", - "@discographySelectAlbumsSubtitle": { - "description": "Subtitle for select albums option" - }, - "discographyFetchingTracks": "Fetching tracks...", - "@discographyFetchingTracks": { - "description": "Progress - fetching album tracks" - }, - "discographyFetchingAlbum": "Fetching {current} of {total}...", - "@discographyFetchingAlbum": { - "description": "Progress - fetching specific album", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "discographySelectedCount": "{count} selected", - "@discographySelectedCount": { - "description": "Selection count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographyDownloadSelected": "Download Selected", - "@discographyDownloadSelected": { - "description": "Button - download selected albums" - }, - "discographyAddedToQueue": "Added {count} tracks to queue", - "@discographyAddedToQueue": { - "description": "Snackbar - tracks added from discography", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "discographySkippedDownloaded": "{added} added, {skipped} already downloaded", - "@discographySkippedDownloaded": { - "description": "Snackbar - with skipped tracks count", - "placeholders": { - "added": { - "type": "int" - }, - "skipped": { - "type": "int" - } - } - }, - "discographyNoAlbums": "No albums available", - "@discographyNoAlbums": { - "description": "Error - no albums found for artist" - }, - "discographyFailedToFetch": "Failed to fetch some albums", - "@discographyFailedToFetch": { - "description": "Error - some albums failed to load" - }, - "sectionStorageAccess": "Storage Access", - "@sectionStorageAccess": { - "description": "Section header for storage access settings" - }, - "allFilesAccess": "All Files Access", - "@allFilesAccess": { - "description": "Toggle for MANAGE_EXTERNAL_STORAGE permission" - }, - "allFilesAccessEnabledSubtitle": "Can write to any folder", - "@allFilesAccessEnabledSubtitle": { - "description": "Subtitle when all files access is enabled" - }, - "allFilesAccessDisabledSubtitle": "Limited to media folders only", - "@allFilesAccessDisabledSubtitle": { - "description": "Subtitle when all files access is disabled" - }, - "allFilesAccessDescription": "Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.", - "@allFilesAccessDescription": { - "description": "Description explaining when to enable all files access" - }, - "allFilesAccessDeniedMessage": "Permission was denied. Please enable 'All files access' manually in system settings.", - "@allFilesAccessDeniedMessage": { - "description": "Message when permission is permanently denied" - }, - "allFilesAccessDisabledMessage": "All Files Access disabled. The app will use limited storage access.", - "@allFilesAccessDisabledMessage": { - "description": "Snackbar message when user disables all files access" - }, - "settingsLocalLibrary": "Local Library", - "@settingsLocalLibrary": { - "description": "Settings menu item - local library" - }, - "settingsLocalLibrarySubtitle": "Scan music & detect duplicates", - "@settingsLocalLibrarySubtitle": { - "description": "Subtitle for local library settings" - }, - "settingsCache": "Storage & Cache", - "@settingsCache": { - "description": "Settings menu item - cache management" - }, - "settingsCacheSubtitle": "View size and clear cached data", - "@settingsCacheSubtitle": { - "description": "Subtitle for cache management menu" - }, - "libraryTitle": "Local Library", - "@libraryTitle": { - "description": "Library settings page title" - }, - "libraryScanSettings": "Scan Settings", - "@libraryScanSettings": { - "description": "Section header for scan settings" - }, - "libraryEnableLocalLibrary": "Enable Local Library", - "@libraryEnableLocalLibrary": { - "description": "Toggle to enable library scanning" - }, - "libraryEnableLocalLibrarySubtitle": "Scan and track your existing music", - "@libraryEnableLocalLibrarySubtitle": { - "description": "Subtitle for enable toggle" - }, - "libraryFolder": "Library Folder", - "@libraryFolder": { - "description": "Folder selection setting" - }, - "libraryFolderHint": "Tap to select folder", - "@libraryFolderHint": { - "description": "Placeholder when no folder selected" - }, - "libraryShowDuplicateIndicator": "Show Duplicate Indicator", - "@libraryShowDuplicateIndicator": { - "description": "Toggle for duplicate indicator in search" - }, - "libraryShowDuplicateIndicatorSubtitle": "Show when searching for existing tracks", - "@libraryShowDuplicateIndicatorSubtitle": { - "description": "Subtitle for duplicate indicator toggle" - }, - "libraryActions": "Actions", - "@libraryActions": { - "description": "Section header for library actions" - }, - "libraryScan": "Scan Library", - "@libraryScan": { - "description": "Button to start library scan" - }, - "libraryScanSubtitle": "Scan for audio files", - "@libraryScanSubtitle": { - "description": "Subtitle for scan button" - }, - "libraryScanSelectFolderFirst": "Select a folder first", - "@libraryScanSelectFolderFirst": { - "description": "Message when trying to scan without folder" - }, - "libraryCleanupMissingFiles": "Cleanup Missing Files", - "@libraryCleanupMissingFiles": { - "description": "Button to remove entries for missing files" - }, - "libraryCleanupMissingFilesSubtitle": "Remove entries for files that no longer exist", - "@libraryCleanupMissingFilesSubtitle": { - "description": "Subtitle for cleanup button" - }, - "libraryClear": "Clear Library", - "@libraryClear": { - "description": "Button to clear all library entries" - }, - "libraryClearSubtitle": "Remove all scanned tracks", - "@libraryClearSubtitle": { - "description": "Subtitle for clear button" - }, - "libraryClearConfirmTitle": "Clear Library", - "@libraryClearConfirmTitle": { - "description": "Dialog title for clear confirmation" - }, - "libraryClearConfirmMessage": "This will remove all scanned tracks from your library. Your actual music files will not be deleted.", - "@libraryClearConfirmMessage": { - "description": "Dialog message for clear confirmation" - }, - "libraryAbout": "About Local Library", - "@libraryAbout": { - "description": "Section header for about info" - }, - "libraryAboutDescription": "Scans your existing music collection to detect duplicates when downloading. Supports FLAC, M4A, MP3, Opus, and OGG formats. Metadata is read from file tags when available.", - "@libraryAboutDescription": { - "description": "Description of local library feature" - }, - "libraryTracksUnit": "{count, plural, =1{track} other{tracks}}", - "@libraryTracksUnit": { - "description": "Unit label for tracks count (without the number itself)", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryLastScanned": "Last scanned: {time}", - "@libraryLastScanned": { - "description": "Last scan time display", - "placeholders": { - "time": { - "type": "String" - } - } - }, - "libraryLastScannedNever": "Never", - "@libraryLastScannedNever": { - "description": "Shown when library has never been scanned" - }, - "libraryScanning": "Scanning...", - "@libraryScanning": { - "description": "Status during scan" - }, - "libraryScanProgress": "{progress}% of {total} files", - "@libraryScanProgress": { - "description": "Scan progress display", - "placeholders": { - "progress": { - "type": "String" - }, - "total": { - "type": "int" - } - } - }, - "libraryInLibrary": "In Library", - "@libraryInLibrary": { - "description": "Badge shown on tracks that exist in local library" - }, - "libraryRemovedMissingFiles": "Removed {count} missing files from library", - "@libraryRemovedMissingFiles": { - "description": "Snackbar after cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "libraryCleared": "Library cleared", - "@libraryCleared": { - "description": "Snackbar after clearing library" - }, - "libraryStorageAccessRequired": "Storage Access Required", - "@libraryStorageAccessRequired": { - "description": "Dialog title for storage permission" - }, - "libraryStorageAccessMessage": "SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.", - "@libraryStorageAccessMessage": { - "description": "Dialog message for storage permission" - }, - "libraryFolderNotExist": "Selected folder does not exist", - "@libraryFolderNotExist": { - "description": "Error when folder doesn't exist" - }, - "librarySourceDownloaded": "Downloaded", - "@librarySourceDownloaded": { - "description": "Badge for tracks downloaded via SpotiFLAC" - }, - "librarySourceLocal": "Local", - "@librarySourceLocal": { - "description": "Badge for tracks from local library scan" - }, - "libraryFilterAll": "All", - "@libraryFilterAll": { - "description": "Filter chip - show all library items" - }, - "libraryFilterDownloaded": "Downloaded", - "@libraryFilterDownloaded": { - "description": "Filter chip - show only downloaded items" - }, - "libraryFilterLocal": "Local", - "@libraryFilterLocal": { - "description": "Filter chip - show only local library items" - }, - "libraryFilterTitle": "Filters", - "@libraryFilterTitle": { - "description": "Filter bottom sheet title" - }, - "libraryFilterReset": "Reset", - "@libraryFilterReset": { - "description": "Reset all filters button" - }, - "libraryFilterApply": "Apply", - "@libraryFilterApply": { - "description": "Apply filters button" - }, - "libraryFilterSource": "Source", - "@libraryFilterSource": { - "description": "Filter section - source type" - }, - "libraryFilterQuality": "Quality", - "@libraryFilterQuality": { - "description": "Filter section - audio quality" - }, - "libraryFilterQualityHiRes": "Hi-Res (24bit)", - "@libraryFilterQualityHiRes": { - "description": "Filter option - high resolution audio" - }, - "libraryFilterQualityCD": "CD (16bit)", - "@libraryFilterQualityCD": { - "description": "Filter option - CD quality audio" - }, - "libraryFilterQualityLossy": "Lossy", - "@libraryFilterQualityLossy": { - "description": "Filter option - lossy compressed audio" - }, - "libraryFilterFormat": "Format", - "@libraryFilterFormat": { - "description": "Filter section - file format" - }, - "libraryFilterSort": "Sort", - "@libraryFilterSort": { - "description": "Filter section - sort order" - }, - "libraryFilterSortLatest": "Latest", - "@libraryFilterSortLatest": { - "description": "Sort option - newest first" - }, - "libraryFilterSortOldest": "Oldest", - "@libraryFilterSortOldest": { - "description": "Sort option - oldest first" - }, - "timeJustNow": "Just now", - "@timeJustNow": { - "description": "Relative time - less than a minute ago" - }, - "timeMinutesAgo": "{count, plural, =1{1 minute ago} other{{count} minutes ago}}", - "@timeMinutesAgo": { - "description": "Relative time - minutes ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "timeHoursAgo": "{count, plural, =1{1 hour ago} other{{count} hours ago}}", - "@timeHoursAgo": { - "description": "Relative time - hours ago", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "tutorialWelcomeTitle": "Welcome to SpotiFLAC!", - "@tutorialWelcomeTitle": { - "description": "Tutorial welcome page title" - }, - "tutorialWelcomeDesc": "Let's learn how to download your favorite music in lossless quality. This quick tutorial will show you the basics.", - "@tutorialWelcomeDesc": { - "description": "Tutorial welcome page description" - }, - "tutorialWelcomeTip1": "Download music from Spotify, Deezer, or paste any supported URL", - "@tutorialWelcomeTip1": { - "description": "Tutorial welcome tip 1" - }, - "tutorialWelcomeTip2": "Get FLAC quality audio from Tidal, Qobuz, or Amazon Music", - "@tutorialWelcomeTip2": { - "description": "Tutorial welcome tip 2" - }, - "tutorialWelcomeTip3": "Automatic metadata, cover art, and lyrics embedding", - "@tutorialWelcomeTip3": { - "description": "Tutorial welcome tip 3" - }, - "tutorialSearchTitle": "Finding Music", - "@tutorialSearchTitle": { - "description": "Tutorial search page title" - }, - "tutorialSearchDesc": "There are two easy ways to find music you want to download.", - "@tutorialSearchDesc": { - "description": "Tutorial search page description" - }, - "tutorialDownloadTitle": "Downloading Music", - "@tutorialDownloadTitle": { - "description": "Tutorial download page title" - }, - "tutorialDownloadDesc": "Downloading music is simple and fast. Here's how it works.", - "@tutorialDownloadDesc": { - "description": "Tutorial download page description" - }, - "tutorialLibraryTitle": "Your Library", - "@tutorialLibraryTitle": { - "description": "Tutorial library page title" - }, - "tutorialLibraryDesc": "All your downloaded music is organized in the Library tab.", - "@tutorialLibraryDesc": { - "description": "Tutorial library page description" - }, - "tutorialLibraryTip1": "View download progress and queue in the Library tab", - "@tutorialLibraryTip1": { - "description": "Tutorial library tip 1" - }, - "tutorialLibraryTip2": "Tap any track to play it with your music player", - "@tutorialLibraryTip2": { - "description": "Tutorial library tip 2" - }, - "tutorialLibraryTip3": "Switch between list and grid view for better browsing", - "@tutorialLibraryTip3": { - "description": "Tutorial library tip 3" - }, - "tutorialExtensionsTitle": "Extensions", - "@tutorialExtensionsTitle": { - "description": "Tutorial extensions page title" - }, - "tutorialExtensionsDesc": "Extend the app's capabilities with community extensions.", - "@tutorialExtensionsDesc": { - "description": "Tutorial extensions page description" - }, - "tutorialExtensionsTip1": "Browse the Store tab to discover useful extensions", - "@tutorialExtensionsTip1": { - "description": "Tutorial extensions tip 1" - }, - "tutorialExtensionsTip2": "Add new download providers or search sources", - "@tutorialExtensionsTip2": { - "description": "Tutorial extensions tip 2" - }, - "tutorialExtensionsTip3": "Get lyrics, enhanced metadata, and more features", - "@tutorialExtensionsTip3": { - "description": "Tutorial extensions tip 3" - }, - "tutorialSettingsTitle": "Customize Your Experience", - "@tutorialSettingsTitle": { - "description": "Tutorial settings page title" - }, - "tutorialSettingsDesc": "Personalize the app in Settings to match your preferences.", - "@tutorialSettingsDesc": { - "description": "Tutorial settings page description" - }, - "tutorialSettingsTip1": "Change download location and folder organization", - "@tutorialSettingsTip1": { - "description": "Tutorial settings tip 1" - }, - "tutorialSettingsTip2": "Set default audio quality and format preferences", - "@tutorialSettingsTip2": { - "description": "Tutorial settings tip 2" - }, - "tutorialSettingsTip3": "Customize app theme and appearance", - "@tutorialSettingsTip3": { - "description": "Tutorial settings tip 3" - }, - "tutorialReadyMessage": "You're all set! Start downloading your favorite music now.", - "@tutorialReadyMessage": { - "description": "Tutorial completion message" - }, - "libraryForceFullScan": "Force Full Scan", - "@libraryForceFullScan": { - "description": "Button to force a complete rescan of library" - }, - "libraryForceFullScanSubtitle": "Rescan all files, ignoring cache", - "@libraryForceFullScanSubtitle": { - "description": "Subtitle for force full scan button" - }, - "cleanupOrphanedDownloads": "Cleanup Orphaned Downloads", - "@cleanupOrphanedDownloads": { - "description": "Button to remove history entries for deleted files" - }, - "cleanupOrphanedDownloadsSubtitle": "Remove history entries for files that no longer exist", - "@cleanupOrphanedDownloadsSubtitle": { - "description": "Subtitle for orphaned cleanup button" - }, - "cleanupOrphanedDownloadsResult": "Removed {count} orphaned entries from history", - "@cleanupOrphanedDownloadsResult": { - "description": "Snackbar after orphan cleanup", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cleanupOrphanedDownloadsNone": "No orphaned entries found", - "@cleanupOrphanedDownloadsNone": { - "description": "Snackbar when no orphans found" - }, - "cacheTitle": "Storage & Cache", - "@cacheTitle": { - "description": "Cache management page title" - }, - "cacheSummaryTitle": "Cache overview", - "@cacheSummaryTitle": { - "description": "Heading for cache summary card" - }, - "cacheSummarySubtitle": "Clearing cache will not remove downloaded music files.", - "@cacheSummarySubtitle": { - "description": "Helper text for cache summary card" - }, - "cacheEstimatedTotal": "Estimated cache usage: {size}", - "@cacheEstimatedTotal": { - "description": "Total cache size shown in summary", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheSectionStorage": "Cached Data", - "@cacheSectionStorage": { - "description": "Section header for cache entries" - }, - "cacheSectionMaintenance": "Maintenance", - "@cacheSectionMaintenance": { - "description": "Section header for cleanup actions" - }, - "cacheAppDirectory": "App cache directory", - "@cacheAppDirectory": { - "description": "Cache item title for app cache directory" - }, - "cacheAppDirectoryDesc": "HTTP responses, WebView data, and other temporary app data.", - "@cacheAppDirectoryDesc": { - "description": "Description of what app cache directory contains" - }, - "cacheTempDirectory": "Temporary directory", - "@cacheTempDirectory": { - "description": "Cache item title for temporary files directory" - }, - "cacheTempDirectoryDesc": "Temporary files from downloads and audio conversion.", - "@cacheTempDirectoryDesc": { - "description": "Description of what temporary directory contains" - }, - "cacheCoverImage": "Cover image cache", - "@cacheCoverImage": { - "description": "Cache item title for persistent cover images" - }, - "cacheCoverImageDesc": "Downloaded album and track cover art. Will re-download when viewed.", - "@cacheCoverImageDesc": { - "description": "Description of what cover image cache contains" - }, - "cacheLibraryCover": "Library cover cache", - "@cacheLibraryCover": { - "description": "Cache item title for local library cover art images" - }, - "cacheLibraryCoverDesc": "Cover art extracted from local music files. Will re-extract on next scan.", - "@cacheLibraryCoverDesc": { - "description": "Description of what library cover cache contains" - }, - "cacheExploreFeed": "Explore feed cache", - "@cacheExploreFeed": { - "description": "Cache item title for explore home feed cache" - }, - "cacheExploreFeedDesc": "Explore tab content (new releases, trending). Will refresh on next visit.", - "@cacheExploreFeedDesc": { - "description": "Description of what explore feed cache contains" - }, - "cacheTrackLookup": "Track lookup cache", - "@cacheTrackLookup": { - "description": "Cache item title for track ID lookup cache" - }, - "cacheTrackLookupDesc": "Spotify/Deezer track ID lookups. Clearing may slow next few searches.", - "@cacheTrackLookupDesc": { - "description": "Description of what track lookup cache contains" - }, - "cacheCleanupUnusedDesc": "Remove orphaned download history and library entries for missing files.", - "@cacheCleanupUnusedDesc": { - "description": "Description of what cleanup unused data does" - }, - "cacheNoData": "No cached data", - "@cacheNoData": { - "description": "Label when cache category has no data" - }, - "cacheSizeWithFiles": "{size} in {count} files", - "@cacheSizeWithFiles": { - "description": "Cache size and file count", - "placeholders": { - "size": { - "type": "String" - }, - "count": { - "type": "int" - } - } - }, - "cacheSizeOnly": "{size}", - "@cacheSizeOnly": { - "description": "Cache size only", - "placeholders": { - "size": { - "type": "String" - } - } - }, - "cacheEntries": "{count} entries", - "@cacheEntries": { - "description": "Track cache entry count", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "cacheClearSuccess": "Cleared: {target}", - "@cacheClearSuccess": { - "description": "Snackbar after clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearConfirmTitle": "Clear cache?", - "@cacheClearConfirmTitle": { - "description": "Dialog title before clearing one cache category" - }, - "cacheClearConfirmMessage": "This will clear cached data for {target}. Downloaded music files will not be deleted.", - "@cacheClearConfirmMessage": { - "description": "Dialog message before clearing selected cache", - "placeholders": { - "target": { - "type": "String" - } - } - }, - "cacheClearAllConfirmTitle": "Clear all cache?", - "@cacheClearAllConfirmTitle": { - "description": "Dialog title before clearing all caches" - }, - "cacheClearAllConfirmMessage": "This will clear all cache categories on this page. Downloaded music files will not be deleted.", - "@cacheClearAllConfirmMessage": { - "description": "Dialog message before clearing all caches" - }, - "cacheClearAll": "Clear all cache", - "@cacheClearAll": { - "description": "Button label to clear all caches" - }, - "cacheCleanupUnused": "Cleanup unused data", - "@cacheCleanupUnused": { - "description": "Action title for cleaning unused entries" - }, - "cacheCleanupUnusedSubtitle": "Remove orphaned download history and missing library entries", - "@cacheCleanupUnusedSubtitle": { - "description": "Subtitle for cleanup unused data action" - }, - "cacheCleanupResult": "Cleanup completed: {downloadCount} orphaned downloads, {libraryCount} missing library entries", - "@cacheCleanupResult": { - "description": "Snackbar after unused data cleanup", - "placeholders": { - "downloadCount": { - "type": "int" - }, - "libraryCount": { - "type": "int" - } - } - }, - "cacheRefreshStats": "Refresh stats", - "@cacheRefreshStats": { - "description": "Button label to refresh cache statistics" - }, - "trackSaveCoverArt": "Save Cover Art", - "@trackSaveCoverArt": { - "description": "Menu action - save album cover art as file" - }, - "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" - }, - "trackReEnrich": "Re-enrich", - "@trackReEnrich": { - "description": "Menu action - re-embed metadata into audio file" - }, - "trackReEnrichOnlineSubtitle": "Search metadata online and embed into file", - "@trackReEnrichOnlineSubtitle": { - "description": "Subtitle for re-enrich metadata action for local items" - }, - "trackEditMetadata": "Edit Metadata", - "@trackEditMetadata": { - "description": "Menu action - edit embedded metadata" - }, - "trackCoverSaved": "Cover art saved to {fileName}", - "@trackCoverSaved": { - "description": "Snackbar after cover art saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackCoverNoSource": "No cover art source available", - "@trackCoverNoSource": { - "description": "Snackbar when no cover art URL or embedded cover" - }, - "trackLyricsSaved": "Lyrics saved to {fileName}", - "@trackLyricsSaved": { - "description": "Snackbar after lyrics saved", - "placeholders": { - "fileName": { - "type": "String" - } - } - }, - "trackReEnrichProgress": "Re-enriching metadata...", - "@trackReEnrichProgress": { - "description": "Snackbar while re-enriching metadata" - }, - "trackReEnrichSearching": "Searching metadata online...", - "@trackReEnrichSearching": { - "description": "Snackbar while searching metadata from internet for local items" - }, - "trackReEnrichSuccess": "Metadata re-enriched successfully", - "@trackReEnrichSuccess": { - "description": "Snackbar after successful re-enrichment" - }, - "trackReEnrichFfmpegFailed": "FFmpeg metadata embed failed", - "@trackReEnrichFfmpegFailed": { - "description": "Snackbar when FFmpeg embed fails for MP3/Opus" - }, - "trackSaveFailed": "Failed: {error}", - "@trackSaveFailed": { - "description": "Snackbar when save operation fails", - "placeholders": { - "error": { - "type": "String" - } - } - }, - "trackConvertFormat": "Convert Format", - "@trackConvertFormat": { - "description": "Menu item - convert audio format" - }, - "trackConvertFormatSubtitle": "Convert to MP3 or Opus", - "@trackConvertFormatSubtitle": { - "description": "Subtitle for convert format menu item" - }, - "trackConvertTitle": "Convert Audio", - "@trackConvertTitle": { - "description": "Title of convert bottom sheet" - }, - "trackConvertTargetFormat": "Target Format", - "@trackConvertTargetFormat": { - "description": "Label for format selection" - }, - "trackConvertBitrate": "Bitrate", - "@trackConvertBitrate": { - "description": "Label for bitrate selection" - }, - "trackConvertConfirmTitle": "Confirm Conversion", - "@trackConvertConfirmTitle": { - "description": "Confirmation dialog title" - }, - "trackConvertConfirmMessage": "Convert from {sourceFormat} to {targetFormat} at {bitrate}?\n\nThe original file will be deleted after conversion.", - "@trackConvertConfirmMessage": { - "description": "Confirmation dialog message", - "placeholders": { - "sourceFormat": { - "type": "String" - }, - "targetFormat": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "trackConvertConverting": "Converting audio...", - "@trackConvertConverting": { - "description": "Snackbar while converting" - }, - "trackConvertSuccess": "Converted to {format} successfully", - "@trackConvertSuccess": { - "description": "Snackbar after successful conversion", - "placeholders": { - "format": { - "type": "String" - } - } - }, - "trackConvertFailed": "Conversion failed", - "@trackConvertFailed": { - "description": "Snackbar when conversion fails" - }, - "actionCreate": "Create", - "@actionCreate": { - "description": "Generic action button - create" - }, - "collectionFoldersTitle": "My folders", - "@collectionFoldersTitle": { - "description": "Library section title for custom folders" - }, - "collectionWishlist": "Wishlist", - "@collectionWishlist": { - "description": "Custom folder for saved tracks to download later" - }, - "collectionLoved": "Loved", - "@collectionLoved": { - "description": "Custom folder for favorite tracks" - }, - "collectionPlaylists": "Playlists", - "@collectionPlaylists": { - "description": "Custom user playlists folder" - }, - "collectionPlaylist": "Playlist", - "@collectionPlaylist": { - "description": "Single playlist label" - }, - "collectionAddToPlaylist": "Add to playlist", - "@collectionAddToPlaylist": { - "description": "Action to add a track to user playlist" - }, - "collectionCreatePlaylist": "Create playlist", - "@collectionCreatePlaylist": { - "description": "Action to create a new playlist" - }, - "collectionNoPlaylistsYet": "No playlists yet", - "@collectionNoPlaylistsYet": { - "description": "Empty state title when user has no playlists" - }, - "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", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "collectionAddedToPlaylist": "Added to \"{playlistName}\"", - "@collectionAddedToPlaylist": { - "description": "Snackbar after adding track to playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionAlreadyInPlaylist": "Already in \"{playlistName}\"", - "@collectionAlreadyInPlaylist": { - "description": "Snackbar when track already exists in playlist", - "placeholders": { - "playlistName": { - "type": "String" - } - } - }, - "collectionPlaylistCreated": "Playlist created", - "@collectionPlaylistCreated": { - "description": "Snackbar after creating playlist" - }, - "collectionPlaylistNameHint": "Playlist name", - "@collectionPlaylistNameHint": { - "description": "Hint text for playlist name input" - }, - "collectionPlaylistNameRequired": "Playlist name is required", - "@collectionPlaylistNameRequired": { - "description": "Validation error for empty playlist name" - }, - "collectionRenamePlaylist": "Rename playlist", - "@collectionRenamePlaylist": { - "description": "Action to rename playlist" - }, - "collectionDeletePlaylist": "Delete playlist", - "@collectionDeletePlaylist": { - "description": "Action to delete playlist" - }, - "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" - }, - "collectionWishlistEmptyTitle": "Wishlist is empty", - "@collectionWishlistEmptyTitle": { - "description": "Wishlist empty state title" - }, - "collectionWishlistEmptySubtitle": "Tap + on tracks to save what you want to download later", - "@collectionWishlistEmptySubtitle": { - "description": "Wishlist empty state subtitle" - }, - "collectionLovedEmptyTitle": "Loved folder is empty", - "@collectionLovedEmptyTitle": { - "description": "Loved empty state title" - }, - "collectionLovedEmptySubtitle": "Tap love on tracks to keep your favorites", - "@collectionLovedEmptySubtitle": { - "description": "Loved empty state subtitle" - }, - "collectionPlaylistEmptyTitle": "Playlist is empty", - "@collectionPlaylistEmptyTitle": { - "description": "Playlist empty state title" - }, - "collectionPlaylistEmptySubtitle": "Long-press + on any track to add it here", - "@collectionPlaylistEmptySubtitle": { - "description": "Playlist empty state subtitle" - }, - "collectionRemoveFromPlaylist": "Remove from playlist", - "@collectionRemoveFromPlaylist": { - "description": "Tooltip for removing track from playlist" - }, - "collectionRemoveFromFolder": "Remove from folder", - "@collectionRemoveFromFolder": { - "description": "Tooltip for removing track from wishlist/loved folder" - }, - "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", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromLoved": "\"{trackName}\" removed from Loved", - "@collectionRemovedFromLoved": { - "description": "Snackbar after removing track from loved folder", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionAddedToWishlist": "\"{trackName}\" added to Wishlist", - "@collectionAddedToWishlist": { - "description": "Snackbar after adding track to wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "collectionRemovedFromWishlist": "\"{trackName}\" removed from Wishlist", - "@collectionRemovedFromWishlist": { - "description": "Snackbar after removing track from wishlist", - "placeholders": { - "trackName": { - "type": "String" - } - } - }, - "trackOptionAddToLoved": "Add to Loved", - "@trackOptionAddToLoved": { - "description": "Bottom sheet action label - add track to loved folder" - }, - "trackOptionRemoveFromLoved": "Remove from Loved", - "@trackOptionRemoveFromLoved": { - "description": "Bottom sheet action label - remove track from loved folder" - }, - "trackOptionAddToWishlist": "Add to Wishlist", - "@trackOptionAddToWishlist": { - "description": "Bottom sheet action label - add track to wishlist" - }, - "trackOptionRemoveFromWishlist": "Remove from Wishlist", - "@trackOptionRemoveFromWishlist": { - "description": "Bottom sheet action label - remove track from wishlist" - }, - "collectionPlaylistChangeCover": "Change cover image", - "@collectionPlaylistChangeCover": { - "description": "Bottom sheet action to pick a custom cover image for a playlist" - }, - "collectionPlaylistRemoveCover": "Remove cover image", - "@collectionPlaylistRemoveCover": { - "description": "Bottom sheet action to remove custom cover image from a playlist" - }, - "selectionShareCount": "Share {count} {count, plural, =1{track} other{tracks}}", - "@selectionShareCount": { - "description": "Share button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionShareNoFiles": "No shareable files found", - "@selectionShareNoFiles": { - "description": "Snackbar when no selected files exist on disk" - }, - "selectionConvertCount": "Convert {count} {count, plural, =1{track} other{tracks}}", - "@selectionConvertCount": { - "description": "Convert button text with count in selection mode", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "selectionConvertNoConvertible": "No convertible tracks selected", - "@selectionConvertNoConvertible": { - "description": "Snackbar when no selected tracks support conversion" - }, - "selectionBatchConvertConfirmTitle": "Batch Convert", - "@selectionBatchConvertConfirmTitle": { - "description": "Confirmation dialog title for batch conversion" - }, - "selectionBatchConvertConfirmMessage": "Convert {count} {count, plural, =1{track} other{tracks}} to {format} at {bitrate}?\n\nOriginal files will be deleted after conversion.", - "@selectionBatchConvertConfirmMessage": { - "description": "Confirmation dialog message for batch conversion", - "placeholders": { - "count": { - "type": "int" - }, - "format": { - "type": "String" - }, - "bitrate": { - "type": "String" - } - } - }, - "selectionBatchConvertProgress": "Converting {current} of {total}...", - "@selectionBatchConvertProgress": { - "description": "Snackbar during batch conversion progress", - "placeholders": { - "current": { - "type": "int" - }, - "total": { - "type": "int" - } - } - }, - "selectionBatchConvertSuccess": "Converted {success} of {total} tracks to {format}", - "@selectionBatchConvertSuccess": { - "description": "Snackbar after batch conversion completes", - "placeholders": { - "success": { - "type": "int" - }, - "total": { - "type": "int" - }, - "format": { - "type": "String" - } - } - }, - "downloadedAlbumDownloadedCount": "{count} downloaded", - "@downloadedAlbumDownloadedCount": { - "description": "Downloaded tracks count badge", - "placeholders": { - "count": { - "type": "int" - } - } - }, - "downloadUseAlbumArtistForFoldersAlbumSubtitle": "Artist folders use Album Artist when available", - "@downloadUseAlbumArtistForFoldersAlbumSubtitle": { - "description": "Subtitle when Album Artist is used for folder naming" - }, - "downloadUseAlbumArtistForFoldersTrackSubtitle": "Artist folders use Track Artist only", - "@downloadUseAlbumArtistForFoldersTrackSubtitle": { - "description": "Subtitle when Track Artist is used for folder naming" - } -} \ No newline at end of file diff --git a/lib/l10n/arb/app_zh_CN.arb b/lib/l10n/arb/app_zh_CN.arb index 5b4dd487..d7a9c1aa 100644 --- a/lib/l10n/arb/app_zh_CN.arb +++ b/lib/l10n/arb/app_zh_CN.arb @@ -1,5 +1,5 @@ { - "@@locale": "zh-CN", + "@@locale": "zh_CN", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/l10n/arb/app_zh_TW.arb b/lib/l10n/arb/app_zh_TW.arb index d33658af..b51686c0 100644 --- a/lib/l10n/arb/app_zh_TW.arb +++ b/lib/l10n/arb/app_zh_TW.arb @@ -1,5 +1,5 @@ { - "@@locale": "zh-TW", + "@@locale": "zh_TW", "@@last_modified": "2026-01-16", "appName": "SpotiFLAC", "@appName": { diff --git a/lib/providers/track_provider.dart b/lib/providers/track_provider.dart index 271f22f7..8ba3f33b 100644 --- a/lib/providers/track_provider.dart +++ b/lib/providers/track_provider.dart @@ -457,6 +457,19 @@ class TrackNotifier extends Notifier { return; } + // If URL doesn't match any known service, it's unrecognized + final isSpotifyUrl = url.contains('open.spotify.com') || + url.contains('spotify.link') || + url.startsWith('spotify:'); + if (!isSpotifyUrl) { + state = TrackState( + isLoading: false, + error: 'url_not_recognized', + hasSearchText: state.hasSearchText, + ); + return; + } + final parsed = await PlatformBridge.parseSpotifyUrl(url); if (!_isRequestValid(requestId)) return; diff --git a/lib/screens/home_tab.dart b/lib/screens/home_tab.dart index f1c3f807..65e8fcec 100644 --- a/lib/screens/home_tab.dart +++ b/lib/screens/home_tab.dart @@ -583,7 +583,25 @@ class _HomeTabState extends ConsumerState if (url.isEmpty) return; if (url.startsWith('http') || url.startsWith('spotify:')) { await ref.read(trackProvider.notifier).fetchFromUrl(url); - _navigateToDetailIfNeeded(); + final trackState = ref.read(trackProvider); + if (trackState.error != null && mounted) { + final l10n = context.l10n; + final errorMsg = trackState.error!; + final isRateLimit = errorMsg.contains('429') || + errorMsg.toLowerCase().contains('rate limit') || + errorMsg.toLowerCase().contains('too many requests'); + final displayMessage = errorMsg == 'url_not_recognized' + ? l10n.errorUrlNotRecognizedMessage + : isRateLimit + ? l10n.errorRateLimitedMessage + : l10n.errorUrlFetchFailed; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(displayMessage)), + ); + ref.read(trackProvider.notifier).clear(); + } else { + _navigateToDetailIfNeeded(); + } } else { final settings = ref.read(settingsProvider); await ref @@ -1262,7 +1280,8 @@ class _HomeTabState extends ConsumerState (searchArtists != null && searchArtists.isNotEmpty) || (searchAlbums != null && searchAlbums.isNotEmpty) || (searchPlaylists != null && searchPlaylists.isNotEmpty) || - isLoading; + isLoading || + error != null; return SliverMainAxisGroup( slivers: _buildSearchResults( @@ -2224,11 +2243,14 @@ class _HomeTabState extends ConsumerState } Widget _buildErrorWidget(String error, ColorScheme colorScheme) { + final l10n = context.l10n; final isRateLimit = error.contains('429') || error.toLowerCase().contains('rate limit') || error.toLowerCase().contains('too many requests'); + final isUrlNotRecognized = error == 'url_not_recognized'; + if (isRateLimit) { return Card( elevation: 0, @@ -2245,7 +2267,7 @@ class _HomeTabState extends ConsumerState crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - 'Rate Limited', + l10n.errorRateLimited, style: TextStyle( color: colorScheme.onErrorContainer, fontWeight: FontWeight.bold, @@ -2253,7 +2275,7 @@ class _HomeTabState extends ConsumerState ), const SizedBox(height: 4), Text( - 'Too many requests. Please wait a moment before searching again.', + l10n.errorRateLimitedMessage, style: TextStyle( color: colorScheme.onErrorContainer, fontSize: 12, @@ -2268,6 +2290,45 @@ class _HomeTabState extends ConsumerState ); } + if (isUrlNotRecognized) { + return Card( + elevation: 0, + color: colorScheme.errorContainer.withValues(alpha: 0.5), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)), + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Icon(Icons.link_off, color: colorScheme.error), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + l10n.errorUrlNotRecognized, + style: TextStyle( + color: colorScheme.error, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 4), + Text( + l10n.errorUrlNotRecognizedMessage, + style: TextStyle( + color: colorScheme.error, + fontSize: 12, + ), + ), + ], + ), + ), + ], + ), + ), + ); + } + return Card( elevation: 0, color: colorScheme.errorContainer.withValues(alpha: 0.5), @@ -2279,7 +2340,10 @@ class _HomeTabState extends ConsumerState Icon(Icons.error_outline, color: colorScheme.error), const SizedBox(width: 12), Expanded( - child: Text(error, style: TextStyle(color: colorScheme.error)), + child: Text( + l10n.errorUrlFetchFailed, + style: TextStyle(color: colorScheme.error), + ), ), ], ), diff --git a/lib/screens/main_shell.dart b/lib/screens/main_shell.dart index e103c6a1..b77fee99 100644 --- a/lib/screens/main_shell.dart +++ b/lib/screens/main_shell.dart @@ -102,13 +102,29 @@ class _MainShellState extends ConsumerState { if (_currentIndex != 0) { _onNavTap(0); } - ref.read(trackProvider.notifier).fetchFromUrl(url); ref.read(settingsProvider.notifier).setHasSearchedBefore(); if (mounted) { ScaffoldMessenger.of( context, ).showSnackBar(SnackBar(content: Text(context.l10n.loadingSharedLink))); } + await ref.read(trackProvider.notifier).fetchFromUrl(url); + final trackState = ref.read(trackProvider); + if (trackState.error != null && mounted) { + final l10n = context.l10n; + final errorMsg = trackState.error!; + final isRateLimit = errorMsg.contains('429') || + errorMsg.toLowerCase().contains('rate limit') || + errorMsg.toLowerCase().contains('too many requests'); + final displayMessage = errorMsg == 'url_not_recognized' + ? l10n.errorUrlNotRecognizedMessage + : isRateLimit + ? l10n.errorRateLimitedMessage + : l10n.errorUrlFetchFailed; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text(displayMessage)), + ); + } } Future _checkForUpdates() async {