diff --git a/.fvmrc b/.fvmrc index 5c08b3bc..3a62807c 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,3 +1,3 @@ { "flutter": "3.38.1" -} \ No newline at end of file +} diff --git a/.gitignore b/.gitignore index 517be8ed..b24e9371 100644 --- a/.gitignore +++ b/.gitignore @@ -79,4 +79,4 @@ tool/ .claude/settings.local.json # FVM Version Cache -.fvm/ \ No newline at end of file +.fvm/ diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 53bcba7f..ce8174e2 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -1066,6 +1066,12 @@ abstract class AppLocalizations { /// **'Import'** String get dialogImport; + /// Confirm button in Download All dialog + /// + /// In en, this message translates to: + /// **'Download'** + String get dialogDownload; + /// Dialog button - discard changes /// /// In en, this message translates to: @@ -4434,7 +4440,7 @@ abstract class AppLocalizations { /// **'Added {count} tracks to Loved'** String snackbarAddedTracksToLoved(int count); - /// Title of the Download All confirmation dialog + /// Dialog title for bulk download confirmation /// /// In en, this message translates to: /// **'Download All'** @@ -4446,12 +4452,6 @@ abstract class AppLocalizations { /// **'Download {count} tracks?'** String dialogDownloadAllMessage(int count); - /// Confirm button in Download All dialog - /// - /// In en, this message translates to: - /// **'Download'** - String get dialogDownload; - /// Checkbox label in import dialog to skip already-downloaded songs /// /// In en, this message translates to: @@ -4817,6 +4817,36 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Refresh'** String get cacheRefresh; + + /// Dialog message for bulk playlist download confirmation + /// + /// In en, this message translates to: + /// **'Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?'** + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount); + + /// Button label for bulk downloading selected playlists + /// + /// In en, this message translates to: + /// **'Download {count} {count, plural, =1{playlist} other{playlists}}'** + String bulkDownloadPlaylistsButton(int count); + + /// Button label when no playlists are selected for download + /// + /// In en, this message translates to: + /// **'Select playlists to download'** + String get bulkDownloadSelectPlaylists; + + /// Snackbar when selected playlists contain no tracks + /// + /// In en, this message translates to: + /// **'Selected playlists have no tracks'** + String get snackbarSelectedPlaylistsEmpty; + + /// Playlist count display + /// + /// In en, this message translates to: + /// **'{count, plural, =1{1 playlist} other{{count} playlists}}'** + String playlistsCount(int count); } class _AppLocalizationsDelegate diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index a3d43076..b913d844 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -536,6 +536,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get dialogImport => 'Importieren'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Verwerfen'; @@ -2580,9 +2583,6 @@ class AppLocalizationsDe extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2790,4 +2790,50 @@ class AppLocalizationsDe extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 03adf67d..07e3ca2d 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -525,6 +525,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsEn extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,4 +2762,50 @@ class AppLocalizationsEn extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index c953dbc8..8a5a974b 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -525,6 +525,9 @@ class AppLocalizationsEs extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsEs extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,6 +2762,52 @@ class AppLocalizationsEs extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } /// The translations for Spanish Castilian, as used in Spain (`es_ES`). diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 4baf9cba..68d677e1 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -527,6 +527,9 @@ class AppLocalizationsFr extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2554,9 +2557,6 @@ class AppLocalizationsFr extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2764,4 +2764,50 @@ class AppLocalizationsFr extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 46d6572a..5da28983 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -525,6 +525,9 @@ class AppLocalizationsHi extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsHi extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,4 +2762,50 @@ class AppLocalizationsHi extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_id.dart b/lib/l10n/app_localizations_id.dart index 6aa97510..7fc8d1de 100644 --- a/lib/l10n/app_localizations_id.dart +++ b/lib/l10n/app_localizations_id.dart @@ -528,6 +528,9 @@ class AppLocalizationsId extends AppLocalizations { @override String get dialogImport => 'Impor'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Buang'; @@ -2559,9 +2562,6 @@ class AppLocalizationsId extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2769,4 +2769,50 @@ class AppLocalizationsId extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 92184e0b..04a7a0c2 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -521,6 +521,9 @@ class AppLocalizationsJa extends AppLocalizations { @override String get dialogImport => 'インポート'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => '破棄'; @@ -2539,9 +2542,6 @@ class AppLocalizationsJa extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2749,4 +2749,50 @@ class AppLocalizationsJa extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index aed486d5..80e8a1df 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -510,6 +510,9 @@ class AppLocalizationsKo extends AppLocalizations { @override String get dialogImport => '불러오기'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => '취소'; @@ -2532,9 +2535,6 @@ class AppLocalizationsKo extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2742,4 +2742,50 @@ class AppLocalizationsKo extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 87c5385a..af603f60 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -525,6 +525,9 @@ class AppLocalizationsNl extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsNl extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,4 +2762,50 @@ class AppLocalizationsNl extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index d45df4f9..fc40c186 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -525,6 +525,9 @@ class AppLocalizationsPt extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsPt extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,6 +2762,52 @@ class AppLocalizationsPt extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } /// The translations for Portuguese, as used in Portugal (`pt_PT`). diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 3e9d7e73..7a542295 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -534,6 +534,9 @@ class AppLocalizationsRu extends AppLocalizations { @override String get dialogImport => 'Импорт'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Отменить'; @@ -2611,9 +2614,6 @@ class AppLocalizationsRu extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2821,4 +2821,50 @@ class AppLocalizationsRu extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_tr.dart b/lib/l10n/app_localizations_tr.dart index 48a9a7d2..1e5727bf 100644 --- a/lib/l10n/app_localizations_tr.dart +++ b/lib/l10n/app_localizations_tr.dart @@ -530,6 +530,9 @@ class AppLocalizationsTr extends AppLocalizations { @override String get dialogImport => 'İçe aktar'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Vazgeç'; @@ -2564,9 +2567,6 @@ class AppLocalizationsTr extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2774,4 +2774,50 @@ class AppLocalizationsTr extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 2287f76a..68381882 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -525,6 +525,9 @@ class AppLocalizationsZh extends AppLocalizations { @override String get dialogImport => 'Import'; + @override + String get dialogDownload => 'Download'; + @override String get dialogDiscard => 'Discard'; @@ -2552,9 +2555,6 @@ class AppLocalizationsZh extends AppLocalizations { return 'Download $count tracks?'; } - @override - String get dialogDownload => 'Download'; - @override String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs'; @@ -2762,6 +2762,52 @@ class AppLocalizationsZh extends AppLocalizations { @override String get cacheRefresh => 'Refresh'; + + @override + String dialogDownloadPlaylistsMessage(int trackCount, int playlistCount) { + String _temp0 = intl.Intl.pluralLogic( + trackCount, + locale: localeName, + other: 'tracks', + one: 'track', + ); + String _temp1 = intl.Intl.pluralLogic( + playlistCount, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $trackCount $_temp0 from $playlistCount $_temp1?'; + } + + @override + String bulkDownloadPlaylistsButton(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'playlists', + one: 'playlist', + ); + return 'Download $count $_temp0'; + } + + @override + String get bulkDownloadSelectPlaylists => 'Select playlists to download'; + + @override + String get snackbarSelectedPlaylistsEmpty => + 'Selected playlists have no tracks'; + + @override + String playlistsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '$count playlists', + one: '1 playlist', + ); + return '$_temp0'; + } } /// The translations for Chinese, as used in China (`zh_CN`). diff --git a/lib/l10n/arb/app_en.arb b/lib/l10n/arb/app_en.arb index 10bf4938..bc3f2e13 100644 --- a/lib/l10n/arb/app_en.arb +++ b/lib/l10n/arb/app_en.arb @@ -671,6 +671,10 @@ "@dialogImport": { "description": "Dialog button - import data" }, + "dialogDownload": "Download", + "@dialogDownload": { + "description": "Dialog button - download action" + }, "dialogDiscard": "Discard", "@dialogDiscard": { "description": "Dialog button - discard changes" @@ -3657,5 +3661,47 @@ "cacheRefresh": "Refresh", "@cacheRefresh": { "description": "Tooltip for refresh button on cache management page" + }, + "dialogDownloadAllTitle": "Download All", + "@dialogDownloadAllTitle": { + "description": "Dialog title for bulk download confirmation" + }, + "dialogDownloadPlaylistsMessage": "Download {trackCount} {trackCount, plural, =1{track} other{tracks}} from {playlistCount} {playlistCount, plural, =1{playlist} other{playlists}}?", + "@dialogDownloadPlaylistsMessage": { + "description": "Dialog message for bulk playlist download confirmation", + "placeholders": { + "trackCount": { + "type": "int" + }, + "playlistCount": { + "type": "int" + } + } + }, + "bulkDownloadPlaylistsButton": "Download {count} {count, plural, =1{playlist} other{playlists}}", + "@bulkDownloadPlaylistsButton": { + "description": "Button label for bulk downloading selected playlists", + "placeholders": { + "count": { + "type": "int" + } + } + }, + "bulkDownloadSelectPlaylists": "Select playlists to download", + "@bulkDownloadSelectPlaylists": { + "description": "Button label when no playlists are selected for download" + }, + "snackbarSelectedPlaylistsEmpty": "Selected playlists have no tracks", + "@snackbarSelectedPlaylistsEmpty": { + "description": "Snackbar when selected playlists contain no tracks" + }, + "playlistsCount": "{count, plural, =1{1 playlist} other{{count} playlists}}", + "@playlistsCount": { + "description": "Playlist count display", + "placeholders": { + "count": { + "type": "int" + } + } } } diff --git a/lib/screens/queue_tab.dart b/lib/screens/queue_tab.dart index 7e3f96f9..5b14ff21 100644 --- a/lib/screens/queue_tab.dart +++ b/lib/screens/queue_tab.dart @@ -1326,7 +1326,7 @@ class _QueueTabState extends ConsumerState { if (totalTracks == 0) { ScaffoldMessenger.of(context).showSnackBar( - const SnackBar(content: Text('Selected playlists have no tracks')), + SnackBar(content: Text(context.l10n.snackbarSelectedPlaylistsEmpty)), ); return; } @@ -1334,11 +1334,9 @@ class _QueueTabState extends ConsumerState { final confirmed = await showDialog( context: context, builder: (ctx) => AlertDialog( - title: const Text('Download All'), + title: Text(ctx.l10n.dialogDownloadAllTitle), content: Text( - 'Download $totalTracks ${totalTracks == 1 ? 'track' : 'tracks'} ' - 'from ${selectedPlaylists.length} ' - '${selectedPlaylists.length == 1 ? 'playlist' : 'playlists'}?', + ctx.l10n.dialogDownloadPlaylistsMessage(totalTracks, selectedPlaylists.length), ), actions: [ TextButton( @@ -1347,7 +1345,7 @@ class _QueueTabState extends ConsumerState { ), FilledButton( onPressed: () => Navigator.pop(ctx, true), - child: const Text('Download'), + child: Text(ctx.l10n.dialogDownload), ), ], ), @@ -1374,8 +1372,8 @@ class _QueueTabState extends ConsumerState { if (settings.askQualityBeforeDownload) { DownloadServicePicker.show( context, - trackName: '$totalTracks tracks', - artistName: '${selectedPlaylists.length} playlists', + trackName: context.l10n.tracksCount(totalTracks), + artistName: context.l10n.playlistsCount(selectedPlaylists.length), onSelect: (quality, service) { enqueueAll(qualityOverride: quality, service: service); if (!mounted) return; @@ -1549,8 +1547,8 @@ class _QueueTabState extends ConsumerState { icon: const Icon(Icons.download_rounded), label: Text( selectedCount > 0 - ? 'Download $selectedCount ${selectedCount == 1 ? 'playlist' : 'playlists'}' - : 'Select playlists to download', + ? context.l10n.bulkDownloadPlaylistsButton(selectedCount) + : context.l10n.bulkDownloadSelectPlaylists, ), style: FilledButton.styleFrom( backgroundColor: selectedCount > 0