fix: show error feedback for unrecognized URLs and fix l10n warnings

This commit is contained in:
zarzet
2026-03-08 23:12:48 +07:00
parent 808083c938
commit a4899144c5
26 changed files with 1630 additions and 10206 deletions
+18
View File
@@ -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:
File diff suppressed because it is too large Load Diff
+11
View File
@@ -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';
+11
View File
@@ -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';
+13 -2
View File
@@ -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 =>
+13 -2
View File
@@ -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 =>
+88 -78
View File
@@ -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
+93 -81
View File
@@ -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';
File diff suppressed because it is too large Load Diff
+13 -2
View File
@@ -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 =>
+11
View File
@@ -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';
+130 -109
View File
@@ -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 =>
+11
View File
@@ -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ğı';
+473 -4
View File
@@ -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';
+9 -9
View File
@@ -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": {
+12
View File
@@ -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",
File diff suppressed because it is too large Load Diff
+12
View File
@@ -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",
File diff suppressed because it is too large Load Diff
+11 -11
View File
@@ -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": {
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,5 +1,5 @@
{
"@@locale": "zh-CN",
"@@locale": "zh_CN",
"@@last_modified": "2026-01-16",
"appName": "SpotiFLAC",
"@appName": {
+1 -1
View File
@@ -1,5 +1,5 @@
{
"@@locale": "zh-TW",
"@@locale": "zh_TW",
"@@last_modified": "2026-01-16",
"appName": "SpotiFLAC",
"@appName": {
+13
View File
@@ -457,6 +457,19 @@ class TrackNotifier extends Notifier<TrackState> {
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;
+69 -5
View File
@@ -583,7 +583,25 @@ class _HomeTabState extends ConsumerState<HomeTab>
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<HomeTab>
(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<HomeTab>
}
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<HomeTab>
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<HomeTab>
),
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<HomeTab>
);
}
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<HomeTab>
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),
),
),
],
),
+17 -1
View File
@@ -102,13 +102,29 @@ class _MainShellState extends ConsumerState<MainShell> {
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<void> _checkForUpdates() async {