mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-08-24 11:52:40 +02:00
The Dart queue loop was already built around an activeDownloads map and per-item progress tracking but was gated to one download at a time. Add a concurrentDownloads setting (1-3, default 1) exposed in Download Settings > Performance, and let the scheduler keep up to that many items in flight. The experimental Android native worker is still strictly sequential, so it is skipped in favor of the Dart queue while concurrency is enabled.
4798 lines
118 KiB
Dart
4798 lines
118 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for Indonesian (`id`).
|
|
class AppLocalizationsId extends AppLocalizations {
|
|
AppLocalizationsId([String locale = 'id']) : super(locale);
|
|
|
|
@override
|
|
String get appName => 'SpotiFLAC Mobile';
|
|
|
|
@override
|
|
String get navHome => 'Beranda';
|
|
|
|
@override
|
|
String get navLibrary => 'Pustaka';
|
|
|
|
@override
|
|
String get navSettings => 'Pengaturan';
|
|
|
|
@override
|
|
String get navStore => 'Repositori';
|
|
|
|
@override
|
|
String get homeTitle => 'Beranda';
|
|
|
|
@override
|
|
String get homeSubtitle => 'Paste a supported URL or search by name';
|
|
|
|
@override
|
|
String get homeEmptyTitle => 'Belum ada penyedia pencarian';
|
|
|
|
@override
|
|
String get homeEmptySubtitle => 'Instal ekstensi untuk melanjutkan.';
|
|
|
|
@override
|
|
String get homeSupports => 'Mendukung: URL Track, Album, Playlist, Artis';
|
|
|
|
@override
|
|
String get homeRecent => 'Terbaru';
|
|
|
|
@override
|
|
String get historyFilterAll => 'Semua';
|
|
|
|
@override
|
|
String get historyFilterAlbums => 'Album';
|
|
|
|
@override
|
|
String get historyFilterSingles => 'Single';
|
|
|
|
@override
|
|
String get historySearchHint => 'Cari riwayat...';
|
|
|
|
@override
|
|
String get settingsTitle => 'Pengaturan';
|
|
|
|
@override
|
|
String get settingsDownload => 'Unduhan';
|
|
|
|
@override
|
|
String get settingsAppearance => 'Tampilan';
|
|
|
|
@override
|
|
String get settingsOptions => 'Opsi';
|
|
|
|
@override
|
|
String get settingsExtensions => 'Ekstensi';
|
|
|
|
@override
|
|
String get settingsAbout => 'Tentang';
|
|
|
|
@override
|
|
String get downloadTitle => 'Unduhan';
|
|
|
|
@override
|
|
String get downloadAskQualitySubtitle =>
|
|
'Tampilkan pemilih kualitas untuk setiap unduhan';
|
|
|
|
@override
|
|
String get downloadFilenameFormat => 'Format Nama File';
|
|
|
|
@override
|
|
String get downloadSingleFilenameFormat => 'Format Nama Berkas Tunggal';
|
|
|
|
@override
|
|
String get downloadSingleFilenameFormatDescription =>
|
|
'Pola nama file untuk single dan EP. Menggunakan tag yang sama dengan format album.';
|
|
|
|
@override
|
|
String get downloadFolderOrganization => 'Organisasi Folder';
|
|
|
|
@override
|
|
String get appearanceTitle => 'Tampilan';
|
|
|
|
@override
|
|
String get appearanceThemeSystem => 'Sistem';
|
|
|
|
@override
|
|
String get appearanceThemeLight => 'Terang';
|
|
|
|
@override
|
|
String get appearanceThemeDark => 'Gelap';
|
|
|
|
@override
|
|
String get appearanceDynamicColor => 'Warna Dinamis';
|
|
|
|
@override
|
|
String get appearanceDynamicColorSubtitle =>
|
|
'Gunakan warna dari wallpaper Anda';
|
|
|
|
@override
|
|
String get appearanceHistoryView => 'Tampilan Riwayat';
|
|
|
|
@override
|
|
String get appearanceHistoryViewList => 'Daftar';
|
|
|
|
@override
|
|
String get appearanceHistoryViewGrid => 'Kisi';
|
|
|
|
@override
|
|
String get optionsTitle => 'Opsi';
|
|
|
|
@override
|
|
String get optionsPrimaryProvider => 'Provider Utama';
|
|
|
|
@override
|
|
String get optionsPrimaryProviderSubtitle =>
|
|
'Layanan yang digunakan untuk mencari berdasarkan nama lagu atau album';
|
|
|
|
@override
|
|
String optionsUsingExtension(String extensionName) {
|
|
return 'Menggunakan ekstensi: $extensionName';
|
|
}
|
|
|
|
@override
|
|
String get optionsDefaultSearchTab => 'Default Search Tab';
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabSubtitle =>
|
|
'Pilih tab mana yang terbuka terlebih dahulu untuk hasil pencarian baru.';
|
|
|
|
@override
|
|
String get optionsSwitchBack =>
|
|
'Choose the default search provider to switch back from an extension';
|
|
|
|
@override
|
|
String get optionsAutoFallback => 'Cadangan Otomatis';
|
|
|
|
@override
|
|
String get optionsAutoFallbackSubtitle =>
|
|
'Coba layanan lain jika unduhan gagal';
|
|
|
|
@override
|
|
String get optionsUseExtensionProviders => 'Gunakan Provider Ekstensi';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOn =>
|
|
'Extension providers are enabled';
|
|
|
|
@override
|
|
String get optionsUseExtensionProvidersOff =>
|
|
'Extension providers are required';
|
|
|
|
@override
|
|
String get optionsEmbedLyrics => 'Sematkan Lirik';
|
|
|
|
@override
|
|
String get optionsEmbedLyricsSubtitle =>
|
|
'Simpan lirik yang disinkronkan bersama dengan lagu yang Anda unduh';
|
|
|
|
@override
|
|
String get optionsMaxQualityCover => 'Cover Kualitas Maksimal';
|
|
|
|
@override
|
|
String get optionsMaxQualityCoverSubtitle =>
|
|
'Unduh cover art resolusi tertinggi';
|
|
|
|
@override
|
|
String get optionsReplayGain => 'ReplayGain';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOn =>
|
|
'Pindai kenyaringan dan sematkan tag ReplayGain (EBU R128)';
|
|
|
|
@override
|
|
String get optionsReplayGainSubtitleOff =>
|
|
'Dinonaktifkan: tidak ada tag normalisasi kenyaringan';
|
|
|
|
@override
|
|
String get trackReplayGain => 'Rescan ReplayGain';
|
|
|
|
@override
|
|
String get trackReplayGainSubtitle =>
|
|
'Analyze loudness and write ReplayGain tags';
|
|
|
|
@override
|
|
String get trackReplayGainScanning => 'Analyzing loudness...';
|
|
|
|
@override
|
|
String get trackReplayGainSuccess => 'ReplayGain tags added';
|
|
|
|
@override
|
|
String get trackReplayGainFailed => 'Failed to add ReplayGain tags';
|
|
|
|
@override
|
|
String selectionReplayGainCount(int count) {
|
|
return 'ReplayGain ($count)';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchConfirmTitle => 'Add ReplayGain';
|
|
|
|
@override
|
|
String replayGainBatchConfirmMessage(int count) {
|
|
return 'Analyze loudness and write ReplayGain tags to $count track(s)?';
|
|
}
|
|
|
|
@override
|
|
String get replayGainBatchAnalyzing => 'Analyzing ReplayGain...';
|
|
|
|
@override
|
|
String replayGainBatchSuccess(int success, int total) {
|
|
return 'ReplayGain added to $success of $total tracks';
|
|
}
|
|
|
|
@override
|
|
String get optionsArtistTagMode => 'Mode Tag Artis';
|
|
|
|
@override
|
|
String get optionsArtistTagModeDescription =>
|
|
'Pilih bagaimana beberapa artis dicantumkan dalam tag yang disematkan.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoined => 'Nilai gabungan tunggal';
|
|
|
|
@override
|
|
String get optionsArtistTagModeJoinedSubtitle =>
|
|
'Tuliskan satu nilai ARTIS seperti \"Artis A, Artis B\" untuk kompatibilitas pemain maksimal.';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbis => 'Tag terpisah untuk FLAC/Opus';
|
|
|
|
@override
|
|
String get optionsArtistTagModeSplitVorbisSubtitle =>
|
|
'Tulis satu tag artis per artis untuk FLAC dan Opus; MP3 dan M4A tetap tergabung.';
|
|
|
|
@override
|
|
String get optionsExtensionStore => 'Extension Repo';
|
|
|
|
@override
|
|
String get optionsExtensionStoreSubtitle => 'Show Repo tab in navigation';
|
|
|
|
@override
|
|
String get optionsCheckUpdates => 'Periksa Pembaruan';
|
|
|
|
@override
|
|
String get optionsCheckUpdatesSubtitle => 'Beritahu saat versi baru tersedia';
|
|
|
|
@override
|
|
String get optionsUpdateChannel => 'Saluran Pembaruan';
|
|
|
|
@override
|
|
String get optionsUpdateChannelStable => 'Hanya rilis stabil';
|
|
|
|
@override
|
|
String get optionsUpdateChannelPreview => 'Dapatkan rilis preview';
|
|
|
|
@override
|
|
String get optionsUpdateChannelWarning =>
|
|
'Preview mungkin mengandung bug atau fitur belum lengkap';
|
|
|
|
@override
|
|
String get optionsClearHistory => 'Hapus Riwayat Unduhan';
|
|
|
|
@override
|
|
String get optionsClearHistorySubtitle => 'Hapus semua lagu dari riwayat';
|
|
|
|
@override
|
|
String get optionsDetailedLogging => 'Log Detail';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOn => 'Log detail sedang direkam';
|
|
|
|
@override
|
|
String get optionsDetailedLoggingOff => 'Aktifkan untuk laporan bug';
|
|
|
|
@override
|
|
String get optionsSpotifyCredentials => 'Kredensial Spotify';
|
|
|
|
@override
|
|
String optionsSpotifyCredentialsConfigured(String clientId) {
|
|
return 'ID Klien: $clientId...';
|
|
}
|
|
|
|
@override
|
|
String get optionsSpotifyCredentialsRequired =>
|
|
'Diperlukan - ketuk untuk mengatur';
|
|
|
|
@override
|
|
String get optionsSpotifyWarning =>
|
|
'Spotify memerlukan kredensial API Anda sendiri. Dapatkan gratis dari developer.spotify.com';
|
|
|
|
@override
|
|
String get optionsSpotifyDeprecationWarning =>
|
|
'Pencarian Spotify akan dihentikan pada 3 Maret 2026 karena perubahan API Spotify. Silakan beralih ke Deezer.';
|
|
|
|
@override
|
|
String get extensionsTitle => 'Ekstensi';
|
|
|
|
@override
|
|
String get extensionsDisabled => 'Nonaktif';
|
|
|
|
@override
|
|
String extensionsVersion(String version) {
|
|
return 'Versi $version';
|
|
}
|
|
|
|
@override
|
|
String extensionsAuthor(String author) {
|
|
return 'oleh $author';
|
|
}
|
|
|
|
@override
|
|
String get extensionsUninstall => 'Copot';
|
|
|
|
@override
|
|
String get storeTitle => 'Extension Repo';
|
|
|
|
@override
|
|
String get storeSearch => 'Cari ekstensi...';
|
|
|
|
@override
|
|
String get storeInstall => 'Pasang';
|
|
|
|
@override
|
|
String get storeInstalled => 'Terpasang';
|
|
|
|
@override
|
|
String get storeUpdate => 'Perbarui';
|
|
|
|
@override
|
|
String get aboutTitle => 'Tentang';
|
|
|
|
@override
|
|
String get aboutContributors => 'Kontributor';
|
|
|
|
@override
|
|
String get aboutMobileDeveloper => 'Pengembang versi mobile';
|
|
|
|
@override
|
|
String get aboutOriginalCreator => 'Pembuat SpotiFLAC asli';
|
|
|
|
@override
|
|
String get aboutLogoArtist =>
|
|
'Seniman berbakat yang membuat logo aplikasi kita yang indah!';
|
|
|
|
@override
|
|
String get aboutTranslators => 'Penerjemah';
|
|
|
|
@override
|
|
String get aboutSpecialThanks => 'Terima Kasih Khusus';
|
|
|
|
@override
|
|
String get aboutLinks => 'Tautan';
|
|
|
|
@override
|
|
String get aboutMobileSource => 'Kode sumber mobile';
|
|
|
|
@override
|
|
String get aboutPCSource => 'Kode sumber PC';
|
|
|
|
@override
|
|
String get aboutKeepAndroidOpen => 'Keep Android Open';
|
|
|
|
@override
|
|
String get aboutReportIssue => 'Laporkan masalah';
|
|
|
|
@override
|
|
String get aboutReportIssueSubtitle => 'Laporkan masalah yang Anda temui';
|
|
|
|
@override
|
|
String get aboutFeatureRequest => 'Permintaan fitur';
|
|
|
|
@override
|
|
String get aboutFeatureRequestSubtitle =>
|
|
'Sarankan fitur baru untuk aplikasi';
|
|
|
|
@override
|
|
String get aboutTelegramChannel => 'Saluran Telegram';
|
|
|
|
@override
|
|
String get aboutTelegramChannelSubtitle => 'Pengumuman dan pembaruan';
|
|
|
|
@override
|
|
String get aboutTelegramChat => 'Komunitas Telegram';
|
|
|
|
@override
|
|
String get aboutTelegramChatSubtitle => 'Berbincang dengan pengguna lain';
|
|
|
|
@override
|
|
String get aboutSocial => 'Sosial';
|
|
|
|
@override
|
|
String get aboutApp => 'Aplikasi';
|
|
|
|
@override
|
|
String get aboutVersion => 'Versi';
|
|
|
|
@override
|
|
String get aboutBinimumDesc =>
|
|
'The creator of QQDL & HiFi API. This project helped shape lossless download support.';
|
|
|
|
@override
|
|
String get aboutSachinsenalDesc =>
|
|
'The original HiFi project creator. A foundation for lossless-source integration.';
|
|
|
|
@override
|
|
String get aboutSjdonadoDesc =>
|
|
'Pencipta I Don\'t Have Spotify (IDHS). Penyelesai tautan cadangan yang menyelamatkan keadaan!';
|
|
|
|
@override
|
|
String get aboutAppDescription =>
|
|
'Search music metadata, manage extensions, and organize your library.';
|
|
|
|
@override
|
|
String get artistAlbums => 'Album';
|
|
|
|
@override
|
|
String get artistSingles => 'Single & EP';
|
|
|
|
@override
|
|
String get artistCompilations => 'Kompilasi';
|
|
|
|
@override
|
|
String get artistPopular => 'Populer';
|
|
|
|
@override
|
|
String artistMonthlyListeners(String count) {
|
|
return '$count pendengar bulanan';
|
|
}
|
|
|
|
@override
|
|
String get trackMetadataService => 'Layanan';
|
|
|
|
@override
|
|
String get trackMetadataPlay => 'Putar';
|
|
|
|
@override
|
|
String get trackMetadataShare => 'Bagikan';
|
|
|
|
@override
|
|
String get trackMetadataDelete => 'Hapus';
|
|
|
|
@override
|
|
String get setupGrantPermission => 'Berikan Izin';
|
|
|
|
@override
|
|
String get setupSkip => 'Lewati untuk sekarang';
|
|
|
|
@override
|
|
String get setupStorageAccessRequired => 'Akses Penyimpanan Diperlukan';
|
|
|
|
@override
|
|
String get setupStorageAccessMessageAndroid11 =>
|
|
'Android 11+ memerlukan izin \"Akses semua file\" untuk menyimpan file ke folder unduhan pilihan Anda.';
|
|
|
|
@override
|
|
String get setupOpenSettings => 'Buka Pengaturan';
|
|
|
|
@override
|
|
String get setupPermissionDeniedMessage =>
|
|
'Izin ditolak. Harap berikan semua izin untuk melanjutkan.';
|
|
|
|
@override
|
|
String setupPermissionRequired(String permissionType) {
|
|
return 'Izin $permissionType Diperlukan';
|
|
}
|
|
|
|
@override
|
|
String setupPermissionRequiredMessage(String permissionType) {
|
|
return 'Izin $permissionType diperlukan untuk pengalaman terbaik. Anda dapat mengubahnya nanti di Pengaturan.';
|
|
}
|
|
|
|
@override
|
|
String get setupUseDefaultFolder => 'Gunakan Folder Default?';
|
|
|
|
@override
|
|
String get setupNoFolderSelected =>
|
|
'Tidak ada folder dipilih. Apakah Anda ingin menggunakan folder Musik default?';
|
|
|
|
@override
|
|
String get setupUseDefault => 'Gunakan Default';
|
|
|
|
@override
|
|
String get setupDownloadLocationTitle => 'Lokasi Unduhan';
|
|
|
|
@override
|
|
String get setupDownloadLocationIosMessage =>
|
|
'Di iOS, unduhan disimpan ke folder Documents aplikasi. Anda dapat mengaksesnya melalui aplikasi Files.';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolder => 'Folder Documents Aplikasi';
|
|
|
|
@override
|
|
String get setupAppDocumentsFolderSubtitle =>
|
|
'Direkomendasikan - dapat diakses via aplikasi Files';
|
|
|
|
@override
|
|
String get setupChooseFromFiles => 'Pilih dari Files';
|
|
|
|
@override
|
|
String get setupChooseFromFilesSubtitle => 'Pilih lokasi iCloud atau lainnya';
|
|
|
|
@override
|
|
String get setupIosEmptyFolderWarning =>
|
|
'Batasan iOS: Folder kosong tidak dapat dipilih. Pilih folder dengan minimal satu file.';
|
|
|
|
@override
|
|
String get setupIcloudNotSupported =>
|
|
'iCloud Drive tidak didukung. Silakan gunakan folder Dokumen di aplikasi.';
|
|
|
|
@override
|
|
String get setupDownloadInFlac => 'Unduh lagu Spotify dalam format FLAC';
|
|
|
|
@override
|
|
String get setupStorageGranted => 'Izin Penyimpanan Diberikan!';
|
|
|
|
@override
|
|
String get setupStorageRequired => 'Izin Penyimpanan Diperlukan';
|
|
|
|
@override
|
|
String get setupStorageDescription =>
|
|
'SpotiFLAC membutuhkan izin penyimpanan untuk menyimpan file musik yang diunduh.';
|
|
|
|
@override
|
|
String get setupNotificationGranted => 'Izin Notifikasi Diberikan!';
|
|
|
|
@override
|
|
String get setupNotificationEnable => 'Aktifkan Notifikasi';
|
|
|
|
@override
|
|
String get setupFolderChoose => 'Pilih Folder Unduhan';
|
|
|
|
@override
|
|
String get setupFolderDescription =>
|
|
'Pilih folder tempat musik yang diunduh akan disimpan.';
|
|
|
|
@override
|
|
String get setupSelectFolder => 'Pilih Folder';
|
|
|
|
@override
|
|
String get setupEnableNotifications => 'Aktifkan Notifikasi';
|
|
|
|
@override
|
|
String get setupNotificationBackgroundDescription =>
|
|
'Dapatkan notifikasi tentang progres dan penyelesaian unduhan. Ini membantu Anda melacak unduhan saat aplikasi di latar belakang.';
|
|
|
|
@override
|
|
String get setupSkipForNow => 'Lewati untuk sekarang';
|
|
|
|
@override
|
|
String get setupNext => 'Lanjut';
|
|
|
|
@override
|
|
String get setupGetStarted => 'Mulai';
|
|
|
|
@override
|
|
String get setupAllowAccessToManageFiles =>
|
|
'Harap aktifkan \"Izinkan akses untuk mengelola semua file\" di layar berikutnya.';
|
|
|
|
@override
|
|
String get setupLanguageTitle => 'Choose Language';
|
|
|
|
@override
|
|
String get setupLanguageDescription =>
|
|
'Select your preferred language for the app. You can change this later in Settings.';
|
|
|
|
@override
|
|
String get setupLanguageSystemDefault => 'System Default';
|
|
|
|
@override
|
|
String get dialogCancel => 'Batal';
|
|
|
|
@override
|
|
String get dialogSave => 'Simpan';
|
|
|
|
@override
|
|
String get dialogDelete => 'Hapus';
|
|
|
|
@override
|
|
String get dialogRetry => 'Coba Lagi';
|
|
|
|
@override
|
|
String get dialogClear => 'Hapus';
|
|
|
|
@override
|
|
String get dialogDone => 'Selesai';
|
|
|
|
@override
|
|
String get dialogImport => 'Impor';
|
|
|
|
@override
|
|
String get dialogDownload => 'Download';
|
|
|
|
@override
|
|
String get previewPlay => 'Play preview';
|
|
|
|
@override
|
|
String get previewStop => 'Stop preview';
|
|
|
|
@override
|
|
String get previewUnavailable => 'Preview unavailable';
|
|
|
|
@override
|
|
String get dialogDiscard => 'Buang';
|
|
|
|
@override
|
|
String get dialogRemove => 'Hapus';
|
|
|
|
@override
|
|
String get dialogUninstall => 'Copot';
|
|
|
|
@override
|
|
String get dialogDiscardChanges => 'Buang Perubahan?';
|
|
|
|
@override
|
|
String get dialogUnsavedChanges =>
|
|
'Anda memiliki perubahan yang belum disimpan. Apakah Anda ingin membuangnya?';
|
|
|
|
@override
|
|
String get dialogClearAll => 'Hapus Semua';
|
|
|
|
@override
|
|
String get dialogRemoveExtension => 'Hapus Ekstensi';
|
|
|
|
@override
|
|
String get dialogRemoveExtensionMessage =>
|
|
'Apakah Anda yakin ingin menghapus ekstensi ini? Tindakan ini tidak dapat dibatalkan.';
|
|
|
|
@override
|
|
String get dialogUninstallExtension => 'Copot Ekstensi?';
|
|
|
|
@override
|
|
String dialogUninstallExtensionMessage(String extensionName) {
|
|
return 'Apakah Anda yakin ingin menghapus $extensionName?';
|
|
}
|
|
|
|
@override
|
|
String get dialogClearHistoryTitle => 'Hapus Riwayat';
|
|
|
|
@override
|
|
String get dialogClearHistoryMessage =>
|
|
'Apakah Anda yakin ingin menghapus semua riwayat unduhan? Ini tidak dapat dibatalkan.';
|
|
|
|
@override
|
|
String get dialogDeleteSelectedTitle => 'Hapus yang Dipilih';
|
|
|
|
@override
|
|
String dialogDeleteSelectedMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'lagu',
|
|
one: 'lagu',
|
|
);
|
|
return 'Hapus $count $_temp0 dari riwayat?\n\nIni juga akan menghapus file dari penyimpanan.';
|
|
}
|
|
|
|
@override
|
|
String get dialogImportPlaylistTitle => 'Impor Playlist';
|
|
|
|
@override
|
|
String dialogImportPlaylistMessage(int count) {
|
|
return 'Ditemukan $count lagu di CSV. Tambahkan ke antrian unduhan?';
|
|
}
|
|
|
|
@override
|
|
String csvImportTracks(int count) {
|
|
return '$count trek dari CSV';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedToQueue(String trackName) {
|
|
return 'Menambahkan \"$trackName\" ke antrian';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToQueue(int count) {
|
|
return 'Menambahkan $count lagu ke antrian';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyDownloaded(String trackName) {
|
|
return '\"$trackName\" sudah diunduh';
|
|
}
|
|
|
|
@override
|
|
String snackbarAlreadyInLibrary(String trackName) {
|
|
return '\"$trackName\" sudah ada di perpustakaan Anda';
|
|
}
|
|
|
|
@override
|
|
String get snackbarHistoryCleared => 'Riwayat dihapus';
|
|
|
|
@override
|
|
String get snackbarCredentialsSaved => 'Kredensial disimpan';
|
|
|
|
@override
|
|
String get snackbarCredentialsCleared => 'Kredensial dihapus';
|
|
|
|
@override
|
|
String snackbarDeletedTracks(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'lagu',
|
|
one: 'lagu',
|
|
);
|
|
return 'Menghapus $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String snackbarCannotOpenFile(String error) {
|
|
return 'Tidak dapat membuka file: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFillAllFields => 'Harap isi semua field';
|
|
|
|
@override
|
|
String get snackbarViewQueue => 'Lihat Antrian';
|
|
|
|
@override
|
|
String snackbarUrlCopied(String platform) {
|
|
return 'URL $platform disalin ke clipboard';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFileNotFound => 'File tidak ditemukan';
|
|
|
|
@override
|
|
String get snackbarSelectExtFile => 'Harap pilih file .spotiflac-ext';
|
|
|
|
@override
|
|
String get snackbarProviderPrioritySaved => 'Prioritas provider disimpan';
|
|
|
|
@override
|
|
String get snackbarMetadataProviderSaved =>
|
|
'Prioritas provider metadata disimpan';
|
|
|
|
@override
|
|
String snackbarExtensionInstalled(String extensionName) {
|
|
return '$extensionName terpasang.';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdated(String extensionName) {
|
|
return '$extensionName diperbarui.';
|
|
}
|
|
|
|
@override
|
|
String get snackbarFailedToInstall => 'Gagal memasang ekstensi';
|
|
|
|
@override
|
|
String get snackbarFailedToUpdate => 'Gagal memperbarui ekstensi';
|
|
|
|
@override
|
|
String get errorRateLimited => 'Dibatasi';
|
|
|
|
@override
|
|
String get errorRateLimitedMessage =>
|
|
'Terlalu banyak permintaan. Harap tunggu sebentar sebelum mencari lagi.';
|
|
|
|
@override
|
|
String get errorNoTracksFound => 'Tidak ada lagu ditemukan';
|
|
|
|
@override
|
|
String get searchEmptyResultSubtitle => 'Try another keyword';
|
|
|
|
@override
|
|
String get errorUrlNotRecognized => 'Tautan tidak dikenali';
|
|
|
|
@override
|
|
String get errorUrlNotRecognizedMessage =>
|
|
'Tautan ini tidak didukung. Pastikan URL sudah benar dan ekstensi yang kompatibel telah terpasang.';
|
|
|
|
@override
|
|
String get errorUrlFetchFailed =>
|
|
'Konten dari tautan ini gagal dimuat. Silakan coba lagi.';
|
|
|
|
@override
|
|
String errorMissingExtensionSource(String item) {
|
|
return 'Tidak dapat memuat $item: sumber ekstensi tidak ada';
|
|
}
|
|
|
|
@override
|
|
String get actionPause => 'Jeda';
|
|
|
|
@override
|
|
String get actionResume => 'Lanjutkan';
|
|
|
|
@override
|
|
String get actionCancel => 'Batal';
|
|
|
|
@override
|
|
String get actionSelectAll => 'Pilih Semua';
|
|
|
|
@override
|
|
String get actionDeselect => 'Batal Pilih';
|
|
|
|
@override
|
|
String get actionRemoveCredentials => 'Hapus Kredensial';
|
|
|
|
@override
|
|
String get actionSaveCredentials => 'Simpan Kredensial';
|
|
|
|
@override
|
|
String selectionSelected(int count) {
|
|
return '$count dipilih';
|
|
}
|
|
|
|
@override
|
|
String get selectionAllSelected => 'Semua lagu dipilih';
|
|
|
|
@override
|
|
String get selectionSelectToDelete => 'Pilih lagu untuk dihapus';
|
|
|
|
@override
|
|
String progressFetchingMetadata(int current, int total) {
|
|
return 'Mengambil metadata... $current/$total';
|
|
}
|
|
|
|
@override
|
|
String get progressReadingCsv => 'Membaca CSV...';
|
|
|
|
@override
|
|
String get searchSongs => 'Lagu';
|
|
|
|
@override
|
|
String get searchArtists => 'Artis';
|
|
|
|
@override
|
|
String get searchAlbums => 'Album';
|
|
|
|
@override
|
|
String get searchPlaylists => 'Playlist';
|
|
|
|
@override
|
|
String get searchSortTitle => 'Sort Results';
|
|
|
|
@override
|
|
String get searchSortDefault => 'Default';
|
|
|
|
@override
|
|
String get searchSortTitleAZ => 'Title (A-Z)';
|
|
|
|
@override
|
|
String get searchSortTitleZA => 'Title (Z-A)';
|
|
|
|
@override
|
|
String get searchSortArtistAZ => 'Artist (A-Z)';
|
|
|
|
@override
|
|
String get searchSortArtistZA => 'Artist (Z-A)';
|
|
|
|
@override
|
|
String get searchSortDurationShort => 'Duration (Shortest)';
|
|
|
|
@override
|
|
String get searchSortDurationLong => 'Duration (Longest)';
|
|
|
|
@override
|
|
String get searchSortDateOldest => 'Release Date (Oldest)';
|
|
|
|
@override
|
|
String get searchSortDateNewest => 'Release Date (Newest)';
|
|
|
|
@override
|
|
String get tooltipPlay => 'Putar';
|
|
|
|
@override
|
|
String get filenameFormat => 'Format Nama File';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTags => 'Tampilkan tag lanjutan';
|
|
|
|
@override
|
|
String get filenameShowAdvancedTagsDescription =>
|
|
'Aktifkan tag yang diformat untuk padding trek dan pola tanggal';
|
|
|
|
@override
|
|
String get folderOrganizationNone => 'Tidak ada';
|
|
|
|
@override
|
|
String get folderOrganizationByPlaylist => 'Berdasarkan Daftar Putar';
|
|
|
|
@override
|
|
String get folderOrganizationByPlaylistSubtitle =>
|
|
'Setiap daftar putar memerlukan folder terpisah';
|
|
|
|
@override
|
|
String get folderOrganizationByArtist => 'Berdasarkan Artis';
|
|
|
|
@override
|
|
String get folderOrganizationByAlbum => 'Berdasarkan Album';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistAlbum => 'Berdasarkan Artis & Album';
|
|
|
|
@override
|
|
String get folderOrganizationDescription =>
|
|
'Atur file yang diunduh ke dalam folder';
|
|
|
|
@override
|
|
String get folderOrganizationNoneSubtitle => 'Semua file di folder unduhan';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistSubtitle =>
|
|
'Folder terpisah untuk setiap artis';
|
|
|
|
@override
|
|
String get folderOrganizationByAlbumSubtitle =>
|
|
'Folder terpisah untuk setiap album';
|
|
|
|
@override
|
|
String get folderOrganizationByArtistAlbumSubtitle =>
|
|
'Folder bersarang untuk artis dan album';
|
|
|
|
@override
|
|
String get updateAvailable => 'Pembaruan Tersedia';
|
|
|
|
@override
|
|
String get updateLater => 'Nanti';
|
|
|
|
@override
|
|
String get updateStartingDownload => 'Memulai unduhan...';
|
|
|
|
@override
|
|
String get updateDownloadFailed => 'Unduhan gagal';
|
|
|
|
@override
|
|
String get updateFailedMessage => 'Gagal mengunduh pembaruan';
|
|
|
|
@override
|
|
String get updateNewVersionReady => 'Versi baru sudah siap';
|
|
|
|
@override
|
|
String get updateCurrent => 'Saat ini';
|
|
|
|
@override
|
|
String get updateNew => 'Baru';
|
|
|
|
@override
|
|
String get updateDownloading => 'Mengunduh...';
|
|
|
|
@override
|
|
String get updateWhatsNew => 'Yang Baru';
|
|
|
|
@override
|
|
String get updateDownloadInstall => 'Unduh & Pasang';
|
|
|
|
@override
|
|
String get updateDontRemind => 'Jangan ingatkan';
|
|
|
|
@override
|
|
String get providerPriorityTitle => 'Prioritas Provider';
|
|
|
|
@override
|
|
String get providerPriorityDescription =>
|
|
'Seret untuk mengatur ulang urutan provider unduhan. Aplikasi akan mencoba provider dari atas ke bawah saat mengunduh lagu.';
|
|
|
|
@override
|
|
String get providerPriorityInfo =>
|
|
'Jika lagu tidak tersedia di provider pertama, aplikasi akan otomatis mencoba yang berikutnya.';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsTitle => 'Extension Fallback';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsDescription =>
|
|
'Choose which installed download extensions can be used during automatic fallback.';
|
|
|
|
@override
|
|
String get providerPriorityFallbackExtensionsHint =>
|
|
'Only enabled extensions with download-provider capability are listed here.';
|
|
|
|
@override
|
|
String get providerBuiltIn => 'Legacy';
|
|
|
|
@override
|
|
String get providerExtension => 'Ekstensi';
|
|
|
|
@override
|
|
String get metadataProviderPriorityTitle => 'Prioritas Metadata';
|
|
|
|
@override
|
|
String get metadataProviderPriorityDescription =>
|
|
'Seret untuk mengatur ulang urutan provider metadata. Aplikasi akan mencoba provider dari atas ke bawah saat mencari lagu dan mengambil metadata.';
|
|
|
|
@override
|
|
String get metadataProviderPriorityInfo =>
|
|
'Deezer tidak memiliki batas rate dan direkomendasikan sebagai utama. Spotify mungkin membatasi rate setelah banyak permintaan.';
|
|
|
|
@override
|
|
String get metadataNoRateLimits => 'Tidak ada batas rate';
|
|
|
|
@override
|
|
String get metadataMayRateLimit => 'Mungkin dibatasi rate';
|
|
|
|
@override
|
|
String get logTitle => 'Log';
|
|
|
|
@override
|
|
String get logCopied => 'Log disalin ke clipboard';
|
|
|
|
@override
|
|
String get logSearchHint => 'Cari log...';
|
|
|
|
@override
|
|
String get logFilterLevel => 'Level';
|
|
|
|
@override
|
|
String get logFilterSection => 'Filter';
|
|
|
|
@override
|
|
String get logShareLogs => 'Bagikan log';
|
|
|
|
@override
|
|
String get logClearLogs => 'Hapus log';
|
|
|
|
@override
|
|
String get logClearLogsTitle => 'Hapus Log';
|
|
|
|
@override
|
|
String get logClearLogsMessage =>
|
|
'Apakah Anda yakin ingin menghapus semua log?';
|
|
|
|
@override
|
|
String get logFilterBySeverity => 'Filter log berdasarkan tingkat keparahan';
|
|
|
|
@override
|
|
String get logNoLogsYet => 'Belum ada log';
|
|
|
|
@override
|
|
String get logNoLogsYetSubtitle =>
|
|
'Log akan muncul di sini saat Anda menggunakan aplikasi';
|
|
|
|
@override
|
|
String logEntriesFiltered(int count) {
|
|
return 'Entri ($count difilter)';
|
|
}
|
|
|
|
@override
|
|
String logEntries(int count) {
|
|
return 'Entri ($count)';
|
|
}
|
|
|
|
@override
|
|
String get credentialsTitle => 'Kredensial Spotify';
|
|
|
|
@override
|
|
String get credentialsDescription =>
|
|
'Masukkan Client ID dan Secret Anda untuk menggunakan kuota aplikasi Spotify Anda sendiri.';
|
|
|
|
@override
|
|
String get credentialsClientId => 'ID Klien';
|
|
|
|
@override
|
|
String get credentialsClientIdHint => 'Tempel Client ID';
|
|
|
|
@override
|
|
String get credentialsClientSecret => 'Rahasia Klien';
|
|
|
|
@override
|
|
String get credentialsClientSecretHint => 'Tempel Client Secret';
|
|
|
|
@override
|
|
String get channelStable => 'Stabil';
|
|
|
|
@override
|
|
String get channelPreview => 'Pratinjau';
|
|
|
|
@override
|
|
String get sectionSearchSource => 'Sumber Pencarian';
|
|
|
|
@override
|
|
String get sectionDownload => 'Unduhan';
|
|
|
|
@override
|
|
String get sectionPerformance => 'Performa';
|
|
|
|
@override
|
|
String get sectionApp => 'Aplikasi';
|
|
|
|
@override
|
|
String get sectionData => 'Data';
|
|
|
|
@override
|
|
String get sectionDebug => 'Debug';
|
|
|
|
@override
|
|
String get sectionService => 'Layanan';
|
|
|
|
@override
|
|
String get sectionAudioQuality => 'Kualitas Audio';
|
|
|
|
@override
|
|
String get sectionFileSettings => 'Pengaturan File';
|
|
|
|
@override
|
|
String get sectionLyrics => 'Lirik';
|
|
|
|
@override
|
|
String get lyricsMode => 'Mode Lirik';
|
|
|
|
@override
|
|
String get lyricsModeDescription =>
|
|
'Pilih cara lirik disimpan bersama unduhan Anda';
|
|
|
|
@override
|
|
String get lyricsModeEmbed => 'Sematkan dalam file';
|
|
|
|
@override
|
|
String get lyricsModeEmbedSubtitle =>
|
|
'Lirik tersimpan di dalam metadata FLAC';
|
|
|
|
@override
|
|
String get lyricsModeExternal => 'File .lrc eksternal';
|
|
|
|
@override
|
|
String get lyricsModeExternalSubtitle =>
|
|
'File .lrc terpisah untuk pemutar musik seperti Samsung Music';
|
|
|
|
@override
|
|
String get lyricsModeBoth => 'Keduanya';
|
|
|
|
@override
|
|
String get lyricsModeBothSubtitle => 'Sematkan dan simpan file .lrc';
|
|
|
|
@override
|
|
String get sectionColor => 'Warna';
|
|
|
|
@override
|
|
String get sectionTheme => 'Tema';
|
|
|
|
@override
|
|
String get sectionLayout => 'Tata Letak';
|
|
|
|
@override
|
|
String get sectionLanguage => 'Bahasa';
|
|
|
|
@override
|
|
String get appearanceLanguage => 'Bahasa Aplikasi';
|
|
|
|
@override
|
|
String get settingsAppearanceSubtitle => 'Tema, warna, tampilan';
|
|
|
|
@override
|
|
String get settingsDownloadSubtitle => 'Service, quality, fallback';
|
|
|
|
@override
|
|
String get settingsOptionsSubtitle => 'Fallback, metadata, lyrics, cover art';
|
|
|
|
@override
|
|
String get settingsExtensionsSubtitle => 'Kelola provider unduhan';
|
|
|
|
@override
|
|
String get settingsLogsSubtitle => 'Lihat log aplikasi untuk debugging';
|
|
|
|
@override
|
|
String get loadingSharedLink => 'Memuat link yang dibagikan...';
|
|
|
|
@override
|
|
String get pressBackAgainToExit => 'Tekan kembali sekali lagi untuk keluar';
|
|
|
|
@override
|
|
String downloadAllCount(int count) {
|
|
return 'Unduh Semua ($count)';
|
|
}
|
|
|
|
@override
|
|
String tracksCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count lagu',
|
|
one: '1 lagu',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get trackCopyFilePath => 'Salin lokasi file';
|
|
|
|
@override
|
|
String get trackRemoveFromDevice => 'Hapus dari perangkat';
|
|
|
|
@override
|
|
String get trackLoadLyrics => 'Muat Lirik';
|
|
|
|
@override
|
|
String get trackMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get trackFileInfo => 'Info File';
|
|
|
|
@override
|
|
String get trackLyrics => 'Lirik';
|
|
|
|
@override
|
|
String get trackFileNotFound => 'File tidak ditemukan';
|
|
|
|
@override
|
|
String get trackOpenInDeezer => 'Buka di Deezer';
|
|
|
|
@override
|
|
String get trackOpenInSpotify => 'Buka di Spotify';
|
|
|
|
@override
|
|
String get trackTrackName => 'Nama lagu';
|
|
|
|
@override
|
|
String get trackArtist => 'Artis';
|
|
|
|
@override
|
|
String get trackAlbumArtist => 'Artis album';
|
|
|
|
@override
|
|
String get trackAlbum => 'Album';
|
|
|
|
@override
|
|
String get trackTrackNumber => 'Nomor lagu';
|
|
|
|
@override
|
|
String get trackDiscNumber => 'Nomor disc';
|
|
|
|
@override
|
|
String get trackDuration => 'Durasi';
|
|
|
|
@override
|
|
String get trackAudioQuality => 'Kualitas audio';
|
|
|
|
@override
|
|
String get trackReleaseDate => 'Tanggal rilis';
|
|
|
|
@override
|
|
String get trackGenre => 'Genre';
|
|
|
|
@override
|
|
String get trackLabel => 'Lebel';
|
|
|
|
@override
|
|
String get trackCopyright => 'Hak cipta';
|
|
|
|
@override
|
|
String get trackDownloaded => 'Diunduh';
|
|
|
|
@override
|
|
String get trackCopyLyrics => 'Salin lirik';
|
|
|
|
@override
|
|
String trackLyricsSource(String source) {
|
|
return 'Source: $source';
|
|
}
|
|
|
|
@override
|
|
String get trackLyricsNotAvailable => 'Lirik tidak tersedia untuk lagu ini';
|
|
|
|
@override
|
|
String get trackLyricsNotInFile => 'No lyrics found in this file';
|
|
|
|
@override
|
|
String get trackFetchOnlineLyrics => 'Fetch from Online';
|
|
|
|
@override
|
|
String get trackLyricsTimeout => 'Permintaan timeout. Coba lagi nanti.';
|
|
|
|
@override
|
|
String get trackLyricsLoadFailed => 'Gagal memuat lirik';
|
|
|
|
@override
|
|
String get trackEmbedLyrics => 'Sematkan Lirik';
|
|
|
|
@override
|
|
String get trackLyricsEmbedded => 'Lirik berhasil disematkan';
|
|
|
|
@override
|
|
String get trackInstrumental => 'Lagu instrumental';
|
|
|
|
@override
|
|
String get trackCopiedToClipboard => 'Disalin ke clipboard';
|
|
|
|
@override
|
|
String get trackDeleteConfirmTitle => 'Hapus dari perangkat?';
|
|
|
|
@override
|
|
String get trackDeleteConfirmMessage =>
|
|
'Ini akan menghapus file unduhan secara permanen dan menghapusnya dari riwayat Anda.';
|
|
|
|
@override
|
|
String get dateToday => 'Hari ini';
|
|
|
|
@override
|
|
String get dateYesterday => 'Kemarin';
|
|
|
|
@override
|
|
String dateDaysAgo(int count) {
|
|
return '$count hari lalu';
|
|
}
|
|
|
|
@override
|
|
String dateWeeksAgo(int count) {
|
|
return '$count minggu lalu';
|
|
}
|
|
|
|
@override
|
|
String dateMonthsAgo(int count) {
|
|
return '$count bulan lalu';
|
|
}
|
|
|
|
@override
|
|
String get storeFilterAll => 'Semua';
|
|
|
|
@override
|
|
String get storeFilterMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get storeFilterDownload => 'Unduhan';
|
|
|
|
@override
|
|
String get storeFilterUtility => 'Utilitas';
|
|
|
|
@override
|
|
String get storeFilterLyrics => 'Lirik';
|
|
|
|
@override
|
|
String get storeFilterIntegration => 'Integrasi';
|
|
|
|
@override
|
|
String get storeClearFilters => 'Hapus filter';
|
|
|
|
@override
|
|
String get storeAddRepoTitle => 'Add Extension Repository';
|
|
|
|
@override
|
|
String get storeAddRepoDescription =>
|
|
'Enter a GitHub repository URL that contains a registry.json file to browse and install extensions.';
|
|
|
|
@override
|
|
String get storeRepoUrlLabel => 'Repository URL';
|
|
|
|
@override
|
|
String get storeRepoUrlHint => 'https://github.com/user/repo';
|
|
|
|
@override
|
|
String get storeRepoUrlHelper =>
|
|
'e.g. https://github.com/user/extensions-repo';
|
|
|
|
@override
|
|
String get storeAddRepoButton => 'Add Repository';
|
|
|
|
@override
|
|
String get storeChangeRepoTooltip => 'Change repository';
|
|
|
|
@override
|
|
String get storeRepoDialogTitle => 'Extension Repository';
|
|
|
|
@override
|
|
String get storeRepoDialogCurrent => 'Current repository:';
|
|
|
|
@override
|
|
String get storeNewRepoUrlLabel => 'New Repository URL';
|
|
|
|
@override
|
|
String get storeLoadError => 'Failed to load repository';
|
|
|
|
@override
|
|
String get storeEmptyNoExtensions => 'No extensions available';
|
|
|
|
@override
|
|
String get storeEmptyNoResults => 'No extensions found';
|
|
|
|
@override
|
|
String get extensionDefaultProvider => 'Default Search';
|
|
|
|
@override
|
|
String get extensionDefaultProviderSubtitle =>
|
|
'Use the default metadata search';
|
|
|
|
@override
|
|
String get extensionAuthor => 'Pembuat';
|
|
|
|
@override
|
|
String get extensionId => 'ID';
|
|
|
|
@override
|
|
String get extensionError => 'Terjadi kesalahan';
|
|
|
|
@override
|
|
String get extensionCapabilities => 'Kemampuan';
|
|
|
|
@override
|
|
String get extensionMetadataProvider => 'Provider Metadata';
|
|
|
|
@override
|
|
String get extensionDownloadProvider => 'Provider Unduhan';
|
|
|
|
@override
|
|
String get extensionLyricsProvider => 'Provider Lirik';
|
|
|
|
@override
|
|
String get extensionUrlHandler => 'Penanganan URL';
|
|
|
|
@override
|
|
String get extensionQualityOptions => 'Opsi Kualitas';
|
|
|
|
@override
|
|
String get extensionPostProcessingHooks => 'Hook Pasca-Pemrosesan';
|
|
|
|
@override
|
|
String get extensionPermissions => 'Izin';
|
|
|
|
@override
|
|
String get extensionSettings => 'Pengaturan';
|
|
|
|
@override
|
|
String get extensionRemoveButton => 'Hapus Ekstensi';
|
|
|
|
@override
|
|
String get extensionUpdated => 'Diperbarui';
|
|
|
|
@override
|
|
String get extensionMinAppVersion => 'Versi App Minimum';
|
|
|
|
@override
|
|
String get extensionCustomTrackMatching => 'Pencocokan Lagu Kustom';
|
|
|
|
@override
|
|
String get extensionPostProcessing => 'Pasca-Pemrosesan';
|
|
|
|
@override
|
|
String extensionHooksAvailable(int count) {
|
|
return '$count hook tersedia';
|
|
}
|
|
|
|
@override
|
|
String extensionPatternsCount(int count) {
|
|
return '$count pola';
|
|
}
|
|
|
|
@override
|
|
String extensionStrategy(String strategy) {
|
|
return 'Strategi: $strategy';
|
|
}
|
|
|
|
@override
|
|
String get extensionsProviderPrioritySection => 'Prioritas Provider';
|
|
|
|
@override
|
|
String get extensionsInstalledSection => 'Ekstensi Terpasang';
|
|
|
|
@override
|
|
String get extensionsNoExtensions => 'Tidak ada ekstensi terpasang';
|
|
|
|
@override
|
|
String get extensionsNoExtensionsSubtitle =>
|
|
'Pasang file .spotiflac-ext untuk menambahkan provider baru';
|
|
|
|
@override
|
|
String get extensionsInstallButton => 'Pasang Ekstensi';
|
|
|
|
@override
|
|
String get extensionsInfoTip =>
|
|
'Ekstensi dapat menambahkan provider metadata dan unduhan baru. Hanya pasang ekstensi dari sumber terpercaya.';
|
|
|
|
@override
|
|
String get extensionsInstalledSuccess => 'Ekstensi berhasil dipasang';
|
|
|
|
@override
|
|
String extensionsInstalledCount(int count) {
|
|
return '$count extensions installed successfully';
|
|
}
|
|
|
|
@override
|
|
String extensionsInstallPartialSuccess(int installed, int attempted) {
|
|
return 'Installed $installed of $attempted extensions';
|
|
}
|
|
|
|
@override
|
|
String get extensionsDownloadPriority => 'Prioritas Unduhan';
|
|
|
|
@override
|
|
String get extensionsDownloadPrioritySubtitle =>
|
|
'Atur urutan layanan unduhan';
|
|
|
|
@override
|
|
String get extensionsFallbackTitle => 'Fallback Extensions';
|
|
|
|
@override
|
|
String get extensionsFallbackSubtitle =>
|
|
'Choose which installed download extensions can be used as fallback';
|
|
|
|
@override
|
|
String get extensionsNoDownloadProvider =>
|
|
'Tidak ada ekstensi dengan provider unduhan';
|
|
|
|
@override
|
|
String get extensionsMetadataPriority => 'Prioritas Metadata';
|
|
|
|
@override
|
|
String get extensionsMetadataPrioritySubtitle =>
|
|
'Atur urutan sumber pencarian & metadata';
|
|
|
|
@override
|
|
String get extensionsNoMetadataProvider =>
|
|
'Tidak ada ekstensi dengan provider metadata';
|
|
|
|
@override
|
|
String get extensionsSearchProvider => 'Provider Pencarian';
|
|
|
|
@override
|
|
String get extensionsNoCustomSearch =>
|
|
'Tidak ada ekstensi dengan pencarian kustom';
|
|
|
|
@override
|
|
String get extensionsSearchProviderDescription =>
|
|
'Pilih layanan yang digunakan untuk mencari lagu';
|
|
|
|
@override
|
|
String get extensionsCustomSearch => 'Pencarian kustom';
|
|
|
|
@override
|
|
String get extensionsErrorLoading => 'Error memuat ekstensi';
|
|
|
|
@override
|
|
String get qualityFlacLossless => 'FLAC Lossless';
|
|
|
|
@override
|
|
String get qualityFlacLosslessSubtitle => '16-bit / 44.1kHz';
|
|
|
|
@override
|
|
String get qualityHiResFlac => 'Hi-Res FLAC';
|
|
|
|
@override
|
|
String get qualityHiResFlacSubtitle => '24-bit / hingga 96kHz';
|
|
|
|
@override
|
|
String get qualityHiResFlacMax => 'Hi-Res FLAC Max';
|
|
|
|
@override
|
|
String get qualityHiResFlacMaxSubtitle => '24-bit / hingga 192kHz';
|
|
|
|
@override
|
|
String get downloadLossy320 => 'Lossy 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyFormat => 'Lossy Format';
|
|
|
|
@override
|
|
String get downloadLossy320Format => 'Lossy 320kbps Format';
|
|
|
|
@override
|
|
String get downloadLossy320FormatDesc =>
|
|
'Choose the output format for 320kbps lossy downloads. The original stream will be converted to your selected format when needed.';
|
|
|
|
@override
|
|
String get downloadLossyMp3 => 'MP3 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyMp3Subtitle => 'Best compatibility, ~10MB per track';
|
|
|
|
@override
|
|
String get downloadLossyAac => 'AAC/M4A 320kbps';
|
|
|
|
@override
|
|
String get downloadLossyAacSubtitle =>
|
|
'Best mobile compatibility, M4A container';
|
|
|
|
@override
|
|
String get downloadLossyOpus256 => 'Opus 256kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus256Subtitle =>
|
|
'Best quality Opus, ~8MB per track';
|
|
|
|
@override
|
|
String get downloadLossyOpus128 => 'Opus 128kbps';
|
|
|
|
@override
|
|
String get downloadLossyOpus128Subtitle => 'Smallest size, ~4MB per track';
|
|
|
|
@override
|
|
String get qualityNote =>
|
|
'Kualitas sebenarnya tergantung ketersediaan lagu dari layanan';
|
|
|
|
@override
|
|
String get downloadAskBeforeDownload => 'Tanya Sebelum Unduh';
|
|
|
|
@override
|
|
String get downloadDirectory => 'Direktori Unduhan';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesFolder => 'Folder Singles Terpisah';
|
|
|
|
@override
|
|
String get downloadAlbumFolderStructure => 'Struktur Folder Album';
|
|
|
|
@override
|
|
String get albumFolderStructureDescription => 'Pilih struktur folder album';
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFolders =>
|
|
'Gunakan Artis Album untuk folder';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnly => 'Hanya artis utama untuk folder';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyEnabled =>
|
|
'Artis unggulan dihapus dari nama folder (misalnya Justin Bieber, Quavo → Justin Bieber)';
|
|
|
|
@override
|
|
String get downloadUsePrimaryArtistOnlyDisabled =>
|
|
'Nama lengkap artis digunakan untuk nama folder';
|
|
|
|
@override
|
|
String get downloadSelectQuality => 'Pilih Kualitas';
|
|
|
|
@override
|
|
String get downloadFrom => 'Unduh Dari';
|
|
|
|
@override
|
|
String get appearanceAmoledDark => 'AMOLED Gelap';
|
|
|
|
@override
|
|
String get appearanceAmoledDarkSubtitle => 'Latar belakang hitam murni';
|
|
|
|
@override
|
|
String get queueClearAll => 'Hapus Semua';
|
|
|
|
@override
|
|
String get queueClearAllMessage =>
|
|
'Apakah Anda yakin ingin menghapus semua unduhan?';
|
|
|
|
@override
|
|
String get settingsAutoExportFailed => 'Unduhan yang gagal diekspor otomatis';
|
|
|
|
@override
|
|
String get settingsAutoExportFailedSubtitle =>
|
|
'Simpan unduhan yang gagal ke file TXT secara otomatis';
|
|
|
|
@override
|
|
String get settingsDownloadNetwork => 'Jaringan Unduhan';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkAny => 'WiFi + Data Seluler';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkWifiOnly => 'Hanya WiFi';
|
|
|
|
@override
|
|
String get settingsDownloadNetworkSubtitle =>
|
|
'Pilih jaringan mana yang akan digunakan untuk mengunduh. Jika diatur ke Hanya WiFi, unduhan akan berhenti sementara dan menggunakan data seluler.';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloads => 'Concurrent downloads';
|
|
|
|
@override
|
|
String get settingsConcurrentDownloadsSubtitle =>
|
|
'Downloading several tracks at once is faster, but some providers may rate-limit parallel requests.';
|
|
|
|
@override
|
|
String get concurrentDownloadsOne => '1 track at a time';
|
|
|
|
@override
|
|
String concurrentDownloadsCount(int count) {
|
|
return 'Up to $count tracks at once';
|
|
}
|
|
|
|
@override
|
|
String get albumFolderArtistAlbum => 'Artis / Album';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSubtitle => 'Albums/Nama Artis/Nama Album/';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbum => 'Artis / [Tahun] Album';
|
|
|
|
@override
|
|
String get albumFolderArtistYearAlbumSubtitle =>
|
|
'Albums/Nama Artis/[2005] Nama Album/';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnly => 'Album Saja';
|
|
|
|
@override
|
|
String get albumFolderAlbumOnlySubtitle => 'Albums/Nama Album/';
|
|
|
|
@override
|
|
String get albumFolderYearAlbum => '[Tahun] Album';
|
|
|
|
@override
|
|
String get albumFolderYearAlbumSubtitle => 'Albums/[2005] Nama Album/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSingles => 'Artis / Album + Singel';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumSinglesSubtitle =>
|
|
'Artis/Album/ dan Artis/Single/';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlat => 'Artist / Album (Singles flat)';
|
|
|
|
@override
|
|
String get albumFolderArtistAlbumFlatSubtitle =>
|
|
'Artist/Album/ and Artist/song.flac';
|
|
|
|
@override
|
|
String get downloadedAlbumDeleteSelected => 'Hapus yang Dipilih';
|
|
|
|
@override
|
|
String downloadedAlbumDeleteMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'lagu',
|
|
one: 'lagu',
|
|
);
|
|
return 'Hapus $count $_temp0 dari album ini?\n\nIni juga akan menghapus file dari penyimpanan.';
|
|
}
|
|
|
|
@override
|
|
String downloadedAlbumSelectedCount(int count) {
|
|
return '$count dipilih';
|
|
}
|
|
|
|
@override
|
|
String get downloadedAlbumAllSelected => 'Semua lagu dipilih';
|
|
|
|
@override
|
|
String get downloadedAlbumTapToSelect => 'Ketuk lagu untuk memilih';
|
|
|
|
@override
|
|
String downloadedAlbumDeleteCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'lagu',
|
|
one: 'lagu',
|
|
);
|
|
return 'Hapus $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get downloadedAlbumSelectToDelete => 'Pilih lagu untuk dihapus';
|
|
|
|
@override
|
|
String downloadedAlbumDiscHeader(int discNumber) {
|
|
return 'Disc $discNumber';
|
|
}
|
|
|
|
@override
|
|
String get recentTypeArtist => 'Artis';
|
|
|
|
@override
|
|
String get recentTypeAlbum => 'Album';
|
|
|
|
@override
|
|
String get recentTypeSong => 'Lagu';
|
|
|
|
@override
|
|
String get recentTypePlaylist => 'Daftar putar';
|
|
|
|
@override
|
|
String get recentEmpty => 'Belum ada item terbaru';
|
|
|
|
@override
|
|
String get recentShowAllDownloads => 'Tampilkan Semua Unduhan';
|
|
|
|
@override
|
|
String recentPlaylistInfo(String name) {
|
|
return 'Daftar Putar: $name';
|
|
}
|
|
|
|
@override
|
|
String get discographyDownload => 'Unduh Diskografi';
|
|
|
|
@override
|
|
String get discographyDownloadAll => 'Unduh Semua';
|
|
|
|
@override
|
|
String discographyDownloadAllSubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount releases';
|
|
}
|
|
|
|
@override
|
|
String get discographyAlbumsOnly => 'Albums Only';
|
|
|
|
@override
|
|
String discographyAlbumsOnlySubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount albums';
|
|
}
|
|
|
|
@override
|
|
String get discographySinglesOnly => 'Singles & EPs Only';
|
|
|
|
@override
|
|
String discographySinglesOnlySubtitle(int count, int albumCount) {
|
|
return '$count tracks from $albumCount singles';
|
|
}
|
|
|
|
@override
|
|
String get discographySelectAlbums => 'Select Albums...';
|
|
|
|
@override
|
|
String get discographySelectAlbumsSubtitle =>
|
|
'Choose specific albums or singles';
|
|
|
|
@override
|
|
String get discographyFetchingTracks => 'Fetching tracks...';
|
|
|
|
@override
|
|
String discographyFetchingAlbum(int current, int total) {
|
|
return 'Fetching $current of $total...';
|
|
}
|
|
|
|
@override
|
|
String discographySelectedCount(int count) {
|
|
return '$count selected';
|
|
}
|
|
|
|
@override
|
|
String get discographyDownloadSelected => 'Download Selected';
|
|
|
|
@override
|
|
String discographyAddedToQueue(int count) {
|
|
return 'Added $count tracks to queue';
|
|
}
|
|
|
|
@override
|
|
String discographySkippedDownloaded(int added, int skipped) {
|
|
return '$added added, $skipped already downloaded';
|
|
}
|
|
|
|
@override
|
|
String get discographyNoAlbums => 'No albums available';
|
|
|
|
@override
|
|
String get discographyFailedToFetch => 'Failed to fetch some albums';
|
|
|
|
@override
|
|
String get sectionStorageAccess => 'Storage Access';
|
|
|
|
@override
|
|
String get allFilesAccess => 'All Files Access';
|
|
|
|
@override
|
|
String get allFilesAccessEnabledSubtitle => 'Can write to any folder';
|
|
|
|
@override
|
|
String get allFilesAccessDisabledSubtitle => 'Limited to media folders only';
|
|
|
|
@override
|
|
String get allFilesAccessDescription =>
|
|
'Enable this if you encounter write errors when saving to custom folders. Android 13+ restricts access to certain directories by default.';
|
|
|
|
@override
|
|
String get allFilesAccessDeniedMessage =>
|
|
'Permission was denied. Please enable \'All files access\' manually in system settings.';
|
|
|
|
@override
|
|
String get allFilesAccessDisabledMessage =>
|
|
'All Files Access disabled. The app will use limited storage access.';
|
|
|
|
@override
|
|
String get settingsLocalLibrary => 'Local Library';
|
|
|
|
@override
|
|
String get settingsLocalLibrarySubtitle => 'Scan music & detect duplicates';
|
|
|
|
@override
|
|
String get settingsCache => 'Storage & Cache';
|
|
|
|
@override
|
|
String get settingsCacheSubtitle => 'View size and clear cached data';
|
|
|
|
@override
|
|
String get libraryTitle => 'Local Library';
|
|
|
|
@override
|
|
String get libraryScanSettings => 'Scan Settings';
|
|
|
|
@override
|
|
String get libraryEnableLocalLibrary => 'Enable Local Library';
|
|
|
|
@override
|
|
String get libraryEnableLocalLibrarySubtitle =>
|
|
'Scan and track your existing music';
|
|
|
|
@override
|
|
String get libraryFolder => 'Library Folder';
|
|
|
|
@override
|
|
String get libraryFolderHint => 'Tap to select folder';
|
|
|
|
@override
|
|
String get libraryShowDuplicateIndicator => 'Show Duplicate Indicator';
|
|
|
|
@override
|
|
String get libraryShowDuplicateIndicatorSubtitle =>
|
|
'Show when searching for existing tracks';
|
|
|
|
@override
|
|
String get libraryAutoScan => 'Auto Scan';
|
|
|
|
@override
|
|
String get libraryAutoScanSubtitle =>
|
|
'Automatically scan your library for new files';
|
|
|
|
@override
|
|
String get libraryAutoScanOff => 'Off';
|
|
|
|
@override
|
|
String get libraryAutoScanOnOpen => 'Every app open';
|
|
|
|
@override
|
|
String get libraryAutoScanDaily => 'Daily';
|
|
|
|
@override
|
|
String get libraryAutoScanWeekly => 'Weekly';
|
|
|
|
@override
|
|
String get libraryActions => 'Actions';
|
|
|
|
@override
|
|
String get libraryScan => 'Scan Library';
|
|
|
|
@override
|
|
String get libraryScanSubtitle => 'Scan for audio files';
|
|
|
|
@override
|
|
String get libraryScanSelectFolderFirst => 'Select a folder first';
|
|
|
|
@override
|
|
String get libraryCleanupMissingFiles => 'Cleanup Missing Files';
|
|
|
|
@override
|
|
String get libraryCleanupMissingFilesSubtitle =>
|
|
'Remove entries for files that no longer exist';
|
|
|
|
@override
|
|
String get libraryClear => 'Clear Library';
|
|
|
|
@override
|
|
String get libraryClearSubtitle => 'Remove all scanned tracks';
|
|
|
|
@override
|
|
String get libraryClearConfirmTitle => 'Clear Library';
|
|
|
|
@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';
|
|
|
|
@override
|
|
String get libraryAboutDescription =>
|
|
'Memindai koleksi musik yang sudah ada untuk mendeteksi duplikat saat mengunduh. Mendukung format FLAC, ALAC, M4A, MP3, Opus, OGG, WAV, AIFF, dan APE. Metadata dibaca dari tag file jika tersedia.';
|
|
|
|
@override
|
|
String libraryTracksUnit(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String libraryFilesUnit(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'files',
|
|
one: 'file',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String libraryLastScanned(String time) {
|
|
return 'Last scanned: $time';
|
|
}
|
|
|
|
@override
|
|
String get libraryLastScannedNever => 'Never';
|
|
|
|
@override
|
|
String get libraryScanning => 'Scanning...';
|
|
|
|
@override
|
|
String get libraryScanFinalizing => 'Finalizing library...';
|
|
|
|
@override
|
|
String libraryScanProgress(String progress, int total) {
|
|
return '$progress% of $total files';
|
|
}
|
|
|
|
@override
|
|
String get libraryInLibrary => 'In Library';
|
|
|
|
@override
|
|
String libraryRemovedMissingFiles(int count) {
|
|
return 'Removed $count missing files from library';
|
|
}
|
|
|
|
@override
|
|
String get libraryCleared => 'Library cleared';
|
|
|
|
@override
|
|
String get libraryStorageAccessRequired => 'Storage Access Required';
|
|
|
|
@override
|
|
String get libraryStorageAccessMessage =>
|
|
'SpotiFLAC needs storage access to scan your music library. Please grant permission in settings.';
|
|
|
|
@override
|
|
String get libraryFolderNotExist => 'Selected folder does not exist';
|
|
|
|
@override
|
|
String get librarySourceDownloaded => 'Downloaded';
|
|
|
|
@override
|
|
String get librarySourceLocal => 'Local';
|
|
|
|
@override
|
|
String get libraryFilterAll => 'All';
|
|
|
|
@override
|
|
String get libraryFilterDownloaded => 'Downloaded';
|
|
|
|
@override
|
|
String get libraryFilterLocal => 'Local';
|
|
|
|
@override
|
|
String get libraryFilterTitle => 'Filters';
|
|
|
|
@override
|
|
String get libraryFilterReset => 'Reset';
|
|
|
|
@override
|
|
String get libraryFilterApply => 'Apply';
|
|
|
|
@override
|
|
String get libraryFilterSource => 'Source';
|
|
|
|
@override
|
|
String get libraryFilterQuality => 'Quality';
|
|
|
|
@override
|
|
String get libraryFilterQualityHiRes => 'Hi-Res (24bit)';
|
|
|
|
@override
|
|
String get libraryFilterQualityCD => 'CD (16bit)';
|
|
|
|
@override
|
|
String get libraryFilterQualityLossy => 'Lossy';
|
|
|
|
@override
|
|
String get libraryFilterFormat => 'Format';
|
|
|
|
@override
|
|
String get libraryFilterMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataComplete => 'Complete metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingAny => 'Missing any metadata';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingYear => 'Missing year';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingGenre => 'Missing genre';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingAlbumArtist => 'Missing album artist';
|
|
|
|
@override
|
|
String get libraryFilterSort => 'Sort';
|
|
|
|
@override
|
|
String get libraryFilterSortLatest => 'Latest';
|
|
|
|
@override
|
|
String get libraryFilterSortOldest => 'Oldest';
|
|
|
|
@override
|
|
String get libraryFilterSortAlbumAsc => 'Album (A-Z)';
|
|
|
|
@override
|
|
String get libraryFilterSortAlbumDesc => 'Album (Z-A)';
|
|
|
|
@override
|
|
String get libraryFilterSortGenreAsc => 'Genre (A-Z)';
|
|
|
|
@override
|
|
String get libraryFilterSortGenreDesc => 'Genre (Z-A)';
|
|
|
|
@override
|
|
String get timeJustNow => 'Just now';
|
|
|
|
@override
|
|
String timeMinutesAgo(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count minutes ago',
|
|
one: '1 minute ago',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String timeHoursAgo(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count hours ago',
|
|
one: '1 hour ago',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get tutorialWelcomeTitle => 'Selamat Datang di SpotiFLAC!';
|
|
|
|
@override
|
|
String get tutorialWelcomeDesc =>
|
|
'Mari kita pelajari cara mengunduh musik favorit Anda dalam kualitas lossless. Tutorial singkat ini akan menunjukkan dasar-dasarnya.';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip1 =>
|
|
'Unduh musik dari Spotify, Deezer, atau tempel URL yang didukung';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip2 =>
|
|
'Get FLAC quality audio from installed download extensions';
|
|
|
|
@override
|
|
String get tutorialWelcomeTip3 =>
|
|
'Penyematan metadata, sampul album, dan lirik secara otomatis';
|
|
|
|
@override
|
|
String get tutorialSearchTitle => 'Menemukan Musik';
|
|
|
|
@override
|
|
String get tutorialSearchDesc =>
|
|
'Ada dua cara mudah untuk menemukan musik yang ingin Anda unduh.';
|
|
|
|
@override
|
|
String get tutorialDownloadTitle => 'Mengunduh Musik';
|
|
|
|
@override
|
|
String get tutorialDownloadDesc =>
|
|
'Mengunduh musik itu mudah dan cepat. Begini cara kerjanya.';
|
|
|
|
@override
|
|
String get tutorialLibraryTitle => 'Perpustakaan Anda';
|
|
|
|
@override
|
|
String get tutorialLibraryDesc =>
|
|
'Semua musik yang Anda unduh tersusun rapi di tab Perpustakaan.';
|
|
|
|
@override
|
|
String get tutorialLibraryTip1 =>
|
|
'View download progress and queue in the Library tab';
|
|
|
|
@override
|
|
String get tutorialLibraryTip2 =>
|
|
'Tap any track to play it with your music player';
|
|
|
|
@override
|
|
String get tutorialLibraryTip3 =>
|
|
'Switch between list and grid view for better browsing';
|
|
|
|
@override
|
|
String get tutorialExtensionsTitle => 'Extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsDesc =>
|
|
'Extend the app\'s capabilities with community extensions.';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip1 =>
|
|
'Browse the Repo tab to discover useful extensions';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip2 =>
|
|
'Add new download providers or search sources';
|
|
|
|
@override
|
|
String get tutorialExtensionsTip3 =>
|
|
'Get lyrics, enhanced metadata, and more features';
|
|
|
|
@override
|
|
String get tutorialSettingsTitle => 'Customize Your Experience';
|
|
|
|
@override
|
|
String get tutorialSettingsDesc =>
|
|
'Personalize the app in Settings to match your preferences.';
|
|
|
|
@override
|
|
String get tutorialSettingsTip1 =>
|
|
'Change download location and folder organization';
|
|
|
|
@override
|
|
String get tutorialSettingsTip2 =>
|
|
'Set default audio quality and format preferences';
|
|
|
|
@override
|
|
String get tutorialSettingsTip3 => 'Customize app theme and appearance';
|
|
|
|
@override
|
|
String get tutorialReadyMessage =>
|
|
'You\'re all set! Start downloading your favorite music now.';
|
|
|
|
@override
|
|
String get libraryForceFullScan => 'Force Full Scan';
|
|
|
|
@override
|
|
String get libraryForceFullScanSubtitle => 'Rescan all files, ignoring cache';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloads => 'Cleanup Orphaned Downloads';
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsSubtitle =>
|
|
'Remove history entries for files that no longer exist';
|
|
|
|
@override
|
|
String cleanupOrphanedDownloadsResult(int count) {
|
|
return 'Removed $count orphaned entries from history';
|
|
}
|
|
|
|
@override
|
|
String get cleanupOrphanedDownloadsNone => 'No orphaned entries found';
|
|
|
|
@override
|
|
String get cacheTitle => 'Storage & Cache';
|
|
|
|
@override
|
|
String get cacheSummaryTitle => 'Cache overview';
|
|
|
|
@override
|
|
String get cacheSummarySubtitle =>
|
|
'Clearing cache will not remove downloaded music files.';
|
|
|
|
@override
|
|
String cacheEstimatedTotal(String size) {
|
|
return 'Estimated cache usage: $size';
|
|
}
|
|
|
|
@override
|
|
String get cacheSectionStorage => 'Cached Data';
|
|
|
|
@override
|
|
String get cacheSectionMaintenance => 'Maintenance';
|
|
|
|
@override
|
|
String get cacheAppDirectory => 'App cache directory';
|
|
|
|
@override
|
|
String get cacheAppDirectoryDesc =>
|
|
'HTTP responses, WebView data, and other temporary app data.';
|
|
|
|
@override
|
|
String get cacheTempDirectory => 'Temporary directory';
|
|
|
|
@override
|
|
String get cacheTempDirectoryDesc =>
|
|
'Temporary files from downloads and audio conversion.';
|
|
|
|
@override
|
|
String get cacheCoverImage => 'Cover image cache';
|
|
|
|
@override
|
|
String get cacheCoverImageDesc =>
|
|
'Downloaded album and track cover art. Will re-download when viewed.';
|
|
|
|
@override
|
|
String get cacheLibraryCover => 'Library cover cache';
|
|
|
|
@override
|
|
String get cacheLibraryCoverDesc =>
|
|
'Cover art extracted from local music files. Will re-extract on next scan.';
|
|
|
|
@override
|
|
String get cacheExploreFeed => 'Explore feed cache';
|
|
|
|
@override
|
|
String get cacheExploreFeedDesc =>
|
|
'Explore tab content (new releases, trending). Will refresh on next visit.';
|
|
|
|
@override
|
|
String get cacheTrackLookup => 'Track lookup cache';
|
|
|
|
@override
|
|
String get cacheTrackLookupDesc =>
|
|
'Spotify/Deezer track ID lookups. Clearing may slow next few searches.';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedDesc =>
|
|
'Remove orphaned download history and library entries for missing files.';
|
|
|
|
@override
|
|
String get cacheNoData => 'No cached data';
|
|
|
|
@override
|
|
String cacheSizeWithFiles(String size, int count) {
|
|
return '$size in $count files';
|
|
}
|
|
|
|
@override
|
|
String cacheSizeOnly(String size) {
|
|
return '$size';
|
|
}
|
|
|
|
@override
|
|
String cacheEntries(int count) {
|
|
return '$count entries';
|
|
}
|
|
|
|
@override
|
|
String cacheClearSuccess(String target) {
|
|
return 'Cleared: $target';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearConfirmTitle => 'Clear cache?';
|
|
|
|
@override
|
|
String cacheClearConfirmMessage(String target) {
|
|
return 'This will clear cached data for $target. Downloaded music files will not be deleted.';
|
|
}
|
|
|
|
@override
|
|
String get cacheClearAllConfirmTitle => 'Clear all cache?';
|
|
|
|
@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';
|
|
|
|
@override
|
|
String get cacheCleanupUnused => 'Cleanup unused data';
|
|
|
|
@override
|
|
String get cacheCleanupUnusedSubtitle =>
|
|
'Remove orphaned download history and missing library entries';
|
|
|
|
@override
|
|
String cacheCleanupResult(int downloadCount, int libraryCount) {
|
|
return 'Cleanup completed: $downloadCount orphaned downloads, $libraryCount missing library entries';
|
|
}
|
|
|
|
@override
|
|
String get cacheRefreshStats => 'Refresh stats';
|
|
|
|
@override
|
|
String get trackSaveCoverArt => 'Save Cover Art';
|
|
|
|
@override
|
|
String get trackSaveCoverArtSubtitle => 'Save album art as .jpg file';
|
|
|
|
@override
|
|
String get trackSaveLyrics => 'Save Lyrics (.lrc)';
|
|
|
|
@override
|
|
String get trackSaveLyricsSubtitle => 'Fetch and save lyrics as .lrc file';
|
|
|
|
@override
|
|
String get trackSaveLyricsProgress => 'Saving lyrics...';
|
|
|
|
@override
|
|
String get trackReEnrich => 'Re-enrich';
|
|
|
|
@override
|
|
String get trackReEnrichOnlineSubtitle =>
|
|
'Search metadata online and embed into file';
|
|
|
|
@override
|
|
String get trackReEnrichFieldsTitle => 'Fields to update';
|
|
|
|
@override
|
|
String get trackReEnrichFieldCover => 'Cover Art';
|
|
|
|
@override
|
|
String get trackReEnrichFieldLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get trackReEnrichFieldBasicTags => 'Album, Album Artist';
|
|
|
|
@override
|
|
String get trackReEnrichFieldTrackInfo => 'Track & Disc Number';
|
|
|
|
@override
|
|
String get trackReEnrichFieldReleaseInfo => 'Date & ISRC';
|
|
|
|
@override
|
|
String get trackReEnrichFieldExtra => 'Genre, Label, Copyright';
|
|
|
|
@override
|
|
String get trackReEnrichSelectAll => 'Select All';
|
|
|
|
@override
|
|
String get trackEditMetadata => 'Edit Metadata';
|
|
|
|
@override
|
|
String trackCoverSaved(String fileName) {
|
|
return 'Cover art saved to $fileName';
|
|
}
|
|
|
|
@override
|
|
String get trackCoverNoSource => 'No cover art source available';
|
|
|
|
@override
|
|
String trackLyricsSaved(String fileName) {
|
|
return 'Lyrics saved to $fileName';
|
|
}
|
|
|
|
@override
|
|
String get trackReEnrichProgress => 'Re-enriching metadata...';
|
|
|
|
@override
|
|
String get trackReEnrichSearching => 'Searching metadata online...';
|
|
|
|
@override
|
|
String get trackReEnrichSuccess => 'Metadata re-enriched successfully';
|
|
|
|
@override
|
|
String get trackReEnrichFfmpegFailed => 'FFmpeg metadata embed failed';
|
|
|
|
@override
|
|
String get queueFlacAction => 'Queue FLAC';
|
|
|
|
@override
|
|
String queueFlacConfirmMessage(int count) {
|
|
return 'Search online matches for the selected tracks and queue FLAC downloads.\n\nExisting files will not be modified or deleted.\n\nOnly high-confidence matches are queued automatically.\n\n$count selected';
|
|
}
|
|
|
|
@override
|
|
String queueFlacFindingProgress(int current, int total) {
|
|
return 'Finding FLAC matches... ($current/$total)';
|
|
}
|
|
|
|
@override
|
|
String get queueFlacNoReliableMatches =>
|
|
'No reliable online matches found for the selection';
|
|
|
|
@override
|
|
String queueFlacQueuedWithSkipped(int addedCount, int skippedCount) {
|
|
return 'Added $addedCount tracks to queue, skipped $skippedCount';
|
|
}
|
|
|
|
@override
|
|
String trackSaveFailed(String error) {
|
|
return 'Failed: $error';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertFormat => 'Convert Format';
|
|
|
|
@override
|
|
String get trackConvertFormatSubtitle =>
|
|
'Convert to AAC/M4A, MP3, Opus, ALAC, or FLAC';
|
|
|
|
@override
|
|
String get trackConvertTitle => 'Convert Audio';
|
|
|
|
@override
|
|
String get trackConvertTargetFormat => 'Target Format';
|
|
|
|
@override
|
|
String get trackConvertBitrate => 'Bitrate';
|
|
|
|
@override
|
|
String get trackConvertConfirmTitle => 'Confirm Conversion';
|
|
|
|
@override
|
|
String trackConvertConfirmMessage(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String bitrate,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat at $bitrate?\n\nThe original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String trackConvertConfirmMessageLossless(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
) {
|
|
return 'Convert from $sourceFormat to $targetFormat? (Lossless — no quality loss)\n\nThe original file will be deleted after conversion.';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertLosslessHint =>
|
|
'Lossless conversion — no quality loss';
|
|
|
|
@override
|
|
String get trackConvertConverting => 'Converting audio...';
|
|
|
|
@override
|
|
String trackConvertSuccess(String format) {
|
|
return 'Converted to $format successfully';
|
|
}
|
|
|
|
@override
|
|
String get trackConvertFailed => 'Conversion failed';
|
|
|
|
@override
|
|
String get cueSplitTitle => 'Split CUE Sheet';
|
|
|
|
@override
|
|
String get cueSplitSubtitle => 'Split CUE+FLAC into individual tracks';
|
|
|
|
@override
|
|
String cueSplitAlbum(String album) {
|
|
return 'Album: $album';
|
|
}
|
|
|
|
@override
|
|
String cueSplitArtist(String artist) {
|
|
return 'Artist: $artist';
|
|
}
|
|
|
|
@override
|
|
String cueSplitTrackCount(int count) {
|
|
return '$count tracks';
|
|
}
|
|
|
|
@override
|
|
String get cueSplitConfirmTitle => 'Split CUE Album';
|
|
|
|
@override
|
|
String cueSplitConfirmMessage(String album, int count) {
|
|
return 'Split \"$album\" into $count individual FLAC files?\n\nFiles will be saved to the same directory.';
|
|
}
|
|
|
|
@override
|
|
String cueSplitSplitting(int current, int total) {
|
|
return 'Splitting CUE sheet... ($current/$total)';
|
|
}
|
|
|
|
@override
|
|
String cueSplitSuccess(int count) {
|
|
return 'Split into $count tracks successfully';
|
|
}
|
|
|
|
@override
|
|
String get cueSplitFailed => 'CUE split failed';
|
|
|
|
@override
|
|
String get cueSplitNoAudioFile => 'Audio file not found for this CUE sheet';
|
|
|
|
@override
|
|
String get cueSplitButton => 'Split into Tracks';
|
|
|
|
@override
|
|
String get actionCreate => 'Create';
|
|
|
|
@override
|
|
String get collectionFoldersTitle => 'My folders';
|
|
|
|
@override
|
|
String get collectionWishlist => 'Wishlist';
|
|
|
|
@override
|
|
String get collectionLoved => 'Loved';
|
|
|
|
@override
|
|
String get collectionFavoriteArtists => 'Favorite Artists';
|
|
|
|
@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 collectionArtistCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count artists',
|
|
one: '1 artist',
|
|
);
|
|
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 collectionFavoriteArtistsEmptyTitle => 'No favorite artists yet';
|
|
|
|
@override
|
|
String get collectionFavoriteArtistsEmptySubtitle =>
|
|
'Tap the heart on an artist page to keep them here';
|
|
|
|
@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 collectionAddedToFavoriteArtists(String artistName) {
|
|
return '\"$artistName\" added to Favorite Artists';
|
|
}
|
|
|
|
@override
|
|
String collectionRemovedFromFavoriteArtists(String artistName) {
|
|
return '\"$artistName\" removed from Favorite Artists';
|
|
}
|
|
|
|
@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 artistOptionAddToFavorites => 'Add to Favorite Artists';
|
|
|
|
@override
|
|
String get artistOptionRemoveFromFavorites => 'Remove from Favorite Artists';
|
|
|
|
@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 selectionBatchConvertConfirmMessageLossless(int count, String format) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Convert $count $_temp0 to $format? (Lossless — no quality loss)\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 diunduh';
|
|
}
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFoldersAlbumSubtitle =>
|
|
'Folder named after Album Artist tag';
|
|
|
|
@override
|
|
String get downloadUseAlbumArtistForFoldersTrackSubtitle =>
|
|
'Folder named after Track Artist tag';
|
|
|
|
@override
|
|
String get lyricsProvidersTitle => 'Lyrics Provider Priority';
|
|
|
|
@override
|
|
String get lyricsProvidersDescription =>
|
|
'Enable, disable and reorder lyrics sources. Providers are tried top-to-bottom until lyrics are found.';
|
|
|
|
@override
|
|
String get lyricsProvidersInfoText =>
|
|
'Extension lyrics providers run before built-in lyrics providers. At least one provider must remain enabled.';
|
|
|
|
@override
|
|
String lyricsProvidersEnabledSection(int count) {
|
|
return 'Enabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String lyricsProvidersDisabledSection(int count) {
|
|
return 'Disabled ($count)';
|
|
}
|
|
|
|
@override
|
|
String get lyricsProvidersAtLeastOne =>
|
|
'At least one provider must remain enabled';
|
|
|
|
@override
|
|
String get lyricsProvidersSaved => 'Lyrics provider priority saved';
|
|
|
|
@override
|
|
String get lyricsProvidersDiscardContent =>
|
|
'You have unsaved changes that will be lost.';
|
|
|
|
@override
|
|
String get lyricsProviderLrclibDesc => 'Open-source synced lyrics database';
|
|
|
|
@override
|
|
String get lyricsProviderNeteaseDesc =>
|
|
'NetEase Cloud Music (good for Asian songs)';
|
|
|
|
@override
|
|
String get lyricsProviderMusixmatchDesc =>
|
|
'Largest lyrics database (multi-language)';
|
|
|
|
@override
|
|
String get lyricsProviderAppleMusicDesc =>
|
|
'Word-by-word synced lyrics (via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderQqMusicDesc =>
|
|
'QQ Music (good for Chinese songs, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderLyricsPlusDesc =>
|
|
'Word-by-word karaoke lyrics (Apple/Musixmatch/Spotify/QQ, via proxy)';
|
|
|
|
@override
|
|
String get lyricsProviderExtensionDesc => 'Extension provider';
|
|
|
|
@override
|
|
String get safMigrationTitle => 'Storage Update Required';
|
|
|
|
@override
|
|
String get safMigrationMessage1 =>
|
|
'SpotiFLAC now uses Android Storage Access Framework (SAF) for downloads. This fixes \"permission denied\" errors on Android 10+.';
|
|
|
|
@override
|
|
String get safMigrationMessage2 =>
|
|
'Please select your download folder again to switch to the new storage system.';
|
|
|
|
@override
|
|
String get safMigrationSuccess => 'Download folder updated to SAF mode';
|
|
|
|
@override
|
|
String get settingsDonate => 'Support Development';
|
|
|
|
@override
|
|
String get settingsDonateSubtitle => 'Buy the developer a coffee';
|
|
|
|
@override
|
|
String get settingsBackup => 'Cadangkan & Pulihkan';
|
|
|
|
@override
|
|
String get settingsBackupSubtitle =>
|
|
'Pindahkan pustaka, riwayat, dan pengaturan ke perangkat baru';
|
|
|
|
@override
|
|
String get backupTitle => 'Cadangkan & Pulihkan';
|
|
|
|
@override
|
|
String get backupExportSectionTitle => 'Buat cadangan';
|
|
|
|
@override
|
|
String get backupExportSectionDescription =>
|
|
'Simpan pengaturan, riwayat unduhan, lagu disukai, wishlist, artis favorit, dan playlist ke dalam satu file yang bisa kamu simpan atau pindahkan ke ponsel lain.';
|
|
|
|
@override
|
|
String get backupExportButton => 'Buat file cadangan';
|
|
|
|
@override
|
|
String get backupImportSectionTitle => 'Pulihkan cadangan';
|
|
|
|
@override
|
|
String get backupImportSectionDescription =>
|
|
'Pilih file cadangan untuk memulihkan data. Ini akan menggantikan pengaturan, riwayat, dan pustaka di perangkat ini.';
|
|
|
|
@override
|
|
String get backupImportButton => 'Pilih file cadangan';
|
|
|
|
@override
|
|
String get backupCreating => 'Membuat cadangan...';
|
|
|
|
@override
|
|
String get backupCreated => 'Cadangan berhasil dibuat';
|
|
|
|
@override
|
|
String get backupCreateFailed => 'Gagal membuat cadangan';
|
|
|
|
@override
|
|
String get backupEmpty => 'Belum ada data untuk dicadangkan';
|
|
|
|
@override
|
|
String get backupRestoreConfirmTitle => 'Pulihkan cadangan ini?';
|
|
|
|
@override
|
|
String get backupRestoreConfirmMessage =>
|
|
'Ini akan menggantikan pengaturan, riwayat unduhan, lagu disukai, wishlist, dan playlist saat ini dengan isi cadangan. Tindakan ini tidak bisa dibatalkan.';
|
|
|
|
@override
|
|
String get backupRestoreConfirmButton => 'Pulihkan';
|
|
|
|
@override
|
|
String get backupRestoring => 'Memulihkan cadangan...';
|
|
|
|
@override
|
|
String get backupRestored => 'Cadangan berhasil dipulihkan';
|
|
|
|
@override
|
|
String get backupRestoreFailed => 'Gagal memulihkan cadangan';
|
|
|
|
@override
|
|
String get backupInvalidFile =>
|
|
'File ini bukan cadangan SpotiFLAC yang valid';
|
|
|
|
@override
|
|
String get backupRestoreRestartHint =>
|
|
'Mulai ulang aplikasi untuk memastikan semua perubahan diterapkan.';
|
|
|
|
@override
|
|
String get backupContentsTitle => 'Isi cadangan';
|
|
|
|
@override
|
|
String get backupContentsSettings => 'Pengaturan aplikasi';
|
|
|
|
@override
|
|
String backupContentsHistory(int count) {
|
|
return '$count item riwayat';
|
|
}
|
|
|
|
@override
|
|
String backupContentsLiked(int count) {
|
|
return '$count lagu disukai';
|
|
}
|
|
|
|
@override
|
|
String backupContentsWishlist(int count) {
|
|
return '$count lagu di wishlist';
|
|
}
|
|
|
|
@override
|
|
String backupContentsPlaylists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count playlist',
|
|
one: '1 playlist',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsArtists(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count artis favorit',
|
|
one: '1 artis favorit',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String backupContentsExtensions(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count extension',
|
|
one: '1 extension',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get backupIncludeSecrets => 'Sertakan kredensial extension';
|
|
|
|
@override
|
|
String get backupIncludeSecretsDescription =>
|
|
'Token dan API key dari extension akan ikut disimpan ke file cadangan. Jaga kerahasiaan file-nya. Jika dimatikan, kamu perlu memasukkannya lagi setelah pemulihan.';
|
|
|
|
@override
|
|
String backupExtensionsRestoreFailed(int count) {
|
|
return '$count extension gagal dipasang ulang. Pasang manual dari store.';
|
|
}
|
|
|
|
@override
|
|
String get tooltipLoveAll => 'Love All';
|
|
|
|
@override
|
|
String get tooltipAddToPlaylist => 'Add to Playlist';
|
|
|
|
@override
|
|
String snackbarRemovedTracksFromLoved(int count) {
|
|
return 'Removed $count tracks from Loved';
|
|
}
|
|
|
|
@override
|
|
String snackbarAddedTracksToLoved(int count) {
|
|
return 'Added $count tracks to Loved';
|
|
}
|
|
|
|
@override
|
|
String get dialogDownloadAllTitle => 'Download All';
|
|
|
|
@override
|
|
String dialogDownloadAllMessage(int count) {
|
|
return 'Download $count tracks?';
|
|
}
|
|
|
|
@override
|
|
String get homeSkipAlreadyDownloaded => 'Skip already downloaded songs';
|
|
|
|
@override
|
|
String get homeGoToAlbum => 'Go to Album';
|
|
|
|
@override
|
|
String get homeAlbumInfoUnavailable => 'Album info not available';
|
|
|
|
@override
|
|
String get snackbarLoadingCueSheet => 'Loading CUE sheet...';
|
|
|
|
@override
|
|
String get snackbarMetadataSaved => 'Metadata saved successfully';
|
|
|
|
@override
|
|
String get snackbarFailedToEmbedLyrics => 'Failed to embed lyrics';
|
|
|
|
@override
|
|
String get snackbarFailedToWriteStorage => 'Failed to write back to storage';
|
|
|
|
@override
|
|
String snackbarError(String error) {
|
|
return 'Error: $error';
|
|
}
|
|
|
|
@override
|
|
String get snackbarNoActionDefined => 'No action defined for this button';
|
|
|
|
@override
|
|
String get noTracksFoundForAlbum => 'No tracks found for this album';
|
|
|
|
@override
|
|
String get downloadLocationSubtitle =>
|
|
'Choose where to save your downloaded tracks';
|
|
|
|
@override
|
|
String get storageModeAppFolder => 'App Folder (Recommended)';
|
|
|
|
@override
|
|
String get storageModeAppFolderSubtitle =>
|
|
'Saves to Music/SpotiFLAC by default';
|
|
|
|
@override
|
|
String get storageModeSaf => 'Custom Folder (SAF)';
|
|
|
|
@override
|
|
String get storageModeSafSubtitle => 'Pick any folder, including SD card';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostTitle => 'Download folder access lost';
|
|
|
|
@override
|
|
String get downloadFolderAccessLostSubtitle =>
|
|
'Downloads will fail until you re-select the folder';
|
|
|
|
@override
|
|
String get downloadFolderReselect => 'Re-select folder';
|
|
|
|
@override
|
|
String get downloadErrorSafPermissionLost =>
|
|
'SAF permission invalid or revoked. Please reconfigure download location in Settings.';
|
|
|
|
@override
|
|
String get downloadErrorFolderAccessLost =>
|
|
'Download folder access lost. Please re-select your download folder in Settings.';
|
|
|
|
@override
|
|
String downloadFilenameDescription(
|
|
Object album,
|
|
Object artist,
|
|
Object date,
|
|
Object disc,
|
|
Object title,
|
|
Object track,
|
|
Object year,
|
|
) {
|
|
return 'Use $artist, $title, $album, $track, $year, $date, $disc as placeholders.';
|
|
}
|
|
|
|
@override
|
|
String get downloadFilenameInsertTag => 'Tap to insert tag:';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesEnabled =>
|
|
'Singles and EPs saved in a separate folder';
|
|
|
|
@override
|
|
String get downloadSeparateSinglesDisabled =>
|
|
'Singles and albums saved in the same folder';
|
|
|
|
@override
|
|
String get downloadArtistNameFilters => 'Artist Name Filters';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolder => 'Playlist Source Folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderEnabled =>
|
|
'A subfolder is created for each playlist';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderDisabled =>
|
|
'All tracks saved directly to download folder';
|
|
|
|
@override
|
|
String get downloadCreatePlaylistSourceFolderRedundant =>
|
|
'Handled by folder organization setting';
|
|
|
|
@override
|
|
String get downloadSongLinkRegion => 'SongLink Region';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityMode => 'Network Compatibility Mode';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeEnabled =>
|
|
'Using legacy TLS settings for older networks';
|
|
|
|
@override
|
|
String get downloadNetworkCompatibilityModeDisabled =>
|
|
'Using standard network settings';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetwork => 'Izinkan Akses Jaringan Lokal';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkEnabled =>
|
|
'Permintaan ke alamat lokal/privat diizinkan (untuk proxy lokal atau DNS kustom)';
|
|
|
|
@override
|
|
String get downloadAllowLocalNetworkDisabled =>
|
|
'Alamat lokal/privat diblokir demi keamanan';
|
|
|
|
@override
|
|
String get downloadSelectServiceToEnable =>
|
|
'Select a provider with quality options to enable this option';
|
|
|
|
@override
|
|
String get downloadSelectTidalQobuz =>
|
|
'Select a provider with quality options to choose audio quality';
|
|
|
|
@override
|
|
String get downloadEmbedLyricsDisabled => 'Enable metadata embedding first';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslation =>
|
|
'Netease: Include Translation';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslationEnabled =>
|
|
'Chinese translation lines included';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeTranslationDisabled =>
|
|
'Original lyrics only';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanization =>
|
|
'Netease: Include Romanization';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanizationEnabled =>
|
|
'Romanization lines included';
|
|
|
|
@override
|
|
String get downloadNeteaseIncludeRomanizationDisabled => 'No romanization';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPerson => 'Apple / QQ: Multi-Person Lyrics';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPersonEnabled =>
|
|
'Speaker labels included for duets and group tracks';
|
|
|
|
@override
|
|
String get downloadAppleQqMultiPersonDisabled =>
|
|
'Standard lyrics without speaker labels';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSync => 'Apple Music eLRC Word Sync';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSyncEnabled =>
|
|
'Raw word-by-word timestamps preserved';
|
|
|
|
@override
|
|
String get downloadAppleElrcWordSyncDisabled =>
|
|
'Safer line-by-line Apple Music lyrics';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguage => 'Musixmatch Language';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageAuto => 'Auto (original language)';
|
|
|
|
@override
|
|
String get downloadFilterContributing => 'Filter Contributing Artists';
|
|
|
|
@override
|
|
String get downloadFilterContributingEnabled =>
|
|
'Contributing artists removed from Album Artist folder name';
|
|
|
|
@override
|
|
String get downloadFilterContributingDisabled =>
|
|
'Full Album Artist string used';
|
|
|
|
@override
|
|
String get downloadProvidersNoneEnabled => 'No providers enabled';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageCode => 'Language code';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageHint => 'e.g. en, de, ja';
|
|
|
|
@override
|
|
String get downloadMusixmatchLanguageDesc =>
|
|
'Enter a BCP-47 language code (e.g. en, de, ja) to request translated lyrics from Musixmatch.';
|
|
|
|
@override
|
|
String get downloadMusixmatchAuto => 'Auto';
|
|
|
|
@override
|
|
String get downloadNetworkAnySubtitle => 'Use WiFi or mobile data';
|
|
|
|
@override
|
|
String get downloadNetworkWifiOnlySubtitle =>
|
|
'Downloads pause when on mobile data';
|
|
|
|
@override
|
|
String get downloadSongLinkRegionDesc =>
|
|
'Region used when resolving track links via SongLink. Choose the country where your streaming services are available.';
|
|
|
|
@override
|
|
String get snackbarUnsupportedAudioFormat => 'Unsupported audio format';
|
|
|
|
@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';
|
|
}
|
|
|
|
@override
|
|
String get editMetadataAutoFill => 'Auto-fill from online';
|
|
|
|
@override
|
|
String get editMetadataAutoFillDesc =>
|
|
'Select fields to fill automatically from online metadata';
|
|
|
|
@override
|
|
String get editMetadataAutoFillFetch => 'Fetch & Fill';
|
|
|
|
@override
|
|
String get editMetadataAutoFillSearching => 'Searching online...';
|
|
|
|
@override
|
|
String get editMetadataAutoFillNoResults =>
|
|
'No matching metadata found online';
|
|
|
|
@override
|
|
String editMetadataAutoFillDone(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'fields',
|
|
one: 'field',
|
|
);
|
|
return 'Filled $count $_temp0 from online metadata';
|
|
}
|
|
|
|
@override
|
|
String get editMetadataAutoFillNoneSelected =>
|
|
'Select at least one field to auto-fill';
|
|
|
|
@override
|
|
String get editMetadataFieldTitle => 'Title';
|
|
|
|
@override
|
|
String get editMetadataFieldArtist => 'Artist';
|
|
|
|
@override
|
|
String get editMetadataFieldAlbum => 'Album';
|
|
|
|
@override
|
|
String get editMetadataFieldAlbumArtist => 'Album Artist';
|
|
|
|
@override
|
|
String get editMetadataFieldDate => 'Date';
|
|
|
|
@override
|
|
String get editMetadataFieldTrackNum => 'Track #';
|
|
|
|
@override
|
|
String get editMetadataFieldDiscNum => 'Disc #';
|
|
|
|
@override
|
|
String get editMetadataFieldGenre => 'Genre';
|
|
|
|
@override
|
|
String get editMetadataFieldIsrc => 'ISRC';
|
|
|
|
@override
|
|
String get editMetadataFieldLabel => 'Label';
|
|
|
|
@override
|
|
String get editMetadataFieldCopyright => 'Copyright';
|
|
|
|
@override
|
|
String get editMetadataFieldCover => 'Cover Art';
|
|
|
|
@override
|
|
String get editMetadataSelectAll => 'All';
|
|
|
|
@override
|
|
String get editMetadataSelectEmpty => 'Empty only';
|
|
|
|
@override
|
|
String queueDownloadingCount(int count) {
|
|
return 'Downloading ($count)';
|
|
}
|
|
|
|
@override
|
|
String get queueDownloadedHeader => 'Downloaded';
|
|
|
|
@override
|
|
String get queueFilteringIndicator => 'Filtering...';
|
|
|
|
@override
|
|
String queueTrackCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks',
|
|
one: '1 track',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String queueAlbumCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count albums',
|
|
one: '1 album',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get queueEmptyAlbums => 'No album downloads';
|
|
|
|
@override
|
|
String get queueEmptyAlbumsSubtitle =>
|
|
'Download multiple tracks from an album to see them here';
|
|
|
|
@override
|
|
String get queueEmptySingles => 'No single downloads';
|
|
|
|
@override
|
|
String get queueEmptySinglesSubtitle =>
|
|
'Single track downloads will appear here';
|
|
|
|
@override
|
|
String get queueEmptyHistory => 'No download history';
|
|
|
|
@override
|
|
String get queueEmptyHistorySubtitle => 'Downloaded tracks will appear here';
|
|
|
|
@override
|
|
String get selectionAllPlaylistsSelected => 'All playlists selected';
|
|
|
|
@override
|
|
String get selectionTapPlaylistsToSelect => 'Tap playlists to select';
|
|
|
|
@override
|
|
String get selectionSelectPlaylistsToDelete => 'Select playlists to delete';
|
|
|
|
@override
|
|
String get audioAnalysisTitle => 'Audio Quality Analysis';
|
|
|
|
@override
|
|
String get audioAnalysisDescription =>
|
|
'Verify lossless quality with spectrum analysis';
|
|
|
|
@override
|
|
String get audioAnalysisAnalyzing => 'Analyzing audio...';
|
|
|
|
@override
|
|
String get audioAnalysisSampleRate => 'Sample Rate';
|
|
|
|
@override
|
|
String get audioAnalysisCodec => 'Codec';
|
|
|
|
@override
|
|
String get audioAnalysisContainer => 'Container';
|
|
|
|
@override
|
|
String get audioAnalysisDecodedFormat => 'Decoded Format';
|
|
|
|
@override
|
|
String get audioAnalysisBitDepth => 'Bit Depth';
|
|
|
|
@override
|
|
String get audioAnalysisChannels => 'Channels';
|
|
|
|
@override
|
|
String get audioAnalysisDuration => 'Duration';
|
|
|
|
@override
|
|
String get audioAnalysisNyquist => 'Nyquist';
|
|
|
|
@override
|
|
String get audioAnalysisFileSize => 'Size';
|
|
|
|
@override
|
|
String get audioAnalysisDynamicRange => 'Dynamic Range';
|
|
|
|
@override
|
|
String get audioAnalysisPeak => 'Peak';
|
|
|
|
@override
|
|
String get audioAnalysisRms => 'RMS';
|
|
|
|
@override
|
|
String get audioAnalysisLufs => 'LUFS';
|
|
|
|
@override
|
|
String get audioAnalysisTruePeak => 'True Peak';
|
|
|
|
@override
|
|
String get audioAnalysisClipping => 'Clipping';
|
|
|
|
@override
|
|
String get audioAnalysisNoClipping => 'No clipping';
|
|
|
|
@override
|
|
String get audioAnalysisSpectralCutoff => 'Spectral Cutoff';
|
|
|
|
@override
|
|
String get audioAnalysisChannelStats => 'Per-channel Stats';
|
|
|
|
@override
|
|
String get audioAnalysisSamples => 'Samples';
|
|
|
|
@override
|
|
String get audioAnalysisRescan => 'Re-analyze';
|
|
|
|
@override
|
|
String get audioAnalysisRescanning => 'Re-analyzing audio...';
|
|
|
|
@override
|
|
String extensionsSearchWith(String providerName) {
|
|
return 'Search with $providerName';
|
|
}
|
|
|
|
@override
|
|
String get extensionsHomeFeedProvider => 'Home Feed Provider';
|
|
|
|
@override
|
|
String get extensionsHomeFeedDescription =>
|
|
'Choose which extension provides the home feed on the main screen';
|
|
|
|
@override
|
|
String get extensionsHomeFeedAuto => 'Auto';
|
|
|
|
@override
|
|
String get extensionsHomeFeedAutoSubtitle =>
|
|
'Automatically select the best available';
|
|
|
|
@override
|
|
String get extensionsHomeFeedOff => 'Off';
|
|
|
|
@override
|
|
String get extensionsHomeFeedOffSubtitle =>
|
|
'Do not show the home feed on the main screen';
|
|
|
|
@override
|
|
String extensionsHomeFeedUse(String extensionName) {
|
|
return 'Use $extensionName home feed';
|
|
}
|
|
|
|
@override
|
|
String get extensionsNoHomeFeedExtensions => 'No extensions with home feed';
|
|
|
|
@override
|
|
String get sortAlphaAsc => 'A-Z';
|
|
|
|
@override
|
|
String get sortAlphaDesc => 'Z-A';
|
|
|
|
@override
|
|
String get cancelDownloadTitle => 'Cancel download?';
|
|
|
|
@override
|
|
String cancelDownloadContent(String trackName) {
|
|
return 'This will cancel the active download for \"$trackName\".';
|
|
}
|
|
|
|
@override
|
|
String get cancelDownloadKeep => 'Keep';
|
|
|
|
@override
|
|
String get metadataSaveFailedFfmpeg => 'Failed to save metadata via FFmpeg';
|
|
|
|
@override
|
|
String get metadataSaveFailedStorage =>
|
|
'Failed to write metadata back to storage';
|
|
|
|
@override
|
|
String snackbarFolderPickerFailed(String error) {
|
|
return 'Failed to open folder picker: $error';
|
|
}
|
|
|
|
@override
|
|
String get errorLoadAlbum => 'Failed to load album';
|
|
|
|
@override
|
|
String get errorLoadPlaylist => 'Failed to load playlist';
|
|
|
|
@override
|
|
String get errorLoadArtist => 'Failed to load artist';
|
|
|
|
@override
|
|
String get notifChannelDownloadName => 'Download Progress';
|
|
|
|
@override
|
|
String get notifChannelDownloadDesc => 'Shows download progress for tracks';
|
|
|
|
@override
|
|
String get notifChannelLibraryScanName => 'Library Scan';
|
|
|
|
@override
|
|
String get notifChannelLibraryScanDesc => 'Shows local library scan progress';
|
|
|
|
@override
|
|
String notifDownloadingTrack(String trackName) {
|
|
return 'Downloading $trackName';
|
|
}
|
|
|
|
@override
|
|
String notifFinalizingTrack(String trackName) {
|
|
return 'Finalizing $trackName';
|
|
}
|
|
|
|
@override
|
|
String get notifEmbeddingMetadata => 'Embedding metadata...';
|
|
|
|
@override
|
|
String notifAlreadyInLibraryCount(int completed, int total) {
|
|
return 'Already in Library ($completed/$total)';
|
|
}
|
|
|
|
@override
|
|
String get notifAlreadyInLibrary => 'Already in Library';
|
|
|
|
@override
|
|
String notifDownloadCompleteCount(int completed, int total) {
|
|
return 'Download Complete ($completed/$total)';
|
|
}
|
|
|
|
@override
|
|
String get notifDownloadComplete => 'Download Complete';
|
|
|
|
@override
|
|
String notifDownloadsFinished(int completed, int failed) {
|
|
return 'Downloads Finished ($completed done, $failed failed)';
|
|
}
|
|
|
|
@override
|
|
String get notifVerificationRequiredTitle => 'Verification required';
|
|
|
|
@override
|
|
String get notifVerificationRequiredBody =>
|
|
'Open the app to complete verification and resume downloads';
|
|
|
|
@override
|
|
String get notifAllDownloadsComplete => 'All Downloads Complete';
|
|
|
|
@override
|
|
String notifTracksDownloadedSuccess(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count tracks downloaded successfully',
|
|
one: '1 track downloaded successfully',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String notifDownloadsFinishedBody(int completed, int failed) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
completed,
|
|
locale: localeName,
|
|
other: '$completed tracks downloaded',
|
|
one: '1 track downloaded',
|
|
);
|
|
String _temp1 = intl.Intl.pluralLogic(
|
|
failed,
|
|
locale: localeName,
|
|
other: '$failed failed',
|
|
one: '1 failed',
|
|
);
|
|
return '$_temp0, $_temp1';
|
|
}
|
|
|
|
@override
|
|
String get notifDownloadsCanceledTitle => 'Downloads canceled';
|
|
|
|
@override
|
|
String notifDownloadsCanceledBody(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: '$count downloads canceled by user',
|
|
one: '1 download canceled by user',
|
|
);
|
|
return '$_temp0';
|
|
}
|
|
|
|
@override
|
|
String get notifScanningLibrary => 'Scanning local library';
|
|
|
|
@override
|
|
String notifLibraryScanProgressWithTotal(
|
|
int scanned,
|
|
int total,
|
|
int percentage,
|
|
) {
|
|
return '$scanned/$total files • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanProgressNoTotal(int scanned, int percentage) {
|
|
return '$scanned files scanned • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanComplete => 'Library scan complete';
|
|
|
|
@override
|
|
String notifLibraryScanCompleteBody(int count) {
|
|
return '$count tracks indexed';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanExcluded(int count) {
|
|
return '$count excluded';
|
|
}
|
|
|
|
@override
|
|
String notifLibraryScanErrors(int count) {
|
|
return '$count errors';
|
|
}
|
|
|
|
@override
|
|
String get notifLibraryScanFailed => 'Library scan failed';
|
|
|
|
@override
|
|
String get notifLibraryScanCancelled => 'Library scan cancelled';
|
|
|
|
@override
|
|
String get notifLibraryScanStopped => 'Scan stopped before completion.';
|
|
|
|
@override
|
|
String notifDownloadingUpdate(String version) {
|
|
return 'Downloading SpotiFLAC Mobile v$version';
|
|
}
|
|
|
|
@override
|
|
String notifUpdateProgress(String received, String total, int percentage) {
|
|
return '$received / $total MB • $percentage%';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateReady => 'Update Ready';
|
|
|
|
@override
|
|
String notifUpdateReadyBody(String version) {
|
|
return 'SpotiFLAC Mobile v$version downloaded. Tap to install.';
|
|
}
|
|
|
|
@override
|
|
String get notifUpdateFailed => 'Update Failed';
|
|
|
|
@override
|
|
String get notifUpdateFailedBody =>
|
|
'Could not download update. Try again later.';
|
|
|
|
@override
|
|
String get searchTracks => 'Tracks';
|
|
|
|
@override
|
|
String get homeSearchHintDefault => 'Paste supported URL or search...';
|
|
|
|
@override
|
|
String homeSearchHintProvider(String providerName) {
|
|
return 'Search with $providerName...';
|
|
}
|
|
|
|
@override
|
|
String get homeImportCsvTooltip => 'Import CSV';
|
|
|
|
@override
|
|
String get homeChangeSearchProviderTooltip => 'Change search provider';
|
|
|
|
@override
|
|
String get actionPaste => 'Paste';
|
|
|
|
@override
|
|
String get searchTracksHint => 'Search tracks...';
|
|
|
|
@override
|
|
String get searchTracksEmptyPrompt => 'Search for tracks';
|
|
|
|
@override
|
|
String get tutorialSearchHint => 'Paste or search...';
|
|
|
|
@override
|
|
String get tutorialDownloadCompletedSemantics => 'Download completed';
|
|
|
|
@override
|
|
String get tutorialDownloadInProgressSemantics => 'Download in progress';
|
|
|
|
@override
|
|
String get tutorialStartDownloadSemantics => 'Start download';
|
|
|
|
@override
|
|
String get optionsEmbedMetadata => 'Embed Metadata';
|
|
|
|
@override
|
|
String get optionsEmbedMetadataSubtitleOn =>
|
|
'Write metadata, cover art, and embedded lyrics to files';
|
|
|
|
@override
|
|
String get optionsEmbedMetadataSubtitleOff =>
|
|
'Disabled (advanced): skip all metadata embedding';
|
|
|
|
@override
|
|
String get optionsMaxQualityCoverSubtitleDisabled =>
|
|
'Disabled when metadata embedding is off';
|
|
|
|
@override
|
|
String downloadFilenameHintExample(Object artist, Object title) {
|
|
return '$artist - $title';
|
|
}
|
|
|
|
@override
|
|
String get trackCoverNoEmbeddedArt => 'No embedded album art found';
|
|
|
|
@override
|
|
String get trackCoverReplace => 'Replace Cover';
|
|
|
|
@override
|
|
String get trackCoverPick => 'Pick Cover';
|
|
|
|
@override
|
|
String get trackCoverClearSelected => 'Clear selected cover';
|
|
|
|
@override
|
|
String get trackCoverCurrent => 'Current cover';
|
|
|
|
@override
|
|
String get trackCoverSelected => 'Selected cover';
|
|
|
|
@override
|
|
String get trackCoverReplaceNotice =>
|
|
'The selected cover will replace the current embedded cover when you tap Save.';
|
|
|
|
@override
|
|
String get actionStop => 'Stop';
|
|
|
|
@override
|
|
String get queueFinalizingDownload => 'Finalizing download';
|
|
|
|
@override
|
|
String get queueDownloadedFileMissing => 'Downloaded file missing';
|
|
|
|
@override
|
|
String get queueDownloadCompleted => 'Download completed';
|
|
|
|
@override
|
|
String get queueRateLimitTitle => 'Service rate limited';
|
|
|
|
@override
|
|
String get queueRateLimitMessage =>
|
|
'This track may still be available. Wait a few minutes, reduce parallel downloads, then retry.';
|
|
|
|
@override
|
|
String appearanceSelectAccentColor(String hex) {
|
|
return 'Select accent color $hex';
|
|
}
|
|
|
|
@override
|
|
String get logAutoScrollOn => 'Auto-scroll ON';
|
|
|
|
@override
|
|
String get logAutoScrollOff => 'Auto-scroll OFF';
|
|
|
|
@override
|
|
String get logCopyLogs => 'Copy logs';
|
|
|
|
@override
|
|
String get logClearSearch => 'Clear search';
|
|
|
|
@override
|
|
String get logIssueIspBlockingLabel => 'ISP BLOCKING DETECTED';
|
|
|
|
@override
|
|
String get logIssueIspBlockingDescription =>
|
|
'Your ISP may be blocking access to download services';
|
|
|
|
@override
|
|
String get logIssueIspBlockingSuggestion =>
|
|
'Try using a VPN or change DNS to 1.1.1.1 or 8.8.8.8';
|
|
|
|
@override
|
|
String get logIssueRateLimitedLabel => 'RATE LIMITED';
|
|
|
|
@override
|
|
String get logIssueRateLimitedDescription =>
|
|
'Too many requests to the service';
|
|
|
|
@override
|
|
String get logIssueRateLimitedSuggestion =>
|
|
'Wait a few minutes before trying again';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorLabel => 'NETWORK ERROR';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorDescription => 'Connection issues detected';
|
|
|
|
@override
|
|
String get logIssueNetworkErrorSuggestion => 'Check your internet connection';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundLabel => 'TRACK NOT FOUND';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundDescription =>
|
|
'Some tracks could not be found on download services';
|
|
|
|
@override
|
|
String get logIssueTrackNotFoundSuggestion =>
|
|
'The track may not be available in lossless quality';
|
|
|
|
@override
|
|
String get clickableLookingUpArtist => 'Looking up artist...';
|
|
|
|
@override
|
|
String clickableInformationUnavailable(String type) {
|
|
return '$type information not available';
|
|
}
|
|
|
|
@override
|
|
String get extensionDetailsTags => 'Tags';
|
|
|
|
@override
|
|
String get extensionDetailsInformation => 'Information';
|
|
|
|
@override
|
|
String get extensionUtilityFunctions => 'Utility Functions';
|
|
|
|
@override
|
|
String get actionDismiss => 'Dismiss';
|
|
|
|
@override
|
|
String get setupChangeFolderTooltip => 'Change folder';
|
|
|
|
@override
|
|
String a11yOpenTrackByArtist(String trackName, String artistName) {
|
|
return 'Open track $trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenItem(String itemType, String name) {
|
|
return 'Open $itemType $name';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenItemCount(String title, int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return 'Open $title, $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenAlbumByArtistTrackCount(
|
|
String albumName,
|
|
String artistName,
|
|
int trackCount,
|
|
) {
|
|
return 'Open album $albumName by $artistName, $trackCount tracks';
|
|
}
|
|
|
|
@override
|
|
String a11yTrackByArtist(String trackName, String artistName) {
|
|
return '$trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String a11ySelectAlbum(String albumName) {
|
|
return 'Select album $albumName';
|
|
}
|
|
|
|
@override
|
|
String a11yOpenAlbum(String albumName) {
|
|
return 'Open album $albumName';
|
|
}
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabAlbums => 'Albums';
|
|
|
|
@override
|
|
String get optionsDefaultSearchTabTracks => 'Tracks';
|
|
|
|
@override
|
|
String get settingsFiles => 'Files & Folders';
|
|
|
|
@override
|
|
String get settingsFilesSubtitle =>
|
|
'Download location, filename, folder structure';
|
|
|
|
@override
|
|
String get settingsMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get settingsMetadataSubtitle =>
|
|
'Cover art, tags, ReplayGain, providers';
|
|
|
|
@override
|
|
String get settingsLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get settingsLyricsSubtitle =>
|
|
'Embed, mode, providers, language options';
|
|
|
|
@override
|
|
String get settingsApp => 'App';
|
|
|
|
@override
|
|
String get settingsAppSubtitle => 'Updates, data, extension repo, debug';
|
|
|
|
@override
|
|
String get sectionMetadataProviders => 'Providers';
|
|
|
|
@override
|
|
String get sectionDuplicates => 'Duplicates';
|
|
|
|
@override
|
|
String get sectionLyricsProviderOptions => 'Provider Options';
|
|
|
|
@override
|
|
String get metadataProvidersTitle => 'Metadata Provider Priority';
|
|
|
|
@override
|
|
String get metadataProvidersSubtitle =>
|
|
'Drag to set search and metadata source order';
|
|
|
|
@override
|
|
String get downloadDeduplication => 'Skip Duplicate Downloads';
|
|
|
|
@override
|
|
String get downloadDeduplicationEnabled =>
|
|
'Already-downloaded tracks will be skipped';
|
|
|
|
@override
|
|
String get downloadDeduplicationDisabled =>
|
|
'All tracks will be downloaded regardless of history';
|
|
|
|
@override
|
|
String get downloadFallbackExtensions => 'Fallback Extensions';
|
|
|
|
@override
|
|
String get downloadFallbackExtensionsSubtitle =>
|
|
'Choose which extensions can be used as fallback';
|
|
|
|
@override
|
|
String get editMetadataFieldDateHint => 'YYYY-MM-DD or YYYY';
|
|
|
|
@override
|
|
String get editMetadataFieldTrackTotal => 'Track Total';
|
|
|
|
@override
|
|
String get editMetadataFieldDiscTotal => 'Disc Total';
|
|
|
|
@override
|
|
String get editMetadataFieldComposer => 'Composer';
|
|
|
|
@override
|
|
String get editMetadataFieldComment => 'Comment';
|
|
|
|
@override
|
|
String get editMetadataAdvanced => 'Advanced';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingTrackNumber => 'Missing track number';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingDiscNumber => 'Missing disc number';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingArtist => 'Missing artist';
|
|
|
|
@override
|
|
String get libraryFilterMetadataIncorrectIsrcFormat =>
|
|
'Incorrect ISRC format';
|
|
|
|
@override
|
|
String get libraryFilterMetadataMissingLabel => 'Missing label';
|
|
|
|
@override
|
|
String collectionDeletePlaylistsMessage(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return 'Delete $count $_temp0?';
|
|
}
|
|
|
|
@override
|
|
String collectionPlaylistsDeleted(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlists',
|
|
one: 'playlist',
|
|
);
|
|
return '$count $_temp0 deleted';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedTracksToPlaylist(int count, String playlistName) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Added $count $_temp0 to $playlistName';
|
|
}
|
|
|
|
@override
|
|
String collectionAddedTracksToPlaylistWithExisting(
|
|
int count,
|
|
String playlistName,
|
|
int alreadyCount,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Added $count $_temp0 to $playlistName ($alreadyCount already in playlist)';
|
|
}
|
|
|
|
@override
|
|
String itemCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'items',
|
|
one: 'item',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String trackReEnrichSuccessWithFailures(
|
|
int successCount,
|
|
int total,
|
|
int failedCount,
|
|
) {
|
|
return 'Metadata re-enriched successfully ($successCount/$total) - Failed: $failedCount';
|
|
}
|
|
|
|
@override
|
|
String selectionDeleteTracksCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'tracks',
|
|
one: 'track',
|
|
);
|
|
return 'Delete $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String queueDownloadSpeedStatus(String speed) {
|
|
return 'Downloading - $speed MB/s';
|
|
}
|
|
|
|
@override
|
|
String get queueDownloadStarting => 'Starting...';
|
|
|
|
@override
|
|
String get a11ySelectTrack => 'Select track';
|
|
|
|
@override
|
|
String get a11yDeselectTrack => 'Deselect track';
|
|
|
|
@override
|
|
String a11yPlayTrackByArtist(String trackName, String artistName) {
|
|
return 'Play $trackName by $artistName';
|
|
}
|
|
|
|
@override
|
|
String storeExtensionsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'extensions',
|
|
one: 'extension',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String storeRequiresVersion(String version) {
|
|
return 'Requires v$version+';
|
|
}
|
|
|
|
@override
|
|
String get actionGo => 'Go';
|
|
|
|
@override
|
|
String get logIssueSummary => 'Issue Summary';
|
|
|
|
@override
|
|
String logTotalErrors(int count) {
|
|
return 'Total errors: $count';
|
|
}
|
|
|
|
@override
|
|
String logAffectedDomains(String domains) {
|
|
return 'Affected: $domains';
|
|
}
|
|
|
|
@override
|
|
String get libraryScanCancelled => 'Scan cancelled';
|
|
|
|
@override
|
|
String get libraryScanCancelledSubtitle =>
|
|
'You can retry the scan when ready.';
|
|
|
|
@override
|
|
String libraryDownloadsHistoryExcluded(int count) {
|
|
return '$count from Downloads history (excluded from list)';
|
|
}
|
|
|
|
@override
|
|
String get downloadNativeWorker => 'Native download worker';
|
|
|
|
@override
|
|
String get downloadNativeWorkerSubtitle =>
|
|
'Beta Android service worker for extension downloads';
|
|
|
|
@override
|
|
String get badgeBeta => 'BETA';
|
|
|
|
@override
|
|
String get extensionServiceStatus => 'Service Status';
|
|
|
|
@override
|
|
String get extensionServiceHealth => 'Service health';
|
|
|
|
@override
|
|
String extensionHealthChecksConfigured(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'checks',
|
|
one: 'check',
|
|
);
|
|
return '$count $_temp0 configured';
|
|
}
|
|
|
|
@override
|
|
String get extensionOauthConnectHint =>
|
|
'Tap Connect to Spotify to fill this field.';
|
|
|
|
@override
|
|
String extensionLastChecked(String time) {
|
|
return 'Last checked $time';
|
|
}
|
|
|
|
@override
|
|
String get extensionRefreshStatus => 'Refresh status';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandling => 'Custom URL Handling';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandlingSubtitle =>
|
|
'This extension can handle links from these sites';
|
|
|
|
@override
|
|
String get extensionCustomUrlHandlingShareHint =>
|
|
'Share links from these sites to SpotiFLAC Mobile and this extension will handle them.';
|
|
|
|
@override
|
|
String extensionSettingsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'settings',
|
|
one: 'setting',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get extensionHealthOnline => 'Online';
|
|
|
|
@override
|
|
String get extensionHealthDegraded => 'Degraded';
|
|
|
|
@override
|
|
String get extensionHealthOffline => 'Offline';
|
|
|
|
@override
|
|
String get extensionHealthNotConfigured => 'Not configured';
|
|
|
|
@override
|
|
String get extensionHealthUnknown => 'Unknown';
|
|
|
|
@override
|
|
String get extensionHealthRequired => 'required';
|
|
|
|
@override
|
|
String get extensionSettingNotSet => 'Not set';
|
|
|
|
@override
|
|
String get extensionActionFailed => 'Action failed';
|
|
|
|
@override
|
|
String get extensionEnterValue => 'Enter value';
|
|
|
|
@override
|
|
String get extensionHealthServiceOnline => 'Service online';
|
|
|
|
@override
|
|
String get extensionHealthServiceDegraded => 'Service degraded';
|
|
|
|
@override
|
|
String get extensionHealthServiceOffline => 'Service offline';
|
|
|
|
@override
|
|
String get extensionHealthServiceUnknown => 'Service status unknown';
|
|
|
|
@override
|
|
String get audioAnalysisStereo => 'Stereo';
|
|
|
|
@override
|
|
String get audioAnalysisMono => 'Mono';
|
|
|
|
@override
|
|
String trackOpenInService(String serviceName) {
|
|
return 'Open in $serviceName';
|
|
}
|
|
|
|
@override
|
|
String get trackLyricsEmbeddedSource => 'Embedded';
|
|
|
|
@override
|
|
String get unknownAlbum => 'Unknown Album';
|
|
|
|
@override
|
|
String get unknownArtist => 'Unknown Artist';
|
|
|
|
@override
|
|
String get permissionAudio => 'Audio';
|
|
|
|
@override
|
|
String get permissionStorage => 'Storage';
|
|
|
|
@override
|
|
String get permissionNotification => 'Notification';
|
|
|
|
@override
|
|
String get errorInvalidFolderSelected => 'Invalid folder selected';
|
|
|
|
@override
|
|
String get errorCouldNotKeepFolderAccess =>
|
|
'Could not keep access to the selected folder';
|
|
|
|
@override
|
|
String get storeAnyVersion => 'Any';
|
|
|
|
@override
|
|
String get storeCategoryMetadata => 'Metadata';
|
|
|
|
@override
|
|
String get storeCategoryDownload => 'Download';
|
|
|
|
@override
|
|
String get storeCategoryUtility => 'Utility';
|
|
|
|
@override
|
|
String get storeCategoryLyrics => 'Lyrics';
|
|
|
|
@override
|
|
String get storeCategoryIntegration => 'Integration';
|
|
|
|
@override
|
|
String get artistReleases => 'Releases';
|
|
|
|
@override
|
|
String get editMetadataSelectNone => 'None';
|
|
|
|
@override
|
|
String queueRetryAllFailed(int count) {
|
|
return 'Retry $count failed';
|
|
}
|
|
|
|
@override
|
|
String get settingsSaveDownloadHistory => 'Save download history';
|
|
|
|
@override
|
|
String get settingsSaveDownloadHistorySubtitle =>
|
|
'Keep completed downloads in history and library views';
|
|
|
|
@override
|
|
String get dialogDisableHistoryTitle => 'Turn off download history?';
|
|
|
|
@override
|
|
String get dialogDisableHistoryMessage =>
|
|
'Existing history will be cleared. Downloaded files will not be deleted.';
|
|
|
|
@override
|
|
String get dialogDisableAndClear => 'Turn off and clear';
|
|
|
|
@override
|
|
String get openInOtherServices => 'Open in Other Services';
|
|
|
|
@override
|
|
String get shareSheetNoExtensions => 'No other compatible services';
|
|
|
|
@override
|
|
String get shareSheetNotFound => 'Not found';
|
|
|
|
@override
|
|
String get shareSheetCopyLink => 'Copy Link';
|
|
|
|
@override
|
|
String shareSheetLinkCopied(Object service) {
|
|
return '$service link copied';
|
|
}
|
|
|
|
@override
|
|
String get libraryPlayback => 'Pemutaran';
|
|
|
|
@override
|
|
String get libraryExternalPlayer => 'Pemutar eksternal';
|
|
|
|
@override
|
|
String get libraryExternalPlayerSubtitle =>
|
|
'Disarankan untuk mendengarkan, kualitas terbaik, pemutaran tanpa jeda, EQ, dan dukungan format lebih luas';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayer => 'Pemutar pratinjau bawaan';
|
|
|
|
@override
|
|
String get libraryBuiltInPreviewPlayerSubtitle =>
|
|
'Hanya untuk pratinjau lokal cepat di dalam SpotiFLAC Mobile, tidak disarankan untuk mendengarkan secara rutin';
|
|
|
|
@override
|
|
String get libraryBuiltInPlayerInfo =>
|
|
'Pemutar bawaan adalah alat pratinjau untuk memeriksa trek lokal dengan cepat. Gunakan pemutar musik eksternal untuk mendengarkan sebenarnya.';
|
|
|
|
@override
|
|
String get nowPlayingTitle => 'Sedang Diputar';
|
|
|
|
@override
|
|
String get nowPlayingNothingPlaying => 'Tidak ada yang diputar';
|
|
|
|
@override
|
|
String get nowPlayingMinimize => 'Minimalkan';
|
|
|
|
@override
|
|
String get nowPlayingUpNext => 'Berikutnya';
|
|
|
|
@override
|
|
String get nowPlayingDetails => 'Detail';
|
|
|
|
@override
|
|
String get nowPlayingOpenInExternalPlayer => 'Buka di pemutar eksternal';
|
|
|
|
@override
|
|
String get nowPlayingTabPlayer => 'Pemutar';
|
|
|
|
@override
|
|
String get nowPlayingTabLyrics => 'Lirik';
|
|
|
|
@override
|
|
String get nowPlayingNoLyrics => 'Tidak ada lirik di file ini';
|
|
|
|
@override
|
|
String get nowPlayingLibraryEmpty => 'Perpustakaan Anda kosong';
|
|
|
|
@override
|
|
String nowPlayingShuffleLibraryFailed(String error) {
|
|
return 'Tidak dapat mengacak perpustakaan: $error';
|
|
}
|
|
|
|
@override
|
|
String get nowPlayingShuffleOn => 'Acak aktif';
|
|
|
|
@override
|
|
String get nowPlayingPlayInOrder => 'Putar berurutan';
|
|
|
|
@override
|
|
String get nowPlayingShuffleLibrary => 'Acak perpustakaan';
|
|
|
|
@override
|
|
String get nowPlayingQueueEmpty => 'Antrean kosong';
|
|
|
|
@override
|
|
String get nowPlayingNoMetadata => 'Metadata tidak tersedia';
|
|
|
|
@override
|
|
String get announcementUnableToOpenLink =>
|
|
'Tidak dapat membuka tautan. Silakan coba lagi.';
|
|
|
|
@override
|
|
String trackConvertLosslessOutputWithCap(String quality) {
|
|
return 'Output lossless dengan batas $quality';
|
|
}
|
|
|
|
@override
|
|
String trackConvertConfirmMessageLosslessCapped(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return 'Konversi dari $sourceFormat ke $targetFormat ($quality)?\n\nOutput tetap codec lossless, tetapi kedalaman bit/sample rate akan dibatasi. File asli akan dihapus setelah konversi.';
|
|
}
|
|
|
|
@override
|
|
String selectionBatchConvertConfirmMessageLosslessCapped(
|
|
int count,
|
|
String format,
|
|
String quality,
|
|
) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'trek',
|
|
one: 'trek',
|
|
);
|
|
return 'Konversi $count $_temp0 ke $format ($quality)?\n\nOutput tetap codec lossless, tetapi kedalaman bit/sample rate akan dibatasi. File asli akan dihapus setelah konversi.';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossless(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String quality,
|
|
) {
|
|
return '$sourceFormat → $targetFormat ($quality)';
|
|
}
|
|
|
|
@override
|
|
String trackConvertActionLabelLossy(
|
|
String sourceFormat,
|
|
String targetFormat,
|
|
String bitrate,
|
|
) {
|
|
return '$sourceFormat → $targetFormat @ $bitrate';
|
|
}
|
|
|
|
@override
|
|
String get aboutPaxsenixSubtitle =>
|
|
'Proxy lirik untuk Musixmatch, Netease, Apple Music, QQ Music, Spotify, Deezer, YouTube, Kugou, dan Genius';
|
|
|
|
@override
|
|
String get snackbarPlayingNext => 'Memutar berikutnya';
|
|
|
|
@override
|
|
String get snackbarAddedToQueueGeneric => 'Ditambahkan ke antrean';
|
|
|
|
@override
|
|
String selectionDeletePlaylistsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'playlist',
|
|
one: 'playlist',
|
|
);
|
|
return 'Hapus $count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get actionShuffle => 'Acak';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOn => 'Hanya utama: Aktif';
|
|
|
|
@override
|
|
String get downloadPrimaryArtistOnlyOff => 'Hanya utama: Nonaktif';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataPrimaryOnly =>
|
|
'Metadata Album Artist: Hanya utama';
|
|
|
|
@override
|
|
String get downloadAlbumArtistMetadataFull =>
|
|
'Metadata Album Artist: Lengkap';
|
|
|
|
@override
|
|
String get trackConvertOriginal => 'Asli';
|
|
|
|
@override
|
|
String get trackConvertOriginalQuality => 'Kualitas asli';
|
|
|
|
@override
|
|
String get trackConvertLosslessSuffix => 'Lossless';
|
|
|
|
@override
|
|
String get trackConvertDithering => 'Dithering';
|
|
|
|
@override
|
|
String get trackConvertResampler => 'Resampler';
|
|
|
|
@override
|
|
String get trackConvertDitherNone => 'Tidak ada';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangular => 'TPDF';
|
|
|
|
@override
|
|
String get trackConvertDitherTriangularHp => 'Triangular HP';
|
|
|
|
@override
|
|
String get trackConvertResamplerSwr => 'SWR';
|
|
|
|
@override
|
|
String get trackConvertResamplerSoxr => 'SoXr';
|
|
|
|
@override
|
|
String get updateSeeReleaseNotes => 'Lihat catatan rilis untuk detail.';
|
|
|
|
@override
|
|
String get unknownTitle => 'Judul tidak diketahui';
|
|
|
|
@override
|
|
String get trackPlayNext => 'Putar berikutnya';
|
|
|
|
@override
|
|
String get trackAddToQueue => 'Tambah ke antrean';
|
|
|
|
@override
|
|
String snackbarExtensionInstalledEnable(String extensionName) {
|
|
return '$extensionName terpasang. Aktifkan di Pengaturan > Ekstensi';
|
|
}
|
|
|
|
@override
|
|
String snackbarExtensionUpdatedVersion(String extensionName, String version) {
|
|
return '$extensionName diperbarui ke v$version';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToInstallNamed(String extensionName) {
|
|
return 'Gagal memasang $extensionName';
|
|
}
|
|
|
|
@override
|
|
String snackbarFailedToUpdateNamed(String extensionName) {
|
|
return 'Gagal memperbarui $extensionName';
|
|
}
|
|
|
|
@override
|
|
String get releaseTypeEp => 'EP';
|
|
|
|
@override
|
|
String get releaseTypeSingle => 'Single';
|
|
|
|
@override
|
|
String get trackCoverOnline => 'Sampul daring';
|
|
|
|
@override
|
|
String get regionCountryUS => 'Amerika Serikat';
|
|
|
|
@override
|
|
String get regionCountryGB => 'Britania Raya';
|
|
|
|
@override
|
|
String get regionCountryFR => 'Prancis';
|
|
|
|
@override
|
|
String get regionCountryDE => 'Jerman';
|
|
|
|
@override
|
|
String get regionCountryJP => 'Jepang';
|
|
|
|
@override
|
|
String get regionCountryKR => 'Korea Selatan';
|
|
|
|
@override
|
|
String get regionCountryIN => 'India';
|
|
|
|
@override
|
|
String get regionCountryID => 'Indonesia';
|
|
|
|
@override
|
|
String get regionCountryBR => 'Brasil';
|
|
|
|
@override
|
|
String get regionCountryMX => 'Meksiko';
|
|
|
|
@override
|
|
String get regionCountryAU => 'Australia';
|
|
|
|
@override
|
|
String get regionCountryCA => 'Kanada';
|
|
|
|
@override
|
|
String get regionCountryXK => 'Kosovo';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserTitle => 'Browser verifikasi';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleExternal =>
|
|
'Buka tantangan di browser default terlebih dahulu';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserSubtitleInApp =>
|
|
'Buka tantangan di browser dalam aplikasi terlebih dahulu';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserExternal => 'Eksternal';
|
|
|
|
@override
|
|
String get extensionVerificationBrowserInApp => 'Dalam aplikasi';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleManual =>
|
|
'Buka verifikasi secara manual';
|
|
|
|
@override
|
|
String get extensionVerificationHelpTitleWaiting =>
|
|
'Verifikasi masih menunggu';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageManual =>
|
|
'SpotiFLAC Mobile tidak dapat membuka browser secara otomatis. Buka tautan ini di browser Anda, atau salin secara manual.';
|
|
|
|
@override
|
|
String get extensionVerificationHelpMessageWaiting =>
|
|
'Jika browser tidak terbuka, atau verifikasi selesai tetapi tidak kembali ke SpotiFLAC Mobile, buka tautan ini lagi atau salin secara manual.';
|
|
|
|
@override
|
|
String get extensionVerificationClose => 'Tutup';
|
|
|
|
@override
|
|
String get extensionVerificationCopyLink => 'Salin tautan';
|
|
|
|
@override
|
|
String get extensionVerificationLinkCopied => 'Tautan verifikasi disalin';
|
|
|
|
@override
|
|
String get extensionVerificationOpenBrowser => 'Buka browser';
|
|
}
|